dsh-agent-plugins-market 0.9.2 → 0.10.0

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.
Files changed (53) hide show
  1. package/README.md +6 -6
  2. package/README.zh.md +6 -6
  3. package/client/client.js +116 -92
  4. package/client/client.js.map +1 -1
  5. package/lib/packages/market-catalog/src/scanning/archive.js +31 -0
  6. package/lib/packages/market-catalog/src/scanning/validate.js +18 -1
  7. package/lib/packages/market-mcp/src/runtime/mcp/bridge/connection.js +42 -23
  8. package/lib/packages/market-mcp/src/runtime/mcp/bridge/oauth.js +29 -2
  9. package/lib/packages/market-mcp/src/runtime/mcp/bridge/transport.js +8 -5
  10. package/lib/packages/market-runtime/src/runtime/agents/agent-role-router.js +2 -1
  11. package/lib/packages/market-runtime/src/runtime/agents/subagent-seam.js +29 -0
  12. package/lib/packages/market-runtime/src/runtime/agents/teammate-role-runtime.js +8 -2
  13. package/lib/packages/market-runtime/src/runtime/host/scoped-contributors.js +4 -0
  14. package/lib/packages/market-runtime/src/runtime/surfaces/project-runtime.js +4 -1
  15. package/lib/types/packages/market-mcp/src/runtime/mcp/bridge/connection.d.ts +4 -1
  16. package/lib/types/packages/market-mcp/src/runtime/mcp/bridge/oauth.d.ts +14 -0
  17. package/lib/types/packages/market-mcp/src/runtime/mcp/bridge/transport.d.ts +5 -1
  18. package/lib/types/packages/market-runtime/src/runtime/agents/agent-role-router.d.ts +2 -10
  19. package/lib/types/packages/market-runtime/src/runtime/agents/subagent-seam.d.ts +63 -0
  20. package/package.json +67 -62
  21. package/schemas/1.0.0/mcp.schema.json +0 -120
  22. package/schemas/1.0.0/plugin.schema.json +0 -65
  23. package/schemas/1.1.0/mcp.schema.json +0 -120
  24. package/schemas/1.1.0/plugin.schema.json +0 -65
  25. package/schemas/README.md +0 -79
  26. package/schemas/agent-plugins/spec.md +0 -62
  27. package/schemas/claude-code/marketplace.schema.json +0 -143
  28. package/schemas/claude-code/plugin.schema.json +0 -105
  29. package/schemas/claude-code/spec.md +0 -108
  30. package/schemas/codex/marketplace.schema.json +0 -78
  31. package/schemas/codex/plugin.schema.json +0 -77
  32. package/schemas/codex/spec.md +0 -91
  33. package/schemas/com.deepseek.harness/namespace.schema.json +0 -42
  34. package/schemas/com.deepseek.harness/spec.md +0 -52
  35. package/schemas/cursor/marketplace.schema.json +0 -82
  36. package/schemas/cursor/plugin.schema.json +0 -58
  37. package/schemas/cursor/spec.md +0 -92
  38. package/schemas/github-copilot/marketplace.schema.json +0 -107
  39. package/schemas/github-copilot/plugin.schema.json +0 -89
  40. package/schemas/github-copilot/spec.md +0 -105
  41. package/schemas/kimi/marketplace.schema.json +0 -38
  42. package/schemas/kimi/plugin.schema.json +0 -84
  43. package/schemas/kimi/spec.md +0 -94
  44. package/schemas/qoder/marketplace.schema.json +0 -115
  45. package/schemas/qoder/plugin.schema.json +0 -127
  46. package/schemas/qoder/spec.md +0 -111
  47. package/schemas/skill-collection/spec.md +0 -37
  48. package/schemas/universal/marketplace.schema.json +0 -98
  49. package/schemas/universal/plugin.schema.json +0 -49
  50. package/schemas/universal/spec.md +0 -53
  51. package/schemas/zcode/marketplace.schema.json +0 -161
  52. package/schemas/zcode/plugin.schema.json +0 -89
  53. package/schemas/zcode/spec.md +0 -102
