dsh-pstack 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,13 +15,13 @@
15
15
  <p align="center">
16
16
  <a href="https://npmx.dev/package/dsh-pstack"><img src="https://img.shields.io/npm/v/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669" alt="npm version" /></a>
17
17
  <a href="https://npmx.dev/package/dsh-pstack"><img src="https://img.shields.io/npm/dm/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669" alt="npm downloads" /></a>
18
- <a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/dsh-0.2.2--alpha.2-1f6feb?style=flat-square" alt="dsh 0.2.2-alpha.2" /></a>
18
+ <a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/dsh-%3E%3D0.2.1--rc.5-1f6feb?style=flat-square" alt="dsh >=0.2.1-rc.5" /></a>
19
19
  <a href="https://github.com/cursor/plugins/tree/main/pstack"><img src="https://img.shields.io/badge/pstack-0.15.36-d97706?style=flat-square" alt="pstack 0.15.36" /></a>
20
20
  </p>
21
21
 
22
22
  <p align="center">
23
23
  <a href="https://github.com/l246804/dsh-pstack/blob/main/LICENSE"><img src="https://img.shields.io/github/license/l246804/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669" alt="license" /></a>
24
- <a href="https://bundlephobia.com/result?p=dsh-pstack"><img src="https://img.shields.io/bundlephobia/minzip/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669&label=minzip" alt="minzip size" /></a>
24
+ <a href="https://npmx.dev/package/dsh-pstack"><img src="https://img.shields.io/npm/unpacked-size/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669" alt="unpacked size" /></a>
25
25
  <a href="https://www.jsdocs.io/package/dsh-pstack"><img src="https://img.shields.io/badge/jsdocs-reference-080f12?style=flat-square&colorA=080f12&colorB=1fa669" alt="JSDocs" /></a>
26
26
  </p>
27
27
 
@@ -30,7 +30,7 @@
30
30
  <tr>
31
31
  <td align="center"><strong>58</strong><br /><sub>pstack skills</sub></td>
32
32
  <td align="center"><strong>23</strong><br /><sub>playbooks</sub></td>
33
- <td align="center"><strong>4</strong><br /><sub>native tools</sub></td>
33
+ <td align="center"><strong>5</strong><br /><sub>native tools</sub></td>
34
34
  <td align="center"><strong>2</strong><br /><sub>agent presets</sub></td>
35
35
  <td align="center"><strong>5</strong><br /><sub>bundled scripts</sub></td>
36
36
  </tr>
@@ -42,10 +42,11 @@
42
42
  <a href="#capabilities">Capabilities</a> ·
43
43
  <a href="#skills-directory">Skills directory</a> ·
44
44
  <a href="#optional-dsh-plugins">Optional DSH plugins</a> ·
45
- <a href="#compatibility">Compatibility</a>
45
+ <a href="#compatibility">Compatibility</a> ·
46
+ <a href="#friendly-links">Friendly Links</a>
46
47
  </p>
47
48
 
