{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/storytold/effectcraft-plugins/main/schema.json", "title": "EffectCraft Plug-in Library catalog (index.json), format 1", "description": "Mirrors crates/engine/src/system/library.rs (parse_catalog). Unknown fields are rejected here to catch typos; the app itself ignores them.", "type": "object", "required": ["schema", "packages"], "additionalProperties": false, "properties": { "schema": {"const": 1}, "packages": {"type": "array", "maxItems": 10000, "items": {"$ref": "#/$defs/package"}} }, "$defs": { "version": {"type": "string", "maxLength": 32, "pattern": "^[0-9]+(\\.[0-9]+)*$"}, "github_url": { "type": "string", "pattern": "^https://(github\\.com|raw\\.githubusercontent\\.com|objects\\.githubusercontent\\.com|release-assets\\.githubusercontent\\.com)/[^\\s]+$" }, "package": { "type": "object", "required": ["id", "name", "versions"], "additionalProperties": false, "properties": { "id": {"type": "string", "pattern": "^(?!\\.)(?!.*\\.\\.)(?!.*\\.$)[A-Za-z0-9._-]{1,100}$"}, "name": {"type": "string", "pattern": "\\S"}, "author": {"type": "string"}, "description": {"type": "string"}, "license": {"type": "string"}, "repo": {"type": "string", "pattern": "^https://"}, "tags": {"type": "array", "items": {"type": "string"}}, "preview": { "type": "object", "additionalProperties": false, "properties": {"video": {"type": "string", "pattern": "^https://[^\\s]+$"}} }, "versions": {"type": "array", "minItems": 1, "items": {"$ref": "#/$defs/release"}} } }, "release": { "type": "object", "required": ["version", "api", "url", "sha256", "effects"], "additionalProperties": false, "properties": { "version": {"$ref": "#/$defs/version"}, "api": {"type": "integer", "minimum": 0, "maximum": 4294967295}, "minApp": {"$ref": "#/$defs/version"}, "url": {"$ref": "#/$defs/github_url"}, "sha256": {"type": "string", "pattern": "^[0-9a-fA-F]{64}$"}, "size": {"type": "integer", "minimum": 1, "maximum": 67108864}, "effects": {"type": "array", "minItems": 1, "items": {"type": "string", "pattern": "^(?!ec\\.)[A-Za-z0-9._-]+$"}} } } } }