@@ -1,91 +0,0 @@
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.
@@ -1,42 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://deepseek.com/schemas/dsh-agent-plugins-market/namespace.schema.json",
4
- "$comment": "Authored contract for the com.deepseek.harness client extension namespace (Agent Plugins §8.1). Documentation-grade: the runtime applies the strategy-chain rules in src/catalog, not this file. The extension namespace is client-defined by specification; this schema records what this manager reads.",
5
- "title": "com.deepseek.harness namespace extension data",
6
- "type": "object",
7
- "required": ["schemaVersion"],
8
- "additionalProperties": false,
9
- "properties": {
10
- "schemaVersion": {
11
- "type": "string",
12
- "const": "1.0.0",
13
- "description": "Namespace contract version the suite was written against. Only 1.0.0 is implemented; any other value skips both namespace seats and keeps the portable core."
14
- },
15
- "mcpServers": {
16
- "type": "object",
17
- "description": "Per-server client policy keyed by the server's own name in the suite's portable mcp.json. Names without a matching server are reported and ignored.",
18
- "additionalProperties": { "$ref": "#/$defs/serverPolicy" }
19
- }
20
- },
21
- "$defs": {
22
- "serverPolicy": {
23
- "type": "object",
24
- "additionalProperties": false,
25
- "properties": {
26
- "auth": {
27
- "type": "object",
28
- "description": "OAuth 2.1 authorization for Streamable HTTP / SSE servers that answer 401 with a challenge; the flow activates on the server's first 401.",
29
- "additionalProperties": false,
30
- "properties": {
31
- "enabled": { "type": "boolean", "default": true, "description": "Enable the OAuth flow (default true; false opts out explicitly)." },
32
- "scope": { "type": "string", "description": "Space-separated scope string requested during authorization." }
33
- }
34
- },
35
- "enabledTools": { "type": "array", "items": { "type": "string" }, "description": "Allow-list of model-facing tool names; absent means all tools." },
36
- "disabledTools": { "type": "array", "items": { "type": "string" }, "description": "Deny-list of model-facing tool names applied after the allow-list." },
37
- "startupTimeoutMs": { "type": "number", "exclusiveMinimum": 0, "description": "Milliseconds allowed between spawn and a completed MCP handshake before the mount fails." },
38
- "toolCallTimeoutMs": { "type": "number", "exclusiveMinimum": 0, "description": "Milliseconds allowed for one tool call before it is cancelled." }
39
- }
40
- }
41
- }
42
- }
@@ -1,52 +0,0 @@
1
- # com.deepseek.harness namespace contract
2
-
3
- The client extension namespace of this manager under the [Agent Plugins specification](https://agent-plugins.org/specification) §8. The namespace has two seats, which the specification leaves entirely to the owning client:
4
-
5
- 1. **Manifest data** — `plugin.json` → `extensions["com.deepseek.harness"]`, validated against [`namespace.schema.json`](namespace.schema.json).
6
- 2. **Extension directory** — the top-level `com.deepseek.harness/` directory.
7
-
8
- Both seats open only when the manifest data declares `"schemaVersion": "1.0.0"`. A suite that ships the directory without the declaration, or with an unsupported version, contributes its portable core only (`skills/`, `mcp.json`) and the directory is ignored with a scan note.
9
-
10
- ## Extension directory layout
11
-
12
- | Path | Surface |
13
- | --------------------------------------- | ----------------------------------------------------------------- |
14
- | `com.deepseek.harness/commands/*.md` | Slash commands |
15
- | `com.deepseek.harness/agents/*.md` | Agent roles |
16
- | `com.deepseek.harness/hooks/hooks.json` | Command hooks (Claude Code event-table shape) |
17
- | `com.deepseek.harness/lsp.json` | LSP server declarations (`lspServers` table or a bare server map) |
18
-
19
- ## What the namespace carries
20
-
21
- Everything a portable suite cannot express because the v1 format fixes its component set to Agent Skills and MCP, and closes the manifest:
22
-
23
- - **Commands, agent roles, hooks, LSP declarations.** The specification records these component types as outside the format "until their formats converge"; the namespace is where they live for this client.
24
- - **Per-server client policy** (`extensions["com.deepseek.harness"].mcpServers`): OAuth authorization, tool allow/deny lists, and timeout policies for servers declared in the portable `mcp.json`. The portable file stays schema-clean; client-specific fields ride the namespace, keyed by the server's own name.
25
-
26
- Namespace values are the suite's defaults rather than a ceiling the user cannot reach. A stored user override may set either timeout, and that value wins over the declaration; a user may add tool names to the deny list, while the allow-list and the suite's own deny entries stay in force. Tool filtering only ever tightens. The override record lives outside the suite checkout, so a package refresh never clobbers it and the namespace file stays source-owned. The host compatibility client (`@deepseek-ai/dsh-mcp-client`) enforces neither the tool lists nor a startup timeout, so a server mounted through it carries no such value; the built-in bridge is where those take effect.
27
-
28
- ## User-owned declarations
29
-
30
- `~/.agents/mcp.json` is local data rather than a distributable package. Keys this client does not know are stored back exactly as written, and the package-only rules — a closed server shape, bare command names, plugin-relative paths — do not apply to it. A suite's packaged `mcp.json` keeps every one of them, because a package carrying fields this client cannot honour is one it cannot promise to mount. `$schema` is optional here: a file another Agent tool wrote is read as this release's dialect when the key is absent, and a declared version this client does not recognize is rejected.
31
-
32
- The editor reads the same two seats a suite declares, for one server at a time: the portable definition under `mcpServers` and this client's policy under `com.deepseek.harness`. The form writes only the half it owns, so a field it has no control for — a key another client introduced, a policy entry the form does not show — survives both a form edit and a JSON edit. Only the policy entries the user changed are sent on save; an entry the document drops asks for inheritance.
33
-
34
- ## Failure behavior
35
-
36
- | Situation | Behavior |
37
- | ------------------------------------------------------- | ----------------------------------------------------------- |
38
- | Namespace value is not an object | Reported, ignored; plugin keeps loading |
39
- | `schemaVersion` missing or unsupported | Reported; both namespace seats skipped; portable core loads |
40
- | Directory exists but the manifest declares no namespace | Directory not read; scan note records it |
41
- | One command / agent / hook / LSP entry invalid | That entry skipped with a diagnostic; the rest load |
42
- | Namespace path resolves outside the plugin root | That path rejected (§4.1) |
43
-
44
- ## Placeholder rules
45
-
46
- Values inside the namespace seats expand `${PLUGIN_ROOT}`, `${PLUGIN_DATA}`, and `${NAME}` credential references — the namespace is client-owned data, so the credential seam the portable `mcp.json` forbids (§9.2) is available here. Missing credential references fail that surface closed with a diagnostic.
47
-
48
- ## Provenance
49
-
50
- - Sources: [Agent Plugins specification](https://agent-plugins.org/specification) §8 (client extensions), §9.2 (placeholder expansion), and the runtime behavior of `packages/market-catalog/src/scanning/manifests.ts` (manifest seat) and `packages/market-catalog/src/scanning/scan-resolvers.ts` (directory seat).
51
- - Verified: 2026-09-17 against `agentplugins/agent-plugins-spec` `ff8ab5e` (1.0.0 published, 1.1.0 working draft).
52
- - Unresolved: none. The specification assigns no semantics to namespace contents, so every rule above is this client's own contract and can evolve by bumping `schemaVersion`.
@@ -1,82 +0,0 @@
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
- }
@@ -1,58 +0,0 @@
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
- }
@@ -1,92 +0,0 @@
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.
@@ -1,107 +0,0 @@
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
- }
@@ -1,89 +0,0 @@
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
- }