dsh-agent-plugins-market 0.7.2 → 0.8.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 (36) hide show
  1. package/README.md +11 -3
  2. package/README.zh.md +11 -3
  3. package/client/client.js +47 -27
  4. package/client/client.js.map +1 -1
  5. package/lib/application/catalog.js +9 -2
  6. package/lib/catalog/component-files.js +3 -1
  7. package/lib/catalog/native-project.js +1 -1
  8. package/lib/catalog/project-config.js +0 -2
  9. package/lib/catalog/project-hooks.js +12 -7
  10. package/lib/catalog/surfaces.js +17 -10
  11. package/lib/model/command-names.js +14 -0
  12. package/lib/model/layouts.js +1 -0
  13. package/lib/runtime/commands-mounts.js +3 -2
  14. package/lib/runtime/hooks-mounts.js +7 -4
  15. package/lib/runtime/mcp-direct-config.js +18 -9
  16. package/lib/runtime/plugin-message-source.js +4 -0
  17. package/lib/runtime/project-runtime.js +10 -8
  18. package/lib/runtime/user-commands.js +23 -8
  19. package/lib/runtime/user-hooks.js +102 -0
  20. package/lib/runtime/user-panels.js +34 -22
  21. package/lib/runtime/user-store.js +81 -19
  22. package/lib/types/catalog/component-files.d.ts +1 -0
  23. package/lib/types/catalog/project-hooks.d.ts +15 -2
  24. package/lib/types/catalog/surfaces.d.ts +6 -4
  25. package/lib/types/contracts/market.d.ts +5 -1
  26. package/lib/types/model/command-names.d.ts +12 -0
  27. package/lib/types/model/layouts.d.ts +1 -0
  28. package/lib/types/model/types.d.ts +2 -1
  29. package/lib/types/runtime/mcp-direct-config.d.ts +1 -5
  30. package/lib/types/runtime/plugin-message-source.d.ts +24 -0
  31. package/lib/types/runtime/user-commands.d.ts +5 -2
  32. package/lib/types/runtime/user-hooks.d.ts +22 -0
  33. package/lib/types/runtime/user-panels.d.ts +35 -15
  34. package/lib/types/runtime/user-store.d.ts +27 -10
  35. package/package.json +32 -28
  36. package/schemas/com.deepseek.harness/spec.md +1 -1
@@ -5,15 +5,25 @@
5
5
  * frontmatter rules the catalog uses, so user entries look exactly like suite
6
6
  * entries to the runtime mounts.
7
7
  *
8
- * An entry is one document. Skills also accept the cross-tool directory
9
- * spelling (`<name>/SKILL.md`) that other Agent tools and the harness's own
10
- * reader of `~/.agents/skills` author; commands and personas are flat only.
8
+ * An entry is one document. A flat panel reads the immediate `<name>.md`
9
+ * children of its directory; a nested panel (commands and agent personas)
10
+ * reads every `.md` document at any depth and names each by its path relative
11
+ * to that directory. Skills also accept the cross-tool directory spelling
12
+ * (`<name>/SKILL.md`) that other Agent tools and the harness's own reader of
13
+ * `~/.agents/skills` author, and read it from the top level only.
11
14
  * @module runtime/user-store
12
15
  */
13
16
  /** Where user panel entries persist: `<agentsRoot>/<kind>/`. */
14
17
  export declare function userEntryDir(agentsRoot: string, kind: 'skills' | 'commands' | 'agents'): string;
15
- /** `[a-z][a-z0-9_-]*` — the grammar every panel entry name must satisfy. */
18
+ /** `[a-z][a-z0-9_-]*` — one segment of a panel entry name. */
16
19
  export declare const USER_ENTRY_NAME: RegExp;
20
+ /**
21
+ * The path grammar a nested panel entry name satisfies: one or more
22
+ * {@link USER_ENTRY_NAME} segments joined by `/`. It rejects `..`, leading or
23
+ * trailing separators, empty segments, backslashes, and uppercase, so the name
24
+ * stays a path relative to the panel directory.
25
+ */
26
+ export declare const USER_ENTRY_PATH: RegExp;
17
27
  /** The file name of a directory-shaped skill's document. */
18
28
  export declare const SKILL_ENTRY_FILE = "SKILL.md";
19
29
  /**
@@ -42,11 +52,18 @@ export interface EntryDocument {
42
52
  }
43
53
  /**
44
54
  * Resolve one entry name to its document, taking the first shape the path
45
- * exists in. Names outside the entry grammar never touch the filesystem.
55
+ * exists in. A nested panel accepts a path name (`git/commit`); a flat panel
56
+ * accepts a single segment. Names outside the panel's grammar never touch the
57
+ * filesystem.
58
+ */
59
+ export declare function resolveEntryDocument(dir: string, name: string, shapes: readonly EntryShape[], strict?: boolean, nested?: boolean): Promise<EntryDocument | undefined>;
60
+ /**
61
+ * Every entry document the served shapes expose. A flat panel reads immediate
62
+ * children only; a nested panel walks every subdirectory to any depth and
63
+ * names each entry by its path relative to `dir`. Entries are deduplicated by
64
+ * name at the first shape that has it.
46
65
  */
