dsh-agent-plugins-market 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +143 -169
- package/README.zh.md +136 -170
- package/client/client.js +8202 -684
- package/client/client.js.map +1 -1
- package/lib/application/catalog.js +236 -47
- package/lib/application/details.js +19 -10
- package/lib/application/panel-resources.js +95 -0
- package/lib/application/project-agent-roles.js +39 -0
- package/lib/catalog/codex-mcp.js +114 -0
- package/lib/catalog/component-files.js +151 -0
- package/lib/catalog/manifests.js +105 -44
- package/lib/catalog/native-project.js +44 -23
- package/lib/catalog/paths.js +6 -6
- package/lib/catalog/project-config.js +96 -0
- package/lib/catalog/project-hooks.js +108 -0
- package/lib/catalog/scan-pipeline.js +6 -1
- package/lib/catalog/scan-resolvers.js +70 -26
- package/lib/catalog/source-catalog.js +16 -3
- package/lib/catalog/suite-components.js +125 -0
- package/lib/catalog/surfaces.js +60 -46
- package/lib/catalog/validate.js +16 -11
- package/lib/contracts/market.js +16 -1
- package/lib/index.js +187 -35
- package/lib/model/layouts.js +49 -0
- package/lib/routes.js +106 -6
- package/lib/runtime/agent-role-router.js +226 -0
- package/lib/runtime/commands-mounts.js +27 -67
- package/lib/runtime/feedback-tool.js +181 -0
- package/lib/runtime/hooks-mounts.js +66 -13
- package/lib/runtime/host-locale.js +23 -7
- package/lib/runtime/legacy-root-migration.js +12 -0
- package/lib/runtime/lsp-direct-config.js +6 -3
- package/lib/runtime/lsp-mounts.js +38 -24
- package/lib/runtime/lsp-server-state.js +19 -0
- package/lib/runtime/lsp-status.js +3 -2
- package/lib/runtime/mcp-backend.js +6 -2
- package/lib/runtime/mcp-client/config.js +6 -0
- package/lib/runtime/mcp-client/connection.js +8 -2
- package/lib/runtime/mcp-client/tools.js +6 -3
- package/lib/runtime/mcp-config.js +26 -13
- package/lib/runtime/mcp-direct-config.js +56 -0
- package/lib/runtime/mcp-mounts.js +25 -9
- package/lib/runtime/mcp-overrides.js +11 -5
- package/lib/runtime/mcp-status.js +10 -7
- package/lib/runtime/model-catalog.js +48 -0
- package/lib/runtime/project-runtime.js +136 -0
- package/lib/runtime/reconciler.js +38 -28
- package/lib/runtime/server-config.js +75 -0
- package/lib/runtime/skills-provider.js +31 -77
- package/lib/runtime/storage-migration.js +169 -0
- package/lib/runtime/subagent-catalog.js +129 -0
- package/lib/runtime/user-commands.js +86 -0
- package/lib/runtime/user-panels.js +176 -0
- package/lib/runtime/user-store.js +142 -0
- package/lib/types/application/catalog.d.ts +39 -9
- package/lib/types/application/panel-resources.d.ts +13 -0
- package/lib/types/application/project-agent-roles.d.ts +3 -0
- package/lib/types/application/queries.d.ts +17 -1
- package/lib/types/catalog/codex-mcp.d.ts +4 -0
- package/lib/types/catalog/component-files.d.ts +17 -0
- package/lib/types/catalog/manifests.d.ts +14 -9
- package/lib/types/catalog/native-project.d.ts +2 -5
- package/lib/types/catalog/paths.d.ts +4 -4
- package/lib/types/catalog/project-config.d.ts +6 -0
- package/lib/types/catalog/project-hooks.d.ts +10 -0
- package/lib/types/catalog/scan-pipeline.d.ts +2 -0
- package/lib/types/catalog/scan-resolvers.d.ts +4 -3
- package/lib/types/catalog/source-catalog.d.ts +1 -1
- package/lib/types/catalog/suite-components.d.ts +5 -0
- package/lib/types/catalog/surfaces.d.ts +2 -2
- package/lib/types/catalog/validate.d.ts +2 -0
- package/lib/types/contracts/market.d.ts +60 -0
- package/lib/types/contracts/mcp-status.d.ts +5 -1
- package/lib/types/index.d.ts +2 -2
- package/lib/types/model/layouts.d.ts +102 -0
- package/lib/types/model/types.d.ts +51 -6
- package/lib/types/routes.d.ts +6 -1
- package/lib/types/runtime/agent-role-router.d.ts +95 -0
- package/lib/types/runtime/commands-mounts.d.ts +16 -7
- package/lib/types/runtime/feedback-tool.d.ts +49 -0
- package/lib/types/runtime/hooks-mounts.d.ts +4 -0
- package/lib/types/runtime/host-locale.d.ts +1 -1
- package/lib/types/runtime/legacy-root-migration.d.ts +2 -0
- package/lib/types/runtime/lsp-mounts.d.ts +4 -0
- package/lib/types/runtime/lsp-server-state.d.ts +3 -0
- package/lib/types/runtime/lsp-status.d.ts +1 -0
- package/lib/types/runtime/mcp-backend.d.ts +9 -1
- package/lib/types/runtime/mcp-client/config.d.ts +4 -3
- package/lib/types/runtime/mcp-client/tools.d.ts +3 -0
- package/lib/types/runtime/mcp-config.d.ts +11 -5
- package/lib/types/runtime/mcp-direct-config.d.ts +7 -0
- package/lib/types/runtime/mcp-mounts.d.ts +2 -1
- package/lib/types/runtime/mcp-overrides.d.ts +2 -0
- package/lib/types/runtime/mcp-status.d.ts +1 -1
- package/lib/types/runtime/model-catalog.d.ts +7 -0
- package/lib/types/runtime/project-runtime.d.ts +32 -0
- package/lib/types/runtime/reconciler.d.ts +2 -0
- package/lib/types/runtime/server-config.d.ts +10 -0
- package/lib/types/runtime/skills-provider.d.ts +1 -5
- package/lib/types/runtime/storage-migration.d.ts +15 -0
- package/lib/types/runtime/subagent-catalog.d.ts +52 -0
- package/lib/types/runtime/user-commands.d.ts +24 -0
- package/lib/types/runtime/user-panels.d.ts +91 -0
- package/lib/types/runtime/user-store.d.ts +51 -0
- package/package.json +10 -3
- package/schemas/README.md +69 -7
- package/schemas/agent-plugins/spec.md +48 -0
- package/schemas/claude-code/marketplace.schema.json +143 -0
- package/schemas/claude-code/plugin.schema.json +105 -0
- package/schemas/claude-code/spec.md +108 -0
- package/schemas/codex/marketplace.schema.json +78 -0
- package/schemas/codex/plugin.schema.json +77 -0
- package/schemas/codex/spec.md +91 -0
- package/schemas/cursor/marketplace.schema.json +82 -0
- package/schemas/cursor/plugin.schema.json +58 -0
- package/schemas/cursor/spec.md +92 -0
- package/schemas/github-copilot/marketplace.schema.json +107 -0
- package/schemas/github-copilot/plugin.schema.json +89 -0
- package/schemas/github-copilot/spec.md +105 -0
- package/schemas/kimi/marketplace.schema.json +38 -0
- package/schemas/kimi/plugin.schema.json +84 -0
- package/schemas/kimi/spec.md +94 -0
- package/schemas/qoder/marketplace.schema.json +115 -0
- package/schemas/qoder/plugin.schema.json +127 -0
- package/schemas/qoder/spec.md +111 -0
- package/schemas/skill-collection/spec.md +29 -0
- package/schemas/universal/marketplace.schema.json +98 -0
- package/schemas/universal/plugin.schema.json +49 -0
- package/schemas/universal/spec.md +53 -0
- package/schemas/zcode/marketplace.schema.json +161 -0
- package/schemas/zcode/plugin.schema.json +89 -0
- package/schemas/zcode/spec.md +102 -0
- package/lib/catalog/legacy-root-migration.js +0 -51
- package/lib/types/catalog/legacy-root-migration.d.ts +0 -14
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Qoder CLI plugin and marketplace specification
|
|
2
|
+
|
|
3
|
+
Reference contract for Qoder CLI plugin repositories. Machine-readable companions: [plugin.schema.json](plugin.schema.json) and [marketplace.schema.json](marketplace.schema.json).
|
|
4
|
+
|
|
5
|
+
- **Verified:** 2026-09-08 against `@qoder-ai/qodercli@1.1.47`.
|
|
6
|
+
- **Evidence:** official reference pages [`docs.qoder.com/cli/plugins-reference`](https://docs.qoder.com/cli/plugins-reference), [`/cli/plugins`](https://docs.qoder.com/cli/plugins), `/cli/settings-reference`, `/cli/config-scope`; the compiled Zod schemas and path-resolution code inside the shipped `bundle/qodercli.js`; the first-party manifest `bundle/vendor/qoder-security/.qoder-plugin/plugin.json`; third-party catalogs (`apify/apify-qoder-plugin`, `qoder-plugins/oh-my-qoder`, `HarmonyOS-AI/HarmonyOS-Plugins`, `superbasedapp/plugins`).
|
|
7
|
+
- **Upstream JSON Schema:** none. Neither Zod schema declares `$schema`, and every probed schema URL returns 404. Qoder's interop mechanism is Claude Code compatibility, not agent-plugins.org.
|
|
8
|
+
- **Official marketplace repository:** `QoderAI/qoder-plugins-official` exists but is empty (no branches, no commits).
|
|
9
|
+
|
|
10
|
+
## Manifest locations and precedence
|
|
11
|
+
|
|
12
|
+
| Artifact | Lookup order | Evidence |
|
|
13
|
+
| --- | --- | --- |
|
|
14
|
+
| Plugin manifest | `.qoder-plugin/plugin.json` → `.claude-plugin/plugin.json` | CLI resolver array `[".qoder-plugin", ".claude-plugin"]`; the `.claude-plugin` fallback is undocumented. There is no root-level fallback. |
|
|
15
|
+
| Marketplace manifest | `.qoder-plugin/marketplace.json` → `.claude-plugin/marketplace.json` → `marketplace.json` → the supplied path as a JSON file | CLI `Fdr()`; a second cache-write path checks only the first and third, so a marketplace shipping only `.claude-plugin/marketplace.json` installs but is not cached. |
|
|
16
|
+
| MCP configuration | `.mcp.json` → `mcp.json` | Documented and implemented; never merged. |
|
|
17
|
+
| Hooks configuration | `hooks/hooks.json`, needing the `{"hooks": {…}}` wrapper | Docs. |
|
|
18
|
+
|
|
19
|
+
The plugin manifest is optional; without it the CLI uses the directory name and the literal version `"local"`.
|
|
20
|
+
|
|
21
|
+
## Plugin manifest (`plugin.json`)
|
|
22
|
+
|
|
23
|
+
Required: `name` (non-empty, no spaces). Every component path must begin with `./`.
|
|
24
|
+
|
|
25
|
+
| Field | Type | Notes |
|
|
26
|
+
| --- | --- | --- |
|
|
27
|
+
| `name` | string | Unique identifier. |
|
|
28
|
+
| `version` | string | Defaults to `"local"` at install time. |
|
|
29
|
+
| `displayName`, `description` | string | |
|
|
30
|
+
| `author` | `{name, email?, url?}` | `name` required. |
|
|
31
|
+
| `homepage` | string | Must be a valid URL. |
|
|
32
|
+
| `repository`, `license` | string | `license` is an SPDX id. |
|
|
33
|
+
| `keywords` | string[] | |
|
|
34
|
+
| `dependencies` | (string \| `{name, marketplace?}`)[] | Bare names resolve against the declaring plugin's own marketplace. |
|
|
35
|
+
| `commands` | string \| string[] \| object | Object form maps a name to `{source?, content?, description?, argumentHint?, model?, allowedTools?, context?: 'inline'\|'fork', arguments?, effort?, agent?}`; `source` and `content` are mutually exclusive. |
|
|
36
|
+
| `agents` | string \| string[] | Paths must end in `.md`. |
|
|
37
|
+
| `skills` | string \| string[] | |
|
|
38
|
+
| `outputStyles` | string \| string[] | Overrides the `output-styles/` directory. |
|
|
39
|
+
| `workflowsPath` / `workflowsPaths` | string / string[] | |
|
|
40
|
+
| `hooks` | string \| object \| array | A string must end in `.json`. |
|
|
41
|
+
| `mcpServers` | string \| object \| array | A string must end in `.json`; an object is keyed by server name. |
|
|
42
|
+
| `userConfig` | object | Keys `^[A-Za-z_]\w*$`; values are strict: `{type: 'string'\|'number'\|'boolean'\|'directory'\|'file', title, description, required?, default?, multiple?, sensitive?, min?, max?}`. |
|
|
43
|
+
| `settings` | object | Only the allowlisted key `agent` is kept. |
|
|
44
|
+
| `lspServers`, `channels` | any | Recognized but not implemented; warned and ignored. |
|
|
45
|
+
|
|
46
|
+
Unknown keys are stripped (the manifest schema is non-strict).
|
|
47
|
+
|
|
48
|
+
## Marketplace manifest (`marketplace.json`)
|
|
49
|
+
|
|
50
|
+
Required: `name`, `owner`, `plugins`.
|
|
51
|
+
|
|
52
|
+
| Field | Type | Notes |
|
|
53
|
+
| --- | --- | --- |
|
|
54
|
+
| `name` | string | 1–100 chars, `^[a-z0-9][-a-z0-9._]*$` case-insensitive, no spaces or non-ASCII. Reserved names and `qoder-*` prefixes are rejected. |
|
|
55
|
+
| `owner` | `{name, email?, url?}` | |
|
|
56
|
+
| `plugins` | array | |
|
|
57
|
+
| `forceRemoveDeletedPlugins` | boolean | Uninstalls plugins removed from the marketplace. |
|
|
58
|
+
| `metadata` | `{pluginRoot?, version?, description?}` | `pluginRoot` is declared as the base path for relative sources but has no consumer in the observed CLI. |
|
|
59
|
+
| `allowCrossMarketplaceDependenciesOn` | string[] | |
|
|
60
|
+
|
|
61
|
+
Plugin entries are the plugin-manifest schema made optional, plus:
|
|
62
|
+
|
|
63
|
+
| Field | Type | Notes |
|
|
64
|
+
| --- | --- | --- |
|
|
65
|
+
| `name` | string | Required; must match the plugin manifest name. |
|
|
66
|
+
| `source` | string \| object | Required. |
|
|
67
|
+
| `category`, `tags` | string, string[] | |
|
|
68
|
+
| `strict` | boolean | Default `true`. When `false`, the marketplace entry provides the manifest. |
|
|
69
|
+
| inherited manifest fields | — | `description`, `version`, `author`, `homepage`, `repository`, `license`, `keywords`, `dependencies`, and every component field are accepted on the entry. |
|
|
70
|
+
|
|
71
|
+
Top-level `description`/`version` are not in the schema and are silently dropped — use `metadata.*`.
|
|
72
|
+
|
|
73
|
+
## Plugin sources
|
|
74
|
+
|
|
75
|
+
| Form | Notes |
|
|
76
|
+
| ------------------------------------------------------ | --------------------------------- |
|
|
77
|
+
| `"./plugins/foo"` | Relative to the marketplace root. |
|
|
78
|
+
| `{source: 'npm'\|'pip', package, version?, registry?}` | |
|
|
79
|
+
| `{source: 'url', url, ref?, sha?}` | |
|
|
80
|
+
| `{source: 'github', repo, ref?, sha?}` | |
|
|
81
|
+
| `{source: 'git-subdir', url, path, ref?, sha?}` | |
|
|
82
|
+
|
|
83
|
+
`sha` must be a full 40-character lowercase hex commit. Marketplace registration (`qoder plugins marketplace add`) classifies `user@host:path`, git URLs, `github.com/owner/repo`, other HTTP(S) URLs, local `.json` files, existing directories, and `owner/repo[#ref]`.
|
|
84
|
+
|
|
85
|
+
## Directory layout
|
|
86
|
+
|
|
87
|
+
```text
|
|
88
|
+
plugin-name/
|
|
89
|
+
├── .qoder-plugin/plugin.json # manifest (optional; must not be in the plugin root)
|
|
90
|
+
├── commands/ # .md, nested directories allowed
|
|
91
|
+
├── agents/ # .md
|
|
92
|
+
├── skills/<name>/SKILL.md
|
|
93
|
+
├── hooks/hooks.json
|
|
94
|
+
├── output-styles/
|
|
95
|
+
├── workflows/
|
|
96
|
+
├── bin/ # added to PATH
|
|
97
|
+
└── .mcp.json # mcp.json is a fallback only
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Marketplace repositories place the catalog at the repository root (`.qoder-plugin/marketplace.json`) with plugin directories beside it. On-disk state lives under `$QODER_PLUGIN_CACHE_DIR` or `<configDir>/plugins`, where `configDir` is `$QODER_CONFIG_DIR` or `~/.qoder`: `marketplaces/<name>.json`, `known_marketplaces.json`, `installed_plugins.json`, `installed_plugins_v2.json`, `cache/`.
|
|
101
|
+
|
|
102
|
+
Hook environment: `QODER_PLUGIN_ROOT`, `QODER_PLUGIN_DATA`, and the undocumented `CLAUDE_PLUGIN_ROOT` / `CLAUDE_PLUGIN_DATA`.
|
|
103
|
+
|
|
104
|
+
## Evidence gaps
|
|
105
|
+
|
|
106
|
+
1. `metadata.pluginRoot` is declared but unimplemented.
|
|
107
|
+
2. The `strict: false` manifest-synthesis path was not traced.
|
|
108
|
+
3. `lspServers` and `channels` are typed `unknown` and explicitly ignored.
|
|
109
|
+
4. Docs drift: the CLI has a `managed` install scope, both `.claude-plugin/*` fallbacks, and the settings keys `pluginConfigs`, `extraKnownMarketplaces`, `blockedMarketplaces`, `strictKnownMarketplaces`.
|
|
110
|
+
5. The first-party manifest's `logo`, `category`, and `tags` are absent from the schema and unread by the CLI.
|
|
111
|
+
6. Marketplace `source: 'npm'` throws "not yet implemented" even though the plugin-level npm source works.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Manifest-less skill collection layout
|
|
2
|
+
|
|
3
|
+
Reference contract for repositories that ship skills without any plugin manifest.
|
|
4
|
+
|
|
5
|
+
- **Schema:** none, because there is no manifest to validate. The unit of validation is the `SKILL.md` frontmatter, which is parsed by `src/catalog/skills-parse.ts`.
|
|
6
|
+
- **Status:** this is a discovery convention of this plugin and of the Agent Skills ecosystem, not a vendor-published plugin format.
|
|
7
|
+
- **Evidence:** the shared scanning rules in `src/catalog/scan-resolvers.ts`; upstream Agent Skills documentation at https://code.claude.com/docs/en/skills and https://developers.openai.com/codex/skills.
|
|
8
|
+
|
|
9
|
+
## Qualification
|
|
10
|
+
|
|
11
|
+
A source directory qualifies as a manifest-less skill collection only after skill discovery finds at least one skill. It does not qualify from directory shape alone, so an unrelated repository is not scanned as a suite.
|
|
12
|
+
|
|
13
|
+
## Recognized layouts
|
|
14
|
+
|
|
15
|
+
| Layout | Meaning |
|
|
16
|
+
| ------------------------------- | ----------------------------------------------------------------------------- |
|
|
17
|
+
| `<root>/SKILL.md` | Single-skill plugin; the directory is the skill. |
|
|
18
|
+
| `<root>/skills/<name>/SKILL.md` | Skill collection; each immediate subdirectory with a `SKILL.md` is one skill. |
|
|
19
|
+
| `<root>/skills/*.md` | Flat skill files, when the consumer supports them. |
|
|
20
|
+
|
|
21
|
+
`SKILL.md` frontmatter carries `name` and `description`; user-invocable skills surface as `/` entries in chat, and skills may restrict manual invocation.
|
|
22
|
+
|
|
23
|
+
## Surfaces
|
|
24
|
+
|
|
25
|
+
Because there is no manifest, component locations are the shared scanning conventions only: files directly under `agents/*.md` and `commands/*.md`, `hooks/hooks.json` or root `hooks.json` (Claude Code command-hook subset), and MCP files (`mcp.json`, `.mcp.json`, or inline manifest `mcpServers`, which does not exist here). LSP is preview-only because there is no manifest `lspServers` to validate.
|
|
26
|
+
|
|
27
|
+
## Relationship to other dialects
|
|
28
|
+
|
|
29
|
+
A repository can be manifest-less and still carry the same component directories as a plugin repository. The difference is identity: without a manifest, the suite name comes from the directory basename and no version, author, or dependency metadata is available. Adding any of the manifests in this directory upgrades the same tree to that dialect without moving files.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/universal/marketplace.schema.json",
|
|
4
|
+
"title": "Universal .plugin/ Marketplace Manifest (observed convention)",
|
|
5
|
+
"description": "Marketplace catalog at .plugin/marketplace.json, read by the OpenHands SDK (after .plugin/, before .claude-plugin/) and by GitHub Copilot CLI (second in its lookup order). There is no cross-vendor specification for this location; this schema is the union of the two consumers' field sets. Authored; nothing upstream is vendored.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: OpenHands/software-agent-sdk openhands/sdk/plugin/format/claude_code.py (MARKETPLACE_MANIFEST_DIRS = ['.plugin', '.claude-plugin']) ; https://docs.openhands.dev/sdk/guides/plugins ; https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference. OpenHands requires name and owner and treats plugins and skills as separate lists; Copilot CLI requires name, owner, and plugins.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": { "type": "string" },
|
|
10
|
+
"owner": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"properties": { "name": { "type": "string" }, "email": { "type": "string" }, "url": { "type": "string" } },
|
|
13
|
+
"required": ["name"],
|
|
14
|
+
"additionalProperties": true
|
|
15
|
+
},
|
|
16
|
+
"description": { "type": "string" },
|
|
17
|
+
"metadata": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"description": { "type": "string" },
|
|
21
|
+
"version": { "type": "string" },
|
|
22
|
+
"pluginRoot": { "type": "string" }
|
|
23
|
+
},
|
|
24
|
+
"additionalProperties": true
|
|
25
|
+
},
|
|
26
|
+
"plugins": { "type": "array", "items": { "$ref": "#/$defs/entry" }, "description": "Plugin entries; required by Copilot CLI, optional (default []) for OpenHands." },
|
|
27
|
+
"skills": { "type": "array", "description": "OpenHands-only skill entries.", "items": { "$ref": "#/$defs/skillEntry" } }
|
|
28
|
+
},
|
|
29
|
+
"required": ["name", "owner"],
|
|
30
|
+
"additionalProperties": true,
|
|
31
|
+
"$defs": {
|
|
32
|
+
"entry": {
|
|
33
|
+
"type": "object",
|
|
34
|
+
"properties": {
|
|
35
|
+
"name": { "type": "string", "description": "Kebab-case plugin name." },
|
|
36
|
+
"source": { "$ref": "#/$defs/source" },
|
|
37
|
+
"description": { "type": "string" },
|
|
38
|
+
"version": { "type": "string" },
|
|
39
|
+
"author": {
|
|
40
|
+
"anyOf": [
|
|
41
|
+
{ "type": "string" },
|
|
42
|
+
{
|
|
43
|
+
"type": "object",
|
|
44
|
+
"properties": { "name": { "type": "string" }, "email": { "type": "string" }, "url": { "type": "string" } },
|
|
45
|
+
"additionalProperties": true
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
"category": { "type": "string" },
|
|
50
|
+
"tags": { "type": "array", "items": { "type": "string" } },
|
|
51
|
+
"homepage": { "type": "string" },
|
|
52
|
+
"repository": { "type": "string" },
|
|
53
|
+
"license": { "type": "string" },
|
|
54
|
+
"keywords": { "type": "array", "items": { "type": "string" } },
|
|
55
|
+
"entry_command": { "type": "string", "description": "OpenHands entry command." },
|
|
56
|
+
"strict": {
|
|
57
|
+
"type": "boolean",
|
|
58
|
+
"default": true,
|
|
59
|
+
"description": "OpenHands: true requires the source to contain plugin.json; false lets this entry define the plugin inline."
|
|
60
|
+
},
|
|
61
|
+
"commands": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
|
|
62
|
+
"agents": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
|
|
63
|
+
"hooks": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
|
|
64
|
+
"mcpServers": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
|
|
65
|
+
"lspServers": { "anyOf": [{ "type": "string" }, { "type": "object" }] }
|
|
66
|
+
},
|
|
67
|
+
"required": ["name", "source"],
|
|
68
|
+
"additionalProperties": true
|
|
69
|
+
},
|
|
70
|
+
"skillEntry": {
|
|
71
|
+
"type": "object",
|
|
72
|
+
"properties": {
|
|
73
|
+
"name": { "type": "string" },
|
|
74
|
+
"source": { "$ref": "#/$defs/source" },
|
|
75
|
+
"description": { "type": "string" }
|
|
76
|
+
},
|
|
77
|
+
"required": ["name", "source"],
|
|
78
|
+
"additionalProperties": true
|
|
79
|
+
},
|
|
80
|
+
"source": {
|
|
81
|
+
"description": "A local path, or an object describing a GitHub or git source.",
|
|
82
|
+
"anyOf": [
|
|
83
|
+
{ "type": "string" },
|
|
84
|
+
{
|
|
85
|
+
"type": "object",
|
|
86
|
+
"properties": {
|
|
87
|
+
"source": { "type": "string" },
|
|
88
|
+
"repo": { "type": "string" },
|
|
89
|
+
"url": { "type": "string" },
|
|
90
|
+
"ref": { "type": "string" },
|
|
91
|
+
"path": { "type": "string" }
|
|
92
|
+
},
|
|
93
|
+
"additionalProperties": true
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/universal/plugin.schema.json",
|
|
4
|
+
"title": "Universal .plugin/ Plugin Manifest (observed convention)",
|
|
5
|
+
"description": "Manifest at .plugin/plugin.json. There is no cross-vendor specification for this location: it is an observed convention implemented by GitHub Copilot CLI, the OpenHands SDK, vercel/vercel-plugin, and goose. This schema is the union of the field sets those consumers accept. Authored; nothing upstream is vendored.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference (.plugin/plugin.json is first in Copilot's lookup order) ; OpenHands/software-agent-sdk openhands/sdk/plugin/format/claude_code.py and docs.openhands.dev/sdk/guides/plugins ; vercel/vercel-plugin/.plugin/plugin.json ; aaif-goose/goose crates/goose/src/plugins/formats/open_plugins.rs. The originating open-plugin specification is not public (vercel-labs/plugins returns 404), so fields beyond name/version/description are unverified for any single consumer. The agent-plugins.org standard is the real cross-vendor format but mandates a root plugin.json, not .plugin/.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": { "type": "string", "description": "Plugin identifier." },
|
|
10
|
+
"version": { "type": "string", "description": "Required by the vercel-plugin validator; the only real .plugin/plugin.json file declares it." },
|
|
11
|
+
"description": { "type": "string", "description": "Required by the vercel-plugin validator." },
|
|
12
|
+
"author": {
|
|
13
|
+
"anyOf": [
|
|
14
|
+
{ "type": "string" },
|
|
15
|
+
{
|
|
16
|
+
"type": "object",
|
|
17
|
+
"properties": { "name": { "type": "string" }, "email": { "type": "string" }, "url": { "type": "string" } },
|
|
18
|
+
"additionalProperties": true
|
|
19
|
+
}
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"homepage": { "type": "string" },
|
|
23
|
+
"repository": { "type": "string" },
|
|
24
|
+
"license": { "type": "string" },
|
|
25
|
+
"keywords": { "type": "array", "items": { "type": "string" } },
|
|
26
|
+
"category": { "type": "string" },
|
|
27
|
+
"tags": { "type": "array", "items": { "type": "string" } },
|
|
28
|
+
"agents": { "$ref": "#/$defs/pathList", "description": "Copilot CLI: path(s) to agent directories containing .agent.md files; default agents/." },
|
|
29
|
+
"skills": { "$ref": "#/$defs/pathList", "description": "Path(s) to skill directories containing SKILL.md; default skills/." },
|
|
30
|
+
"commands": { "$ref": "#/$defs/pathList", "description": "Path(s) to command directories." },
|
|
31
|
+
"hooks": { "anyOf": [{ "type": "string" }, { "type": "object" }], "description": "Copilot CLI reads hooks.json or hooks/hooks.json; other consumers use hooks/hooks.json." },
|
|
32
|
+
"extensions": {
|
|
33
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }, { "type": "object" }],
|
|
34
|
+
"description": "Copilot CLI extension directories, or { paths: [...], exclusive: true }."
|
|
35
|
+
},
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"anyOf": [{ "type": "string" }, { "type": "object" }],
|
|
38
|
+
"description": "Copilot CLI and the other .plugin/ consumers read .mcp.json; the agent-plugins.org standard uses mcp.json instead."
|
|
39
|
+
},
|
|
40
|
+
"lspServers": { "anyOf": [{ "type": "string" }, { "type": "object" }], "description": "Copilot CLI: path to an LSP configuration file, or inline server definitions." }
|
|
41
|
+
},
|
|
42
|
+
"required": ["name"],
|
|
43
|
+
"additionalProperties": true,
|
|
44
|
+
"$defs": {
|
|
45
|
+
"pathList": {
|
|
46
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Universal `.plugin/` layout specification (observed convention)
|
|
2
|
+
|
|
3
|
+
Reference contract for repositories using `.plugin/plugin.json`. Machine-readable companions: [plugin.schema.json](plugin.schema.json) and [marketplace.schema.json](marketplace.schema.json).
|
|
4
|
+
|
|
5
|
+
- **Verified:** 2026-09-08.
|
|
6
|
+
- **Upstream specification:** **none.** `.plugin/plugin.json` is an observed convention with several independent implementers, not a published format. The originating open-plugin specification is not public (`vercel-labs/plugins` returns 404). The real cross-vendor format exists but mandates a root `plugin.json` — see [../agent-plugins/spec.md](../agent-plugins/spec.md).
|
|
7
|
+
- **Evidence:** GitHub Copilot CLI official docs (`.plugin/plugin.json` is first in its lookup order); `OpenHands/software-agent-sdk` (`openhands/sdk/plugin/format/claude_code.py`, docs at `docs.openhands.dev/sdk/guides/plugins`); [`vercel/vercel-plugin`](https://github.com/vercel/vercel-plugin) (the only real `.plugin/plugin.json`, 682 bytes, with no component declaration fields); `aaif-goose/goose` (`crates/goose/src/plugins/formats/open_plugins.rs`).
|
|
8
|
+
|
|
9
|
+
## Implementers and precedence
|
|
10
|
+
|
|
11
|
+
| Implementer | Lookup order |
|
|
12
|
+
| -------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
13
|
+
| GitHub Copilot CLI | `.plugin/plugin.json` → `plugin.json` → `.github/plugin/plugin.json` → `.claude-plugin/plugin.json` |
|
|
14
|
+
| OpenHands SDK | `.plugin/plugin.json` → `.claude-plugin/plugin.json`; falls back to inferring a manifest from the directory name |
|
|
15
|
+
| goose | `.goose-plugin/plugin.json` → `.plugin/plugin.json` → `plugin.json` |
|
|
16
|
+
| vercel/vercel-plugin | Ships `.plugin/plugin.json` only |
|
|
17
|
+
|
|
18
|
+
Marketplace manifests: OpenHands checks `.plugin/marketplace.json` then `.claude-plugin/marketplace.json`; Copilot CLI checks `marketplace.json`, `.plugin/marketplace.json`, `.github/plugin/marketplace.json`, `.claude-plugin/marketplace.json`.
|
|
19
|
+
|
|
20
|
+
## Plugin manifest fields
|
|
21
|
+
|
|
22
|
+
There is no authoritative field list, so this schema is the union of the consumers. `vercel/vercel-plugin`'s validator requires `name`, `version`, and `description`; the only real file declares exactly those plus `author`, `repository`, `license`, and `keywords`, and **no component declaration fields at all** — components are discovered from directories.
|
|
23
|
+
|
|
24
|
+
When Copilot CLI reads `.plugin/plugin.json`, its own manifest schema applies: `name` (required, kebab-case, max 64), `description` (max 1024), `version`, `author`, `homepage`, `repository`, `license`, `keywords`, `category`, `tags`, `agents`, `skills`, `commands`, `hooks`, `extensions`, `mcpServers`, `lspServers`.
|
|
25
|
+
|
|
26
|
+
| Item | Copilot CLI | OpenHands | vercel-plugin | Agent Plugins (for contrast) |
|
|
27
|
+
| --- | --- | --- | --- | --- |
|
|
28
|
+
| Skills | `skills/` | `skills/<name>/SKILL.md`, flat `skills/*.md`, root `SKILL.md` | `skills/` | `skills/` (fixed) |
|
|
29
|
+
| Agents | `agents/` | `agents/*.md` | `agents/` | not defined |
|
|
30
|
+
| Commands | `commands/` | `commands/*.md` | `commands/` | not defined |
|
|
31
|
+
| Hooks | `hooks.json` or `hooks/hooks.json` | `hooks/hooks.json` | `hooks/hooks.json` | not defined |
|
|
32
|
+
| MCP | `.mcp.json`, `.github/mcp.json` | `.mcp.json` | `.mcp.json` | `mcp.json` (no dot) |
|
|
33
|
+
| LSP | `lspServers`, `lsp.json`, `.github/lsp.json`, `lsp-config/servers.json` | marketplace entries only | — | not defined |
|
|
34
|
+
|
|
35
|
+
## Marketplace manifest fields
|
|
36
|
+
|
|
37
|
+
The two consumers require different sets:
|
|
38
|
+
|
|
39
|
+
| Level | Field | OpenHands | Copilot CLI |
|
|
40
|
+
| --- | --- | --- | --- |
|
|
41
|
+
| top | `name` | required | required |
|
|
42
|
+
| top | `owner` | required | required |
|
|
43
|
+
| top | `plugins` | optional (default `[]`) | required |
|
|
44
|
+
| top | `skills` | optional skill entries | — |
|
|
45
|
+
| top | `description`, `metadata` | optional | optional |
|
|
46
|
+
| entry | `name`, `source` | required | required |
|
|
47
|
+
| entry | `strict` | default `true`; `false` lets the entry define the plugin inline | default `true` |
|
|
48
|
+
| entry | component fields (`commands`, `agents`, `hooks`, `mcpServers`, `lspServers`) | declared on the entry | declared on the entry |
|
|
49
|
+
| entry | metadata (`description`, `version`, `author`, `category`, `homepage`, `entry_command`, `license`, `keywords`, `tags`, `repository`) | accepted | accepted |
|
|
50
|
+
|
|
51
|
+
## Status
|
|
52
|
+
|
|
53
|
+
`.plugin/plugin.json` is not covered by any cross-vendor specification. Treat it as a compatibility layout: repositories that ship it are readable by Copilot CLI and OpenHands, but nothing guarantees field semantics beyond `name`. The portable standard is [agent-plugins.org v1](../agent-plugins/spec.md).
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/zcode/marketplace.schema.json",
|
|
4
|
+
"title": "ZCode Marketplace Manifest",
|
|
5
|
+
"description": "Marketplace catalog read by ZCode at .claude-plugin/marketplace.json or a repository-root marketplace.json (there is no .zcode-plugin/marketplace.json). Authored from the official authoring page, the official marketplace repository, and the shipped runtime; ZCode publishes no JSON Schema.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: https://zcode.z.ai/en/docs/plugin ; https://github.com/zai-org/zcode-plugins (marketplace.json, scripts/validate.py, docs/distribution.md) ; ZCode 3.11.2 runtime (marketplace lookup order, plugin-entry normalizer). The official marketplace validator additionally requires owner and description_i18n; the runtime also accepts plugins as an object map keyed by plugin name.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": { "type": "string", "description": "Marketplace identifier." },
|
|
10
|
+
"description": { "type": "string" },
|
|
11
|
+
"description_i18n": {
|
|
12
|
+
"type": "object",
|
|
13
|
+
"additionalProperties": { "type": "string" }
|
|
14
|
+
},
|
|
15
|
+
"owner": {
|
|
16
|
+
"type": "object",
|
|
17
|
+
"description": "Marketplace maintainer. Required by the official marketplace validator; not listed in the docs field table.",
|
|
18
|
+
"properties": {
|
|
19
|
+
"name": { "type": "string" },
|
|
20
|
+
"email": { "type": "string" },
|
|
21
|
+
"url": { "type": "string" }
|
|
22
|
+
},
|
|
23
|
+
"required": ["name"],
|
|
24
|
+
"additionalProperties": true
|
|
25
|
+
},
|
|
26
|
+
"version": { "description": "Seen in the wild as a number (for example 1) in per-plugin payload manifests." },
|
|
27
|
+
"pluginRoot": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"description": "Base directory for resolving relative plugin sources. Documented at the top level; the observed runtime reads metadata.pluginRoot and only surfaces a top-level value on already-normalized manifests."
|
|
30
|
+
},
|
|
31
|
+
"metadata": {
|
|
32
|
+
"type": "object",
|
|
33
|
+
"properties": {
|
|
34
|
+
"description": { "type": "string" },
|
|
35
|
+
"pluginRoot": { "type": "string" },
|
|
36
|
+
"version": { "type": "string" }
|
|
37
|
+
},
|
|
38
|
+
"additionalProperties": true
|
|
39
|
+
},
|
|
40
|
+
"featured": { "type": "array", "items": { "type": "string" }, "description": "Read by the runtime normalizer; not documented." },
|
|
41
|
+
"allowCrossMarketplaceDependenciesOn": { "type": "array", "items": { "type": "string" } },
|
|
42
|
+
"plugins": {
|
|
43
|
+
"description": "Plugin entries. Documented as an array; the observed runtime also accepts an object map keyed by plugin name.",
|
|
44
|
+
"anyOf": [
|
|
45
|
+
{ "type": "array", "items": { "$ref": "#/$defs/entry" } },
|
|
46
|
+
{ "type": "object", "additionalProperties": { "$ref": "#/$defs/entry" } }
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"required": ["name", "plugins"],
|
|
51
|
+
"additionalProperties": true,
|
|
52
|
+
"$defs": {
|
|
53
|
+
"entry": {
|
|
54
|
+
"type": "object",
|
|
55
|
+
"properties": {
|
|
56
|
+
"name": { "type": "string", "description": "Must match the plugin manifest name." },
|
|
57
|
+
"source": { "$ref": "#/$defs/source" },
|
|
58
|
+
"description": { "type": "string" },
|
|
59
|
+
"description_i18n": { "type": "object", "additionalProperties": { "type": "string" } },
|
|
60
|
+
"displayName": { "type": "string" },
|
|
61
|
+
"displayName_i18n": { "type": "object", "additionalProperties": { "type": "string" } },
|
|
62
|
+
"version": { "type": "string", "description": "Drives update checks; the installed version comes from the plugin's own manifest. Bump both." },
|
|
63
|
+
"author": {
|
|
64
|
+
"anyOf": [
|
|
65
|
+
{ "type": "string" },
|
|
66
|
+
{
|
|
67
|
+
"type": "object",
|
|
68
|
+
"properties": { "name": { "type": "string" }, "url": { "type": "string" } },
|
|
69
|
+
"additionalProperties": true
|
|
70
|
+
}
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"category": {
|
|
74
|
+
"description": "Discovery category. The official marketplace validator restricts this to developer-tools, productivity, utilities, guides, finance, template, other.",
|
|
75
|
+
"type": "string"
|
|
76
|
+
},
|
|
77
|
+
"tags": { "type": "array", "items": { "type": "string" } },
|
|
78
|
+
"keywords": { "type": "array", "items": { "type": "string" } },
|
|
79
|
+
"icon": { "type": "string" },
|
|
80
|
+
"homepage": { "type": "string" },
|
|
81
|
+
"privacyPolicy": { "type": "string" },
|
|
82
|
+
"termsOfService": { "type": "string" },
|
|
83
|
+
"heroImage": { "type": "string" },
|
|
84
|
+
"examplePrompts": { "type": "array", "items": { "type": "string" } },
|
|
85
|
+
"examplePrompts_i18n": { "type": "object", "additionalProperties": { "type": "array", "items": { "type": "string" } } },
|
|
86
|
+
"requiresPaidPlan": { "type": "boolean" },
|
|
87
|
+
"dependencies": { "type": "array", "items": { "type": "string" } },
|
|
88
|
+
"strict": { "type": "boolean", "description": "When false, ZCode synthesizes a plugin manifest from this entry if the plugin ships none." },
|
|
89
|
+
"cachePath": { "type": "string", "description": "Absolute cached plugin path; used with source \"filesystem\" in bundled marketplace manifests." },
|
|
90
|
+
"_artifact": {
|
|
91
|
+
"type": "object",
|
|
92
|
+
"description": "ZCode distribution extension: where the immutable zip artifact lives under the marketplace base URL.",
|
|
93
|
+
"properties": {
|
|
94
|
+
"path": { "type": "string" },
|
|
95
|
+
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
96
|
+
"size": { "type": "number" }
|
|
97
|
+
},
|
|
98
|
+
"additionalProperties": true
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
"required": ["name", "source"],
|
|
102
|
+
"additionalProperties": true
|
|
103
|
+
},
|
|
104
|
+
"source": {
|
|
105
|
+
"description": "Where the plugin lives. Documented forms plus runtime-observed forms.",
|
|
106
|
+
"anyOf": [
|
|
107
|
+
{ "type": "string", "description": "Relative subdirectory such as ./plugins/hello, or the runtime-only literal \"filesystem\" / \"sea\"." },
|
|
108
|
+
{
|
|
109
|
+
"type": "object",
|
|
110
|
+
"properties": { "source": { "const": "directory" }, "path": { "type": "string" } },
|
|
111
|
+
"required": ["source", "path"],
|
|
112
|
+
"additionalProperties": true
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"type": "object",
|
|
116
|
+
"properties": { "source": { "const": "github" }, "repo": { "type": "string" }, "path": { "type": "string" }, "ref": { "type": "string" } },
|
|
117
|
+
"required": ["source", "repo"],
|
|
118
|
+
"additionalProperties": true
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"type": "object",
|
|
122
|
+
"properties": { "source": { "const": "git" }, "url": { "type": "string" }, "path": { "type": "string" }, "ref": { "type": "string" } },
|
|
123
|
+
"required": ["source", "url"],
|
|
124
|
+
"additionalProperties": true
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"type": "object",
|
|
128
|
+
"properties": { "source": { "const": "git-subdir" }, "url": { "type": "string" }, "path": { "type": "string" }, "ref": { "type": "string" } },
|
|
129
|
+
"required": ["source", "url", "path"],
|
|
130
|
+
"additionalProperties": true
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"type": "object",
|
|
134
|
+
"properties": { "source": { "const": "file" }, "path": { "type": "string" } },
|
|
135
|
+
"required": ["source", "path"],
|
|
136
|
+
"additionalProperties": true
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"type": "object",
|
|
140
|
+
"properties": {
|
|
141
|
+
"source": { "const": "url" },
|
|
142
|
+
"url": { "type": "string" },
|
|
143
|
+
"type": { "enum": ["git", "zip"] },
|
|
144
|
+
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
|
|
145
|
+
"path": { "type": "string" },
|
|
146
|
+
"stripRoot": { "type": "boolean" },
|
|
147
|
+
"headers": { "type": "object", "additionalProperties": { "type": "string" } }
|
|
148
|
+
},
|
|
149
|
+
"required": ["source", "url"],
|
|
150
|
+
"additionalProperties": true
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"type": "object",
|
|
154
|
+
"properties": { "source": { "const": "npm" }, "package": { "type": "string" }, "version": { "type": "string" } },
|
|
155
|
+
"required": ["source", "package"],
|
|
156
|
+
"additionalProperties": true
|
|
157
|
+
}
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/zcode/plugin.schema.json",
|
|
4
|
+
"title": "ZCode Plugin Manifest",
|
|
5
|
+
"description": "Plugin manifest accepted by ZCode (Z.ai) at .zcode-plugin/plugin.json, .claude-plugin/plugin.json, or .codex-plugin/plugin.json. Authored from the official authoring page and the shipped runtime; ZCode publishes no JSON Schema. Unknown properties are ignored by the client, so this schema is open.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: https://zcode.z.ai/en/docs/plugin ; https://github.com/zai-org/zcode-plugins (docs/distribution.md, docs/PLUGIN_DEVELOPMENT.md, scripts/validate.py, plugins/example-plugin) ; ZCode 3.11.2 runtime constants (manifest candidate order). Fields channels/lspServers/outputStyles/settings are registered but diagnostic-only in the observed runtime.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"pattern": "^[a-z0-9][a-z0-9._-]{0,127}$",
|
|
12
|
+
"description": "Plugin identifier; 1-128 characters, lowercase."
|
|
13
|
+
},
|
|
14
|
+
"version": {
|
|
15
|
+
"type": "string",
|
|
16
|
+
"description": "Semantic version. The runtime defaults to \"0.0.0\" when absent. The official marketplace validator requires this to equal the marketplace entry version."
|
|
17
|
+
},
|
|
18
|
+
"description": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"description": "One-line description shown in the plugin manager."
|
|
21
|
+
},
|
|
22
|
+
"description_i18n": {
|
|
23
|
+
"type": "object",
|
|
24
|
+
"description": "Localized descriptions keyed by BCP-47 locale. Required for community submissions by the official marketplace validator (en and zh-CN), which also requires it to match the marketplace entry.",
|
|
25
|
+
"additionalProperties": { "type": "string" }
|
|
26
|
+
},
|
|
27
|
+
"author": {
|
|
28
|
+
"description": "Author as a bare name or a structured record.",
|
|
29
|
+
"anyOf": [
|
|
30
|
+
{ "type": "string" },
|
|
31
|
+
{
|
|
32
|
+
"type": "object",
|
|
33
|
+
"properties": {
|
|
34
|
+
"name": { "type": "string" },
|
|
35
|
+
"email": { "type": "string" },
|
|
36
|
+
"url": { "type": "string" }
|
|
37
|
+
},
|
|
38
|
+
"additionalProperties": true
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"homepage": { "type": "string" },
|
|
43
|
+
"repository": { "type": "string" },
|
|
44
|
+
"license": { "type": "string", "description": "SPDX identifier, e.g. MIT." },
|
|
45
|
+
"keywords": { "type": "array", "items": { "type": "string" } },
|
|
46
|
+
"commands": { "$ref": "#/$defs/component" },
|
|
47
|
+
"skills": { "$ref": "#/$defs/component" },
|
|
48
|
+
"agents": { "$ref": "#/$defs/component" },
|
|
49
|
+
"hooks": { "$ref": "#/$defs/component" },
|
|
50
|
+
"mcpServers": {
|
|
51
|
+
"description": "MCP servers: a path to a JSON file, an array of such paths, or an inline server map. Inline entries override same-named servers from .mcp.json.",
|
|
52
|
+
"$ref": "#/$defs/component"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"type": "array",
|
|
56
|
+
"description": "Other plugins required at enable time. A bare name resolves inside the declaring marketplace; use name@marketplace for another marketplace.",
|
|
57
|
+
"items": { "type": "string" }
|
|
58
|
+
},
|
|
59
|
+
"userConfig": {
|
|
60
|
+
"type": "object",
|
|
61
|
+
"description": "User-configurable options prompted when the plugin is enabled. Values are referenced as ${user_config.<key>} in MCP declarations and hooks.",
|
|
62
|
+
"additionalProperties": { "$ref": "#/$defs/userConfigOption" }
|
|
63
|
+
},
|
|
64
|
+
"channels": { "description": "Registered but diagnostic-only in the observed ZCode runtime; not executed." },
|
|
65
|
+
"lspServers": { "description": "Registered but diagnostic-only in the observed ZCode runtime; not executed." },
|
|
66
|
+
"outputStyles": { "description": "Registered but diagnostic-only in the observed ZCode runtime; not executed." },
|
|
67
|
+
"settings": { "description": "Registered but diagnostic-only in the observed ZCode runtime; not executed." }
|
|
68
|
+
},
|
|
69
|
+
"required": ["name"],
|
|
70
|
+
"additionalProperties": true,
|
|
71
|
+
"$defs": {
|
|
72
|
+
"component": {
|
|
73
|
+
"description": "Component declaration: a relative path, an array of relative paths, or an inline object. ZCode resolves relative paths against the plugin root.",
|
|
74
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }, { "type": "object" }]
|
|
75
|
+
},
|
|
76
|
+
"userConfigOption": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"properties": {
|
|
79
|
+
"type": { "enum": ["string", "number", "boolean", "directory", "file"] },
|
|
80
|
+
"title": { "type": "string" },
|
|
81
|
+
"description": { "type": "string" },
|
|
82
|
+
"default": { "type": ["string", "number", "boolean"] },
|
|
83
|
+
"required": { "type": "boolean" },
|
|
84
|
+
"sensitive": { "type": "boolean", "description": "Masked in the UI and not enterable interactively." }
|
|
85
|
+
},
|
|
86
|
+
"additionalProperties": false
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|