Add comprehensive validation rules documentation
This commit is contained in:
168
VALIDATION_RULES.md
Normal file
168
VALIDATION_RULES.md
Normal file
@@ -0,0 +1,168 @@
|
||||
# Plugin Validation Rules
|
||||
|
||||
All plugin submissions are automatically validated before being merged. PRs must pass all validation checks to be auto-merged.
|
||||
|
||||
## Security
|
||||
|
||||
**The validation script runs from the main branch, not from your PR branch.** This prevents malicious PRs from modifying the validation logic. PRs that attempt to modify `.gitea/` directory files will be automatically rejected.
|
||||
|
||||
## File Requirements
|
||||
|
||||
### 1. Location
|
||||
- ✅ Only modify files in `plugins/` directory
|
||||
- ❌ Cannot modify files outside `plugins/`
|
||||
- ❌ Cannot modify `.gitea/` infrastructure files
|
||||
- ⚠️ `plugins/index.json` is auto-generated - don't manually edit it
|
||||
|
||||
### 2. File Type
|
||||
- ✅ Only `.json` files are allowed in `plugins/` directory
|
||||
- ❌ No other file types (images, scripts, etc. must be in plugin repo)
|
||||
|
||||
## Plugin JSON Schema
|
||||
|
||||
### Required Fields
|
||||
Every plugin JSON must have these fields:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "string",
|
||||
"name": "string",
|
||||
"version": "string",
|
||||
"description": "string",
|
||||
"author": "string",
|
||||
"repository": "string"
|
||||
}
|
||||
```
|
||||
|
||||
### Field Validation Rules
|
||||
|
||||
#### `id` (required)
|
||||
- Must match the filename
|
||||
- Example: `example-plugin.json` → `"id": "example-plugin"`
|
||||
- Lowercase, hyphens allowed, no spaces
|
||||
|
||||
#### `name` (required)
|
||||
- Display name for the plugin
|
||||
- Human-readable, any format
|
||||
|
||||
#### `version` (required)
|
||||
- Must follow semantic versioning: `x.y.z`
|
||||
- Example: `"1.0.0"`, `"2.1.3"`
|
||||
- ❌ Invalid: `"v1.0"`, `"1.0"`, `"latest"`
|
||||
|
||||
#### `description` (required)
|
||||
- Short description of what the plugin does
|
||||
- Will be shown in the plugin browser
|
||||
|
||||
#### `author` (required)
|
||||
- **MUST MATCH YOUR GITEA USERNAME**
|
||||
- This enforces ownership - you can only submit/remove plugins authored by you
|
||||
- Case-sensitive
|
||||
|
||||
#### `repository` (required)
|
||||
- Git repository URL where the plugin code lives
|
||||
- Must be a valid URL
|
||||
- Example: `"http://synbox.ruv.wtf:8418/username/Plugin-Name.git"`
|
||||
|
||||
#### `thumbnail` (optional)
|
||||
- URL to plugin thumbnail image
|
||||
- **Requirements:**
|
||||
- Format: PNG, JPG, or GIF only
|
||||
- Max dimensions: 512×512 pixels
|
||||
- Max file size: 2MB
|
||||
- Must be accessible via HTTP/HTTPS
|
||||
- Example: `"http://synbox.ruv.wtf:8418/username/Plugin-Name/raw/branch/main/thumbnail.png"`
|
||||
- Validation checks actual image format (magic bytes), dimensions, and size
|
||||
|
||||
### Optional Fields
|
||||
You can include any additional fields for metadata:
|
||||
- `homepage` - Project homepage URL
|
||||
- `downloadUrl` - Direct download link
|
||||
- `tags` - Array of tags
|
||||
- `addedDate` - ISO timestamp
|
||||
|
||||
## Ownership Rules
|
||||
|
||||
### Adding Plugins
|
||||
- The `author` field must match your Gitea username
|
||||
- This is checked automatically
|
||||
|
||||
### Removing Plugins
|
||||
- You can only remove plugins where `author` matches your username
|
||||
- Attempting to remove someone else's plugin will fail validation
|
||||
|
||||
## Validation Process
|
||||
|
||||
1. **File check**: Ensures only `plugins/*.json` files are modified
|
||||
2. **Infrastructure check**: Blocks any `.gitea/` modifications
|
||||
3. **JSON parsing**: Validates JSON syntax
|
||||
4. **Schema validation**: Checks all required fields exist
|
||||
5. **Field validation**: Validates each field's format and rules
|
||||
6. **Thumbnail validation** (if provided): Downloads and validates image
|
||||
7. **Author matching**: Ensures `author` field matches PR creator
|
||||
8. **Auto-merge**: If all checks pass, PR is automatically merged
|
||||
|
||||
## Testing Locally
|
||||
|
||||
You can test your plugin JSON before submitting:
|
||||
|
||||
```bash
|
||||
cd Plugin-Directory
|
||||
node .gitea/scripts/validate-pr.js "your-username" "plugins/your-plugin.json"
|
||||
```
|
||||
|
||||
## Common Errors
|
||||
|
||||
### ❌ Author mismatch
|
||||
```
|
||||
❌ plugins/example-plugin.json: Author "someone" must match PR creator "you"
|
||||
```
|
||||
**Fix**: Change `"author": "someone"` to `"author": "you"`
|
||||
|
||||
### ❌ ID doesn't match filename
|
||||
```
|
||||
❌ plugins/my-plugin.json: Plugin ID "different-name" doesn't match filename "my-plugin.json"
|
||||
```
|
||||
**Fix**: Change `"id": "different-name"` to `"id": "my-plugin"`
|
||||
|
||||
### ❌ Invalid version
|
||||
```
|
||||
❌ plugins/example-plugin.json: Invalid version format: v1.0
|
||||
```
|
||||
**Fix**: Use semantic versioning like `"version": "1.0.0"`
|
||||
|
||||
### ❌ Thumbnail too large
|
||||
```
|
||||
❌ plugins/example-plugin.json: Thumbnail validation failed: Thumbnail exceeds 2MB limit (3.45MB)
|
||||
```
|
||||
**Fix**: Compress your thumbnail to under 2MB
|
||||
|
||||
### ❌ Thumbnail dimensions too large
|
||||
```
|
||||
❌ plugins/example-plugin.json: Thumbnail validation failed: Thumbnail dimensions 1024x768 exceed 512x512
|
||||
```
|
||||
**Fix**: Resize your thumbnail to 512×512 or smaller
|
||||
|
||||
## Example Valid Plugin JSON
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "example-plugin",
|
||||
"name": "Example Plugin",
|
||||
"version": "1.0.0",
|
||||
"description": "An example plugin demonstrating the plugin system capabilities",
|
||||
"author": "litruv",
|
||||
"repository": "http://synbox.ruv.wtf:8418/litruv/Plugin-Example.git",
|
||||
"thumbnail": "http://synbox.ruv.wtf:8418/litruv/Plugin-Example/raw/branch/main/thumbnail.png",
|
||||
"homepage": "http://synbox.ruv.wtf:8418/litruv/Plugin-Example",
|
||||
"tags": ["example", "demo"]
|
||||
}
|
||||
```
|
||||
|
||||
## Security Note
|
||||
|
||||
**Never include sensitive information in plugin JSON files.** These files are public and will be served to all plugin host users. Do not include:
|
||||
- API keys or tokens
|
||||
- Passwords
|
||||
- Private URLs or endpoints
|
||||
- Personal information
|
||||
Reference in New Issue
Block a user