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,77 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/codex/plugin.schema.json",
|
|
4
|
+
"title": "Codex Plugin Manifest (legacy .codex-plugin dialect)",
|
|
5
|
+
"description": "Codex reads four manifest paths in order: root plugin.json when it declares the agent-plugins.org v1.0.0 $schema, then .codex-plugin/plugin.json, .claude-plugin/plugin.json, .cursor-plugin/plugin.json. This schema describes the legacy nested dialect; root plugin.json is validated by the vendored agent-plugins.org schema in schemas/1.0.0/plugin.schema.json. Authored from the OpenAI Codex source; OpenAI publishes no JSON Schema for the legacy dialect.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: openai/codex codex-rs/core-plugins/src/manifest.rs, codex-rs/utils/plugins/src/plugin_namespace.rs, codex-rs/exec-server-protocol/src/protocol.rs (DISCOVERABLE_PLUGIN_MANIFEST_PATHS), and the bundled plugin-creator skill (plugin-json-spec.md, validate_plugin.py). The runtime deserializer and the scaffold validator disagree: the runtime reads hooks and commands, while validate_plugin.py rejects both. Fields the runtime reads are marked; interface is required by the scaffold validator only.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": {
|
|
10
|
+
"type": "string",
|
|
11
|
+
"description": "Plugin identifier. Falls back to the plugin-root directory name when absent. Runtime pattern: [A-Za-z0-9_-]+(\\.[A-Za-z0-9_-]+)*."
|
|
12
|
+
},
|
|
13
|
+
"id": { "type": "string", "description": "Accepted by the scaffold validator only; not read by the runtime deserializer." },
|
|
14
|
+
"version": { "type": "string", "description": "Semantic version. The scaffold validator requires it; the runtime defaults to None. Cachebuster form: <base>+codex.<token>." },
|
|
15
|
+
"description": { "type": "string" },
|
|
16
|
+
"author": {
|
|
17
|
+
"type": "object",
|
|
18
|
+
"properties": {
|
|
19
|
+
"name": { "type": "string" },
|
|
20
|
+
"email": { "type": "string" },
|
|
21
|
+
"url": { "type": "string", "description": "Must be an absolute https:// URL per the scaffold validator." }
|
|
22
|
+
},
|
|
23
|
+
"required": ["name"],
|
|
24
|
+
"additionalProperties": true
|
|
25
|
+
},
|
|
26
|
+
"homepage": { "type": "string" },
|
|
27
|
+
"repository": { "type": "string" },
|
|
28
|
+
"license": { "type": "string" },
|
|
29
|
+
"keywords": { "type": "array", "items": { "type": "string" }, "default": [] },
|
|
30
|
+
"skills": { "$ref": "#/$defs/pathList", "description": "Relative ./ paths to skill directories or files. Supplements default discovery rather than replacing it." },
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"description": "A path to an MCP configuration file, or an inline server map. The scaffold validator requires a path that normalizes to exactly .mcp.json; mcp.json without the dot is not accepted.",
|
|
33
|
+
"anyOf": [{ "type": "string" }, { "type": "object" }]
|
|
34
|
+
},
|
|
35
|
+
"apps": {
|
|
36
|
+
"type": "string",
|
|
37
|
+
"description": "Path to a .app.json file. Must exist when declared; the file must contain {\"apps\": {\"<key>\": {\"id\": string, \"category\"?: string}}}."
|
|
38
|
+
},
|
|
39
|
+
"hooks": {
|
|
40
|
+
"description": "Path(s) to hooks file(s) or inline hook configuration. Read by the runtime; rejected by the scaffold validator.",
|
|
41
|
+
"anyOf": [{ "type": "string" }, { "type": "array" }, { "type": "object" }]
|
|
42
|
+
},
|
|
43
|
+
"commands": { "$ref": "#/$defs/pathList", "description": "Read by the runtime for install-time command-to-skill migration; rejected by the scaffold validator." },
|
|
44
|
+
"interface": {
|
|
45
|
+
"type": "object",
|
|
46
|
+
"description": "UI and listing block. Required by the scaffold validator; optional for the runtime.",
|
|
47
|
+
"properties": {
|
|
48
|
+
"displayName": { "type": "string" },
|
|
49
|
+
"shortDescription": { "type": "string" },
|
|
50
|
+
"longDescription": { "type": "string" },
|
|
51
|
+
"developerName": { "type": "string" },
|
|
52
|
+
"category": { "type": "string" },
|
|
53
|
+
"capabilities": { "type": "array", "items": { "type": "string" }, "default": [] },
|
|
54
|
+
"websiteURL": { "type": "string" },
|
|
55
|
+
"websiteUrl": { "type": "string", "description": "Alias of websiteURL." },
|
|
56
|
+
"privacyPolicyURL": { "type": "string" },
|
|
57
|
+
"termsOfServiceURL": { "type": "string" },
|
|
58
|
+
"defaultPrompt": {
|
|
59
|
+
"description": "Starter prompts. At most 3 are used; each is truncated at 128 characters.",
|
|
60
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
|
|
61
|
+
},
|
|
62
|
+
"brandColor": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" },
|
|
63
|
+
"composerIcon": { "type": "string", "description": "Asset path; must be a real file in the archive." },
|
|
64
|
+
"logo": { "type": "string" },
|
|
65
|
+
"logoDark": { "type": "string" },
|
|
66
|
+
"screenshots": { "type": "array", "items": { "type": "string" }, "description": "PNG only, under ./assets/.", "default": [] }
|
|
67
|
+
},
|
|
68
|
+
"additionalProperties": true
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"additionalProperties": true,
|
|
72
|
+
"$defs": {
|
|
73
|
+
"pathList": {
|
|
74
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Codex plugin and marketplace specification
|
|
2
|
+
|
|
3
|
+
Reference contract for Codex plugin repositories. Machine-readable companion: [marketplace.schema.json](marketplace.schema.json). The legacy nested manifest is described by [plugin.schema.json](plugin.schema.json); root `plugin.json` is validated by the vendored agent-plugins.org schema in [../1.0.0/plugin.schema.json](../1.0.0/plugin.schema.json).
|
|
4
|
+
|
|
5
|
+
- **Verified:** 2026-09-08 against the `openai/codex` source.
|
|
6
|
+
- **Evidence:** `codex-rs/core-plugins/src/manifest.rs` and `marketplace.rs`, `codex-rs/utils/plugins/src/plugin_namespace.rs`, `codex-rs/exec-server-protocol/src/protocol.rs`, `codex-rs/core-plugins/src/{installed_marketplaces,marketplace_add/source}.rs`, `codex-rs/cli/src/plugin_cmd.rs`, and the bundled `plugin-creator` skill (`plugin-json-spec.md`, `validate_plugin.py`). OpenAI's prose documentation (`developers.openai.com/plugins/build/plugins`) returns HTTP 403 to automated fetch, so every fact here rests on source.
|
|
7
|
+
- **Upstream JSON Schema:** none for the legacy manifest or the marketplace manifest. Root `plugin.json` uses the published agent-plugins.org v1.0.0 schema.
|
|
8
|
+
|
|
9
|
+
## Plugin manifest paths and precedence
|
|
10
|
+
|
|
11
|
+
First match wins:
|
|
12
|
+
|
|
13
|
+
| # | Path | Dialect |
|
|
14
|
+
| --- | ---------------------------- | -------------------------------------------------------------------------------------------------- |
|
|
15
|
+
| 1 | `plugin.json` | Agent Plugins, only when `$schema` is `https://agent-plugins.org/schemas/1.0.0/plugin.schema.json` |
|
|
16
|
+
| 2 | `.codex-plugin/plugin.json` | Legacy |
|
|
17
|
+
| 3 | `.claude-plugin/plugin.json` | Legacy |
|
|
18
|
+
| 4 | `.cursor-plugin/plugin.json` | Legacy |
|
|
19
|
+
|
|
20
|
+
A symlinked root `plugin.json` is rejected. When path 1 wins, Codex also reads `.codex-plugin/plugin.json` as an **overlay** and takes only its `apps`, `hooks`, and `interface` values.
|
|
21
|
+
|
|
22
|
+
In the Agent Plugins dialect Codex hard-codes the component locations `./skills` and `./mcp.json` (no leading dot) and accepts only `$schema`, `name`, `version`, `description`, `author`, `homepage`, `repository`, `license`, `keywords`, and `extensions`; `repository` and `license` are parsed and discarded, and only the `com.openai` namespace of `extensions` is read.
|
|
23
|
+
|
|
24
|
+
## Legacy manifest fields (`.codex-plugin/plugin.json`)
|
|
25
|
+
|
|
26
|
+
| Field | Type | Notes |
|
|
27
|
+
| --- | --- | --- |
|
|
28
|
+
| `name` | string | Falls back to the directory name; runtime pattern `[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)*`. |
|
|
29
|
+
| `id` | string | Scaffold validator only; not read by the runtime. |
|
|
30
|
+
| `version` | string | Required by the validator; cachebuster form `<base>+codex.<token>`. |
|
|
31
|
+
| `description`, `homepage`, `repository`, `license` | string | |
|
|
32
|
+
| `author` | `{name, email?, url?}` | `name` required by the validator; `url` must be absolute `https://`. |
|
|
33
|
+
| `keywords` | string[] | |
|
|
34
|
+
| `skills` | string \| string[] | Supplements default discovery. |
|
|
35
|
+
| `mcpServers` | string \| object | The validator requires a path normalizing to exactly `.mcp.json`; `mcp.json` without the dot is rejected. |
|
|
36
|
+
| `apps` | string | Path to `.app.json`, containing `{"apps": {"<key>": {"id", "category"?}}}`. |
|
|
37
|
+
| `hooks` | string \| string[] \| object \| object[] | Read by the runtime; rejected by the scaffold validator. |
|
|
38
|
+
| `commands` | string \| string[] | Read by the runtime for command-to-skill migration; rejected by the validator. |
|
|
39
|
+
| `interface` | object | Required by the validator: `displayName`, `shortDescription`, `longDescription`, `developerName`, `category`, `capabilities`, `defaultPrompt` (max 3 entries, 128 chars each). Optional: `websiteURL`/`websiteUrl`, `privacyPolicyURL`, `termsOfServiceURL`, `brandColor` (`#RRGGBB`), `composerIcon`, `logo`, `logoDark`, `screenshots` (PNG under `./assets/`). |
|
|
40
|
+
|
|
41
|
+
The runtime deserializer and the scaffold validator disagree (tracked upstream as `openai/codex#27141`).
|
|
42
|
+
|
|
43
|
+
## Marketplace manifest paths and precedence
|
|
44
|
+
|
|
45
|
+
First match wins: `.agents/plugins/marketplace.json` → `.agents/plugins/api_marketplace.json` → `.claude-plugin/marketplace.json` → `.cursor-plugin/marketplace.json`.
|
|
46
|
+
|
|
47
|
+
`~/.agents/plugins/marketplace.json` is the personal marketplace and needs no explicit add. Repo and team marketplaces are opt-in. Remote sources install under `$CODEX_HOME/.tmp/marketplaces/<name>/` and are recorded in `config.toml` under `[marketplaces.<name>]` with `source_type`, `source`, `ref`, and `sparse`.
|
|
48
|
+
|
|
49
|
+
CLI: `codex plugin marketplace add <source>` / `list` / `upgrade` / `remove`; `codex plugin add PLUGIN@MARKETPLACE` / `list` / `remove`. The `add` grammar accepts `owner/repo`, any git URL, an SSH URL, or a local directory; `--ref` and `--sparse` are git-only; a file is rejected.
|
|
50
|
+
|
|
51
|
+
## Marketplace fields
|
|
52
|
+
|
|
53
|
+
Top level: `name` (required, `[A-Za-z0-9_-]+`), `plugins` (required, ordered = render order), `interface.displayName` (optional).
|
|
54
|
+
|
|
55
|
+
Entry: `name` (required; must match the folder and manifest name), `source` (required), `category`, `policy`, plus any plugin-manifest field inlined as a flattened fallback.
|
|
56
|
+
|
|
57
|
+
`policy`: `installation` (`NOT_AVAILABLE` \| `AVAILABLE` \| `INSTALLED_BY_DEFAULT`, default `AVAILABLE`), `authentication` (`ON_INSTALL` \| `ON_USE`, default `ON_INSTALL`), `products` (empty array denies every product).
|
|
58
|
+
|
|
59
|
+
Sources — a bare string is a local relative path:
|
|
60
|
+
|
|
61
|
+
| Form | Shape |
|
|
62
|
+
| ------------ | ---------------------------------------------------------------------------- |
|
|
63
|
+
| `local` | `{source, path}` |
|
|
64
|
+
| `url` | `{source, url, path?, ref?, sha?}` |
|
|
65
|
+
| `git-subdir` | `{source, url, path, ref?, sha?}` |
|
|
66
|
+
| `npm` | `{source, package, version?, registry?}` |
|
|
67
|
+
| `github` | **Not supported** — the tagged enum has only Local, Url, GitSubdir, and Npm. |
|
|
68
|
+
|
|
69
|
+
GitHub shorthand `owner/repo` is normalized to `https://github.com/owner/repo.git` inside `url`/`git-subdir`.
|
|
70
|
+
|
|
71
|
+
## Directory layout
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
<plugin-root>/
|
|
75
|
+
├── .codex-plugin/plugin.json # manifest (or overlay)
|
|
76
|
+
├── .codex-plugin/migrated-command-skills/
|
|
77
|
+
├── skills/<name>/SKILL.md
|
|
78
|
+
├── hooks/
|
|
79
|
+
├── scripts/
|
|
80
|
+
├── assets/ # composerIcon, logo, logoDark, screenshots
|
|
81
|
+
├── .mcp.json
|
|
82
|
+
└── .app.json
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Codex has no LSP field and no LSP component location.
|
|
86
|
+
|
|
87
|
+
## Evidence gaps
|
|
88
|
+
|
|
89
|
+
1. OpenAI's prose documentation is not machine-readable, so no prose doc was quoted.
|
|
90
|
+
2. The runtime/validator disagreement on `hooks` and `commands` has no documented resolution.
|
|
91
|
+
3. No published schema exists for the legacy manifest or the marketplace manifest; `validate_plugin.py` claims to mirror an internal ingestion schema that is not public.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/cursor/marketplace.schema.json",
|
|
4
|
+
"title": "Cursor Marketplace Manifest",
|
|
5
|
+
"description": "Marketplace catalog read by Cursor at .cursor-plugin/marketplace.json in the repository root. Authored from the official Cursor plugin reference and the official plugin template; Cursor publishes no JSON Schema.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: https://cursor.com/docs/reference/plugins ; cursor/plugin-template/.cursor-plugin/marketplace.json ; real catalogs (tldraw/tldraw for metadata.pluginRoot, cloudflare/skills, huggingface/skills, NVIDIA/skills, wshobson/agents). The docs describe the entry source object only as \"object with path and options\" and leave the option set unspecified, so it is modeled as an object requiring path. When a per-plugin manifest exists, it is merged with the entry and manifest values take precedence.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": { "type": "string", "description": "Marketplace identifier (kebab-case)." },
|
|
10
|
+
"owner": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"properties": {
|
|
13
|
+
"name": { "type": "string" },
|
|
14
|
+
"email": { "type": "string" },
|
|
15
|
+
"url": { "type": "string", "description": "Used in real catalogs; not in the docs field table." }
|
|
16
|
+
},
|
|
17
|
+
"required": ["name"],
|
|
18
|
+
"additionalProperties": true
|
|
19
|
+
},
|
|
20
|
+
"plugins": { "type": "array", "maxItems": 500, "items": { "$ref": "#/$defs/entry" }, "description": "Plugin entries; at most 500." },
|
|
21
|
+
"metadata": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"properties": {
|
|
24
|
+
"description": { "type": "string" },
|
|
25
|
+
"version": { "type": "string" },
|
|
26
|
+
"pluginRoot": { "type": "string", "description": "Prefix path for all plugin sources; a bare source name resolves under it." }
|
|
27
|
+
},
|
|
28
|
+
"additionalProperties": true
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
"required": ["name", "owner", "plugins"],
|
|
32
|
+
"additionalProperties": true,
|
|
33
|
+
"$defs": {
|
|
34
|
+
"entry": {
|
|
35
|
+
"type": "object",
|
|
36
|
+
"properties": {
|
|
37
|
+
"name": { "type": "string", "description": "Kebab-case plugin name." },
|
|
38
|
+
"source": { "$ref": "#/$defs/source" },
|
|
39
|
+
"description": { "type": "string" },
|
|
40
|
+
"version": { "type": "string" },
|
|
41
|
+
"displayName": { "type": "string" },
|
|
42
|
+
"author": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"properties": { "name": { "type": "string" }, "email": { "type": "string" }, "url": { "type": "string" } },
|
|
45
|
+
"required": ["name"],
|
|
46
|
+
"additionalProperties": true
|
|
47
|
+
},
|
|
48
|
+
"homepage": { "type": "string" },
|
|
49
|
+
"repository": { "type": "string" },
|
|
50
|
+
"license": { "type": "string" },
|
|
51
|
+
"keywords": { "type": "array", "items": { "type": "string" } },
|
|
52
|
+
"logo": { "type": "string" },
|
|
53
|
+
"category": { "type": "string" },
|
|
54
|
+
"tags": { "type": "array", "items": { "type": "string" } },
|
|
55
|
+
"skills": { "$ref": "#/$defs/pathList" },
|
|
56
|
+
"rules": { "$ref": "#/$defs/pathList" },
|
|
57
|
+
"agents": { "$ref": "#/$defs/pathList" },
|
|
58
|
+
"commands": { "$ref": "#/$defs/pathList" },
|
|
59
|
+
"hooks": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
|
|
60
|
+
"mcpServers": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
|
|
61
|
+
"variables": { "type": "object", "description": "Variable schema; prefer the plugin manifest, whose values win when both are set." }
|
|
62
|
+
},
|
|
63
|
+
"required": ["name", "source"],
|
|
64
|
+
"additionalProperties": true
|
|
65
|
+
},
|
|
66
|
+
"source": {
|
|
67
|
+
"description": "Path to the plugin directory, or an object with path and options. Resolution: look for <source>/.cursor-plugin/plugin.json, merge it with this entry (manifest wins), then run component discovery inside the source directory.",
|
|
68
|
+
"anyOf": [
|
|
69
|
+
{ "type": "string" },
|
|
70
|
+
{
|
|
71
|
+
"type": "object",
|
|
72
|
+
"properties": { "path": { "type": "string" } },
|
|
73
|
+
"required": ["path"],
|
|
74
|
+
"additionalProperties": true
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
"pathList": {
|
|
79
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/cursor/plugin.schema.json",
|
|
4
|
+
"title": "Cursor Plugin Manifest",
|
|
5
|
+
"description": "Cursor Plugin manifest at .cursor-plugin/plugin.json. Cursor also loads the agent-plugins.org format from a root plugin.json, which the vendored schemas/1.0.0/plugin.schema.json covers. Authored from the official Cursor plugin reference and the official plugin template; Cursor publishes no JSON Schema.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: https://cursor.com/docs/reference/plugins ; cursor/plugin-template (.cursor-plugin/plugin.json) ; vercel/vercel-plugin. displayName and author.url are used by the official template and multiple vendor repos but are absent from the docs field table. Cursor documents no lspServers, outputStyles, workflows, userConfig, settings, strict, or dependencies for this manifest. A manifest field replaces folder discovery for that component; a root SKILL.md with no skills/ directory and no skills field loads as a single-skill plugin.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": { "type": "string", "description": "Lowercase kebab-case identifier (alphanumerics, hyphens, periods); must start and end with an alphanumeric character." },
|
|
10
|
+
"displayName": { "type": "string", "description": "UI label. Present in the official template and vendor manifests; missing from the docs field table." },
|
|
11
|
+
"description": { "type": "string" },
|
|
12
|
+
"version": { "type": "string", "description": "Semantic version." },
|
|
13
|
+
"author": {
|
|
14
|
+
"type": "object",
|
|
15
|
+
"properties": {
|
|
16
|
+
"name": { "type": "string" },
|
|
17
|
+
"email": { "type": "string" },
|
|
18
|
+
"url": { "type": "string", "description": "Used in the wild; not in the docs field table." }
|
|
19
|
+
},
|
|
20
|
+
"required": ["name"],
|
|
21
|
+
"additionalProperties": true
|
|
22
|
+
},
|
|
23
|
+
"homepage": { "type": "string" },
|
|
24
|
+
"repository": { "type": "string" },
|
|
25
|
+
"license": { "type": "string" },
|
|
26
|
+
"keywords": { "type": "array", "items": { "type": "string" } },
|
|
27
|
+
"logo": { "type": "string", "description": "Relative repository path resolved to raw.githubusercontent.com, or an absolute URL; relative is preferred." },
|
|
28
|
+
"rules": { "$ref": "#/$defs/pathList", "description": "Rule files or directories (.md, .mdc, .markdown). Default rules/." },
|
|
29
|
+
"agents": { "$ref": "#/$defs/pathList", "description": "Agent files or directories. Default agents/." },
|
|
30
|
+
"skills": { "$ref": "#/$defs/pathList", "description": "Skill directories. Default skills/." },
|
|
31
|
+
"commands": { "$ref": "#/$defs/pathList", "description": "Command files or directories (.md, .mdc, .markdown, .txt). Default commands/." },
|
|
32
|
+
"hooks": {
|
|
33
|
+
"description": "Path to a hooks configuration file or an inline hook configuration. Default hooks/hooks.json.",
|
|
34
|
+
"anyOf": [{ "type": "string" }, { "type": "object" }]
|
|
35
|
+
},
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"description": "Path, inline server map, or array of either. Overrides default mcp.json discovery.",
|
|
38
|
+
"anyOf": [{ "type": "string" }, { "type": "object" }, { "type": "array" }]
|
|
39
|
+
},
|
|
40
|
+
"variables": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"description": "JSON Schema declaring variable names only (never secret values). ${VAR} placeholders are substituted into mcp.json and similar files; values are configured by admins in the dashboard.",
|
|
43
|
+
"properties": {
|
|
44
|
+
"type": { "const": "object" },
|
|
45
|
+
"properties": { "type": "object" },
|
|
46
|
+
"required": { "type": "array", "items": { "type": "string" } }
|
|
47
|
+
},
|
|
48
|
+
"additionalProperties": true
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"required": ["name"],
|
|
52
|
+
"additionalProperties": true,
|
|
53
|
+
"$defs": {
|
|
54
|
+
"pathList": {
|
|
55
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Cursor plugin and marketplace specification
|
|
2
|
+
|
|
3
|
+
Reference contract for Cursor plugin repositories. Machine-readable companions: [plugin.schema.json](plugin.schema.json) and [marketplace.schema.json](marketplace.schema.json).
|
|
4
|
+
|
|
5
|
+
- **Verified:** 2026-09-08.
|
|
6
|
+
- **Evidence:** official reference pages [`cursor.com/docs/reference/plugins`](https://cursor.com/docs/reference/plugins) and [`cursor.com/docs/plugins`](https://cursor.com/docs/plugins); the official [`cursor/plugin-template`](https://github.com/cursor/plugin-template); real catalogs (`tldraw/tldraw`, `cloudflare/skills`, `huggingface/skills`, `NVIDIA/skills`, `wshobson/agents`, `vercel/vercel-plugin`).
|
|
7
|
+
- **Upstream JSON Schema:** none for `.cursor-plugin/plugin.json` or `.cursor-plugin/marketplace.json` (probed URLs return the SPA HTML). The agent-plugins.org schemas Cursor consumes are published upstream.
|
|
8
|
+
|
|
9
|
+
## Two accepted formats
|
|
10
|
+
|
|
11
|
+
Cursor loads a format by manifest location:
|
|
12
|
+
|
|
13
|
+
| Format | Manifest | Components |
|
|
14
|
+
| ----------------------------- | ---------------------------- | -------------------------------------------------------------------------------------------- |
|
|
15
|
+
| Agent Plugins (open standard) | root `plugin.json` | Skills and MCP only; validated by [../1.0.0/plugin.schema.json](../1.0.0/plugin.schema.json) |
|
|
16
|
+
| Cursor Plugin | `.cursor-plugin/plugin.json` | Skills, MCP, rules, agents, commands, hooks, variables |
|
|
17
|
+
|
|
18
|
+
Which format wins when both manifests exist is undocumented.
|
|
19
|
+
|
|
20
|
+
## Plugin manifest (`.cursor-plugin/plugin.json`)
|
|
21
|
+
|
|
22
|
+
Required: `name` — lowercase kebab-case with optional periods, starting and ending alphanumeric.
|
|
23
|
+
|
|
24
|
+
| Field | Type | Default | Notes |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| `name` | string | — | Plugin identifier. |
|
|
27
|
+
| `displayName` | string | — | Used by the official template and vendor repos; missing from the docs field table. |
|
|
28
|
+
| `description`, `version`, `homepage`, `repository`, `license` | string | — | |
|
|
29
|
+
| `author` | `{name, email?, url?}` | — | `url` is used in the wild but absent from the docs table. |
|
|
30
|
+
| `keywords` | string[] | — | |
|
|
31
|
+
| `logo` | string | — | Relative repository path (resolved to `raw.githubusercontent.com`) or absolute URL; relative is preferred. |
|
|
32
|
+
| `rules` | string \| string[] | `rules/` | `.md`, `.mdc`, `.markdown`. |
|
|
33
|
+
| `agents` | string \| string[] | `agents/` | |
|
|
34
|
+
| `skills` | string \| string[] | `skills/` | |
|
|
35
|
+
| `commands` | string \| string[] | `commands/` | `.md`, `.mdc`, `.markdown`, `.txt`. |
|
|
36
|
+
| `hooks` | string \| object | `hooks/hooks.json` | |
|
|
37
|
+
| `mcpServers` | string \| object \| string[] \| object[] | `mcp.json` | A manifest value overrides default discovery. |
|
|
38
|
+
| `variables` | object | — | JSON Schema declaring variable **names** only. `${VAR}` placeholders are substituted into `mcp.json`; values are set by admins in the dashboard. |
|
|
39
|
+
|
|
40
|
+
`variables` must be `{"type": "object", "properties": {...}}` and accepts only `type`, `title`, `description`, `default`, `enum`, `const`, `properties`, `required`, `items`, and common length/numeric constraints.
|
|
41
|
+
|
|
42
|
+
Cursor documents no `lspServers`, `outputStyles`, `workflows`, `userConfig`, `settings`, `strict`, or `dependencies` for this manifest. A manifest field replaces folder discovery for that component.
|
|
43
|
+
|
|
44
|
+
## Marketplace manifest (`.cursor-plugin/marketplace.json`)
|
|
45
|
+
|
|
46
|
+
Required: `name`, `owner`, `plugins` (max 500 entries).
|
|
47
|
+
|
|
48
|
+
| Field | Type | Notes |
|
|
49
|
+
| ---------- | --------------------------------------- | ------------------------------------------------------- |
|
|
50
|
+
| `name` | string | Marketplace identifier. |
|
|
51
|
+
| `owner` | `{name, email?}` | Real catalogs also use `url`. |
|
|
52
|
+
| `plugins` | array | At most 500 entries. |
|
|
53
|
+
| `metadata` | `{description?, version?, pluginRoot?}` | `pluginRoot` is the prefix path for all plugin sources. |
|
|
54
|
+
|
|
55
|
+
Entry fields: `name` (required), `source` (required), `description`, `version`, `author`, `homepage`, `repository`, `license`, `keywords`, `logo`, `category`, `tags`, `skills`, `rules`, `agents`, `commands`, `hooks`, `mcpServers`, `variables`.
|
|
56
|
+
|
|
57
|
+
`source` is "a path to the plugin directory, or an object with `path` and options" — the docs leave the option set unspecified. Resolution: look for `<source>/.cursor-plugin/plugin.json`, merge it with the entry (**manifest values take precedence**), then discover components inside the source directory using manifest paths where declared.
|
|
58
|
+
|
|
59
|
+
A bare source name resolves under `metadata.pluginRoot` (for example `tldraw/tldraw`: `pluginRoot: "apps/mcp-app/plugins"`, `source: "tldraw-mcp"`).
|
|
60
|
+
|
|
61
|
+
## Directory layout
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
my-plugin/
|
|
65
|
+
├── .cursor-plugin/plugin.json # required manifest
|
|
66
|
+
├── rules/ # .mdc files
|
|
67
|
+
├── skills/<name>/SKILL.md
|
|
68
|
+
├── agents/
|
|
69
|
+
├── commands/
|
|
70
|
+
├── hooks/hooks.json
|
|
71
|
+
├── mcp.json # documented default; the dot-file .mcp.json is not auto-discovered
|
|
72
|
+
├── assets/
|
|
73
|
+
└── scripts/
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Hook events include `sessionStart`, `sessionEnd`, `preToolUse`, `postToolUse`, `postToolUseFailure`, `subagentStart`, `subagentStop`, `beforeShellExecution`, `afterShellExecution`, `beforeMCPExecution`, `afterMCPExecution`, `beforeReadFile`, `afterFileEdit`, `beforeSubmitPrompt`, `preCompact`, `stop`, `afterAgentResponse`, `afterAgentThought`, `beforeTabFileRead`, `afterTabFileEdit`, and `workspaceOpen`; entries carry `command` and `matcher`.
|
|
77
|
+
|
|
78
|
+
## Precedence
|
|
79
|
+
|
|
80
|
+
1. Marketplace entry versus plugin manifest: manifest values win.
|
|
81
|
+
2. Component path versus discovery: a declared field replaces discovery for that component.
|
|
82
|
+
3. MCP: a manifest `mcpServers` value overrides `mcp.json` discovery.
|
|
83
|
+
4. Local development: `~/.cursor/plugins/local/<name>` loses to an installed marketplace plugin of the same name.
|
|
84
|
+
|
|
85
|
+
## Evidence gaps
|
|
86
|
+
|
|
87
|
+
1. `displayName` and `author.url` are used by official repos but missing from the docs table.
|
|
88
|
+
2. The marketplace entry `source` object's option set is unspecified.
|
|
89
|
+
3. Hook merge precedence (inline versus file, plugin versus project) is undocumented.
|
|
90
|
+
4. Format precedence when both a root `plugin.json` and `.cursor-plugin/plugin.json` exist is undocumented.
|
|
91
|
+
5. Whether Cursor auto-discovers `.mcp.json` (dot) is unverified; the documented default is `mcp.json`.
|
|
92
|
+
6. No LSP support is documented for Cursor plugins.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/github-copilot/marketplace.schema.json",
|
|
4
|
+
"title": "GitHub Copilot CLI Marketplace Manifest",
|
|
5
|
+
"description": "Marketplace catalog read by GitHub Copilot CLI, looked up as marketplace.json, .plugin/marketplace.json, .github/plugin/marketplace.json, then .claude-plugin/marketplace.json. Authored from the official CLI plugin reference; GitHub publishes no JSON Schema for this manifest.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Source: https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference (raw markdown in github/docs). Marketplace names must be kebab-case (dots accepted for Open Plugin Spec plugins) and max 64 chars; the marketplace's own name becomes its registration key.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"name": { "type": "string", "maxLength": 64, "description": "Kebab-case marketplace name; dots are also accepted for Open Plugin Spec plugins." },
|
|
10
|
+
"owner": {
|
|
11
|
+
"type": "object",
|
|
12
|
+
"properties": {
|
|
13
|
+
"name": { "type": "string" },
|
|
14
|
+
"email": { "type": "string" }
|
|
15
|
+
},
|
|
16
|
+
"required": ["name"],
|
|
17
|
+
"additionalProperties": true
|
|
18
|
+
},
|
|
19
|
+
"plugins": { "type": "array", "items": { "$ref": "#/$defs/entry" } },
|
|
20
|
+
"metadata": {
|
|
21
|
+
"type": "object",
|
|
22
|
+
"properties": {
|
|
23
|
+
"description": { "type": "string" },
|
|
24
|
+
"version": { "type": "string" },
|
|
25
|
+
"pluginRoot": { "type": "string" }
|
|
26
|
+
},
|
|
27
|
+
"additionalProperties": true
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"required": ["name", "owner", "plugins"],
|
|
31
|
+
"additionalProperties": true,
|
|
32
|
+
"$defs": {
|
|
33
|
+
"entry": {
|
|
34
|
+
"type": "object",
|
|
35
|
+
"properties": {
|
|
36
|
+
"name": { "type": "string", "maxLength": 64, "description": "Kebab-case plugin name; dots are also accepted for Open Plugin Spec plugins." },
|
|
37
|
+
"source": { "$ref": "#/$defs/source" },
|
|
38
|
+
"description": { "type": "string", "maxLength": 1024 },
|
|
39
|
+
"version": { "type": "string" },
|
|
40
|
+
"author": {
|
|
41
|
+
"type": "object",
|
|
42
|
+
"properties": { "name": { "type": "string" }, "email": { "type": "string" }, "url": { "type": "string" } },
|
|
43
|
+
"required": ["name"],
|
|
44
|
+
"additionalProperties": true
|
|
45
|
+
},
|
|
46
|
+
"homepage": { "type": "string" },
|
|
47
|
+
"repository": { "type": "string" },
|
|
48
|
+
"license": { "type": "string" },
|
|
49
|
+
"keywords": { "type": "array", "items": { "type": "string" } },
|
|
50
|
+
"category": { "type": "string" },
|
|
51
|
+
"tags": { "type": "array", "items": { "type": "string" } },
|
|
52
|
+
"commands": { "$ref": "#/$defs/pathList" },
|
|
53
|
+
"agents": { "$ref": "#/$defs/pathList" },
|
|
54
|
+
"skills": { "$ref": "#/$defs/pathList" },
|
|
55
|
+
"hooks": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
|
|
56
|
+
"mcpServers": {
|
|
57
|
+
"description": "MCP servers to activate when the plugin is installed; an inline server map or a path to a JSON configuration file. Used when the plugin source does not ship its own MCP configuration.",
|
|
58
|
+
"anyOf": [{ "type": "string" }, { "type": "object" }]
|
|
59
|
+
},
|
|
60
|
+
"lspServers": {
|
|
61
|
+
"description": "Path to LSP configuration or inline server definitions.",
|
|
62
|
+
"anyOf": [{ "type": "string" }, { "type": "object" }]
|
|
63
|
+
},
|
|
64
|
+
"strict": {
|
|
65
|
+
"type": "boolean",
|
|
66
|
+
"default": true,
|
|
67
|
+
"description": "When true (the default) plugins must conform to the full schema and validation rules; false enables relaxed validation for direct installs or legacy plugins."
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"required": ["name", "source"],
|
|
71
|
+
"additionalProperties": true
|
|
72
|
+
},
|
|
73
|
+
"source": {
|
|
74
|
+
"description": "A relative path string, or an object describing a GitHub repository or Git URL source.",
|
|
75
|
+
"anyOf": [
|
|
76
|
+
{ "type": "string" },
|
|
77
|
+
{
|
|
78
|
+
"type": "object",
|
|
79
|
+
"properties": {
|
|
80
|
+
"source": { "const": "github" },
|
|
81
|
+
"repo": { "type": "string" },
|
|
82
|
+
"ref": { "type": "string" },
|
|
83
|
+
"sha": { "type": "string", "pattern": "^[a-f0-9]{40}$", "description": "Full 40-character commit SHA; pins installs against force-pushes and moved tags." },
|
|
84
|
+
"path": { "type": "string" }
|
|
85
|
+
},
|
|
86
|
+
"required": ["source", "repo"],
|
|
87
|
+
"additionalProperties": true
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"type": "object",
|
|
91
|
+
"properties": {
|
|
92
|
+
"source": { "const": "url" },
|
|
93
|
+
"url": { "type": "string" },
|
|
94
|
+
"ref": { "type": "string" },
|
|
95
|
+
"sha": { "type": "string", "pattern": "^[a-f0-9]{40}$" },
|
|
96
|
+
"path": { "type": "string" }
|
|
97
|
+
},
|
|
98
|
+
"required": ["source", "url"],
|
|
99
|
+
"additionalProperties": true
|
|
100
|
+
}
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
"pathList": {
|
|
104
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -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/github-copilot/plugin.schema.json",
|
|
4
|
+
"title": "GitHub Copilot CLI Plugin Manifest",
|
|
5
|
+
"description": "Plugin manifest accepted by GitHub Copilot CLI, looked up as .plugin/plugin.json, plugin.json, .github/plugin/plugin.json, then .claude-plugin/plugin.json. Authored from the official CLI plugin reference; GitHub publishes no JSON Schema for this manifest.",
|
|
6
|
+
"$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Source: https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference (raw markdown in github/docs). Declaring the canonical agent-plugins.org $schema opts the plugin into Agent Plugins v1.0.0 additively; the extensions field then changes meaning. Unknown properties are reported and ignored.",
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"$schema": { "type": "string", "description": "Set to the agent-plugins.org v1.0.0 plugin schema URL to opt into Open Plugin Spec semantics." },
|
|
10
|
+
"name": {
|
|
11
|
+
"type": "string",
|
|
12
|
+
"maxLength": 64,
|
|
13
|
+
"description": "Kebab-case plugin name (letters, numbers, hyphens). Plugins opting into Open Plugin Spec support may also use dots, for example acme.tools."
|
|
14
|
+
},
|
|
15
|
+
"description": { "type": "string", "maxLength": 1024 },
|
|
16
|
+
"version": { "type": "string", "description": "Semantic version, e.g. 1.0.0." },
|
|
17
|
+
"author": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"properties": {
|
|
20
|
+
"name": { "type": "string" },
|
|
21
|
+
"email": { "type": "string" },
|
|
22
|
+
"url": { "type": "string" }
|
|
23
|
+
},
|
|
24
|
+
"required": ["name"],
|
|
25
|
+
"additionalProperties": true
|
|
26
|
+
},
|
|
27
|
+
"homepage": { "type": "string" },
|
|
28
|
+
"repository": { "type": "string" },
|
|
29
|
+
"license": { "type": "string" },
|
|
30
|
+
"keywords": { "type": "array", "items": { "type": "string" } },
|
|
31
|
+
"category": { "type": "string" },
|
|
32
|
+
"tags": { "type": "array", "items": { "type": "string" } },
|
|
33
|
+
"agents": { "$ref": "#/$defs/pathList", "description": "Path(s) to agent directories containing .agent.md files. Default agents/." },
|
|
34
|
+
"skills": { "$ref": "#/$defs/pathList", "description": "Path(s) to skill directories containing SKILL.md. Default skills/." },
|
|
35
|
+
"commands": { "$ref": "#/$defs/pathList", "description": "Path(s) to command directories." },
|
|
36
|
+
"hooks": {
|
|
37
|
+
"description": "Path to a hooks configuration file, or an inline hooks object.",
|
|
38
|
+
"anyOf": [{ "type": "string" }, { "type": "object" }]
|
|
39
|
+
},
|
|
40
|
+
"extensions": {
|
|
41
|
+
"description": "Path(s) to extension directories, or { paths: [...], exclusive: true } to suppress built-in extensions. In Open Plugin Spec mode the field has a different meaning.",
|
|
42
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }, { "type": "object" }]
|
|
43
|
+
},
|
|
44
|
+
"mcpServers": {
|
|
45
|
+
"description": "Path to an MCP configuration file such as .mcp.json, or inline server definitions.",
|
|
46
|
+
"anyOf": [{ "type": "string" }, { "type": "object" }]
|
|
47
|
+
},
|
|
48
|
+
"lspServers": {
|
|
49
|
+
"description": "Path to an LSP configuration file, or inline server definitions.",
|
|
50
|
+
"anyOf": [
|
|
51
|
+
{ "type": "string" },
|
|
52
|
+
{
|
|
53
|
+
"type": "object",
|
|
54
|
+
"properties": { "lspServers": { "type": "object", "additionalProperties": { "$ref": "#/$defs/lspServer" } } },
|
|
55
|
+
"additionalProperties": true
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"required": ["name"],
|
|
61
|
+
"additionalProperties": true,
|
|
62
|
+
"$defs": {
|
|
63
|
+
"pathList": {
|
|
64
|
+
"anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
|
|
65
|
+
},
|
|
66
|
+
"lspServer": {
|
|
67
|
+
"type": "object",
|
|
68
|
+
"description": "One language server. At least one of command, bash, or powershell is required. When both bash and powershell are given, the platform-appropriate one is selected automatically.",
|
|
69
|
+
"properties": {
|
|
70
|
+
"command": { "type": "string", "description": "Executable to launch the server." },
|
|
71
|
+
"bash": { "type": "string", "description": "Bash script for Linux/macOS, executed via bash -c SCRIPT." },
|
|
72
|
+
"powershell": { "type": "string", "description": "PowerShell script for Windows, executed via pwsh -c SCRIPT." },
|
|
73
|
+
"cwd": { "type": "string", "description": "Working directory; absolute or relative to the configuration file. Supports ${PLUGIN_ROOT}." },
|
|
74
|
+
"args": { "type": "array", "items": { "type": "string" }, "description": "Arguments for command; ignored for bash and powershell." },
|
|
75
|
+
"env": { "type": "object", "additionalProperties": { "type": "string" } },
|
|
76
|
+
"fileExtensions": {
|
|
77
|
+
"type": "object",
|
|
78
|
+
"additionalProperties": { "type": "string" },
|
|
79
|
+
"description": "Map of file extension to language id, for example { \".ts\": \"typescript\" }."
|
|
80
|
+
},
|
|
81
|
+
"rootUri": { "type": "string", "description": "Project root relative to the git root; default \".\"." },
|
|
82
|
+
"initializationOptions": { "description": "Options sent in the LSP initialize request." }
|
|
83
|
+
},
|
|
84
|
+
"required": ["fileExtensions"],
|
|
85
|
+
"anyOf": [{ "required": ["command"] }, { "required": ["bash"] }, { "required": ["powershell"] }],
|
|
86
|
+
"additionalProperties": true
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|