48
- `dsh-pstack` ports [pstack](https://github.com/cursor/plugins/tree/main/pstack) to [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH). It keeps the upstream pstack skills, playbooks, and reference documents. Four native tools replace the interfaces that DSH lacks, while an adaptation layer maps Cursor's tool names, subagent fields, model slugs, and paths to DSH.
49
+ `dsh-pstack` ports [pstack](https://github.com/cursor/plugins/tree/main/pstack) to [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (DSH). It keeps the upstream pstack skills, playbooks, and reference documents. Five native tools fill the gaps in DSH's interfaces, while an adaptation layer maps Cursor's tool names, subagent fields, model slugs, and paths to DSH.
49
50
 
50
51
  Most upstream pstack skills declare `disable-model-invocation: true`. `poteto-mode` routes to those hidden skills by name, but DSH's `skill` tool only exposes the model-visible catalog. DSH also has no equivalents for Cursor's model slugs, `subagent_type`, `readonly`, and Bun scripts. dsh-pstack handles those differences in the plugin layer. You can start with `/poteto-mode` after installation.
51
52
 
@@ -96,6 +97,7 @@ See [`pstack/README.md`](./pstack/README.md) for the full capability map, gaps,
96
97
  |---|---|
97
98
  | `pstack_skill` | Loads a hidden skill registered by this plugin by name, and reads relative resources inside the skill directory. |
98
99
  | `pstack_models` | Read-only list of the providers, models, and efforts DSH actually offers, used by `/setup-pstack`. |
100
+ | `pstack_roles` | Read-only list of every pstack role's shape and whether it is an automatic panel, so a `pstack_subagent` call passes the right `roleIndex`. |
99
101
  | `pstack_subagent` | Reads `$DSH_HOME/pstack-models.mdc` per role, parses `provider/model [effort]`, selects a preset by `agent`, and can start several subagents at once. |
100
102
  | `pstack_script` | Runs bundled Node scripts by fixed id without Bun or shell scripts. |
101
103
 
@@ -124,7 +126,7 @@ Open **Plugins → Installed plugins → dsh-pstack** and click **Configure** in
124
126
 
125
127
  ## Optional DSH plugins
126
128
 
127
- DSH ships with the following plugins, which are disabled by default. dsh-pstack does not require them during installation. Some pstack flows need these plugins to run end to end. To enable a plugin, enter its package name in **Add plugin** on the Plugins page. Alternatively, run `dsh plugin --profile <profile> add <package>`, then restart the profile. Except for `@deepseek-ai/dsh-mcp-client`, the bundles and providers here are experimental.
129
+ DSH provides the following optional plugins, which are disabled by default. Most ship with DSH; `@deepseek-ai/dsh-cua-bundle` installs on demand. dsh-pstack does not require them during installation. Some pstack flows need these plugins to run end to end. To enable a plugin, enter its package name in **Add plugin** on the Plugins page. Alternatively, run `dsh plugin --profile <profile> add <package>`, then restart the profile. Except for `@deepseek-ai/dsh-mcp-client`, the bundles and providers here are experimental.
128
130
 
129
131
  > [!NOTE]
130
132
  > Without an optional plugin, the pstack skills still load. Steps that need the plugin print `Skipped in DeepSeek Harness: <step>. <reason>.` and continue. Missing `gh`, Java/TLC, or video tools also cause the corresponding steps to report blocked or degrade to screenshots. dsh-pstack never marks an unrun step as passed.
@@ -135,7 +137,7 @@ DSH ships with the following plugins, which are disabled by default. dsh-pstack
135
137
  |---|---|---|
136
138
  | `@deepseek-ai/dsh-experimental-session-search` | Five read-only tools search and trace historical Sessions for `/recall`, `/reflect`, and `/show-me-your-work`: `session_search`, `session_event_search`, `session_trace`, `session_event_trace`, and `session_event_read`. | Matches only Sessions with the same `cwd`; use `session_event_search` for the current Session; there is no Cursor `.jsonl` transcript path. |
137
139
  | `@deepseek-ai/dsh-experimental-worktree`<br />`@deepseek-ai/dsh-experimental-tool-worktree` | `create_worktree` creates a local branch and worktree and switches the current Session directory, isolating parallel candidates for `/arena`, `/swarm`, and `/architect`. | `from` reads only local refs and does not fetch; there is no cloud VM; creating worktrees repeatedly changes `cwd`; it does not automatically give each subagent its own tree. |
138
- | `@deepseek-ai/dsh-experimental-forge-bundle` | PR panel, checks, review, mark ready, merge, and Session binding, plus starting a Session from the composer with a new worktree, serving `/babysit`, `/shipping`, and `/autopilot-*`. | GitHub only, requires `gh` login; there is no take tool on the model side; there is no stack verdict or `origin` CLI; it can coexist with the worktree bundle. |
140
+ | `@deepseek-ai/dsh-experimental-forge-bundle` | PR panel, checks, review, mark ready, merge, and Session binding, plus starting a Session from the composer with a new worktree, serving `/babysit`, `/shipping`, and `/autopilot-*`. | GitHub only, requires `gh` login; there is no model-side change-request tool; there is no stack verdict or `origin` CLI; it can coexist with the worktree bundle. |
139
141
 
140
142
  ### Verification and evidence
141
143
 
@@ -143,16 +145,16 @@ Choose one of three browser providers: `@deepseek-ai/dsh-experimental-browser-us
143
145
 
144
146
  | Plugin | Capability when enabled | Boundaries and conflicts |
145
147
  |---|---|---|
146
- | `@deepseek-ai/dsh-browser-use` + one provider | Navigation, clicking, typing, screenshots, and ARIA snapshots; Stagehand also provides act, find, and extract, for verification skills and UI reproduction. | The base package does nothing without a provider; one provider per Session; screenshots need an image model; no video; Stagehand needs Chromium and a non-DeepSeek model. |
147
- | `@deepseek-ai/dsh-cua-bundle` | macOS app clicking, typing, screenshots, and permission pages, for desktop app verification. | macOS PTC only; Windows is incomplete; no video. |
148
- | `@deepseek-ai/dsh-experimental-terminal-bundle` | Six global terminal tools that keep a shell or REPL alive across calls and support background send, for CLI and TUI verification. | Terminal only; added to every Agent; persistent state must be cleaned up; switching invalidates the KV cache. |
148
+ | `@deepseek-ai/dsh-browser-use` + one provider | Navigation, clicking, typing, screenshots, and ARIA snapshots; Stagehand also provides act, observe, and extract, for verification skills and UI reproduction. | The base package does nothing without a provider; one provider per Session; screenshots need an image-capable model; no video; Stagehand needs Chromium and a non-DeepSeek model. |
149
+ | `@deepseek-ai/dsh-cua-bundle` | macOS app clicking, typing, screenshots, permission pages, and session-level authorization, for desktop app verification. | macOS PTC only; single computer-use provider slot; Windows is incomplete; no video. |
150
+ | `@deepseek-ai/dsh-experimental-terminal-bundle` | Six global terminal tools that keep a shell or REPL alive across calls, support background send, and isolate terminals by owner, for CLI and TUI verification. | Terminal only; added to every Agent; persistent state must be cleaned up; switching invalidates the KV cache. |
149
151
  | `@deepseek-ai/dsh-mcp-client` | Mounts MCP servers; tools appear as `mcp__<server>__<tool>`, and `mcp-resources` lists servers with resources, serving evidence investigation for `/why` and `/teach`. | No default server; configuration is per server; no automatic category discovery. |
150
152
 
151
153
  ### Multi-agent
152
154
 
153
155
  | Plugin | Capability when enabled | Boundaries and conflicts |
154
156
  |---|---|---|
155
- | `@deepseek-ai/dsh-experimental-agent-team-profile` | Lead and teammate roles, a shared task board, nine team tools, and a Web roster, serving `/orchestrate` and `/autopilot-*`. | Disables `subagent` and `subagent_fork`. Conflicts with `pstack_subagent`. See the warning below. |
157
+ | `@deepseek-ai/dsh-experimental-agent-team-profile` | Lead and teammate roles, a shared task board, nine team tools, and a Web roster, serving `/orchestrate` and `/autopilot-*`. | Disables `subagent` and `subagent_fork`. Conflicts with `pstack_subagent`. There is no pstack PR frontier, ledger, or stack verdict. See the warning below. |
156
158
  | `@deepseek-ai/dsh-experimental-ralph-bundle` | Global `ralph`, a foreground loop with a fresh child each round, serving `/autonomous-run`. | Not a persistent loop in the same Session; no event watcher; does not replace goals, heartbeats, or the decision log. |
157
159
 
158
160
  > [!WARNING]
@@ -163,7 +165,7 @@ Choose one of three browser providers: `@deepseek-ai/dsh-experimental-browser-us
163
165
  | Item | Version | Notes |
164
166
  |---|---|---|
165
167
  | DSH | `>=0.2.1-rc.5` | Minimum supported version; verified through the `0.2.2-alpha.2` baseline |
166
- | pstack | `0.15.36` | Upstream baseline commit `4dd1d05` |
168
+ | pstack | `0.15.36` | Upstream baseline commit `ae5650f` |
167
169
  | Node.js | `>=24.21.1` | Runtime requirement |
168
170
  | Cordis | `~4.0.6-alpha.1` | Peer dependency |
169
171
 
@@ -183,7 +185,11 @@ A worktree Session has a different `cwd` from the original Session. The session-
183
185
 
184
186
  Upstream pstack adapts Claude Code with `docs/harness/claude-code.md`. It preserves the skill bodies. A separate host adaptation table maps `Task`, `AskQuestion`, todo, model slugs, and paths to the target host. The generator adds a one-line Claude Code adaptation note to skills that use Cursor names. Unsupported capabilities report `Skipped in Claude Code: <step>. <reason>.`
185
187
 
186
- dsh-pstack follows the same approach. The main adaptation document is [`pstack/harness/docs/harness/dsh.md`](./pstack/harness/docs/harness/dsh.md). It covers Tools, Subagent fields, Models, setup-pstack, Paths, and Cursor-only features. The `pstack_*` tools, agent presets, and Node scripts replace fields that DSH lacks. At build time, upstream pstack and the local adaptation tree are rendered into `pstack/pstack/`, then packaged with `src/*.ts` and `skills/` into `dist/`.
188
+ dsh-pstack follows the same approach. The main adaptation document is [`pstack/harness/docs/harness/dsh.md`](./pstack/harness/docs/harness/dsh.md). It covers Tools, Subagent fields, Models, setup-pstack, Paths, Cursor-only features, Local replacements, and Optional plugins. The `pstack_*` tools, agent presets, and Node scripts replace fields that DSH lacks. At build time, upstream pstack and the local adaptation tree are rendered into `pstack/pstack/`, then packaged with `src/*.ts` and `skills/` into `dist/`.
189
+
190
+ ## Friendly Links
191
+
192
+ [LinuxDo](https://linux.do/) — the new ideal community
187
193
 
188
194
  ## Credits
189
195
 
package/README.zh.md CHANGED
@@ -15,13 +15,13 @@
15
15
  <p align="center">
16
16
  <a href="https://npmx.dev/package/dsh-pstack"><img src="https://img.shields.io/npm/v/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669" alt="npm version" /></a>
17
17
  <a href="https://npmx.dev/package/dsh-pstack"><img src="https://img.shields.io/npm/dm/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669" alt="npm downloads" /></a>
18
- <a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/dsh-0.2.2--alpha.2-1f6feb?style=flat-square" alt="dsh 0.2.2-alpha.2" /></a>
18
+ <a href="https://github.com/deepseek-ai/deepseek-harness"><img src="https://img.shields.io/badge/dsh-%3E%3D0.2.1--rc.5-1f6feb?style=flat-square" alt="dsh >=0.2.1-rc.5" /></a>
19
19
  <a href="https://github.com/cursor/plugins/tree/main/pstack"><img src="https://img.shields.io/badge/pstack-0.15.36-d97706?style=flat-square" alt="pstack 0.15.36" /></a>
20
20
  </p>
21
21
 
22
22
  <p align="center">
23
23
  <a href="https://github.com/l246804/dsh-pstack/blob/main/LICENSE"><img src="https://img.shields.io/github/license/l246804/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669" alt="license" /></a>
24
- <a href="https://bundlephobia.com/result?p=dsh-pstack"><img src="https://img.shields.io/bundlephobia/minzip/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669&label=minzip" alt="minzip size" /></a>
24
+ <a href="https://npmx.dev/package/dsh-pstack"><img src="https://img.shields.io/npm/unpacked-size/dsh-pstack?style=flat-square&colorA=080f12&colorB=1fa669" alt="unpacked size" /></a>
25
25
  <a href="https://www.jsdocs.io/package/dsh-pstack"><img src="https://img.shields.io/badge/jsdocs-reference-080f12?style=flat-square&colorA=080f12&colorB=1fa669" alt="JSDocs" /></a>
26
26
  </p>
27
27
 
@@ -30,7 +30,7 @@
30
30
  <tr>
31
31
  <td align="center"><strong>58</strong><br /><sub>pstack 技能</sub></td>
32
32
  <td align="center"><strong>23</strong><br /><sub>playbook</sub></td>
33
- <td align="center"><strong>4</strong><br /><sub>原生工具</sub></td>
33
+ <td align="center"><strong>5</strong><br /><sub>原生工具</sub></td>
34
34
  <td align="center"><strong>2</strong><br /><sub>agent preset</sub></td>
35
35
  <td align="center"><strong>5</strong><br /><sub>随包脚本</sub></td>
36
36
  </tr>
@@ -42,10 +42,11 @@
42
42
  <a href="#能力">能力</a> ·
43
43
  <a href="#skills-目录">skills 目录</a> ·
44
44
  <a href="#可选-dsh-插件">可选 DSH 插件</a> ·
45
- <a href="#兼容性">兼容性</a>
45
+ <a href="#兼容性">兼容性</a> ·
46
+ <a href="#友情链接">友情链接</a>
46
47
  </p>
47
48
 
48
- `dsh-pstack` 是 [pstack](https://github.com/cursor/plugins/tree/main/pstack) 的 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)移植。它保留上游 pstack 的技能、playbook 与参考文档。4 个原生工具替代 DSH 缺少的接口,适配层则把 Cursor 的工具名、子代理字段、模型 slug 和路径映射到 DSH。
49
+ `dsh-pstack` 是 [pstack](https://github.com/cursor/plugins/tree/main/pstack) 的 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)移植。它保留上游 pstack 的技能、playbook 与参考文档。5 个原生工具补上 DSH 的接口缺口,适配层则把 Cursor 的工具名、子代理字段、模型 slug 和路径映射到 DSH。
49
50
 
50
51
  上游 pstack 的技能大多声明 `disable-model-invocation: true`。`poteto-mode` 按名称路由到这些隐藏技能,但 DSH 的 `skill` 工具只暴露模型可见目录。DSH 也没有与 Cursor 的模型 slug、`subagent_type`、`readonly` 和 Bun 脚本对等的接口。dsh-pstack 在插件层处理这些差异,安装后可以从 `/poteto-mode` 开始工作。
51
52
 
@@ -96,6 +97,7 @@
96
97
  |---|---|
97
98
  | `pstack_skill` | 按名称加载本插件注册的隐藏技能,也能读取技能目录内的相对资源。 |
98
99
  | `pstack_models` | 只读列出 DSH 实际提供的 provider、model 和 effort,供 `/setup-pstack` 使用。 |
100
+ | `pstack_roles` | 只读列出每个 pstack 角色的 shape 与是否为自动面板,帮助 `pstack_subagent` 调用传对 `roleIndex`。 |
99
101
  | `pstack_subagent` | 按角色读取 `$DSH_HOME/pstack-models.mdc`,解析 `provider/model [effort]`,按 `agent` 选择 preset,一次可启动多个子代理。 |
100
102
  | `pstack_script` | 用固定 id 运行随包 Node 脚本,不依赖 Bun 或 shell 脚本。 |
101
103
 
@@ -124,7 +126,7 @@
124
126
 
125
127
  ## 可选 DSH 插件
126
128
 
127
- 以下插件随 DSH 提供,默认关闭。安装 dsh-pstack 时不要求安装这些插件,但部分 pstack 流程需要它们才能完整执行。要启用插件,在「插件」页面用**添加插件**输入包名。也可以运行 `dsh plugin --profile <profile> add <package>`,然后重启 profile。除 `@deepseek-ai/dsh-mcp-client` 外,本节列出的 bundle 与 provider 都是实验性的。
129
+ DSH 提供以下可选插件,默认关闭。多数随 DSH 提供,`@deepseek-ai/dsh-cua-bundle` 需按需安装。安装 dsh-pstack 时不要求安装这些插件,但部分 pstack 流程需要它们才能完整执行。要启用插件,在「插件」页面用**添加插件**输入包名。也可以运行 `dsh plugin --profile <profile> add <package>`,然后重启 profile。除 `@deepseek-ai/dsh-mcp-client` 外,本节列出的 bundle 与 provider 都是实验性的。
128
130
 
129
131
  > [!NOTE]
130
132
  > 未启用可选插件时,pstack 技能仍可加载。需要插件的步骤会输出 `Skipped in DeepSeek Harness: <step>. <reason>.` 后继续。缺少 `gh`、Java/TLC 或视频工具时,对应步骤会报告 blocked 或降级为截图。dsh-pstack 不会把未运行的步骤标记为通过。
@@ -135,7 +137,7 @@
135
137
  |---|---|---|
136
138
  | `@deepseek-ai/dsh-experimental-session-search` | 5 个只读工具:`session_search`、`session_event_search`、`session_trace`、`session_event_trace`、`session_event_read`,搜索和追踪历史会话,服务 `/recall`、`/reflect`、`/show-me-your-work`。 | 只匹配同一 `cwd` 的会话;当前会话用 `session_event_search`;没有 Cursor 的 `.jsonl` 转写路径。 |
137
139
  | `@deepseek-ai/dsh-experimental-worktree`<br />`@deepseek-ai/dsh-experimental-tool-worktree` | `create_worktree` 建本地分支和工作树,切换当前 Session 目录,用于 `/arena`、`/swarm`、`/architect` 的并行候选隔离。 | `from` 只读本地 ref,不 fetch;无云 VM;连续建树会改 `cwd`;不会自动给每个子代理分树。 |
138
- | `@deepseek-ai/dsh-experimental-forge-bundle` | PR 面板、checks、review、mark ready、merge、Session 绑定,也能从 composer 用新 worktree 启动 Session,服务 `/babysit`、`/shipping`、`/autopilot-*`。 | 仅 GitHub,需 `gh` 登录;模型侧没有 take 工具;没有 stack verdict,也没有 `origin` CLI;可与 worktree bundle 共存。 |
140
+ | `@deepseek-ai/dsh-experimental-forge-bundle` | PR 面板、checks、review、mark ready、merge、Session 绑定,也能从 composer 用新 worktree 启动 Session,服务 `/babysit`、`/shipping`、`/autopilot-*`。 | 仅 GitHub,需 `gh` 登录;模型侧没有变更请求工具;没有 stack verdict,也没有 `origin` CLI;可与 worktree bundle 共存。 |
139
141
 
140
142
  ### 验证与证据
141
143
 
@@ -143,16 +145,16 @@
143
145
 
144
146
  | 插件 | 打开后的能力 | 边界与冲突 |
145
147
  |---|---|---|
146
- | `@deepseek-ai/dsh-browser-use` + 一个 provider | 导航、点击、输入、截图和 ARIA snapshot;Stagehand 另有 act、find、extract,用于验证技能和 UI 复现。 | 基础包没有 provider 时不生效;每个 Session 一个 provider;截图要图像模型;无视频;Stagehand 需要 Chromium 和非 DeepSeek 模型。 |
147
- | `@deepseek-ai/dsh-cua-bundle` | macOS 应用点击、输入、截图和权限页,用于桌面应用验证。 | 仅 macOS PTC;Windows 未完成;无视频。 |
148
- | `@deepseek-ai/dsh-experimental-terminal-bundle` | 6 个全局终端工具,跨调用保持 shell / REPL,支持后台 send,用于 CLI / TUI 验证。 | 只覆盖终端;会加到所有 Agent;持久状态要清理;切换会失效 KV cache。 |
148
+ | `@deepseek-ai/dsh-browser-use` + 一个 provider | 导航、点击、输入、截图和 ARIA snapshot;Stagehand 另有 act、observe、extract,用于验证技能和 UI 复现。 | 基础包没有 provider 时不生效;每个 Session 一个 provider;截图要图像模型;无视频;Stagehand 需要 Chromium 和非 DeepSeek 模型。 |
149
+ | `@deepseek-ai/dsh-cua-bundle` | macOS 应用点击、输入、截图、权限页和会话级授权,用于桌面应用验证。 | 仅 macOS PTC;单 computer-use provider 槽;Windows 未完成;无视频。 |
150
+ | `@deepseek-ai/dsh-experimental-terminal-bundle` | 6 个全局终端工具,跨调用保持 shell / REPL,支持后台 send 和按 owner 隔离,用于 CLI / TUI 验证。 | 只覆盖终端;会加到所有 Agent;持久状态要清理;切换会失效 KV cache。 |
149
151
  | `@deepseek-ai/dsh-mcp-client` | 挂载 MCP server,工具以 `mcp__<server>__<tool>` 出现,`mcp-resources` 列出带资源的 server,服务 `/why`、`/teach` 的证据调查。 | 无默认 server;需逐项配置;无自动类别发现。 |
150
152
 
151
153
  ### 多代理
152
154
 
153
155
  | 插件 | 打开后的能力 | 边界与冲突 |
154
156
  |---|---|---|
155
- | `@deepseek-ai/dsh-experimental-agent-team-profile` | Lead / teammate、共享任务板、9 个团队工具和 Web roster,服务 `/orchestrate`、`/autopilot-*`。 | 禁用 `subagent` 和 `subagent_fork`,与 `pstack_subagent` 冲突。见下方警告。 |
157
+ | `@deepseek-ai/dsh-experimental-agent-team-profile` | Lead / teammate、共享任务板、9 个团队工具和 Web roster,服务 `/orchestrate`、`/autopilot-*`。 | 禁用 `subagent` 和 `subagent_fork`,与 `pstack_subagent` 冲突。没有 pstack 的 PR frontier、ledger 或 stack verdict。见下方警告。 |
156
158
  | `@deepseek-ai/dsh-experimental-ralph-bundle` | 全局 `ralph`,每轮 fresh child 的 foreground 循环,服务 `/autonomous-run`。 | 不是同一 Session 常驻循环;无事件 watcher;不替代 goal、心跳和 decision log。 |
157
159
 
158
160
  > [!WARNING]
@@ -163,7 +165,7 @@
163
165
  | 项目 | 版本 | 说明 |
164
166
  |---|---|---|
165
167
  | DSH | `>=0.2.1-rc.5` | 最低支持版本;已验证至 `0.2.2-alpha.2` 基线 |
166
- | pstack | `0.15.36` | 上游基线提交 `4dd1d05` |
168
+ | pstack | `0.15.36` | 上游基线提交 `ae5650f` |
167
169
  | Node.js | `>=24.21.1` | 运行时要求 |
168
170
  | Cordis | `~4.0.6-alpha.1` | peer dependency |
169
171
 
@@ -183,7 +185,11 @@ worktree Session 的 `cwd` 与原 Session 不同。session-search 插件只匹
183
185
 
184
186
  上游 pstack 用 `docs/harness/claude-code.md` 适配 Claude Code。它保留技能正文,另用宿主适配表把 `Task`、`AskQuestion`、todo、模型 slug 和路径映射到目标宿主。生成器为使用 Cursor 名称的技能添加一行 Claude Code 适配提示。不支持的能力会报告 `Skipped in Claude Code: <step>. <reason>.`
185
187
 
186
- dsh-pstack 沿用这套做法。主适配文档是 [`pstack/harness/docs/harness/dsh.md`](./pstack/harness/docs/harness/dsh.md),覆盖 Tools、Subagent fields、Models、setup-pstack、Paths 和 Cursor-only features。`pstack_*` 工具、agent preset 和 Node 脚本替代 DSH 缺少的字段。构建时,上游 pstack 与本地适配树被渲染到 `pstack/pstack/`,再与 `src/*.ts`、`skills/` 一起打包到 `dist/`。
188
+ dsh-pstack 沿用这套做法。主适配文档是 [`pstack/harness/docs/harness/dsh.md`](./pstack/harness/docs/harness/dsh.md),覆盖 Tools、Subagent fields、Models、setup-pstack、Paths、Cursor-only features、Local replacements 和 Optional plugins。`pstack_*` 工具、agent preset 和 Node 脚本替代 DSH 缺少的字段。构建时,上游 pstack 与本地适配树被渲染到 `pstack/pstack/`,再与 `src/*.ts`、`skills/` 一起打包到 `dist/`。
189
+
190
+ ## 友情链接
191
+
192
+ [LinuxDo](https://linux.do/) —— 新的理想型社区
187
193
 
188
194
  ## 鸣谢
189
195
 
package/cordis.patch.yml CHANGED
@@ -5,6 +5,8 @@
5
5
  # `pstack-models` registers the read-only model/effort directory used by `/setup-pstack`.
6
6
  # `pstack-roles` exposes the same role file to the Plugins configuration page through a
7
7
  # Typert Remote service; its browser half is declared by `dsh.client` in package.json.
8
+ # `pstack-role-catalog` registers `pstack_roles`, the read-only capability query that
9
+ # reports each role's shape and autoPanel so a caller sets `roleIndex` correctly.
8
10
  # `pstack-subagent` registers `pstack_subagent`, which re-reads the role file on every
9
11
  # delegation and selects one of the pstack agent presets below.
10
12
  # `pstack-script` registers `pstack_script`, the only supported way to run the bundled
@@ -21,6 +23,8 @@
21
23
  name: dsh-pstack/models
22
24
  - id: pstack-roles
23
25
  name: dsh-pstack/roles
26
+ - id: pstack-role-catalog
27
+ name: dsh-pstack/role-catalog
24
28
  - id: pstack-subagent
25
29
  name: dsh-pstack/subagent
26
30
  config:
package/dist/client.mjs CHANGED
@@ -7,6 +7,98 @@ window.__ModuleLoader__.load({
7
7
  let react = require("react");
8
8
  let react_jsx_runtime = require("react/jsx-runtime");
9
9
  let react_dom = require("react-dom");
10
+ // src/internal/role-manifest.ts
11
+ /** The 17 roles, in manifest order. */
12
+ const ROLE_MANIFEST = [
13
+ {
14
+ key: "feature, refactoring",
15
+ shape: "single",
16
+ autoPanel: false
17
+ },
18
+ {
19
+ key: "bug-fix",
20
+ shape: "single",
21
+ autoPanel: false
22
+ },
23
+ {
24
+ key: "perf-issue",
25
+ shape: "single",
26
+ autoPanel: false
27
+ },
28
+ {
29
+ key: "hillclimb",
30
+ shape: "single",
31
+ autoPanel: false
32
+ },
33
+ {
34
+ key: "judgment and prose",
35
+ shape: "single",
36
+ autoPanel: false
37
+ },
38
+ {
39
+ key: "hardest tasks",
40
+ shape: "single",
41
+ autoPanel: false
42
+ },
43
+ {
44
+ key: "how explorer",
45
+ shape: "single",
46
+ autoPanel: false
47
+ },
48
+ {
49
+ key: "how explainer",
50
+ shape: "single",
51
+ autoPanel: false
52
+ },
53
+ {
54
+ key: "why investigators",
55
+ shape: "single",
56
+ autoPanel: false
57
+ },
58
+ {
59
+ key: "why synthesizer",
60
+ shape: "single",
61
+ autoPanel: false
62
+ },
63
+ {
64
+ key: "reflect tooling",
65
+ shape: "single",
66
+ autoPanel: false
67
+ },
68
+ {
69
+ key: "reflect judgment, divergent, synthesizer",
70
+ shape: "single",
71
+ autoPanel: false
72
+ },
73
+ {
74
+ key: "arena runners",
75
+ shape: "list",
76
+ autoPanel: true
77
+ },
78
+ {
79
+ key: "arena cross-judge pool",
80
+ shape: "list",
81
+ autoPanel: false
82
+ },
83
+ {
84
+ key: "swarm workers",
85
+ shape: "list",
86
+ autoPanel: false
87
+ },
88
+ {
89
+ key: "architect runners",
90
+ shape: "list",
91
+ autoPanel: true
92
+ },
93
+ {
94
+ key: "interrogate reviewers",
95
+ shape: "list",
96
+ autoPanel: true
97
+ }
98
+ ];
99
+ function isRoleKey(value) {
100
+ return ROLE_MANIFEST.some((role) => role.key === value);
101
+ }
10
102
  // src/remote.ts
11
103
  /** npm package that owns these methods. */
12
104
  const REMOTE_PACKAGE = "dsh-pstack";
@@ -79,7 +171,7 @@ window.__ModuleLoader__.load({
79
171
  }
80
172
  function parseRoleView(value, index) {
81
173
  const record = parseRecord(value, `roles[${index}]`);
82
- if (typeof record["key"] !== "string") throw new TypeError(`roles[${index}].key must be a string`);
174
+ if (typeof record["key"] !== "string" || !isRoleKey(record["key"])) throw new TypeError(`roles[${index}].key is not in the role manifest`);
83
175
  if (record["shape"] !== "single" && record["shape"] !== "list") throw new TypeError(`roles[${index}].shape is unknown`);
84
176
  if (typeof record["configured"] !== "boolean") throw new TypeError(`roles[${index}].configured must be a boolean`);
85
177
  const routes = record["routes"];
@@ -310,6 +402,10 @@ window.__ModuleLoader__.load({
310
402
  bundle: "@deepseek-ai/dsh-experimental-ralph-bundle"
311
403
  }
312
404
  ];
405
+ /** The default recommendation ids, in catalogue order. */
406
+ function defaultRecommendationIds() {
407
+ return OPTIONAL_PLUGINS.filter((plugin) => plugin.recommended === true).map((plugin) => plugin.id);
408
+ }
313
409
  // src/client/optional-plugins-state.ts
314
410
  /**
315
411
  * Pure state and small async operations for the optional-plugin recommendation
@@ -527,6 +623,7 @@ window.__ModuleLoader__.load({
527
623
  /** Render the recommendation section; all decisions come from props. */
528
624
  function OptionalPluginsView(props) {
529
625
  const { rows, status, loadError, busyId, bulkBusy = false, messages, summary, onToggle, onEnableRecommended, onRetry, t } = props;
626
+ const recommendationIds = defaultRecommendationIds();
530
627
  const offRecommended = rows.filter((row) => row.definition.recommended === true && row.status === "off").length;
531
628
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
532
629
  "data-optional-plugins": true,
@@ -600,7 +697,7 @@ window.__ModuleLoader__.load({
600
697
  color: COLOR_CAPTION$1,
601
698
  fontSize: 12
602
699
  },
603
- children: t("recommendedHint")
700
+ children: t("recommendedHint", { ids: recommendationIds.join(t("listSeparator")) })
604
701
  })
605
702
  ]
606
703
  }),
@@ -1222,10 +1319,7 @@ window.__ModuleLoader__.load({
1222
1319
  /** Localized role name and usage, keyed by the exact role-file key. */
1223
1320
  function rolePresentation(key, t) {
1224
1321
  const copy = roleCopyKeys[key];
1225
- return copy === void 0 ? {
1226
- name: key,
1227
- description: ""
1228
- } : {
1322
+ return {
1229
1323
  name: t(copy.name),
1230
1324
  description: t(copy.description)
1231
1325
  };
@@ -1257,6 +1351,17 @@ window.__ModuleLoader__.load({
1257
1351
  color: primary ? "var(--dsw-alias-label-primary-foreground)" : COLOR_TEXT$1
1258
1352
  };
1259
1353
  }
1354
+ function dangerButtonStyle() {
1355
+ return {
1356
+ border: `1px solid color-mix(in srgb, ${COLOR_ERROR} 55%, transparent)`,
1357
+ borderRadius: 8,
1358
+ padding: "5px 12px",
1359
+ cursor: "pointer",
1360
+ font: "inherit",
1361
+ background: `color-mix(in srgb, ${COLOR_ERROR} 10%, transparent)`,
1362
+ color: COLOR_ERROR
1363
+ };
1364
+ }
1260
1365
  function fieldStyle(basis, fullWidth = false) {
1261
1366
  return {
1262
1367
  flex: fullWidth ? "1 1 auto" : `1 1 ${basis}px`,
@@ -1414,7 +1519,7 @@ window.__ModuleLoader__.load({
1414
1519
  routes.length > 1 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1415
1520
  type: "button",
1416
1521
  style: {
1417
- ...buttonStyle(),
1522
+ ...dangerButtonStyle(),
1418
1523
  justifySelf: "start"
1419
1524
  },
1420
1525
  onClick: () => onRemove(index),
@@ -2166,7 +2271,8 @@ window.__ModuleLoader__.load({
2166
2271
  enableRecommended: "Enable recommended plugins",
2167
2272
  enablingRecommended: "Enabling recommended plugins…",
2168
2273
  recommendedSummary: "{applied} applied, {restart} need a restart, {failed} failed, {skipped} skipped",
2169
- recommendedHint: "Default recommendations: OPT-01, OPT-06.",
2274
+ recommendedHint: "Default recommendations: {ids}.",
2275
+ listSeparator: ", ",
2170
2276
  enablePlugin: "Enable",
2171
2277
  disablePlugin: "Disable",
2172
2278
  pluginWorking: "Working…",
@@ -2226,7 +2332,8 @@ window.__ModuleLoader__.load({
2226
2332
  enableRecommended: "一键启用推荐项",
2227
2333
  enablingRecommended: "正在启用推荐项…",
2228
2334
  recommendedSummary: "成功 {applied} 项,需重启 {restart} 项,失败 {failed} 项,跳过 {skipped} 项",
2229
- recommendedHint: "默认推荐 OPT-01、OPT-06。",
2335
+ recommendedHint: "默认推荐 {ids}。",
2336
+ listSeparator: "、",
2230
2337
  enablePlugin: "启用",
2231
2338
  disablePlugin: "关闭",
2232
2339
  pluginWorking: "处理中…",