dsh-agent-plugins-market 0.9.2 → 0.11.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 (78) hide show
  1. package/README.md +6 -6
  2. package/README.zh.md +6 -6
  3. package/client/client.js +339 -223
  4. package/client/client.js.map +1 -1
  5. package/lib/packages/market-bundle/src/application/catalog.js +8 -0
  6. package/lib/packages/market-bundle/src/index.js +4 -4
  7. package/lib/packages/market-bundle/src/platform/settings-namespace.js +4 -16
  8. package/lib/packages/market-bundle/src/platform/settings-schema.js +6 -6
  9. package/lib/packages/market-bundle/src/routes.js +14 -0
  10. package/lib/packages/market-catalog/src/scanning/archive.js +31 -0
  11. package/lib/packages/market-catalog/src/scanning/validate.js +18 -1
  12. package/lib/packages/market-contracts/src/contracts/market.js +1 -0
  13. package/lib/packages/market-contracts/src/contracts/settings.js +20 -43
  14. package/lib/packages/market-contracts/src/ports/ports.js +1 -0
  15. package/lib/packages/market-mcp/src/application/mcp/mcp-direct-config.js +28 -0
  16. package/lib/packages/market-mcp/src/application/mcp/mcp-status.js +36 -8
  17. package/lib/packages/market-mcp/src/application/mcp-service.js +44 -3
  18. package/lib/packages/market-mcp/src/runtime/mcp/bridge/connection.js +42 -23
  19. package/lib/packages/market-mcp/src/runtime/mcp/bridge/oauth.js +29 -2
  20. package/lib/packages/market-mcp/src/runtime/mcp/bridge/transport.js +8 -5
  21. package/lib/packages/market-runtime/src/runtime/agents/agent-role-router.js +2 -1
  22. package/lib/packages/market-runtime/src/runtime/agents/subagent-seam.js +29 -0
  23. package/lib/packages/market-runtime/src/runtime/agents/teammate-role-runtime.js +8 -2
  24. package/lib/packages/market-runtime/src/runtime/core/reconciler.js +12 -0
  25. package/lib/packages/market-runtime/src/runtime/host/scoped-contributors.js +4 -0
  26. package/lib/packages/market-runtime/src/runtime/surfaces/project-runtime.js +4 -1
  27. package/lib/types/packages/market-bundle/src/application/catalog.d.ts +6 -0
  28. package/lib/types/packages/market-bundle/src/index.d.ts +1 -1
  29. package/lib/types/packages/market-bundle/src/platform/settings-namespace.d.ts +4 -18
  30. package/lib/types/packages/market-bundle/src/platform/settings-schema.d.ts +6 -6
  31. package/lib/types/packages/market-contracts/src/contracts/market.d.ts +1 -0
  32. package/lib/types/packages/market-contracts/src/contracts/mcp-status.d.ts +16 -0
  33. package/lib/types/packages/market-contracts/src/contracts/settings.d.ts +15 -39
  34. package/lib/types/packages/market-contracts/src/ports/ports.d.ts +11 -0
  35. package/lib/types/packages/market-contracts/src/ports/queries.d.ts +2 -0
  36. package/lib/types/packages/market-mcp/src/application/mcp/mcp-direct-config.d.ts +12 -0
  37. package/lib/types/packages/market-mcp/src/application/mcp/mcp-status.d.ts +8 -2
  38. package/lib/types/packages/market-mcp/src/application/mcp-service.d.ts +12 -0
  39. package/lib/types/packages/market-mcp/src/runtime/mcp/bridge/connection.d.ts +4 -1
  40. package/lib/types/packages/market-mcp/src/runtime/mcp/bridge/oauth.d.ts +14 -0
  41. package/lib/types/packages/market-mcp/src/runtime/mcp/bridge/transport.d.ts +5 -1
  42. package/lib/types/packages/market-runtime/src/runtime/agents/agent-role-router.d.ts +2 -10
  43. package/lib/types/packages/market-runtime/src/runtime/agents/subagent-seam.d.ts +63 -0
  44. package/lib/types/packages/market-runtime/src/runtime/core/reconciler.d.ts +13 -0
  45. package/package.json +67 -62
  46. package/schemas/1.0.0/mcp.schema.json +0 -120
  47. package/schemas/1.0.0/plugin.schema.json +0 -65
  48. package/schemas/1.1.0/mcp.schema.json +0 -120
  49. package/schemas/1.1.0/plugin.schema.json +0 -65
  50. package/schemas/README.md +0 -79
  51. package/schemas/agent-plugins/spec.md +0 -62
  52. package/schemas/claude-code/marketplace.schema.json +0 -143
  53. package/schemas/claude-code/plugin.schema.json +0 -105
  54. package/schemas/claude-code/spec.md +0 -108
  55. package/schemas/codex/marketplace.schema.json +0 -78
  56. package/schemas/codex/plugin.schema.json +0 -77
  57. package/schemas/codex/spec.md +0 -91
  58. package/schemas/com.deepseek.harness/namespace.schema.json +0 -42
  59. package/schemas/com.deepseek.harness/spec.md +0 -52
  60. package/schemas/cursor/marketplace.schema.json +0 -82
  61. package/schemas/cursor/plugin.schema.json +0 -58
  62. package/schemas/cursor/spec.md +0 -92
  63. package/schemas/github-copilot/marketplace.schema.json +0 -107
  64. package/schemas/github-copilot/plugin.schema.json +0 -89
  65. package/schemas/github-copilot/spec.md +0 -105
  66. package/schemas/kimi/marketplace.schema.json +0 -38
  67. package/schemas/kimi/plugin.schema.json +0 -84
  68. package/schemas/kimi/spec.md +0 -94
  69. package/schemas/qoder/marketplace.schema.json +0 -115
  70. package/schemas/qoder/plugin.schema.json +0 -127
  71. package/schemas/qoder/spec.md +0 -111
  72. package/schemas/skill-collection/spec.md +0 -37
  73. package/schemas/universal/marketplace.schema.json +0 -98
  74. package/schemas/universal/plugin.schema.json +0 -49
  75. package/schemas/universal/spec.md +0 -53
  76. package/schemas/zcode/marketplace.schema.json +0 -161
  77. package/schemas/zcode/plugin.schema.json +0 -89
  78. package/schemas/zcode/spec.md +0 -102