47
- export declare function resolveEntryDocument(dir: string, name: string, shapes: readonly EntryShape[], strict?: boolean): Promise<EntryDocument | undefined>;
48
- /** Every entry document the served shapes expose, deduplicated by name at the first shape that has it. */
49
- export declare function listEntryDocuments(dir: string, strict?: boolean, shapes?: readonly EntryShape[]): Promise<EntryDocument[]>;
66
+ export declare function listEntryDocuments(dir: string, strict?: boolean, shapes?: readonly EntryShape[], nested?: boolean): Promise<EntryDocument[]>;
50
67
  /** Parse full YAML metadata without flattening arrays, mappings, or multiline strings. */
51
68
  export declare function parseFrontmatterRecord(text: string): Record<string, unknown>;
52
69
  /** Read one resolved entry; strict runtime snapshots throw on I/O errors other than a vanished file. */
@@ -79,7 +96,7 @@ export interface UserEntryFile {
79
96
  };
80
97
  }
81
98
  /** List entries across the served shapes; strict runtime snapshots propagate I/O errors instead of publishing partial inventories. */
82
- export declare function listEntryFiles(dir: string, strict?: boolean, shapes?: readonly EntryShape[]): Promise<UserEntryFile[]>;
99
+ export declare function listEntryFiles(dir: string, strict?: boolean, shapes?: readonly EntryShape[], nested?: boolean): Promise<UserEntryFile[]>;
83
100
  /** Create one panel entry's document from its name: `<name>.md`, or `<name>/SKILL.md` in the directory shape. */
84
101
  export declare function writeEntryFile(dir: string, name: string, text: string, shape?: EntryShape): Promise<void>;
85
102
  /** Replace one resolved entry's document in place, wherever it lives. */
@@ -93,6 +110,6 @@ export declare function writeEntryDocument(document: EntryDocument, text: string
93
110
  */
94
111
  export declare function deleteEntryDocument(document: EntryDocument): Promise<void>;
95
112
  /** Whether an entry document with that name exists in any served shape. */
96
- export declare function entryExists(dir: string, name: string, shapes?: readonly EntryShape[]): Promise<boolean>;
113
+ export declare function entryExists(dir: string, name: string, shapes?: readonly EntryShape[], nested?: boolean): Promise<boolean>;
97
114
  /** Serialize a frontmatter block from a shallow record (deterministic key order). */
98
115
  export declare function serializeFrontmatter(meta: Record<string, unknown>): string;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dsh-agent-plugins-market",
3
- "description": "The standard way to install Claude Code / Codex / Cursor / Kimi plugin marketplace suites in DeepSeek Harness (DSH) — zero conversion, zero file copying. Skills, MCP servers, hooks and slash commands are injected into your dsh sessions at runtime.",
4
- "version": "0.7.2",
3
+ "description": "One-stop skills, subagent, MCP and LSP manager inside DeepSeek Harness (DSH), compatible with Claude Code, Codex, Cursor, Kimi and other agent plugin layouts.",
4
+ "version": "0.8.0",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/types/index.d.ts",
@@ -75,15 +75,16 @@
75
75
  ],
76
76
  "peerDependencies": {
77
77
  "@deepseek-ai/cordis": "^4.0.2",
78
- "@deepseek-ai/dsh-attachment": "^0.1.5-rc.2",
79
- "@deepseek-ai/dsh-credentials": "^0.1.5-rc.2",
80
- "@deepseek-ai/dsh-hooks-claude-code": "^0.1.5-rc.2",
81
- "@deepseek-ai/dsh-llm": "^0.1.5-rc.2",
82
- "@deepseek-ai/dsh-mcp-client": "^0.1.5-rc.2",
83
- "@deepseek-ai/dsh-skill": "^0.1.5-rc.2",
84
- "@deepseek-ai/dsh-subprocess": "^0.1.5-rc.2",
85
- "@deepseek-ai/dsh-timeout": "^0.1.5-rc.2",
86
- "@deepseek-ai/dsh-tools": "^0.1.5-rc.2"
78
+ "@deepseek-ai/dsh-attachment": "^0.1.7-rc.1",
79
+ "@deepseek-ai/dsh-credentials": "^0.1.7-rc.1",
80
+ "@deepseek-ai/dsh-hooks-claude-code": "^0.1.7-rc.1",
81
+ "@deepseek-ai/dsh-llm": "^0.1.7-rc.1",
82
+ "@deepseek-ai/dsh-mcp-client": "^0.1.7-rc.1",
83
+ "@deepseek-ai/dsh-skill": "^0.1.7-rc.1",
84
+ "@deepseek-ai/dsh-subprocess": "^0.1.7-rc.1",
85
+ "@deepseek-ai/dsh-timeout": "^0.1.7-rc.1",
86
+ "@deepseek-ai/dsh-tools": "^0.1.7-rc.1",
87
+ "@deepseek-ai/dsh-util-workspace-path": "^0.1.7-rc.1"
87
88
  },
