navidrome/plugins/manifest-schema.json
Deluan Quintão f1e75c40dc
Some checks are pending
Pipeline: Test, Lint, Build / Get version info (push) Waiting to run
Pipeline: Test, Lint, Build / Lint Go code (push) Waiting to run
Pipeline: Test, Lint, Build / Test Go code (push) Waiting to run
Pipeline: Test, Lint, Build / Test JS code (push) Waiting to run
Pipeline: Test, Lint, Build / Lint i18n files (push) Waiting to run
Pipeline: Test, Lint, Build / Check Docker configuration (push) Waiting to run
Pipeline: Test, Lint, Build / Build (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-1 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-2 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-3 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-4 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-5 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-6 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-7 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-8 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build-9 (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Push to GHCR (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Push to Docker Hub (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Cleanup digest artifacts (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Build Windows installers (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Package/Release (push) Blocked by required conditions
Pipeline: Test, Lint, Build / Upload Linux PKG (push) Blocked by required conditions
feat(plugins): add JSONForms-based plugin configuration UI (#4911)
* feat(plugins): add JSONForms schema for plugin configuration

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: enhance error handling by formatting validation errors with field names

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: enforce required fields in config validation and improve error handling

Signed-off-by: Deluan <deluan@navidrome.org>

* format JS code

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: add config schema validation and enhance manifest structure

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: refactor plugin config parsing and add unit tests

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: add config validation error message in Portuguese

* feat: enhance AlwaysExpandedArrayLayout with description support and improve array control testing

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: update Discord Rust plugin configuration to use JSONForm for user tokens and enhance schema validation

Signed-off-by: Deluan <deluan@navidrome.org>

* fix: resolve React Hooks linting issues in plugin UI components

* Apply suggestions from code review

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* format code

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: migrate schema validation to use santhosh-tekuri/jsonschema and improve error formatting

Signed-off-by: Deluan <deluan@navidrome.org>

* address PR comments

Signed-off-by: Deluan <deluan@navidrome.org>

* fix flaky test

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: enhance array layout and configuration handling with AJV defaults

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: implement custom tester to exclude enum arrays from AlwaysExpandedArrayLayout

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: add error boundary for schema rendering and improve error messages

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: refine non-enum array control logic by utilizing JSONForms schema resolution

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: add error styling to ToggleEnabledSwitch for disabled state

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: adjust label positioning and styling in SchemaConfigEditor for improved layout

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: implement outlined input controls renderers to replace custom fragile CSS

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: remove margin from last form control inside array items for better spacing

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: enhance AJV error handling to transform required errors for field-level validation

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: set default value for User Tokens in manifest.json to improve user experience

Signed-off-by: Deluan <deluan@navidrome.org>

* format

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: add margin to outlined input controls for improved spacing

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: remove redundant margin rule for last form control in array items

Signed-off-by: Deluan <deluan@navidrome.org>

* feat: adjust font size of label elements in SchemaConfigEditor for improved readability

Signed-off-by: Deluan <deluan@navidrome.org>

---------

Signed-off-by: Deluan <deluan@navidrome.org>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-01-19 20:51:00 -05:00

250 lines
7.3 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://navidrome.org/schemas/Manifest.json",
"title": "Manifest",
"description": "Plugin manifest for Navidrome plugins",
"type": "object",
"additionalProperties": false,
"required": ["name", "author", "version"],
"properties": {
"name": {
"type": "string",
"description": "The display name of the plugin",
"minLength": 1
},
"author": {
"type": "string",
"description": "The author of the plugin",
"minLength": 1
},
"version": {
"type": "string",
"description": "The version of the plugin (semver recommended)",
"minLength": 1
},
"description": {
"type": "string",
"description": "A brief description of what the plugin does"
},
"website": {
"type": "string",
"description": "URL to the plugin's website or repository",
"format": "uri"
},
"permissions": {
"$ref": "#/$defs/Permissions"
},
"experimental": {
"$ref": "#/$defs/Experimental"
},
"config": {
"$ref": "#/$defs/ConfigDefinition"
}
},
"$defs": {
"ConfigDefinition": {
"type": "object",
"description": "Configuration schema for the plugin using JSON Schema (draft-07) and optional JSONForms UI Schema",
"additionalProperties": false,
"required": ["schema"],
"properties": {
"schema": {
"type": "object",
"description": "JSON Schema (draft-07) defining the plugin's configuration options"
},
"uiSchema": {
"type": "object",
"description": "Optional JSONForms UI Schema for customizing form layout"
}
}
},
"Experimental": {
"type": "object",
"description": "Experimental features that may change or be removed in future versions",
"additionalProperties": false,
"properties": {
"threads": {
"$ref": "#/$defs/ThreadsFeature"
}
}
},
"ThreadsFeature": {
"type": "object",
"description": "Enable experimental WebAssembly threads support",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why threads support is needed"
}
}
},
"Permissions": {
"type": "object",
"description": "Permissions required by the plugin",
"additionalProperties": false,
"properties": {
"http": {
"$ref": "#/$defs/HTTPPermission"
},
"subsonicapi": {
"$ref": "#/$defs/SubsonicAPIPermission"
},
"scheduler": {
"$ref": "#/$defs/SchedulerPermission"
},
"websocket": {
"$ref": "#/$defs/WebSocketPermission"
},
"artwork": {
"$ref": "#/$defs/ArtworkPermission"
},
"cache": {
"$ref": "#/$defs/CachePermission"
},
"library": {
"$ref": "#/$defs/LibraryPermission"
},
"kvstore": {
"$ref": "#/$defs/KVStorePermission"
},
"users": {
"$ref": "#/$defs/UsersPermission"
}
}
},
"ArtworkPermission": {
"type": "object",
"description": "Artwork service permissions for generating artwork URLs",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why artwork access is needed"
}
}
},
"CachePermission": {
"type": "object",
"description": "Cache service permissions for storing and retrieving data",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why cache access is needed"
}
}
},
"HTTPPermission": {
"type": "object",
"description": "HTTP access permissions for a plugin",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why HTTP access is needed"
},
"requiredHosts": {
"type": "array",
"description": "List of required host patterns for HTTP requests (e.g., 'api.example.com', '*.spotify.com')",
"items": {
"type": "string"
}
}
}
},
"ConfigPermission": {
"type": "object",
"description": "Configuration access permissions for a plugin",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why config access is needed"
}
}
},
"SubsonicAPIPermission": {
"type": "object",
"description": "SubsonicAPI service permissions. Requires 'users' permission to be declared.",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why SubsonicAPI access is needed"
}
}
},
"SchedulerPermission": {
"type": "object",
"description": "Scheduler service permissions for scheduling tasks",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why scheduler access is needed"
}
}
},
"WebSocketPermission": {
"type": "object",
"description": "WebSocket service permissions for establishing WebSocket connections",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why WebSocket access is needed"
},
"requiredHosts": {
"type": "array",
"description": "List of required host patterns for WebSocket connections (e.g., 'api.example.com', '*.spotify.com')",
"items": {
"type": "string"
}
}
}
},
"LibraryPermission": {
"type": "object",
"description": "Library service permissions for accessing library metadata and optionally filesystem",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why library access is needed"
},
"filesystem": {
"type": "boolean",
"description": "Whether the plugin requires read-only filesystem access to library directories",
"default": false
}
}
},
"KVStorePermission": {
"type": "object",
"description": "Key-value store permissions for persistent plugin storage",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why key-value store access is needed"
},
"maxSize": {
"type": "string",
"description": "Maximum storage size (e.g., '1MB', '500KB'). Default: 1MB"
}
}
},
"UsersPermission": {
"type": "object",
"description": "Users service permissions for accessing user information",
"additionalProperties": false,
"properties": {
"reason": {
"type": "string",
"description": "Explanation for why users access is needed"
}
}
}
}
}