You've already forked AstralRinth
forked from didirus/AstralRinth
This reverts commit 44267619b6.
This commit is contained in:
@@ -1,8 +1,6 @@
|
||||
<!-- TODO: After checklist v1.5, move everything into src directory. -->
|
||||
|
||||
# @modrinth/moderation
|
||||
|
||||
This package contains both the moderation checklist system used by moderators for reviewing projects on Modrinth, and the publishing checklist (nag system) that provides automated feedback to project authors during the submission process.
|
||||
This package contains the moderation checklist system used for reviewing projects on Modrinth. It provides a structured and transparent way to define moderation stages, actions, and messages that are displayed to moderators during the review process.
|
||||
|
||||
## Structure
|
||||
|
||||
@@ -11,31 +9,22 @@ The package is organized as follows:
|
||||
```
|
||||
/packages/moderation/
|
||||
├── data/
|
||||
│ ├── checklist.ts # Main moderation checklist definition - imports and exports all stages
|
||||
│ ├── messages/ # Markdown files containing message templates for moderation
|
||||
│ ├── checklist.ts # Main checklist definition - imports and exports all stages
|
||||
│ ├── messages/ # Markdown files containing message templates
|
||||
│ │ ├── title/ # Messages for the title stage
|
||||
│ │ ├── description/ # Messages for the description stage
|
||||
│ │ └── ... # One directory per stage
|
||||
│ ├── stages/ # Moderation stage definition files
|
||||
│ │ ├── title.ts # Title stage definition
|
||||
│ │ ├── description.ts # Description stage definition
|
||||
│ │ └── ... # One file per stage
|
||||
│ └── nags/ # Publishing checklist (nag system) files
|
||||
│ ├── core.ts # Core nags (required fields, basic validation)
|
||||
│ ├── core.i18n.ts # Internationalization messages for core nags
|
||||
│ └── ...
|
||||
│ └── stages/ # Stage definition files
|
||||
│ ├── title.ts # Title stage definition
|
||||
│ ├── description.ts # Description stage definition
|
||||
│ └── ... # One file per stage
|
||||
└── types/ # Type definitions
|
||||
├── actions.ts # Action-related types (moderation)
|
||||
├── messages.ts # Message-related types (moderation)
|
||||
├── stage.ts # Stage-related types (moderation)
|
||||
└── nags.ts # Nag-related types (publishing checklist)
|
||||
├── actions.ts # Action-related types
|
||||
├── messages.ts # Message-related types
|
||||
└── stage.ts # Stage-related types
|
||||
```
|
||||
|
||||
## Moderation Checklist System
|
||||
|
||||
The moderation checklist provides a structured and transparent way to define moderation stages, actions, and messages that are displayed to moderators during the review process.
|
||||
|
||||
### Stages
|
||||
## Stages
|
||||
|
||||
A stage represents a discrete step in the moderation process, like checking a project's title, description, or links. Each stage has:
|
||||
|
||||
@@ -46,7 +35,7 @@ A stage represents a discrete step in the moderation process, like checking a pr
|
||||
|
||||
Stages are defined in individual files in the `data/stages` directory and are assembled into the complete checklist in `data/checklist.ts`.
|
||||
|
||||
### Actions
|
||||
## Actions
|
||||
|
||||
Actions represent decisions moderators can make for each stage. They can be buttons, dropdowns, toggles, etc. Actions can have:
|
||||
|
||||
@@ -58,11 +47,11 @@ Actions represent decisions moderators can make for each stage. They can be butt
|
||||
|
||||
Each action requires a unique `id` field that is used for conditional logic and action relationships. The `suggestedStatus` and `severity` fields help determine the overall moderation outcome.
|
||||
|
||||
### Messages
|
||||
## Messages
|
||||
|
||||
Messages are the actual text that will be included in communications to project authors. To promote maintainability and reuse, messages are stored as Markdown files in the `data/messages` directory, organized by stage.
|
||||
|
||||
#### Variable replacement
|
||||
### Variable replacement
|
||||
|
||||
You can use variables in your messages that will be replaced with user input:
|
||||
|
||||
@@ -92,11 +81,11 @@ More text after the variable.
|
||||
|
||||
The `%MESSAGE%` placeholder will be replaced with the text entered by the moderator.
|
||||
|
||||
### Conditional logic
|
||||
## Conditional logic
|
||||
|
||||
The moderation system supports conditional behavior that changes based on the selection of other actions.
|
||||
|
||||
#### Conditional messages
|
||||
### Conditional messages
|
||||
|
||||
You can define different messages for an action based on other selected actions:
|
||||
|
||||
@@ -119,7 +108,7 @@ You can define different messages for an action based on other selected actions:
|
||||
}
|
||||
```
|
||||
|
||||
#### Enabling and disabling actions
|
||||
### Enabling and disabling actions
|
||||
|
||||
Actions can enable or disable other actions when selected:
|
||||
|
||||
@@ -142,7 +131,7 @@ Actions can enable or disable other actions when selected:
|
||||
}
|
||||
```
|
||||
|
||||
#### Conditional text inputs
|
||||
### Conditional text inputs
|
||||
|
||||
Text inputs can be conditionally shown based on selected actions:
|
||||
|
||||
@@ -158,101 +147,3 @@ relevantExtraInput: [
|
||||
},
|
||||
]
|
||||
```
|
||||
|
||||
## Publishing Checklist (Nag System)
|
||||
|
||||
The nag system provides automated feedback to project authors during the submission process, helping them improve their projects before they reach moderation. It analyzes project data and provides suggestions, warnings, and requirements.
|
||||
|
||||
### Nags
|
||||
|
||||
A nag represents a specific issue or suggestion for improvement. Each nag has:
|
||||
|
||||
- A unique `id` for identification
|
||||
- A `title` and `description` displayed to the user
|
||||
- A `status` indicating severity: `'required'`, `'warning'`, or `'suggestion'`
|
||||
- A `shouldShow` function that determines when the nag should be displayed
|
||||
- An optional `link` to help users address the issue
|
||||
|
||||
### Internationalization
|
||||
|
||||
Each nag category has a corresponding `.i18n.ts` file containing message definitions:
|
||||
|
||||
```typescript
|
||||
// Example from core.i18n.ts
|
||||
export default defineMessages({
|
||||
addDescriptionTitle: {
|
||||
id: 'nags.add-description.title',
|
||||
defaultMessage: 'Add a description',
|
||||
},
|
||||
addDescriptionDescription: {
|
||||
id: 'nags.add-description.description',
|
||||
defaultMessage:
|
||||
"A description that clearly describes the project's purpose and function is required.",
|
||||
},
|
||||
})
|
||||
```
|
||||
|
||||
If you want to use context in the messages, you can do so like this:
|
||||
|
||||
```typescript
|
||||
description: (context: NagContext) => {
|
||||
const { formatMessage } = useVIntl()
|
||||
|
||||
return formatMessage(messages.descriptionTooShortDescription, {
|
||||
length: context.project.body?.length || 0,
|
||||
minChars: MIN_DESCRIPTION_CHARS,
|
||||
})
|
||||
}
|
||||
```
|
||||
|
||||
### Nag Context
|
||||
|
||||
The `NagContext` type provides access to:
|
||||
|
||||
- `project`: Current project data
|
||||
- `versions`: Project versions
|
||||
- `tags`: Frontend "tags" (generated state)
|
||||
- `currentRoute`: Current page route
|
||||
- and other data...
|
||||
|
||||
### Adding New Nags
|
||||
|
||||
To add a new nag:
|
||||
|
||||
1. Add the nag definition to the appropriate category file (or make a new category file and add it to `data/nags.ts`)
|
||||
2. Add corresponding i18n messages to the `.i18n.ts` file
|
||||
3. Implement the `shouldShow` logic based on project state
|
||||
4. Add appropriate links to help users resolve the issue
|
||||
5. Run `pnpm run fix` to fix lint issues & generate the root locale index.json file.
|
||||
|
||||
Example:
|
||||
|
||||
```typescript
|
||||
// In description.ts
|
||||
{
|
||||
id: 'new-nag',
|
||||
title: messages.newNagTitle,
|
||||
description: messages.newNagDescription,
|
||||
status: 'warning',
|
||||
shouldShow: (context: NagContext) => {
|
||||
// Your validation logic here
|
||||
return someCondition
|
||||
},
|
||||
link: {
|
||||
path: 'settings/description',
|
||||
title: messages.editDescriptionTitle,
|
||||
shouldShow: (context: NagContext) => context.currentRoute !== 'type-id-settings-description',
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
```typescript
|
||||
// In description.i18n.ts
|
||||
newNagTitle: {
|
||||
id: 'nags.new-nag.title',
|
||||
defaultMessage: 'New Nag Title',
|
||||
},
|
||||
newNagDescription: {
|
||||
id: 'nags.new-nag.description',
|
||||
defaultMessage: 'Description of the new nag issue.',
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user