88
89
  "peerDependenciesMeta": {
89
90
  "@deepseek-ai/dsh-hooks-claude-code": {
@@ -97,11 +98,11 @@
97
98
  }
98
99
  },
99
100
  "dependencies": {
100
- "@deepseek-ai/dsh-atomic-write": "^0.1.5-rc.2",
101
- "@deepseek-ai/dsh-home-paths": "^0.1.5-rc.2",
102
- "@deepseek-ai/dsh-lsp": "^0.1.5-rc.2",
103
- "@deepseek-ai/dsh-lsp-stdio": "^0.1.5-rc.2",
104
- "@deepseek-ai/dsh-tool-lsp": "^0.1.5-rc.2",
101
+ "@deepseek-ai/dsh-atomic-write": "^0.1.7-rc.1",
102
+ "@deepseek-ai/dsh-home-paths": "^0.1.7-rc.1",
103
+ "@deepseek-ai/dsh-lsp": "^0.1.7-rc.1",
104
+ "@deepseek-ai/dsh-lsp-stdio": "^0.1.7-rc.1",
105
+ "@deepseek-ai/dsh-tool-lsp": "^0.1.7-rc.1",
105
106
  "@deepseek-ai/schemastery": "^3.18.2",
106
107
  "@modelcontextprotocol/sdk": "^1.30.0",
107
108
  "ajv": "^8.17.1",
@@ -118,18 +119,19 @@
118
119
  "@codemirror/state": "^6.7.5",
119
120
  "@codemirror/view": "^6.43.12",
120
121
  "@deepseek-ai/cordis": "^4.0.2",
121
- "@deepseek-ai/dsh-attachment": "0.1.5-rc.2",
122
- "@deepseek-ai/dsh-client-store": "0.1.5-rc.2",
123
- "@deepseek-ai/dsh-client-ui-primitives": "0.1.5-rc.2",
124
- "@deepseek-ai/dsh-client-ui-settings": "0.1.5-rc.2",
125
- "@deepseek-ai/dsh-credentials": "0.1.5-rc.2",
126
- "@deepseek-ai/dsh-hooks-claude-code": "0.1.5-rc.2",
127
- "@deepseek-ai/dsh-llm": "0.1.5-rc.2",
128
- "@deepseek-ai/dsh-mcp-client": "0.1.5-rc.2",
129
- "@deepseek-ai/dsh-skill": "0.1.5-rc.2",
130
- "@deepseek-ai/dsh-subprocess": "0.1.5-rc.2",
131
- "@deepseek-ai/dsh-timeout": "0.1.5-rc.2",
132
- "@deepseek-ai/dsh-tools": "0.1.5-rc.2",
122
+ "@deepseek-ai/dsh-attachment": "0.1.7-rc.1",
123
+ "@deepseek-ai/dsh-client-store": "0.1.7-rc.1",
124
+ "@deepseek-ai/dsh-client-ui-primitives": "0.1.7-rc.1",
125
+ "@deepseek-ai/dsh-client-ui-settings": "0.1.7-rc.1",
126
+ "@deepseek-ai/dsh-credentials": "0.1.7-rc.1",
127
+ "@deepseek-ai/dsh-hooks-claude-code": "0.1.7-rc.1",
128
+ "@deepseek-ai/dsh-llm": "0.1.7-rc.1",
129
+ "@deepseek-ai/dsh-mcp-client": "0.1.7-rc.1",
130
+ "@deepseek-ai/dsh-skill": "0.1.7-rc.1",
131
+ "@deepseek-ai/dsh-subprocess": "0.1.7-rc.1",
132
+ "@deepseek-ai/dsh-timeout": "0.1.7-rc.1",
133
+ "@deepseek-ai/dsh-tools": "0.1.7-rc.1",
134
+ "@deepseek-ai/dsh-util-workspace-path": "0.1.7-rc.1",
133
135
  "@eslint/js": "^10.0.1",
134
136
  "@shikijs/langs": "^4.4.3",
135
137
  "@tsdown/css": "^0.22.14",
@@ -140,6 +142,7 @@
140
142
  "anser": "^2.3.5",
141
143
  "clsx": "^2.1.1",
142
144
  "dependency-cruiser": "^18.4.0",
145
+ "diff": "^9.0.0",
143
146
  "eslint": "^10.9.1",
144
147
  "immer": "^11.1.18",
145
148
  "jsdom": "^30.0.1",
@@ -159,6 +162,7 @@
159
162
  "react": "^18.3.1",
160
163
  "react-dom": "~18.3.1",
161
164
  "shiki": "^4.4.3",
165
+ "simple-icons": "^16.31.0",
162
166
  "tsdown": "^0.22.14",
163
167
  "typescript": "^5.8.3",
164
168
  "typescript-eslint": "^8.67.0",
@@ -27,7 +27,7 @@ Namespace values are the suite's defaults rather than a ceiling the user cannot
27
27
 
28
28
  ## User-owned declarations
29
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.
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
31
 
32
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
33