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.
Files changed (134) hide show
  1. package/README.md +143 -169
  2. package/README.zh.md +136 -170
  3. package/client/client.js +8202 -684
  4. package/client/client.js.map +1 -1
  5. package/lib/application/catalog.js +236 -47
  6. package/lib/application/details.js +19 -10
  7. package/lib/application/panel-resources.js +95 -0
  8. package/lib/application/project-agent-roles.js +39 -0
  9. package/lib/catalog/codex-mcp.js +114 -0
  10. package/lib/catalog/component-files.js +151 -0
  11. package/lib/catalog/manifests.js +105 -44
  12. package/lib/catalog/native-project.js +44 -23
  13. package/lib/catalog/paths.js +6 -6
  14. package/lib/catalog/project-config.js +96 -0
  15. package/lib/catalog/project-hooks.js +108 -0
  16. package/lib/catalog/scan-pipeline.js +6 -1
  17. package/lib/catalog/scan-resolvers.js +70 -26
  18. package/lib/catalog/source-catalog.js +16 -3
  19. package/lib/catalog/suite-components.js +125 -0
  20. package/lib/catalog/surfaces.js +60 -46
  21. package/lib/catalog/validate.js +16 -11
  22. package/lib/contracts/market.js +16 -1
  23. package/lib/index.js +187 -35
  24. package/lib/model/layouts.js +49 -0
  25. package/lib/routes.js +106 -6
  26. package/lib/runtime/agent-role-router.js +226 -0
  27. package/lib/runtime/commands-mounts.js +27 -67
  28. package/lib/runtime/feedback-tool.js +181 -0
  29. package/lib/runtime/hooks-mounts.js +66 -13
  30. package/lib/runtime/host-locale.js +23 -7
  31. package/lib/runtime/legacy-root-migration.js +12 -0
  32. package/lib/runtime/lsp-direct-config.js +6 -3
  33. package/lib/runtime/lsp-mounts.js +38 -24
  34. package/lib/runtime/lsp-server-state.js +19 -0
  35. package/lib/runtime/lsp-status.js +3 -2
  36. package/lib/runtime/mcp-backend.js +6 -2
  37. package/lib/runtime/mcp-client/config.js +6 -0
  38. package/lib/runtime/mcp-client/connection.js +8 -2
  39. package/lib/runtime/mcp-client/tools.js +6 -3
  40. package/lib/runtime/mcp-config.js +26 -13
  41. package/lib/runtime/mcp-direct-config.js +56 -0
  42. package/lib/runtime/mcp-mounts.js +25 -9
  43. package/lib/runtime/mcp-overrides.js +11 -5
  44. package/lib/runtime/mcp-status.js +10 -7
  45. package/lib/runtime/model-catalog.js +48 -0
  46. package/lib/runtime/project-runtime.js +136 -0
  47. package/lib/runtime/reconciler.js +38 -28
  48. package/lib/runtime/server-config.js +75 -0
  49. package/lib/runtime/skills-provider.js +31 -77
  50. package/lib/runtime/storage-migration.js +169 -0
  51. package/lib/runtime/subagent-catalog.js +129 -0
  52. package/lib/runtime/user-commands.js +86 -0
  53. package/lib/runtime/user-panels.js +176 -0
  54. package/lib/runtime/user-store.js +142 -0
  55. package/lib/types/application/catalog.d.ts +39 -9
  56. package/lib/types/application/panel-resources.d.ts +13 -0
  57. package/lib/types/application/project-agent-roles.d.ts +3 -0
  58. package/lib/types/application/queries.d.ts +17 -1
  59. package/lib/types/catalog/codex-mcp.d.ts +4 -0
  60. package/lib/types/catalog/component-files.d.ts +17 -0
  61. package/lib/types/catalog/manifests.d.ts +14 -9
  62. package/lib/types/catalog/native-project.d.ts +2 -5
  63. package/lib/types/catalog/paths.d.ts +4 -4
  64. package/lib/types/catalog/project-config.d.ts +6 -0
  65. package/lib/types/catalog/project-hooks.d.ts +10 -0
  66. package/lib/types/catalog/scan-pipeline.d.ts +2 -0
  67. package/lib/types/catalog/scan-resolvers.d.ts +4 -3
  68. package/lib/types/catalog/source-catalog.d.ts +1 -1
  69. package/lib/types/catalog/suite-components.d.ts +5 -0
  70. package/lib/types/catalog/surfaces.d.ts +2 -2
  71. package/lib/types/catalog/validate.d.ts +2 -0
  72. package/lib/types/contracts/market.d.ts +60 -0
  73. package/lib/types/contracts/mcp-status.d.ts +5 -1
  74. package/lib/types/index.d.ts +2 -2
  75. package/lib/types/model/layouts.d.ts +102 -0
  76. package/lib/types/model/types.d.ts +51 -6
  77. package/lib/types/routes.d.ts +6 -1
  78. package/lib/types/runtime/agent-role-router.d.ts +95 -0
  79. package/lib/types/runtime/commands-mounts.d.ts +16 -7
  80. package/lib/types/runtime/feedback-tool.d.ts +49 -0
  81. package/lib/types/runtime/hooks-mounts.d.ts +4 -0
  82. package/lib/types/runtime/host-locale.d.ts +1 -1
  83. package/lib/types/runtime/legacy-root-migration.d.ts +2 -0
  84. package/lib/types/runtime/lsp-mounts.d.ts +4 -0
  85. package/lib/types/runtime/lsp-server-state.d.ts +3 -0
  86. package/lib/types/runtime/lsp-status.d.ts +1 -0
  87. package/lib/types/runtime/mcp-backend.d.ts +9 -1
  88. package/lib/types/runtime/mcp-client/config.d.ts +4 -3
  89. package/lib/types/runtime/mcp-client/tools.d.ts +3 -0
  90. package/lib/types/runtime/mcp-config.d.ts +11 -5
  91. package/lib/types/runtime/mcp-direct-config.d.ts +7 -0
  92. package/lib/types/runtime/mcp-mounts.d.ts +2 -1
  93. package/lib/types/runtime/mcp-overrides.d.ts +2 -0
  94. package/lib/types/runtime/mcp-status.d.ts +1 -1
  95. package/lib/types/runtime/model-catalog.d.ts +7 -0
  96. package/lib/types/runtime/project-runtime.d.ts +32 -0
  97. package/lib/types/runtime/reconciler.d.ts +2 -0
  98. package/lib/types/runtime/server-config.d.ts +10 -0
  99. package/lib/types/runtime/skills-provider.d.ts +1 -5
  100. package/lib/types/runtime/storage-migration.d.ts +15 -0
  101. package/lib/types/runtime/subagent-catalog.d.ts +52 -0
  102. package/lib/types/runtime/user-commands.d.ts +24 -0
  103. package/lib/types/runtime/user-panels.d.ts +91 -0
  104. package/lib/types/runtime/user-store.d.ts +51 -0
  105. package/package.json +10 -3
  106. package/schemas/README.md +69 -7
  107. package/schemas/agent-plugins/spec.md +48 -0
  108. package/schemas/claude-code/marketplace.schema.json +143 -0
  109. package/schemas/claude-code/plugin.schema.json +105 -0
  110. package/schemas/claude-code/spec.md +108 -0
  111. package/schemas/codex/marketplace.schema.json +78 -0
  112. package/schemas/codex/plugin.schema.json +77 -0
  113. package/schemas/codex/spec.md +91 -0
  114. package/schemas/cursor/marketplace.schema.json +82 -0
  115. package/schemas/cursor/plugin.schema.json +58 -0
  116. package/schemas/cursor/spec.md +92 -0
  117. package/schemas/github-copilot/marketplace.schema.json +107 -0
  118. package/schemas/github-copilot/plugin.schema.json +89 -0
  119. package/schemas/github-copilot/spec.md +105 -0
  120. package/schemas/kimi/marketplace.schema.json +38 -0
  121. package/schemas/kimi/plugin.schema.json +84 -0
  122. package/schemas/kimi/spec.md +94 -0
  123. package/schemas/qoder/marketplace.schema.json +115 -0
  124. package/schemas/qoder/plugin.schema.json +127 -0
  125. package/schemas/qoder/spec.md +111 -0
  126. package/schemas/skill-collection/spec.md +29 -0
  127. package/schemas/universal/marketplace.schema.json +98 -0
  128. package/schemas/universal/plugin.schema.json +49 -0
  129. package/schemas/universal/spec.md +53 -0
  130. package/schemas/zcode/marketplace.schema.json +161 -0
  131. package/schemas/zcode/plugin.schema.json +89 -0
  132. package/schemas/zcode/spec.md +102 -0
  133. package/lib/catalog/legacy-root-migration.js +0 -51
  134. package/lib/types/catalog/legacy-root-migration.d.ts +0 -14