@@ -1,65 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://agent-plugins.org/schemas/1.1.0/plugin.schema.json",
4
- "title": "Agent Plugins Manifest",
5
- "description": "Machine-readable schema for plugin.json in Agent Plugins 1.1.0. The Agent Plugins specification defines additional semantic and operational requirements.",
6
- "type": "object",
7
- "properties": {
8
- "$schema": {
9
- "const": "https://agent-plugins.org/schemas/1.1.0/plugin.schema.json",
10
- "description": "Canonical identifier of the plugin manifest schema for the Agent Plugins version targeted by this document."
11
- },
12
- "name": {
13
- "type": "string",
14
- "minLength": 1,
15
- "maxLength": 64,
16
- "pattern": "^(?!.*(?:--|\\.\\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$",
17
- "description": "Human-readable plugin name."
18
- },
19
- "version": {
20
- "type": "string"
21
- },
22
- "description": {
23
- "type": "string"
24
- },
25
- "author": {
26
- "type": "object",
27
- "properties": {
28
- "name": {
29
- "type": "string"
30
- },
31
- "email": {
32
- "type": "string"
33
- },
34
- "url": {
35
- "type": "string"
36
- }
37
- },
38
- "additionalProperties": false
39
- },
40
- "homepage": {
41
- "type": "string"
42
- },
43
- "repository": {
44
- "type": "string"
45
- },
46
- "license": {
47
- "type": "string"
48
- },
49
- "keywords": {
50
- "type": "array",
51
- "items": {
52
- "type": "string"
53
- }
54
- },
55
- "extensions": {
56
- "type": "object",
57
- "description": "Client-specific manifest data keyed by reverse-domain extension namespace. Agent Plugins assigns no semantics to namespace object contents.",
58
- "additionalProperties": {
59
- "type": "object"
60
- }
61
- }
62
- },
63
- "required": ["$schema", "name"],
64
- "additionalProperties": false
65
- }
package/schemas/README.md DELETED
@@ -1,79 +0,0 @@
1
- # Plugin manifest and marketplace specifications
2
-
3
- This directory is the specification library for the plugin layouts this manager reads. It holds three kinds of files:
4
-
5
- 1. **Vendored upstream schemas** in [`1.0.0/`](1.0.0/) and [`1.1.0/`](1.1.0/) — pinned copies of the official agent-plugins.org schemas (1.0.0 published, 1.1.0 the working draft this manager explicitly recognizes as compatible; the two releases' schemas differ only in the version string). These are bundled into the published package and loaded at runtime by [`packages/market-catalog/src/scanning/validate.ts`](../packages/market-catalog/src/scanning/validate.ts), because the specification requires clients to validate plugin packages without retrieving schemas at load time (§7.2.1: "Clients MUST NOT retrieve a schema while loading a plugin").
6
- 2. **Reference contracts** in `<dialect>/` — an authored JSON Schema pair plus a `spec.md` for each layout the manager recognizes. **These are documentation, not runtime validators**: the scanner still applies the strategy-chain rules in `src/catalog/`. They exist so a dialect's field set, file locations, and evidence are pinned in one place.
7
- 3. **The client extension namespace contract** in [`com.deepseek.harness/`](com.deepseek.harness/) — the authored schema and rules for this manager's own §8 namespace: manifest data under `extensions["com.deepseek.harness"]` and the top-level `com.deepseek.harness/` extension directory.
8
-
9
- Every authored schema records its provenance in a `$comment`, and every dialect's `spec.md` records the sources, the verification date, and the unresolved gaps.
10
-
11
- ## Layout
12
-
13
- ```text
14
- schemas/
15
- ├── 1.0.0/ # vendored agent-plugins.org v1.0.0 (runtime-loaded)
16
- │ ├── plugin.schema.json
17
- │ └── mcp.schema.json
18
- ├── 1.1.0/ # vendored agent-plugins.org v1.1.0 working draft (runtime-loaded)
19
- ├── agent-plugins/spec.md # the published cross-vendor standard (schemas live in 1.0.0/ and 1.1.0/)
20
- ├── com.deepseek.harness/ # this manager's §8 client extension namespace
21
- │ ├── namespace.schema.json
22
- │ └── spec.md
23
- ├── skill-collection/spec.md # manifest-less layout; nothing to validate
24
- └── <dialect>/
25
- ├── plugin.schema.json
26
- ├── marketplace.schema.json
27
- └── spec.md
28
- ```
29
-
30
- ## Dialect index
31
-
32
- This table records **upstream client conventions**, including their own fallback orders; it does not define this plugin's discovery priority. DSH uses one shared layout order for suite manifests and Marketplace catalogs, shown on the [compatible plugins page](https://sivan757.github.io/dsh-agent-plugins-market/compatible-plugins/#shared-layout-precedence). Catalogs without a dedicated layout use root `marketplace.json` as the final fallback.
33
-
34
- | Dialect | Upstream plugin manifest conventions | Upstream marketplace conventions | Upstream schema |
35
- | --- | --- | --- | --- |
36
- | [Claude Code](claude-code/spec.md) | `.claude-plugin/plugin.json` (optional) | `.claude-plugin/marketplace.json`, or any `marketplace.json` added by path/URL | None; the URL the official catalog declares returns 404 |
37
- | [Codex](codex/spec.md) | `plugin.json` (agent-plugins `$schema`) → `.codex-plugin/` → `.claude-plugin/` → `.cursor-plugin/` | `.agents/plugins/marketplace.json` → `.agents/plugins/api_marketplace.json` → `.claude-plugin/` → `.cursor-plugin/` | agent-plugins v1.0.0 for root `plugin.json`; none otherwise |
38
- | [Cursor](cursor/spec.md) | `.cursor-plugin/plugin.json`, or root `plugin.json` (agent-plugins) | `.cursor-plugin/marketplace.json` | None for `.cursor-plugin/`; agent-plugins v1.0.0 for root |
39
- | [Kimi (kimi-code)](kimi/spec.md) | `kimi.plugin.json` → `.kimi-plugin/plugin.json` | `KIMI_CODE_PLUGIN_MARKETPLACE_URL`, default `https://code.kimi.com/kimi-code/plugins/marketplace.json` | None reachable; the declared URI serves HTML |
40
- | [Kimi (kimi-cli, legacy)](kimi/spec.md#kimi-cli-legacy-a-different-format) | `plugin.json` with a `tools` array | None | None |
41
- | [Universal `.plugin/`](universal/spec.md) | `.plugin/plugin.json` | `.plugin/marketplace.json` | None — an observed convention, not a specification |
42
- | [agent-plugins.org v1](agent-plugins/spec.md) | `plugin.json` (required) | Vendor-specific; not part of the standard. This manager reads `.claude-plugin/marketplace.json`, root `marketplace.json`, or rooted discovery with no catalog | **Vendored 1.0.0 and 1.1.0** |
43
- | [Skill collection](skill-collection/spec.md) | None | None | n/a |
44
- | [ZCode](zcode/spec.md) | `.zcode-plugin/plugin.json` → `.claude-plugin/` → `.codex-plugin/` | `.claude-plugin/marketplace.json` → `marketplace.json` | None |
45
- | [Qoder CLI](qoder/spec.md) | `.qoder-plugin/plugin.json` → `.claude-plugin/plugin.json` | `.qoder-plugin/marketplace.json` → `.claude-plugin/` → `marketplace.json` | None |
46
- | [GitHub Copilot CLI](github-copilot/spec.md) | `.plugin/plugin.json` → `plugin.json` → `.github/plugin/plugin.json` → `.claude-plugin/` | `marketplace.json` → `.plugin/` → `.github/plugin/` → `.claude-plugin/` | None; agent-plugins optional via `$schema` |
47
-
48
- ## Cross-dialect conventions
49
-
50
- These are the points where the layouts actually differ; they cause the most silent failures.
51
-
52
- | Dialect | MCP configuration | Hooks |
53
- | -------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
54
- | Claude Code | `.mcp.json`; inline `mcpServers` is additive | `hooks/hooks.json` or inline |
55
- | Codex | legacy: `.mcp.json` (validator rejects `mcp.json`); agent-plugins dialect: `mcp.json` | manifest `hooks` or `hooks/` |
56
- | Cursor | `mcp.json` (dot-file only via an explicit `mcpServers` field) | `hooks/hooks.json` or inline |
57
- | Kimi (kimi-code) | inline `mcpServers` only | inline `hooks` array |
58
- | Universal `.plugin/` | `.mcp.json`, `.github/mcp.json` | `hooks.json` or `hooks/hooks.json` |
59
- | agent-plugins.org v1 | `mcp.json` (optional — a skills-only suite is conformant), closed; inline is forbidden | `com.deepseek.harness/hooks/hooks.json` (namespace contract) |
60
- | ZCode | `.mcp.json` only | `hooks/hooks.json` |
61
- | Qoder CLI | `.mcp.json` → `mcp.json` (never merged) | `hooks/hooks.json` |
62
- | GitHub Copilot CLI | `.mcp.json`, `.github/mcp.json` | `hooks.json` or `hooks/hooks.json` |
63
-
64
- Claude Code and Copilot (including the Universal convention) define usable LSP declarations. Qoder/ZCode record the field without native execution. Cursor, Codex, Kimi and agent-plugins do not define a native LSP surface; this manager reads agent-plugins LSP declarations from the [`com.deepseek.harness` namespace](com.deepseek.harness/spec.md), its own §8 extension rather than an upstream feature.
65
-
66
- ## Executable coverage
67
-
68
- All ten active layouts are covered by [offline README repository tests](../tests/real-layouts.test.ts). Fixtures retain original Git blobs, commit IDs, hashes and licenses. Competing manifests are removed at every suite root in isolated cases, and the scanner reports the productive marketplace rather than inferring it from file presence. [Component contract tests](../tests/component-declarations.test.ts) cover path/array/inline forms and validation failures. See the [coverage audit](../docs/user/layout-coverage.md) for the exact boundary between layout compatibility and vendor-native runtime behavior.
69
-
70
- ## Provenance and update policy
71
-
72
- - `1.0.0/*.schema.json` and `1.1.0/*.schema.json` are vendored. Replace the files from [`agentplugins/agent-plugins-spec`](https://github.com/agentplugins/agent-plugins-spec) at the pinned spec versions and bump the spec-version references in `packages/market-catalog/src/scanning/validate.ts`. Never edit them by hand.
73
- - `<dialect>/*.schema.json` and `spec.md` are authored here. They are **not** upstream copies and carry no upstream compatibility guarantee. When a cited source changes, re-verify and update the schema, the `spec.md`, and the `$comment` provenance line together.
74
- - `agent-plugins/spec.md` documents the published standard but deliberately keeps its schemas in `1.0.0/` and `1.1.0/` so there is exactly one copy of each release in the tree.
75
- - `com.deepseek.harness/` is authored here and owned here: it defines this manager's own §8 namespace, so its evolution is governed by the namespace `schemaVersion`, not by upstream releases.
76
-
77
- ## Validation
78
-
79
- `tests/schemas.test.ts` compiles every schema with Ajv 2020-12, asserts `$id` uniqueness, pins the vendored ids to the runtime constants in `packages/market-catalog/src/scanning/validate.ts`, and requires each dialect to keep a `spec.md` and a paired marketplace schema (the vendored release directories and the namespace contract keep their own documented shape instead). Run `pnpm run test` after touching this directory; run `pnpm run format:check` for formatting.
@@ -1,62 +0,0 @@
1
- # Agent Plugins (agent-plugins.org) v1 specification
2
-
3
- The only published cross-vendor plugin format in this directory. Unlike the other dialects, its schemas are **vendored upstream** and loaded at runtime by this plugin.
4
-
5
- - **Schemas:** [`../1.0.0/plugin.schema.json`](../1.0.0/plugin.schema.json), [`../1.0.0/mcp.schema.json`](../1.0.0/mcp.schema.json), [`../1.1.0/plugin.schema.json`](../1.1.0/plugin.schema.json), [`../1.1.0/mcp.schema.json`](../1.1.0/mcp.schema.json)
6
- - **Specification:** https://agent-plugins.org/specification
7
- - **Repository:** [`agentplugins/agent-plugins-spec`](https://github.com/agentplugins/agent-plugins-spec) (`spec/1.0.0.md`, `spec/1.1.0.md`, `schemas/1.0.0/`, `schemas/1.1.0/`)
8
- - **Status:** 1.0.0 published; 1.1.0 is a working draft whose schemas differ from 1.0.0 only in the version string (verified 2026-09-17 at upstream `ff8ab5e`); the spec text additionally renames two phrasings ("claiming conformance to Agent Plugins v1" → "claiming conformance", "Agent Plugins v1 defines no OAuth" → "This specification defines no OAuth"). This manager explicitly recognizes 1.1.0 as compatible (§5.2) and validates each version against its own vendored schemas.
9
- - **Runtime use:** `packages/market-catalog/src/scanning/validate.ts` loads all four vendored schemas through Ajv and selects the validator by the manifest's declared `$schema`; `packages/market-catalog/src/scanning/manifests.ts` selects this dialect only when a root `plugin.json` declares a recognized `$schema`. Client-specific behavior beyond the portable core lives in the [`com.deepseek.harness` namespace](../com.deepseek.harness/spec.md).
10
-
11
- ## Manifest location
12
-
13
- Normative (§5.1): clients MUST check for a manifest at `plugin.json` in the plugin root. The core specification defines exactly one portable manifest per plugin, and no other file can replace, supplement, or override its core fields. The specification text contains no reference to `.plugin/`, `.codex-plugin/`, `.claude-plugin/`, `.cursor-plugin/`, or `.kimi-plugin/`.
14
-
15
- ## Plugin manifest fields
16
-
17
- Closed schema: `additionalProperties: false`, `required: ["$schema", "name"]`, and no `default` keyword anywhere. Per §5.2 an unknown top-level field is reported and ignored while the plugin keeps loading; any other schema violation is fatal.
18
-
19
- | Field | Type | Required | Constraints |
20
- | --- | --- | --- | --- |
21
- | `$schema` | string | yes | `const`: the canonical id of one supported release (`1.0.0`, `1.1.0`) |
22
- | `name` | string | yes | 1–64 chars, `^(?!.*(?:--\|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$` |
23
- | `version` | string | no | SemVer recommended, not enforced. |
24
- | `description` | string | no | |
25
- | `author` | `{name?, email?, url?}` | no | Closed object; fields unvalidated. |
26
- | `homepage`, `repository` | string | no | Not URL-validated. |
27
- | `license` | string | no | SPDX recommended, not enforced. |
28
- | `keywords` | string[] | no | No `minItems`/`uniqueItems`. |
29
- | `extensions` | object of object | no | Client-specific data keyed by reverse-domain namespace; the specification assigns no semantics to namespace contents. Violations inside this subtree are reported and ignored (§8.1). |
30
-
31
- ## Fixed component locations
32
-
33
- Clients MUST discover each supported component type from its fixed location, and `plugin.json` cannot override those locations or carry inline component configuration.
34
-
35
- | Component | Location | Pattern |
36
- | ----------- | ---------- | ---------------------------------------------- |
37
- | Skills | `skills/` | Immediate subdirectories containing `SKILL.md` |
38
- | MCP servers | `mcp.json` | JSON configuration |
39
-
40
- v1 defines exactly these two component types. Commands, hooks, agents, rules, and LSP servers are explicitly outside the format "until their formats converge". MCP configuration MUST NOT be declared inline in `plugin.json`. The `mcp.json` schema is closed and requires `$schema` and `mcpServers` with no other top-level fields; every server requires `type` and must match exactly one closed variant (§7.2.2 rule 3: a per-server violation skips that server only). `mcp.json` `$schema` MUST name the same release as `plugin.json` (§10.1). Skills discovery covers one level of `skills/` subdirectories and MUST NOT search deeper descendants (§7.1). `mcp.json` fixes a location, not a presence requirement: a suite carrying skills only is conformant, and an absent `mcp.json` contributes zero servers.
41
-
42
- ## Marketplace catalogs
43
-
44
- The specification defines no marketplace format — catalogs of v1 suites are a vendor-side convention, and the standard assigns them no schema. This manager reads three catalog shapes over v1 suite roots, in the shared scan order:
45
-
46
- 1. `.claude-plugin/marketplace.json` (Claude Code shape).
47
- 2. Root `marketplace.json` — the fallback catalog for layouts without a dedicated one.
48
- 3. No catalog at all — rooted discovery walks the checkout (up to four levels deep) and reads every directory carrying a v1 manifest, so a bare collection is scannable without any catalog file. The first-party collection [dsh-agent-plugins](https://github.com/Sivan757/dsh-agent-plugins) ships this shape: suites under `plugins/`, no catalog manifest.
49
-
50
- A catalog entry's `name`/`version`/`description` are fallbacks: a conformant suite's own `plugin.json` wins for every field it declares. Entries may add display metadata the portable manifest cannot express (`category`, `keywords`). Entry sources resolve relative to the catalog's checkout; with no `source`, each entry resolves against the catalog checkout's own containers.
51
-
52
- ## Client extensions
53
-
54
- §8 gives every client a reverse-domain namespace: manifest data under `extensions`, files under a top-level directory of the same name. Other clients MUST ignore unimplemented namespaces without validating their contents. This manager's namespace is [`com.deepseek.harness`](../com.deepseek.harness/spec.md) — it carries the component types the portable format leaves out and the per-server client policy the closed `mcp.json` schema cannot hold.
55
-
56
- ## Governance and adoption
57
-
58
- The technical steering committee is Amazon, Cursor, Microsoft, OpenAI, and Vercel (lead), with a rule that no single vendor may control a majority of core maintainer seats. Adopters list Agent Skills and MCP: VS Code, Cursor, GitHub Copilot, ChatGPT and Codex, Kiro, Hermes Agent, OpenClaw, Grok Bot, and NanoClaw. **Claude Code and Vercel are absent from that list**, and Vercel's own `vercel-plugin` repository is non-conformant (no root `plugin.json`, no `$schema`, ships `commands/`/`agents/`/`hooks/`, and puts MCP at `.mcp.json` instead of `mcp.json`). The OpenHands SDK vendors the schema and implements the format but keeps it out of its active format list pending its `mcp.json` loader.
59
-
60
- ## Update procedure
61
-
62
- Replace the vendored files from the upstream repository at the pinned spec versions and bump the spec-version references in `packages/market-catalog/src/scanning/validate.ts`. Do not edit the vendored files by hand.
@@ -1,143 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/claude-code/marketplace.schema.json",
4
- "title": "Claude Code Marketplace Manifest",
5
- "description": "Marketplace catalog read by Claude Code at .claude-plugin/marketplace.json, or from any marketplace.json file added by direct path or URL. Authored from the official plugin marketplace reference and the official claude-plugins-official catalog; Anthropic publishes no JSON Schema.",
6
- "$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: https://code.claude.com/docs/en/plugin-marketplaces ; anthropics/claude-plugins-official/.claude-plugin/marketplace.json (291 entries). forceRemoveDeletedPlugins appears only in the community schemastore schema and in no current official doc. Entry source variants observed in the official catalog: url 153, git-subdir 85, relative path 53.",
7
- "type": "object",
8
- "properties": {
9
- "$schema": {
10
- "type": "string",
11
- "description": "Ignored at load. The official catalog declares https://anthropic.com/claude-code/marketplace.schema.json, which currently returns 404."
12
- },
13
- "name": { "type": "string", "description": "Kebab-case marketplace identifier. Registration is per name per user; a reserved-name list applies." },
14
- "owner": {
15
- "type": "object",
16
- "properties": {
17
- "name": { "type": "string" },
18
- "email": { "type": "string" },
19
- "url": { "type": "string" }
20
- },
21
- "required": ["name"],
22
- "additionalProperties": true
23
- },
24
- "plugins": { "type": "array", "items": { "$ref": "#/$defs/entry" } },
25
- "description": { "type": "string", "description": "Also accepted under metadata for backward compatibility." },
26
- "version": { "type": "string", "description": "Also accepted under metadata for backward compatibility." },
27
- "metadata": {
28
- "type": "object",
29
- "properties": {
30
- "pluginRoot": {
31
- "type": "string",
32
- "description": "Directory under which bare source names resolve; must be a relative path inside the marketplace and is ignored for ./ sources."
33
- },
34
- "description": { "type": "string" },
35
- "version": { "type": "string" }
36
- },
37
- "additionalProperties": true
38
- },
39
- "allowCrossMarketplaceDependenciesOn": {
40
- "type": "array",
41
- "items": { "type": "string" },
42
- "description": "Marketplace names whose plugins may be auto-installed as dependencies. Only the root marketplace's allowlist applies; there is no transitive trust."
43
- },
44
- "renames": {
45
- "type": "object",
46
- "description": "Old plugin name to new name, or null when removed. Chains are followed; cycles are rejected by `claude plugin validate`.",
47
- "additionalProperties": { "type": ["string", "null"] }
48
- },
49
- "forceRemoveDeletedPlugins": { "type": "boolean", "description": "Community-schema field with no current official documentation; treat as unverified." }
50
- },
51
- "required": ["name", "owner", "plugins"],
52
- "additionalProperties": true,
53
- "$defs": {
54
- "entry": {
55
- "type": "object",
56
- "properties": {
57
- "name": { "type": "string", "description": "Kebab-case plugin identifier used by enabledPlugins and /plugin." },
58
- "source": { "$ref": "#/$defs/source" },
59
- "displayName": { "type": "string" },
60
- "description": { "type": "string" },
61
- "version": { "type": "string", "description": "Pins the plugin. The plugin.json version wins when both are set; ignored for command sources." },
62
- "author": {
63
- "type": "object",
64
- "properties": { "name": { "type": "string" }, "email": { "type": "string" }, "url": { "type": "string" } },
65
- "required": ["name"],
66
- "additionalProperties": true
67
- },
68
- "homepage": { "type": "string" },
69
- "repository": { "type": "string" },
70
- "license": { "type": "string" },
71
- "keywords": { "type": "array", "items": { "type": "string" } },
72
- "metadata": { "type": "object" },
73
- "category": { "type": "string" },
74
- "tags": { "type": "array", "items": { "type": "string" } },
75
- "strict": {
76
- "type": "boolean",
77
- "default": true,
78
- "description": "true: plugin.json is authoritative and this entry supplements it. false: this entry is the whole definition; a conflicting plugin.json fails to load."
79
- },
80
- "relevance": { "type": "object", "description": "Suggestion signals; only honored for admin-allowlisted marketplaces." },
81
- "defaultEnabled": { "type": "boolean", "default": true, "description": "Takes precedence over the manifest value." },
82
- "headers": { "type": "object", "additionalProperties": { "type": "string" }, "description": "HTTP headers for this entry's archive download." },
83
- "headersHelper": { "type": "string", "description": "Command printing header JSON; the entry must also set strict: false." },
84
- "skills": { "anyOf": [{ "type": "string" }, { "type": "array" }] },
85
- "commands": { "anyOf": [{ "type": "string" }, { "type": "array" }] },
86
- "agents": { "anyOf": [{ "type": "string" }, { "type": "array" }] },
87
- "hooks": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
88
- "mcpServers": { "anyOf": [{ "type": "string" }, { "type": "object" }] },
89
- "lspServers": { "anyOf": [{ "type": "string" }, { "type": "object" }] }
90
- },
91
- "required": ["name", "source"],
92
- "additionalProperties": true
93
- },
94
- "source": {
95
- "description": "Where to fetch the plugin. When both ref and sha are set on a git source, sha is the effective pin.",
96
- "anyOf": [
97
- { "type": "string", "description": "Relative path beginning with ./, or a bare name resolved under metadata.pluginRoot." },
98
- {
99
- "type": "object",
100
- "properties": { "source": { "const": "github" }, "repo": { "type": "string" }, "ref": { "type": "string" }, "sha": { "type": "string", "pattern": "^[a-f0-9]{40}$" } },
101
- "required": ["source", "repo"],
102
- "additionalProperties": true
103
- },
104
- {
105
- "type": "object",
106
- "properties": { "source": { "const": "url" }, "url": { "type": "string" }, "ref": { "type": "string" }, "sha": { "type": "string", "pattern": "^[a-f0-9]{40}$" } },
107
- "required": ["source", "url"],
108
- "additionalProperties": true
109
- },
110
- {
111
- "type": "object",
112
- "properties": {
113
- "source": { "const": "git-subdir" },
114
- "url": { "type": "string" },
115
- "path": { "type": "string" },
116
- "ref": { "type": "string" },
117
- "sha": { "type": "string", "pattern": "^[a-f0-9]{40}$" }
118
- },
119
- "required": ["source", "url", "path"],
120
- "additionalProperties": true
121
- },
122
- {
123
- "type": "object",
124
- "properties": { "source": { "const": "npm" }, "package": { "type": "string" }, "version": { "type": "string" }, "registry": { "type": "string" } },
125
- "required": ["source", "package"],
126
- "additionalProperties": true
127
- },
128
- {
129
- "type": "object",
130
- "properties": { "source": { "const": "archive" }, "url": { "type": "string" }, "sha256": { "type": "string" } },
131
- "required": ["source", "url"],
132
- "additionalProperties": true
133
- },
134
- {
135
- "type": "object",
136
- "properties": { "source": { "const": "command" }, "command": { "type": "string" }, "timeout": { "type": "number" }, "mode": { "enum": ["copy", "link"] } },
137
- "required": ["source", "command"],
138
- "additionalProperties": true
139
- }
140
- ]
141
- }
142
- }
143
- }
@@ -1,105 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/claude-code/plugin.schema.json",
4
- "title": "Claude Code Plugin Manifest",
5
- "description": "Plugin manifest accepted by Claude Code at .claude-plugin/plugin.json. The manifest is optional: when omitted the client discovers components from default locations and derives the name from the directory. Authored from the official plugin reference; Anthropic publishes no JSON Schema (the $schema URL the official marketplace itself uses returns 404).",
6
- "$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Source: https://code.claude.com/docs/en/plugins-reference. Unrecognized top-level fields are ignored with a warning (--strict turns them into errors), so this schema is open. Paths are relative to the plugin root and must begin with ./ (skills also accepts \".\"). Claude Code is not listed among agent-plugins.org compatible clients.",
7
- "type": "object",
8
- "properties": {
9
- "$schema": { "type": "string", "description": "Editor autocomplete only; ignored at load. The docs cite https://json.schemastore.org/claude-code-plugin-manifest.json." },
10
- "name": {
11
- "type": "string",
12
- "description": "Kebab-case unique identifier; namespaces the plugin's components as <plugin>:<component>."
13
- },
14
- "displayName": { "type": "string", "description": "Human-readable UI name; falls back to name and is never used for lookup." },
15
- "version": { "type": "string", "description": "Semantic version. When both the manifest and a marketplace entry declare a version, the manifest wins without warning." },
16
- "description": { "type": "string" },
17
- "author": {
18
- "type": "object",
19
- "properties": {
20
- "name": { "type": "string" },
21
- "email": { "type": "string" },
22
- "url": { "type": "string" }
23
- },
24
- "additionalProperties": true
25
- },
26
- "homepage": { "type": "string" },
27
- "repository": { "type": "string" },
28
- "license": { "type": "string" },
29
- "keywords": { "type": "array", "items": { "type": "string" }, "description": "A wrong type is a load error." },
30
- "metadata": { "type": "object", "description": "Free-form; Claude Code does not read it." },
31
- "defaultEnabled": { "type": "boolean", "default": true, "description": "Ship the plugin disabled. A marketplace entry value takes precedence." },
32
- "skills": { "$ref": "#/$defs/pathList", "description": "Adds to the default skills/ scan." },
33
- "commands": { "$ref": "#/$defs/pathList", "description": "Replaces the default commands/ directory." },
34
- "agents": { "$ref": "#/$defs/pathList", "description": "Replaces the default agents/ directory." },
35
- "workflows": { "$ref": "#/$defs/pathList", "description": "Replaces the default workflows/ directory." },
36
- "outputStyles": { "$ref": "#/$defs/pathList", "description": "Replaces the default output-styles/ directory." },
37
- "hooks": { "$ref": "#/$defs/configOrPath", "description": "Path(s) to a hooks configuration file or inline config. Default hooks/hooks.json." },
38
- "mcpServers": { "$ref": "#/$defs/configOrPath", "description": "Path(s) to an MCP configuration file or inline config. Default .mcp.json; inline servers are additive." },
39
- "lspServers": { "$ref": "#/$defs/configOrPath", "description": "Path(s) to an LSP configuration file or inline config. Default .lsp.json." },
40
- "experimental": {
41
- "type": "object",
42
- "description": "Newer home for themes and monitors; the top-level spellings still work but warn.",
43
- "properties": {
44
- "themes": { "$ref": "#/$defs/pathList" },
45
- "monitors": { "$ref": "#/$defs/pathList" }
46
- },
47
- "additionalProperties": true
48
- },
49
- "themes": { "$ref": "#/$defs/pathList", "description": "Deprecated top-level spelling of experimental.themes." },
50
- "monitors": { "$ref": "#/$defs/pathList", "description": "Deprecated top-level spelling of experimental.monitors." },
51
- "userConfig": {
52
- "type": "object",
53
- "description": "Options prompted when the plugin is enabled. Referenced as ${user_config.<key>}; exported as CLAUDE_PLUGIN_OPTION_<KEY>. Shell-form hooks, monitor commands, and MCP headersHelper reject the substitution.",
54
- "additionalProperties": { "$ref": "#/$defs/userConfigOption" }
55
- },
56
- "channels": { "type": "array", "description": "Message-channel declarations; each entry's server must match a key in mcpServers." },
57
- "dependencies": {
58
- "type": "array",
59
- "description": "Plugins this one depends on.",
60
- "items": {
61
- "anyOf": [
62
- { "type": "string" },
63
- {
64
- "type": "object",
65
- "properties": { "name": { "type": "string" }, "version": { "type": "string" } },
66
- "required": ["name"],
67
- "additionalProperties": true
68
- }
69
- ]
70
- }
71
- },
72
- "settings": { "type": "object", "description": "Default settings. The settings.json file takes priority over this field." }
73
- },
74
- "required": ["name"],
75
- "additionalProperties": true,
76
- "$defs": {
77
- "pathList": {
78
- "description": "A plugin-relative path or an array of them; each must begin with ./.",
79
- "anyOf": [
80
- { "type": "string", "pattern": "^\\." },
81
- { "type": "array", "items": { "type": "string", "pattern": "^\\." } }
82
- ]
83
- },
84
- "configOrPath": {
85
- "description": "A plugin-relative path, an array of paths, or inline configuration.",
86
- "anyOf": [{ "type": "string", "pattern": "^\\." }, { "type": "array" }, { "type": "object" }]
87
- },
88
- "userConfigOption": {
89
- "type": "object",
90
- "properties": {
91
- "type": { "enum": ["string", "number", "boolean", "directory", "file"] },
92
- "title": { "type": "string" },
93
- "description": { "type": "string" },
94
- "sensitive": { "type": "boolean" },
95
- "required": { "type": "boolean" },
96
- "default": {},
97
- "multiple": { "type": "boolean", "description": "String type only." },
98
- "min": { "type": "number", "description": "Number type only." },
99
- "max": { "type": "number", "description": "Number type only." }
100
- },
101
- "required": ["type", "title", "description"],
102
- "additionalProperties": true
103
- }
104
- }
105
- }
@@ -1,108 +0,0 @@
1
- # Claude Code plugin and marketplace specification
2
-
3
- Reference contract for Claude Code 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 [`plugins-reference`](https://code.claude.com/docs/en/plugins-reference) and [`plugin-marketplaces`](https://code.claude.com/docs/en/plugin-marketplaces); the official catalog [`anthropics/claude-plugins-official`](https://github.com/anthropics/claude-plugins-official) (291 entries).
7
- - **Upstream JSON Schema:** none. The `$schema` URL the official catalog itself declares, `https://anthropic.com/claude-code/marketplace.schema.json`, returns 404. The SchemaStore schemas are community-maintained and stale (generated 2026-04-23, missing `displayName`, `metadata`, `defaultEnabled`, `experimental`, `workflows`, and `renames`).
8
- - **Spec status:** Claude Code is not listed among agent-plugins.org compatible clients.
9
-
10
- ## Manifest locations and precedence
11
-
12
- | Artifact | Location |
13
- | --- | --- |
14
- | Plugin manifest | `.claude-plugin/plugin.json`; optional — without it components are auto-discovered and the name comes from the directory |
15
- | Marketplace manifest | `.claude-plugin/marketplace.json`, or any `marketplace.json` added by direct path or URL |
16
- | Skills | `skills/` (manifest `skills` **adds** to this scan) |
17
- | Commands / agents / workflows / output styles / themes / monitors | `commands/`, `agents/`, `workflows/`, `output-styles/`, `themes/`, `monitors/monitors.json` (manifest fields **replace** these) |
18
- | Hooks | `hooks/hooks.json` or inline |
19
- | MCP | `.mcp.json` or inline `mcpServers` (additive) |
20
- | LSP | `.lsp.json` or inline `lspServers` |
21
- | Executables / settings | `bin/`, `settings.json` (only `agent` and `subagentStatusLine` keys) |
22
-
23
- Only `plugin.json` may live inside `.claude-plugin/`; every component directory belongs at the plugin root. A root `SKILL.md` with no `skills/` directory and no `skills` field loads as a single-skill plugin. A root `CLAUDE.md` is not loaded as context.
24
-
25
- ## Plugin manifest (`plugin.json`)
26
-
27
- Required: `name`. All paths are relative to the plugin root and must begin with `./` (`skills` also accepts `"."`); traversal outside the plugin is rejected.
28
-
29
- | Field | Type | Notes |
30
- | --- | --- | --- |
31
- | `name` | string | Kebab-case id; namespaces components as `<plugin>:<component>`. |
32
- | `displayName` | string | UI label; falls back to `name`. |
33
- | `version` | string | Pins updates. The manifest value wins over a marketplace entry without warning. |
34
- | `description`, `homepage`, `repository`, `license` | string | |
35
- | `author` | `{name, email, url}` | |
36
- | `keywords` | string[] | A wrong type is a load error. |
37
- | `metadata` | object | Free-form; not read by the client. |
38
- | `defaultEnabled` | boolean | Default `true`; a marketplace entry value takes precedence. |
39
- | `$schema` | string | Editor autocomplete only. |
40
- | `skills`, `commands`, `agents`, `workflows`, `outputStyles` | string \| string[] | See precedence above. |
41
- | `hooks`, `mcpServers`, `lspServers` | string \| string[] \| object | Path(s) or inline configuration. |
42
- | `experimental` | `{themes?, monitors?}` | The top-level `themes`/`monitors` spellings still work but warn. |
43
- | `userConfig` | object | Options prompted at enable time; each requires `type`, `title`, `description`, plus optional `sensitive`, `required`, `default`, `multiple` (string), `min`/`max` (number). |
44
- | `channels` | array | Message-channel declarations; each `server` must match a key in `mcpServers`. |
45
- | `dependencies` | (string \| `{name, version?}`)[] | |
46
- | `settings` | object | `settings.json` takes priority over this field. |
47
-
48
- Unrecognized top-level fields are ignored with a warning (`--strict` makes them errors), deliberately so a manifest can double as a VS Code or Cursor extension manifest, a `package.json`, or an MCPB/DXT bundle manifest.
49
-
50
- ## Marketplace manifest (`marketplace.json`)
51
-
52
- Required: `name`, `owner`, `plugins`.
53
-
54
- | Field | Type | Notes |
55
- | ------------------------------------- | ---------------------- | --------------------------------------------------------------------- |
56
- | `name` | string | Kebab-case; one registration per name per user; reserved names apply. |
57
- | `owner` | `{name, email?, url?}` | |
58
- | `plugins` | array | |
59
- | `description`, `version` | string | Also accepted under `metadata` for backward compatibility. |
60
- | `metadata.pluginRoot` | string | Directory for bare `source` names; ignored for `./` sources. |
61
- | `allowCrossMarketplaceDependenciesOn` | string[] | Only the root marketplace's allowlist applies; no transitive trust. |
62
- | `renames` | `{old: new \| null}` | Chains are followed; cycles are rejected by `claude plugin validate`. |
63
- | `forceRemoveDeletedPlugins` | boolean | Community-schema field with no current official documentation. |
64
-
65
- Plugin entries require `name` and `source`; optional fields include `displayName`, `description`, `version`, `author`, `homepage`, `repository`, `license`, `keywords`, `metadata`, `category`, `tags`, `strict` (default `true`), `relevance`, `defaultEnabled`, `headers`, `headersHelper`, `skills`, `commands`, `agents`, `hooks`, `mcpServers`, and `lspServers`. With `strict: true` the plugin manifest is authoritative and the entry supplements it; with `strict: false` the entry is the whole definition, and a conflicting component-declaring manifest fails to load.
66
-
67
- ## Plugin sources
68
-
69
- | Variant | Shape | Notes |
70
- | ------------- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
71
- | relative path | string | `./…`, or a bare name under `metadata.pluginRoot`; resolved against the marketplace root, not `.claude-plugin/`. |
72
- | `github` | `{source, repo, ref?, sha?}` | `owner/repo`. |
73
- | `url` | `{source, url, ref?, sha?}` | Any git URL, including SSH. |
74
- | `git-subdir` | `{source, url, path, ref?, sha?}` | Sparse partial clone. |
75
- | `npm` | `{source, package, version?, registry?}` | |
76
- | `archive` | `{source, url, sha256?}` | HTTPS zip, at most 256 MiB. |
77
- | `command` | `{source, command, timeout?, mode?}` | Prints one absolute path; `mode` is `copy` (default) or `link`. |
78
-
79
- When both `ref` and `sha` are set, `sha` is the effective pin. In the official catalog the observed distribution is `url` 153, `git-subdir` 85, relative path 53.
80
-
81
- ## Version and enablement resolution
82
-
83
- 1. Version: `plugin.json` → marketplace entry → git commit SHA → archive `sha256` prefix → `unknown`.
84
- 2. `defaultEnabled`: marketplace entry > manifest; a user's `enabledPlugins` setting beats both.
85
- 3. `--plugin-dir` local plugins take precedence over a marketplace install for that session.
86
-
87
- ## Directory layout
88
-
89
- ```text
90
- enterprise-plugin/
91
- ├── .claude-plugin/plugin.json # optional manifest
92
- ├── skills/ commands/ agents/ workflows/ output-styles/
93
- ├── themes/ monitors/monitors.json
94
- ├── hooks/hooks.json
95
- ├── bin/ # executables added to PATH
96
- ├── settings.json
97
- ├── .mcp.json
98
- └── .lsp.json
99
- ```
100
-
101
- Placeholders: `${CLAUDE_PLUGIN_ROOT}`, `${CLAUDE_PLUGIN_DATA}` (`~/.claude/plugins/data/{id}/`), `${CLAUDE_PROJECT_DIR}`, `${user_config.KEY}` (rejected in shell-form hooks, monitor commands, and MCP `headersHelper`).
102
-
103
- ## Evidence gaps
104
-
105
- 1. Hook, MCP, and LSP merge semantics are described only as "own merge rules"; only MCP's additivity with `.mcp.json` is documented.
106
- 2. `.lsp.json` versus inline `lspServers` precedence is unstated.
107
- 3. Whether a root `marketplace.json` can coexist with `.claude-plugin/marketplace.json`, and which wins, is undocumented.
108
- 4. `forceRemoveDeletedPlugins` has no current official documentation.