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