@@ -0,0 +1,105 @@
1
+ # GitHub Copilot CLI plugin and marketplace specification
2
+
3
+ Reference contract for GitHub Copilot CLI plugin repositories. Machine-readable companions: [plugin.schema.json](plugin.schema.json) and [marketplace.schema.json](marketplace.schema.json).
4
+
5
+ - **Verified:** 2026-09-08.
6
+ - **Evidence:** official documentation [`CLI plugin reference`](https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-plugin-reference) and [`Creating a plugin marketplace for GitHub Copilot CLI`](https://docs.github.com/en/enterprise-cloud@latest/copilot/how-tos/copilot-cli/customize-copilot/plugins-marketplace), read from the raw markdown in `github/docs`.
7
+ - **Upstream JSON Schema:** none for these manifests. Copilot CLI additionally supports the agent-plugins.org v1.0.0 schema when `plugin.json` declares its `$schema`.
8
+ - **Note:** `.plugin/plugin.json` is first in Copilot's plugin lookup order, which is why the [universal layout](../universal/spec.md) works here.
9
+
10
+ ## Manifest locations and precedence
11
+
12
+ | Artifact | Lookup order |
13
+ | -------------------- | ----------------------------------------------------------------------------------------------------------------------- |
14
+ | Plugin manifest | `.plugin/plugin.json` → `plugin.json` → `.github/plugin/plugin.json` → `.claude-plugin/plugin.json` |
15
+ | Marketplace manifest | `marketplace.json` → `.plugin/marketplace.json` → `.github/plugin/marketplace.json` → `.claude-plugin/marketplace.json` |
16
+ | Agents | `agents/` (default, overridable) |
17
+ | Skills | `skills/` (default, overridable) |
18
+ | Hooks | `hooks.json` or `hooks/hooks.json` |
19
+ | MCP | `.mcp.json`, `.github/mcp.json` |
20
+ | LSP | `lsp.json` or `.github/lsp.json` |
21
+ | Plugin data | `${COPILOT_PLUGIN_DATA}` (also `${CLAUDE_PLUGIN_DATA}`) |
22
+
23
+ Installed plugins live under `~/.copilot/installed-plugins/<MARKETPLACE>/<PLUGIN>` (or `_direct/<SOURCE-ID>` for direct installs); the marketplace cache is the platform cache directory, overridable with `COPILOT_CACHE_HOME`.
24
+
25
+ ## Plugin manifest (`plugin.json`)
26
+
27
+ Required: `name` — kebab-case, letters/numbers/hyphens only, max 64 chars. Plugins opting into Open Plugin Spec support may also use dots.
28
+
29
+ | Field | Type | Default | Notes |
30
+ | --- | --- | --- | --- |
31
+ | `$schema` | string | — | Set to the agent-plugins.org v1.0.0 schema URL to opt into spec semantics, additively. |
32
+ | `description` | string | — | Max 1024 chars. |
33
+ | `version` | string | — | Semantic version. |
34
+ | `author` | `{name, email?, url?}` | — | `name` required. |
35
+ | `homepage`, `repository`, `license` | string | — | |
36
+ | `keywords` | string[] | — | |
37
+ | `category`, `tags` | string, string[] | — | |
38
+ | `agents` | string \| string[] | `agents/` | Directories of `.agent.md` files. |
39
+ | `skills` | string \| string[] | `skills/` | Directories of `SKILL.md` files. |
40
+ | `commands` | string \| string[] | — | Command directories. |
41
+ | `hooks` | string \| object | — | Configuration path or inline hooks object. |
42
+ | `extensions` | string \| string[] \| object | — | Extension directories, or `{paths: [...], exclusive: true}`. Different meaning in Open Plugin Spec mode. |
43
+ | `mcpServers` | string \| object | — | Path to a JSON config file (for example `.mcp.json`), or inline servers. |
44
+ | `lspServers` | string \| object | — | Path to an LSP config file, or inline definitions. |
45
+
46
+ LSP server entries require at least one of `command`, `bash`, or `powershell` plus `fileExtensions`; optional keys are `cwd`, `args`, `env`, `rootUri`, `initializationOptions`. Use `${PLUGIN_ROOT}` for plugin-relative paths.
47
+
48
+ ## Marketplace manifest (`marketplace.json`)
49
+
50
+ Required: `name`, `owner`, `plugins`.
51
+
52
+ | Field | Type | Notes |
53
+ | --- | --- | --- |
54
+ | `name` | string | Kebab-case, max 64 chars; dots accepted for Open Plugin Spec plugins. The marketplace's own name becomes its registration key. |
55
+ | `owner` | `{name, email?}` | |
56
+ | `plugins` | array | |
57
+ | `metadata` | `{description?, version?, pluginRoot?}` | |
58
+
59
+ Plugin entries:
60
+
61
+ | Field | Type | Notes |
62
+ | ---------------------------------------------- | ---------------------- | ----------------------------------------------------------------------------------------- |
63
+ | `name` | string | Required; kebab-case, max 64 chars. |
64
+ | `source` | string \| object | Required. |
65
+ | `description` | string | Max 1024 chars. |
66
+ | `version`, `homepage`, `repository`, `license` | string | |
67
+ | `author` | `{name, email?, url?}` | |
68
+ | `keywords`, `tags` | string[] | |
69
+ | `category` | string | |
70
+ | `commands`, `agents`, `skills` | string \| string[] | |
71
+ | `hooks` | string \| object | |
72
+ | `mcpServers` | string \| object | Inline map or config path, used when the plugin source ships no MCP configuration. |
73
+ | `lspServers` | string \| object | |
74
+ | `strict` | boolean | Default `true`; `false` enables relaxed validation for direct installs or legacy plugins. |
75
+
76
+ Sources accept a relative path string, or an object `{source: 'github'|'url', repo|url, ref?, sha?, path?}`. `sha` must be a full 40-character commit SHA and pins installs against force-pushes or moved tags.
77
+
78
+ ## Commands
79
+
80
+ `copilot plugin install SPECIFICATION` accepts `plugin@marketplace`, `OWNER/REPO`, `OWNER/REPO:PATH/TO/PLUGIN`, a Git URL, or a local path. `copilot plugin marketplace add SOURCE` accepts `owner/repo`, `owner/repo#ref`, a URL, or a local path. Built-in `copilot-plugins` and `awesome-copilot` marketplaces cannot be removed and auto-update at session start unless `autoUpdate` is false or `COPILOT_AUTO_UPDATE=false`; a user-added marketplace opts in with `autoUpdate: true` on its `extraKnownMarketplaces` entry.
81
+
82
+ ## Loading precedence
83
+
84
+ - **Agents and skills: first-found wins.** A project-level agent or skill with the same name shadows the plugin's. Agents deduplicate by file-derived id; skills by their `SKILL.md` `name`.
85
+ - **MCP servers: last-wins.** A plugin's definition overrides an existing server of the same name; `--additional-mcp-config` overrides everything; when two plugins declare the same name the last loaded wins and every prior plugin is named in a warning.
86
+ - **Built-in tools and agents** cannot be overridden.
87
+
88
+ ## Directory layout
89
+
90
+ ```text
91
+ my-plugin/
92
+ ├── .plugin/plugin.json # or plugin.json / .github/plugin/plugin.json / .claude-plugin/plugin.json
93
+ ├── agents/ # *.agent.md
94
+ ├── skills/<name>/SKILL.md
95
+ ├── commands/
96
+ ├── hooks.json or hooks/hooks.json
97
+ ├── .mcp.json or .github/mcp.json
98
+ └── lsp.json or .github/lsp.json
99
+ ```
100
+
101
+ ## Evidence gaps
102
+
103
+ 1. The documentation does not state what happens when several manifest paths exist simultaneously beyond the ordered list.
104
+ 2. Open Plugin Spec mode changes the meaning of `extensions`; the exact spec-mode field set is defined upstream at agent-plugins.org.
105
+ 3. `strict: false` is described as "relaxed validation" without an enumerated relaxed rule set.
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/kimi/marketplace.schema.json",
4
+ "title": "Kimi Code Marketplace Manifest",
5
+ "description": "Marketplace catalog for the current Kimi CLI (kimi-code). The default catalog is https://code.kimi.com/kimi-code/plugins/marketplace.json, overridable with the KIMI_CODE_PLUGIN_MARKETPLACE_URL environment variable or /plugins marketplace <source>. Authored from MoonshotAI's official source; Kimi publishes no JSON Schema.",
6
+ "$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: MoonshotAI/kimi-code docs/en/customization/plugins.md and packages/agent-core-v2/src/app/plugin/marketplace.ts. Relative sources resolve against the marketplace URL when remote, or against the marketplace file's directory when local. The legacy kimi-cli has no marketplace.",
7
+ "type": "object",
8
+ "properties": {
9
+ "version": { "type": "string", "description": "Used for update checks via semantic version comparison." },
10
+ "plugins": { "type": "array", "items": { "$ref": "#/$defs/entry" }, "description": "Plugin catalog entries; required." }
11
+ },
12
+ "required": ["plugins"],
13
+ "additionalProperties": true,
14
+ "$defs": {
15
+ "entry": {
16
+ "type": "object",
17
+ "properties": {
18
+ "id": { "type": "string", "description": "Registration key." },
19
+ "source": { "type": "string", "description": "Plugin location. Aliases url and downloadUrl are accepted; the first non-empty value wins." },
20
+ "url": { "type": "string", "description": "Alias of source." },
21
+ "downloadUrl": { "type": "string", "description": "Alias of source." },
22
+ "displayName": { "type": "string", "description": "Falls back to name, then id. Alias name is accepted." },
23
+ "name": { "type": "string", "description": "Alias of displayName." },
24
+ "tier": { "enum": ["official", "curated"] },
25
+ "version": { "type": "string", "description": "Derived from a GitHub tree, commit, or releases/tag URL when present." },
26
+ "description": { "type": "string", "description": "Alias shortDescription is accepted." },
27
+ "shortDescription": { "type": "string", "description": "Alias of description." },
28
+ "homepage": { "type": "string", "description": "Alias websiteURL is accepted." },
29
+ "websiteURL": { "type": "string", "description": "Alias of homepage." },
30
+ "keywords": { "type": "array", "items": { "type": "string" } },
31
+ "type": { "type": "string", "description": "plugin; legacy aliases managed and guide are accepted." },
32
+ "builtIn": { "type": "boolean", "description": "Declared in the TypeScript interface but not read by the parser." }
33
+ },
34
+ "required": ["id", "source"],
35
+ "additionalProperties": true
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,84 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/kimi/plugin.schema.json",
4
+ "title": "Kimi Code Plugin Manifest",
5
+ "description": "Plugin manifest for the current Kimi CLI (kimi-code), looked up as kimi.plugin.json then .kimi-plugin/plugin.json in the plugin root. Authored from MoonshotAI's official documentation and source; Kimi publishes no reachable JSON Schema (its shipped manifest declares https://kimi.com/schemas/kimi.plugin.schema.json, which serves HTML).",
6
+ "$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: MoonshotAI/kimi-code docs/en/customization/plugins.md and packages/agent-core-v2/src/app/plugin/{manifest,types,marketplace}.ts. The legacy MoonshotAI/kimi-cli plugin system is a different format: root plugin.json with a tools array, no marketplace, no skills/agents components (see spec.md). fields listed in UNSUPPORTED_RUNTIME_FIELDS (tools, apps, inject, configFile, config_file, bootstrap) emit an info diagnostic and are ignored.",
7
+ "type": "object",
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "pattern": "^[a-z0-9][a-z0-9_-]{0,63}$",
12
+ "description": "Plugin identifier; normalized to lowercase. The only field whose failure invalidates the manifest."
13
+ },
14
+ "version": { "type": "string", "description": "Display metadata." },
15
+ "description": { "type": "string" },
16
+ "keywords": { "type": "array", "items": { "type": "string" } },
17
+ "author": {
18
+ "description": "Author as a bare name or a structured record; a bare string is coerced to { name }.",
19
+ "anyOf": [
20
+ { "type": "string" },
21
+ {
22
+ "type": "object",
23
+ "properties": { "name": { "type": "string" }, "email": { "type": "string" } },
24
+ "additionalProperties": true
25
+ }
26
+ ]
27
+ },
28
+ "homepage": { "type": "string" },
29
+ "license": { "type": "string" },
30
+ "skills": { "$ref": "#/$defs/pathList", "description": "./-prefixed paths that must resolve inside the plugin root. Defaults to a root SKILL.md when present." },
31
+ "agents": { "$ref": "#/$defs/pathList", "description": "./-prefixed paths to agent files. agents/ is auto-discovered when omitted." },
32
+ "sessionStart": {
33
+ "type": "object",
34
+ "description": "Loads a named plugin skill at new or resumed session start.",
35
+ "properties": { "skill": { "type": "string" } },
36
+ "required": ["skill"],
37
+ "additionalProperties": true
38
+ },
39
+ "skillInstructions": { "type": "string", "description": "Extra instructions appended whenever a skill from this plugin loads." },
40
+ "systemPrompt": { "type": "string", "description": "Inline system-prompt contribution; capped at 32 KB." },
41
+ "systemPromptPath": { "type": "string", "description": "./ path to a UTF-8 text file appended after systemPrompt; capped at 32 KB and read at install or reload." },
42
+ "mcpServers": {
43
+ "type": "object",
44
+ "description": "Inline MCP server map. Kimi declares MCP only inline; there is no .mcp.json companion file. A command containing / must start with ./."
45
+ },
46
+ "hooks": { "type": "array", "description": "Inline hook definitions; there is no hooks/hooks.json convention.", "items": { "$ref": "#/$defs/hook" } },
47
+ "commands": { "$ref": "#/$defs/pathList", "description": "./ directories or .md files exposed as slash commands namespaced <plugin>:<command>." },
48
+ "interface": {
49
+ "type": "object",
50
+ "description": "Listing metadata; dropped entirely when every field is absent.",
51
+ "properties": {
52
+ "displayName": { "type": "string" },
53
+ "shortDescription": { "type": "string" },
54
+ "longDescription": { "type": "string" },
55
+ "developerName": { "type": "string" },
56
+ "websiteURL": { "type": "string" }
57
+ },
58
+ "additionalProperties": true
59
+ },
60
+ "tools": { "description": "Legacy kimi-cli field; emits an info diagnostic and is ignored by kimi-code." },
61
+ "apps": { "description": "Unsupported runtime field; ignored." },
62
+ "inject": { "description": "Unsupported runtime field; ignored." },
63
+ "configFile": { "description": "Unsupported runtime field; ignored." },
64
+ "config_file": { "description": "Unsupported runtime field; ignored." },
65
+ "bootstrap": { "description": "Unsupported runtime field; ignored." }
66
+ },
67
+ "required": ["name"],
68
+ "additionalProperties": true,
69
+ "$defs": {
70
+ "pathList": {
71
+ "anyOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
72
+ },
73
+ "hook": {
74
+ "type": "object",
75
+ "properties": {
76
+ "event": { "type": "string" },
77
+ "matcher": { "type": "string" },
78
+ "command": { "type": "string" },
79
+ "timeout": { "type": "number" }
80
+ },
81
+ "additionalProperties": true
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,94 @@
1
+ # Kimi plugin and marketplace specification
2
+
3
+ Reference contract for Kimi plugin repositories. Machine-readable companions: [plugin.schema.json](plugin.schema.json) and [marketplace.schema.json](marketplace.schema.json), both describing the current **kimi-code** CLI.
4
+
5
+ - **Verified:** 2026-09-08.
6
+ - **Evidence:** `MoonshotAI/kimi-code` `docs/en/customization/plugins.md` and `packages/agent-core-v2/src/app/plugin/{manifest,types,marketplace}.ts`; `MoonshotAI/kimi-cli` `docs/en/customization/plugins.md` and `src/kimi_cli/plugin/__init__.py`.
7
+ - **Upstream JSON Schema:** none reachable. MoonshotAI's own shipped plugin declares `$schema: https://kimi.com/schemas/kimi.plugin.schema.json`, but that URL serves the Kimi homepage HTML, not a schema.
8
+ - **Critical scoping note:** MoonshotAI ships **two non-overlapping plugin systems**. `.kimi-plugin/plugin.json` is officially documented — by `kimi-code`, not by the `kimi-cli` repository that older research cites. Their field sets are disjoint.
9
+
10
+ ## kimi-code (current): manifest locations
11
+
12
+ | # | Path | Notes |
13
+ | --- | -------------------------- | ------------------------------------------------------------------------------ |
14
+ | 1 | `kimi.plugin.json` | Wins when both exist; the other becomes `shadowedManifestPath` in diagnostics. |
15
+ | 2 | `.kimi-plugin/plugin.json` | Compatibility layout. |
16
+
17
+ When neither exists, a diagnostic reports `No manifest at kimi.plugin.json or .kimi-plugin/plugin.json`.
18
+
19
+ ## kimi-code plugin manifest
20
+
21
+ Required: `name` (`^[a-z0-9][a-z0-9_-]{0,63}$`, normalized to lowercase). Only `name` invalidates the manifest; every other problem degrades to a diagnostic.
22
+
23
+ | Field | Type | Notes |
24
+ | --- | --- | --- |
25
+ | `version`, `description`, `homepage`, `license` | string | Display metadata. |
26
+ | `keywords` | string[] | |
27
+ | `author` | string \| `{name?, email?}` | A bare string is coerced to `{name}`. |
28
+ | `skills` | string \| string[] | `./`-prefixed paths that must resolve inside the plugin root; defaults to a root `SKILL.md` when present. |
29
+ | `agents` | string \| string[] | `./`-prefixed agent files; `agents/` is auto-discovered when omitted. |
30
+ | `commands` | string \| string[] | `./` directories or `.md` files exposed as `/<plugin>:<command>`. |
31
+ | `sessionStart` | `{skill}` | Loads a named plugin skill at new or resumed session start. |
32
+ | `skillInstructions` | string | Extra instructions appended whenever a plugin skill loads. |
33
+ | `systemPrompt` | string | Inline system-prompt contribution; 32 KB cap. |
34
+ | `systemPromptPath` | string | `./` path to UTF-8 text appended after `systemPrompt`; 32 KB cap; read at install or reload. |
35
+ | `mcpServers` | object | Inline server map. A `command` containing `/` must start with `./`; `cwd` must be `./`-relative. |
36
+ | `hooks` | array | Inline `{event, matcher, command, timeout}` entries. |
37
+ | `interface` | object | `displayName`, `shortDescription`, `longDescription`, `developerName`, `websiteURL`; dropped entirely when all are absent. |
38
+ | `tools`, `apps`, `inject`, `configFile`, `config_file`, `bootstrap` | — | Unsupported runtime fields; emit an `info` diagnostic and are ignored. |
39
+
40
+ Kimi declares MCP **only inline** — there is no `.mcp.json` companion file — and there is no `hooks/hooks.json` convention, no LSP support, and no component declaration fields beyond the ones above.
41
+
42
+ ## kimi-code marketplace manifest
43
+
44
+ Default catalog `https://code.kimi.com/kimi-code/plugins/marketplace.json`, overridable with `KIMI_CODE_PLUGIN_MARKETPLACE_URL` or `/plugins marketplace <source>`. `http(s)://` sources are remote, `file://` is a local path, and anything else is a local path resolved against the current directory. Relative entry sources resolve against the marketplace URL when remote, or the marketplace file's directory when local.
45
+
46
+ Top level: `plugins` (required), `version` (optional, used for update checks).
47
+
48
+ | Entry field | Type | Notes |
49
+ | ------------- | -------- | --------------------------------------------------------------------------------- |
50
+ | `id` | string | Required registration key. |
51
+ | `source` | string | Required. Aliases `url` and `downloadUrl` are accepted; the first non-empty wins. |
52
+ | `displayName` | string | Falls back to `name`, then `id`; alias `name` accepted. |
53
+ | `tier` | string | `official` or `curated`. |
54
+ | `version` | string | Derived from a GitHub `tree`, `commit`, or `releases/tag` URL when present. |
55
+ | `description` | string | Alias `shortDescription` accepted. |
56
+ | `homepage` | string | Alias `websiteURL` accepted. |
57
+ | `keywords` | string[] | |
58
+ | `type` | string | `plugin`; legacy aliases `managed` and `guide`. |
59
+ | `builtIn` | boolean | Declared in the TypeScript interface but not read by the parser. |
60
+
61
+ ## kimi-cli (legacy): a different format
62
+
63
+ Root `plugin.json` is the only manifest path; there is no marketplace and no `.kimi-plugin/` support. The Pydantic model ignores unknown fields.
64
+
65
+ | Field | Type | Notes |
66
+ | ------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
67
+ | `name` | string | Required; lowercase letters, numbers, hyphens. |
68
+ | `version` | string | Required; semantic version. |
69
+ | `description` | string | Default `""`. |
70
+ | `config_file` | string | Credential injection target; required when `inject` is present. |
71
+ | `inject` | object | Maps `target.dotted.path` to a source variable (`api_key`, `base_url`). |
72
+ | `tools` | array | `{name, description, command: string[], parameters?}`; scripts read parameters as JSON on stdin and write results to stdout. |
73
+ | `runtime` | `{host, host_version}` | Host-written after install. |
74
+
75
+ Install location: `~/.kimi/plugins/<name>/`.
76
+
77
+ ## Directory layout (kimi-code)
78
+
79
+ ```text
80
+ <plugin-root>/
81
+ ├── kimi.plugin.json # or .kimi-plugin/plugin.json
82
+ ├── skills/ # or a root SKILL.md
83
+ ├── agents/
84
+ ├── commands/
85
+ ├── hooks/ # referenced by the inline hooks array
86
+ └── SYSTEM.md # via systemPromptPath
87
+ ```
88
+
89
+ ## Evidence gaps
90
+
91
+ 1. The `$schema` URI declared by MoonshotAI's own plugin does not resolve to a schema.
92
+ 2. Whether kimi-code also reads a plain root `plugin.json` is unverified.
93
+ 3. The legacy `kimi-cli` has no marketplace.
94
+ 4. `builtIn` has no observed effect.
@@ -0,0 +1,115 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/qoder/marketplace.schema.json",
4
+ "title": "Qoder CLI Marketplace Manifest",
5
+ "description": "Marketplace catalog read by Qoder CLI at .qoder-plugin/marketplace.json, .claude-plugin/marketplace.json, or a repository-root marketplace.json. Authored from the official reference page and the Zod schema compiled into the shipped CLI; Qoder publishes no JSON Schema.",
6
+ "$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: https://docs.qoder.com/cli/plugins-reference ; @qoder-ai/qodercli@1.1.47 bundle/qodercli.js (marketplace schema Jji, plugin-entry schema jjt, source union bYa). The plugin-entry schema is the plugin manifest schema made optional plus name/source/category/tags/strict, so entries may carry any plugin-manifest field. metadata.pluginRoot is declared but has no consumer in the observed CLI.",
7
+ "type": "object",
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "minLength": 1,
12
+ "maxLength": 100,
13
+ "pattern": "^[a-zA-Z0-9][-a-zA-Z0-9._]*$",
14
+ "description": "Marketplace name; no spaces or non-ASCII characters. Reserved names and qoder-* prefixes are rejected by the CLI."
15
+ },
16
+ "owner": {
17
+ "type": "object",
18
+ "properties": {
19
+ "name": { "type": "string" },
20
+ "email": { "type": "string" },
21
+ "url": { "type": "string" }
22
+ },
23
+ "required": ["name"],
24
+ "additionalProperties": true
25
+ },
26
+ "plugins": { "type": "array", "items": { "$ref": "#/$defs/entry" } },
27
+ "forceRemoveDeletedPlugins": { "type": "boolean", "description": "Uninstall plugins removed from this marketplace." },
28
+ "metadata": {
29
+ "type": "object",
30
+ "properties": {
31
+ "pluginRoot": { "type": "string", "description": "Declared as the base path for relative plugin sources; no consumer was found in the observed CLI." },
32
+ "version": { "type": "string" },
33
+ "description": { "type": "string" }
34
+ },
35
+ "additionalProperties": true
36
+ },
37
+ "allowCrossMarketplaceDependenciesOn": { "type": "array", "items": { "type": "string" } }
38
+ },
39
+ "required": ["name", "owner", "plugins"],
40
+ "additionalProperties": true,
41
+ "$defs": {
42
+ "entry": {
43
+ "type": "object",
44
+ "description": "A plugin entry. Extends the plugin manifest schema, so manifest fields are accepted here too.",
45
+ "properties": {
46
+ "name": { "type": "string", "minLength": 1, "description": "Unique identifier matching the plugin name." },
47
+ "source": { "$ref": "#/$defs/source" },
48
+ "category": { "type": "string" },
49
+ "tags": { "type": "array", "items": { "type": "string" } },
50
+ "strict": { "type": "boolean", "default": true, "description": "Require a plugin manifest in the plugin folder. When false, the marketplace entry provides the manifest." },
51
+ "version": { "type": "string" },
52
+ "description": { "type": "string" },
53
+ "author": {
54
+ "type": "object",
55
+ "properties": { "name": { "type": "string" }, "email": { "type": "string" }, "url": { "type": "string" } },
56
+ "required": ["name"],
57
+ "additionalProperties": true
58
+ },
59
+ "homepage": { "type": "string" },
60
+ "repository": { "type": "string" },
61
+ "license": { "type": "string" },
62
+ "keywords": { "type": "array", "items": { "type": "string" } },
63
+ "dependencies": { "type": "array", "items": {} },
64
+ "commands": {},
65
+ "agents": {},
66
+ "skills": {},
67
+ "outputStyles": {},
68
+ "workflowsPath": { "type": "string" },
69
+ "workflowsPaths": { "type": "array", "items": { "type": "string" } },
70
+ "hooks": {},
71
+ "mcpServers": {},
72
+ "userConfig": { "type": "object" },
73
+ "settings": { "type": "object" }
74
+ },
75
+ "required": ["name", "source"],
76
+ "additionalProperties": true
77
+ },
78
+ "source": {
79
+ "description": "Where to fetch the plugin. A relative path must start with ./ and is resolved against the marketplace install location.",
80
+ "anyOf": [
81
+ { "type": "string", "pattern": "^\\./" },
82
+ {
83
+ "type": "object",
84
+ "properties": { "source": { "enum": ["npm", "pip"] }, "package": { "type": "string" }, "version": { "type": "string" }, "registry": { "type": "string" } },
85
+ "required": ["source", "package"],
86
+ "additionalProperties": true
87
+ },
88
+ {
89
+ "type": "object",
90
+ "properties": { "source": { "const": "url" }, "url": { "type": "string" }, "ref": { "type": "string" }, "sha": { "type": "string", "pattern": "^[a-f0-9]{40}$" } },
91
+ "required": ["source", "url"],
92
+ "additionalProperties": true
93
+ },
94
+ {
95
+ "type": "object",
96
+ "properties": { "source": { "const": "github" }, "repo": { "type": "string" }, "ref": { "type": "string" }, "sha": { "type": "string", "pattern": "^[a-f0-9]{40}$" } },
97
+ "required": ["source", "repo"],
98
+ "additionalProperties": true
99
+ },
100
+ {
101
+ "type": "object",
102
+ "properties": {
103
+ "source": { "const": "git-subdir" },
104
+ "url": { "type": "string" },
105
+ "path": { "type": "string" },
106
+ "ref": { "type": "string" },
107
+ "sha": { "type": "string", "pattern": "^[a-f0-9]{40}$" }
108
+ },
109
+ "required": ["source", "url", "path"],
110
+ "additionalProperties": true
111
+ }
112
+ ]
113
+ }
114
+ }
115
+ }
@@ -0,0 +1,127 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://sivan757.github.io/dsh-agent-plugins-market/schemas/qoder/plugin.schema.json",
4
+ "title": "Qoder CLI Plugin Manifest",
5
+ "description": "Plugin manifest accepted by Qoder CLI at .qoder-plugin/plugin.json, with an undocumented .claude-plugin/plugin.json fallback. Authored from the official reference page and the Zod schema compiled into the shipped CLI; Qoder publishes no JSON Schema. Unknown properties are stripped by the client, so this schema is open.",
6
+ "$comment": "Provenance: authored (not upstream-vendored) 2026-09-08. Sources: https://docs.qoder.com/cli/plugins-reference ; @qoder-ai/qodercli@1.1.47 bundle/qodercli.js (compiled Zod schemas, lookup arrays). Component paths must start with ./ per the CLI schema. lspServers and channels are recognized but not implemented and are ignored with a warning.",
7
+ "type": "object",
8
+ "properties": {
9
+ "name": {
10
+ "type": "string",
11
+ "minLength": 1,
12
+ "description": "Unique identifier; non-empty and free of spaces. Kebab-case is recommended. The CLI defaults version to \"local\" and derives the name from the directory when the manifest is absent."
13
+ },
14
+ "version": { "type": "string", "description": "Semantic version. The CLI substitutes \"local\" at install time when absent." },
15
+ "displayName": { "type": "string", "description": "Human-readable name for UI surfaces." },
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
+ "required": ["name"],
25
+ "additionalProperties": true
26
+ },
27
+ "homepage": { "type": "string", "description": "Must be a valid URL." },
28
+ "repository": { "type": "string" },
29
+ "license": { "type": "string", "description": "SPDX identifier, e.g. MIT or Apache-2.0." },
30
+ "keywords": { "type": "array", "items": { "type": "string" } },
31
+ "dependencies": {
32
+ "type": "array",
33
+ "description": "Plugins that must be enabled for this plugin to work. A bare name resolves against the declaring plugin's own marketplace.",
34
+ "items": {
35
+ "anyOf": [
36
+ { "type": "string", "pattern": "^[a-z0-9][-a-z0-9._]*(@[a-z0-9][-a-z0-9._]*)?(@\\^[^@]*)?$" },
37
+ {
38
+ "type": "object",
39
+ "properties": { "name": { "type": "string" }, "marketplace": { "type": "string" } },
40
+ "required": ["name"],
41
+ "additionalProperties": true
42
+ }
43
+ ]
44
+ }
45
+ },
46
+ "commands": { "$ref": "#/$defs/commandComponent" },
47
+ "agents": { "$ref": "#/$defs/markdownComponent" },
48
+ "skills": { "$ref": "#/$defs/component" },
49
+ "outputStyles": { "$ref": "#/$defs/component", "description": "Overrides the conventional output-styles/ directory." },
50
+ "workflowsPath": { "$ref": "#/$defs/componentPath" },
51
+ "workflowsPaths": { "type": "array", "items": { "$ref": "#/$defs/componentPath" } },
52
+ "hooks": { "$ref": "#/$defs/jsonComponent" },
53
+ "mcpServers": { "$ref": "#/$defs/jsonComponent" },
54
+ "userConfig": {
55
+ "type": "object",
56
+ "description": "User-configurable values prompted at enable time. Keys must match ^[A-Za-z_]\\w*$.",
57
+ "propertyNames": { "pattern": "^[A-Za-z_]\\w*$" },
58
+ "additionalProperties": { "$ref": "#/$defs/userConfigOption" }
59
+ },
60
+ "settings": {
61
+ "type": "object",
62
+ "description": "Settings merged when the plugin is enabled. Only the allowlisted key \"agent\" is kept; other keys are ignored."
63
+ },
64
+ "lspServers": { "description": "Recognized but not implemented in the observed CLI; warned and ignored." },
65
+ "channels": { "description": "Recognized but not implemented in the observed CLI; warned and ignored." }
66
+ },
67
+ "required": ["name"],
68
+ "additionalProperties": true,
69
+ "$defs": {
70
+ "componentPath": { "type": "string", "pattern": "^\\." },
71
+ "component": {
72
+ "description": "A plugin-relative path, an array of paths, or an object map.",
73
+ "anyOf": [{ "$ref": "#/$defs/componentPath" }, { "type": "array", "items": { "$ref": "#/$defs/componentPath" } }, { "type": "object" }]
74
+ },
75
+ "markdownComponent": {
76
+ "description": "Agent definitions; every declared path must end in .md.",
77
+ "anyOf": [
78
+ { "type": "string", "pattern": "^\\..*\\.md$" },
79
+ { "type": "array", "items": { "type": "string", "pattern": "^\\..*\\.md$" } }
80
+ ]
81
+ },
82
+ "jsonComponent": {
83
+ "description": "Configuration declared as a plugin-relative .json path, an inline object, or an array mixing both.",
84
+ "anyOf": [{ "type": "string", "pattern": "^\\..*\\.json$" }, { "type": "object" }, { "type": "array" }]
85
+ },
86
+ "commandComponent": {
87
+ "description": "Command definitions: paths, an array of paths, or an object mapping command names to inline definitions.",
88
+ "anyOf": [
89
+ { "$ref": "#/$defs/componentPath" },
90
+ { "type": "array", "items": { "$ref": "#/$defs/componentPath" } },
91
+ { "type": "object", "additionalProperties": { "$ref": "#/$defs/commandDefinition" } }
92
+ ]
93
+ },
94
+ "commandDefinition": {
95
+ "type": "object",
96
+ "properties": {
97
+ "source": { "type": "string", "description": "Mutually exclusive with content." },
98
+ "content": { "type": "string", "description": "Mutually exclusive with source." },
99
+ "description": { "type": "string" },
100
+ "argumentHint": { "type": "string" },
101
+ "model": { "type": "string" },
102
+ "allowedTools": { "type": "array", "items": { "type": "string" } },
103
+ "context": { "enum": ["inline", "fork"] },
104
+ "arguments": { "type": "array", "items": { "type": "string" } },
105
+ "effort": { "type": "string" },
106
+ "agent": { "type": "string" }
107
+ },
108
+ "additionalProperties": true
109
+ },
110
+ "userConfigOption": {
111
+ "type": "object",
112
+ "properties": {
113
+ "type": { "enum": ["string", "number", "boolean", "directory", "file"] },
114
+ "title": { "type": "string" },
115
+ "description": { "type": "string" },
116
+ "required": { "type": "boolean" },
117
+ "default": {},
118
+ "multiple": { "type": "boolean" },
119
+ "sensitive": { "type": "boolean" },
120
+ "min": { "type": "number" },
121
+ "max": { "type": "number" }
122
+ },
123
+ "required": ["title", "description"],
124
+ "additionalProperties": false
125
+ }
126
+ }
127
+ }