@menghuan1918/dsh-apollo 0.3.0 → 0.4.1

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
@@ -5,6 +5,7 @@
5
5
  </p>
6
6
 
7
7
  <p align="center">
8
+ <a href="https://www.npmjs.com/package/@menghuan1918/dsh-apollo"><img src="https://img.shields.io/npm/v/%40menghuan1918%2Fdsh-apollo.svg" alt="npm 版本"></a>
8
9
  <a href="LICENSE"><img alt="License" src="https://img.shields.io/github/license/Menghuan1918/dsh-apollo?color=blue"></a>
9
10
  <a href="package.json"><img alt="Node ^22.19.0 || &gt;=24.0.0" src="https://img.shields.io/badge/node-%5E22.19%20%7C%7C%20%3E%3D24-339933?logo=node.js&amp;logoColor=white"></a>
10
11
  <a href="package.json"><img alt="DSH &gt;=0.2.1-rc.2 &lt;0.3.0" src="https://img.shields.io/badge/DSH-%3E%3D0.2.1--rc.2%20%3C0.3.0-4B32C3"></a>
@@ -31,7 +32,7 @@ Apollo 是 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)
31
32
  flowchart TB
32
33
  A["dsh-apollo<br/>插件集合入口"]
33
34
  A --> S["流程技能<br/>拆 Spec · 并行 · 审查"]
34
- A --> E["工程模式<br/>eng / eng-noask"]
35
+ A --> E["工程模式<br/>eng / eng-ptc"]
35
36
  A --> C["CLI 后台任务<br/>Codex / Claude"]
36
37
  A -. 自动包含 .-> G["dsh-better-goal<br/>独立长期目标插件"]
37
38
  ```
@@ -41,7 +42,7 @@ flowchart TB
41
42
  | 模块 | 入口 | 提供什么 |
42
43
  |---|---|---|
43
44
  | 流程技能 | 会话内用 `/技能名` 或按描述自动选用 | 把大任务拆成可验证的 Spec,按波次实现、审查、验证后合入 |
44
- | 工程预设 | 预设选择器:`eng` / `eng-noask` | 工程纪律、后台工作约定、可选退出守卫,以及同一个长期目标 |
45
+ | 工程预设 | 预设选择器:`eng` / `eng-ptc` | 工程纪律、委派约定、子代理模型分档、可选退出守卫,以及同一个长期目标 |
45
46
  | CLI 后台任务 | **Plugins → @menghuan1918/dsh-apollo**;在会话里直接派发 | 让本机 Codex / Claude 在后台执行子任务,结果回到父会话 |
46
47
  | 长期目标(独立 `dsh-better-goal`) | **Plugins → @menghuan1918/dsh-apollo → `dsh-better-goal` 行** + `/goal` | 每个会话一个持久目标;执行步骤单独跟踪 |
47
48
 
@@ -50,7 +51,7 @@ flowchart TB
50
51
  | 技能 | 用途 |
51
52
  |---|---|
52
53
  | `/brainstorming` | 把大型需求设计为获批的主 Spec 与子 Spec |
53
- | `/exec` | 按依赖分波:worktree → 并行实现 → 审查 → 验证与合并 |
54
+ | `/exec` | 按依赖分波:worktree → 并行子代理实现 → 审查 → 验证与合并 |
54
55
  | `/dev` | 实现与审查节点的 prompt、报告结构与失败契约 |
55
56
  | `/main-agent-driven-development` | 实现一个边界明确的单个任务 |
56
57
  | `/tdd` | 测试先行、红绿循环、测试边界与反模式 |
@@ -64,8 +65,10 @@ flowchart TB
64
65
 
65
66
  | 预设(ID) | 适合 | 关键差异 |
66
67
  |---|---|---|
67
- | 工程模式 — `eng` | 需要偶尔向用户确认的编码 / 基础设施任务 | 可以向你提问;带可选退出守卫 |
68
- | 工程模式(无提问) — `eng-noask` | 无人值守、希望一次跑完的任务 | 与 eng 相同,但没有提问渠道;自主决策并写明关键假设 |
68
+ | 工程模式 — `eng` | 编码 / 基础设施任务 | 原生工具调用;保留 workflow 工具,用法以内置说明为准 |
69
+ | 工程(PTC)模式 — `eng-ptc` | 多步、循环、需要过滤汇总的任务 | 工具经 `run_code` 的 TypeScript SDK 调用,一个程序组合多步;与官方 PTC 模式一致不提供 workflow,扇出改为在一个 `run_code` 里派发多个子代理 |
70
+
71
+ 两套预设共用同一段工程模式提示词(KISS、证据先行、修复根因、防过度设计与过度防御、权限与依赖边界、命令与进程纪律、委派与编排),并按设置渲染子代理模型分档。提示词是弱约束:用户的明确指示优先。最终组装出的完整提示词见 [prompts/eng.md](prompts/eng.md) 与 [prompts/eng-ptc.md](prompts/eng-ptc.md)。
69
72
 
70
73
  两套预设都不提供自动化任务工具:工程模式会话内不能创建或修改自动化任务,侧栏「自动化任务」页和其他预设不受影响。退出守卫默认关闭,只检查本会话仍运行的后台工作,不管理 pm2、systemd、nohup 等外部进程。
71
74
 
@@ -82,24 +85,28 @@ flowchart TB
82
85
  ```
83
86
 
84
87
  ```sh
85
- # npm 安装
86
- dsh plugin --profile <profile> add @menghuan1918/dsh-apollo@0.3.0
88
+ # npm 安装(推荐)
89
+ dsh plugin --profile <profile> add @menghuan1918/dsh-apollo@0.4.1
87
90
 
88
- # 或从 GitHub main 源码安装
91
+ # 或从 GitHub main 源码安装(备选)
89
92
  dsh plugin --profile <profile> add github:Menghuan1918/dsh-apollo
90
93
  ```
91
94
 
92
- 重启对应 profile 的 DSH 进程。重启后选择「工程模式」;需要 CLI 时,打开 **Plugins → @menghuan1918/dsh-apollo → `apollo-skills` 行** 按需启用。
95
+ npm 包页面:[`@menghuan1918/dsh-apollo`](https://www.npmjs.com/package/@menghuan1918/dsh-apollo)。安装、升级或换包都会改变运行的代码,必须重启对应 profile 的 DSH 进程;只刷新网页不够。重启后选择「工程模式」;需要 CLI 时,打开 **Plugins → @menghuan1918/dsh-apollo → `apollo-skills` 行** 按需启用。
93
96
 
94
- > npm 和 GitHub 安装都自动带入 `dsh-better-goal`,**不需要再单独安装**。安装 Apollo 不会安装、登录或启用 Codex / Claude。
97
+ > npm 和 GitHub 安装都会自动带入精确依赖 `dsh-better-goal@0.2.0`,**不需要再单独安装**。安装 Apollo 不会安装、登录或启用 Codex / Claude。
95
98
 
96
- 如果之前通过 GitHub 或 `link:` 安装了旧名 `dsh-apollo`,迁移到 scoped npm 包时先移除旧入口,再安装新包;已有会话记录保留,重启对应 profile 后加载新版:
99
+ 如果之前通过 GitHub 或 `link:` 安装了旧名 `dsh-apollo`,迁移到 scoped npm 包时请按下面两条命令手动处理,不要依赖自动迁移。会话记录会保留,但换包后仍须重启对应 profile(刷新网页不够):
97
100
 
98
101
  ```sh
99
102
  dsh plugin --profile <profile> remove dsh-apollo
100
- dsh plugin --profile <profile> add @menghuan1918/dsh-apollo@0.3.0
103
+ dsh plugin --profile <profile> add @menghuan1918/dsh-apollo@0.4.1
101
104
  ```
102
105
 
106
+ > `dsh-apollo` 只是旧入口名;unscoped 的 `dsh-apollo` 已被其他项目占用,不要从 npm 安装它。
107
+
108
+ > **0.4.0 破坏性变更**:删除了 `eng-noask`(工程模式(无提问))预设,之前用它开的会话不能再按原预设恢复,请改用 `eng` 或 `eng-ptc` 新建会话。
109
+
103
110
  ## CLI 后台任务
104
111
 
105
112
  你不需要记住工具名或调用格式:在会话里正常派发任务即可。需要时,Agent 会把子任务交给本机 Codex / Claude 后台执行,结果回到父会话;之后可以继续同一任务。
@@ -116,10 +123,21 @@ flowchart TB
116
123
  ### 启用步骤
117
124
 
118
125
  1. 在运行 DSH 的机器上安装并登录 Codex CLI 或 Claude Code,确认账户有可用额度。
119
- 2. 打开 **Plugins → @menghuan1918/dsh-apollo → `apollo-skills` 行**,启用对应后端,填写可执行文件,并至少配置一个模型与匹配的 effort;Codex 可选 profile。
126
+ 2. 打开 **Plugins → @menghuan1918/dsh-apollo → `apollo-skills` 行**,启用对应后端,填写可执行文件,点「自动发现模型」或手填至少一个模型与匹配的 effort;Codex 可选 profile。
120
127
  3. 选择接入范围(默认只对工程预设生效;需要全局时再打开)和 CLI 权限,保存。
121
128
  4. 如果当前会话是在启用前开的,新建会话再派发。
122
129
 
130
+ ### 自动发现模型
131
+
132
+ 设置页的「自动发现模型」按后端读取一次模型清单,**只追加列表里还没有的 id**,不覆盖已有条目;默认模型为空时自动选第一个。
133
+
134
+ | 后端 | 来源 | 说明 |
135
+ |---|---|---|
136
+ | Codex | `codex debug models`(失败退回 `--bundled`) | 清单跟随 `config.toml` 的 model_provider;id 取 `slug`,effort 取 `supported_reasoning_levels`,默认 effort 取 `default_reasoning_level`,只收 `visibility: "list"` 的模型。 |
137
+ | Claude | `GET {ANTHROPIC_BASE_URL}/v1/models` | Claude CLI 没有模型清单命令;Apollo 读取与 CLI 相同的端点与凭据(进程 env,其次 `~/.claude/settings.json` 的 `env`)。凭据只在宿主进程内用于请求头,不会返回给页面。effort 固定为 `low` / `medium` / `high` / `xhigh` / `max`,默认 `high`。 |
138
+
139
+ > Codex 的 `profile` 不参与发现(`codex debug models` 不接受 `-p`);profile 若改了 model_provider,请手填该 profile 的模型。Claude 的 OAuth 订阅凭据存在系统钥匙串时不参与发现——请手填模型,或把 `ANTHROPIC_AUTH_TOKEN` / `ANTHROPIC_API_KEY` 放进进程 env 或 `~/.claude/settings.json` 的 `env`。
140
+
123
141
  > **安全默认**
124
142
  >
125
143
  > - CLI 权限**不继承父会话**;默认 Codex 为 `read-only`,Claude 为 `plan`。
@@ -135,9 +153,9 @@ flowchart TB
135
153
 
136
154
  ## 长期目标
137
155
 
138
- 目标域由独立插件 **`dsh-better-goal`** 提供,Apollo 负责把它装进同一个 profile。每个会话一个持久目标;执行步骤单独记录,不与目标混在一起。模型侧只看到一个 `goal` 工具,人侧用 `/goal` 管理同一个目标。
156
+ 目标域由独立插件 **[`dsh-better-goal`](https://www.npmjs.com/package/dsh-better-goal)**(npm `0.2.0`)提供,Apollo 负责把它装进同一个 profile。每个会话一个持久目标;执行步骤单独记录,不与目标混在一起。模型侧只看到一个 `goal` 工具,人侧用 `/goal` 管理同一个目标。
139
157
 
140
- > **相较原生 goal,重点不只是继续跑,而是该停时能停。** 缺少必需密钥、权限或外部条件时,Agent 可以立即记录失败原因并停止续跑,不用先凑目标轮数;提问默认等 120 秒,超时后仍可回答,也可以先推进不依赖答案的工作。原生的受阻门槛、恢复限制、默认阻塞提问与本插件的[完整对照](https://github.com/Menghuan1918/dsh-better-goal/blob/main/README.md#与-dsh-原生-goal-对比)见独立插件文档。
158
+ > **相较原生 goal,重点不只是继续跑,而是该停时能停。** 缺少必需密钥、权限或需要你做决定时,Agent 会立即暂停目标并说明缺什么,不会为了“完成”而伪造、跳过检查或缩小范围,也不用先凑目标轮数;提问默认等 120 秒,超时后仍可回答,也可以先推进不依赖答案的工作。原生的受阻门槛、恢复限制、默认阻塞提问与本插件的[完整对照](https://github.com/Menghuan1918/dsh-better-goal/blob/main/README.md#与-dsh-原生-goal-对比)见独立插件文档。
141
159
 
142
160
  - **默认轮数策略是 `agent`**:由 Agent 按任务决定是否设置上限;切到 `fixed` 才使用配置值,`unlimited` 不施加策略性轮数上限。
143
161
  - **固定值默认 `256`**,只在 `fixed` 模式生效。
@@ -157,18 +175,21 @@ flowchart TB
157
175
 
158
176
  ## 设置与权限
159
177
 
160
- 打开 **Plugins → @menghuan1918/dsh-apollo → `apollo-skills` 行** 修改技能、CLI 和退出守卫设置;目标设置在同页的 `dsh-better-goal` 行。保存后即时生效。
178
+ 打开 **Plugins → @menghuan1918/dsh-apollo → `apollo-skills` 行** 修改模型分档、CLI 和退出守卫设置;目标设置在同页的 `dsh-better-goal` 行。保存后即时生效。
161
179
 
162
180
  | 设置 | 默认 | 说明 |
163
181
  |---|---|---|
164
182
  | `exitGuard` | `false` | 退出守卫;开启后在回合结束时拦下仍在运行的后台工作,用户中断始终放行 |
165
- | `subagents.eng` | `true` | 在 `eng` / `eng-noask` 中接入 CLI 后台任务 |
183
+ | `tiers.fast` / `tiers.quality` | 空(沿用父会话路由) | 子代理快速档(探索、侦察、批量排查)与质量档(复杂实现、调试、审查、设计)的 provider / model / effort;从「子代理 → 模型选择」白名单下拉选择,写进工程模式提示词 |
184
+ | `subagents.eng` | `true` | 在 `eng` / `eng-ptc` 中接入 CLI 后台任务 |
166
185
  | `subagents.global` | `false` | 在所有具备所需工具和服务的预设中接入 |
167
186
  | `codex.enabled` / `claude.enabled` | `false` | 启用对应 CLI 后端 |
168
187
  | `executable` | `codex` / `claude` | PATH 命令名、绝对路径或 `~/` 路径 |
169
- | `defaultModel` / `models` | 空 / `[]` | 启用前至少配置一个模型、默认模型和匹配的 effort |
188
+ | `defaultModel` / `models` | 空 / `[]` | 启用前至少配置一个模型、默认模型和匹配的 effort;可用「自动发现模型」从本机 CLI 或 Anthropic 端点补齐 |
189
+
190
+ 模型分档要生效,需先在 **Plugins → 子代理 → 模型选择** 开启模型选择并把路由加入白名单;设置页只能选白名单内的路由,未开启时会提示。模型选择策略在会话创建时记录,改白名单只影响新会话;分档本身改完下一次请求即生效。
170
191
 
171
- 权限档见下表;模型 ID、effort 和 profile 以 CLI 与账户实际支持为准。表单会阻止不完整组合,手写配置虽可装载,但调用时会失败。
192
+ 权限档见下表;模型 ID、effort 和 profile 以 CLI 与账户实际支持为准,自动发现读到的清单也受同一限制。表单会阻止不完整组合,手写配置虽可装载,但调用时会失败。
172
193
 
173
194
  ### CLI 权限对照
174
195
 
@@ -192,7 +213,7 @@ flowchart TB
192
213
 
193
214
  <details><summary>需要单独安装 dsh-better-goal 吗?</summary>
194
215
 
195
- 不需要。通过 npm 或 GitHub 安装 Apollo 时,Apollo 会把 `dsh-better-goal` 作为依赖装配进来,goal 行和 `/goal` 一起可用。只有在准备脱离 Apollo 单独使用目标插件时,才按独立仓库说明安装;不要在同一个 profile 里重复添加两个 goal bundle。
216
+ 不需要。通过 npm 或 GitHub 安装 Apollo 时,Apollo 会把 `dsh-better-goal@0.2.0` 作为固定依赖装配进来,goal 行和 `/goal` 一起可用。只有在准备脱离 Apollo 单独使用目标插件时,才按[独立包页面](https://www.npmjs.com/package/dsh-better-goal)或独立仓库说明安装;不要在同一个 profile 里重复添加两个 goal bundle。
196
217
 
197
218
  </details>
198
219
 
@@ -208,9 +229,9 @@ flowchart TB
208
229
 
209
230
  </details>
210
231
 
211
- <details><summary>无提问模式会停下来等我吗?</summary>
232
+ <details><summary>eng 和 eng-ptc 怎么选?</summary>
212
233
 
213
- 常规执行不会。`eng-noask` 没有提问渠道,也不能用纯文本反问后停下等待;需要拍板时它自主决策,并把关键假设和被否掉的替代方案写进最终报告。计划模式仍需要你批准计划,用户中断也始终有效;退出守卫开启时,运行中的后台工作仍会让回合继续。
234
+ 默认用 `eng`。任务里有大量「读多个文件 → 过滤 → 汇总」或循环式操作时用 `eng-ptc`:模型写一个 `run_code` 程序一次完成,中间结果不进上下文。`eng-ptc` 没有 workflow 工具;`/exec` 用 `subagent` + `wait_subagent` 编排,两种模式都能用。两者的纪律、分档、CLI 后台任务和退出守卫一致。
214
235
 
215
236
  </details>
216
237
 
@@ -220,7 +241,7 @@ flowchart TB
220
241
  dsh plugin --profile <profile> remove @menghuan1918/dsh-apollo
221
242
  ```
222
243
 
223
- 旧 unscoped 安装使用 `remove dsh-apollo`。卸载 Apollo 后,Apollo 插入的 goal 行也会消失。若之前还单独安装过 `dsh-better-goal`,需要按独立仓库的说明一并处理。
244
+ 旧的 unscoped 入口用 `remove dsh-apollo` 卸载。卸载 Apollo 后,Apollo 插入的 goal 行也会消失。若之前还单独安装过 `dsh-better-goal`,需要按独立仓库的说明一并处理。
224
245
 
225
246
  </details>
226
247
 
@@ -230,4 +251,4 @@ dsh plugin --profile <profile> remove @menghuan1918/dsh-apollo
230
251
 
231
252
  ## 许可与致谢
232
253
 
233
- 本包采用 **GPL-3.0-or-later**,见 [LICENSE](LICENSE)。工程预设改编自 DeepSeek Harness 的 MIT 标准预设([eng 声明](presets/eng/NOTICE)、[eng-noask 声明](presets/eng-noask/NOTICE)、[MIT 许可](third-party/LICENSE-MIT-dsh-standard-preset));`tdd` / `diagnosing-bugs` 改编自 [mattpocock/skills](https://github.com/mattpocock/skills)([第三方声明](third-party/NOTICE-mattpocock-skills));能力探针的请求信任边界改编自 dsh-better-sidebar,源自 BSD-3-Clause 的 DSH client connection 实现。
254
+ 本包采用 **GPL-3.0-or-later**,见 [LICENSE](LICENSE)。工程预设改编自 DeepSeek Harness 的 MIT 标准预设与 PTC 预设([预设声明](presets/eng/NOTICE)、[MIT 许可](third-party/LICENSE-MIT-dsh-standard-preset));`tdd` / `diagnosing-bugs` 改编自 [mattpocock/skills](https://github.com/mattpocock/skills)([第三方声明](third-party/NOTICE-mattpocock-skills));能力探针的请求信任边界改编自 dsh-better-sidebar,源自 BSD-3-Clause 的 DSH client connection 实现。
package/cordis.patch.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  # dsh-apollo bundle patch: inserts the two host-plane rows this package needs
2
2
  # into the profile roster. Applied as a profile bundle layer (the first entry
3
- # of the `dsh.bundle.patch` array in package.json — the eng/eng-noask preset
3
+ # of the `dsh.bundle.patch` array in package.json — the eng/eng-ptc preset
4
4
  # patches in presets/ load after it); activate with
5
5
  # `dsh plugin --profile <name> add link:<path-to>/dsh-apollo`.
6
6
  #
@@ -58,7 +58,7 @@
58
58
  # the official client treats a proxied page as loopback.
59
59
  #
60
60
  # Row config — two classes of fields (details in README, section 配置):
61
- # - volatile, editable from the Web form: `exitGuard`,
61
+ # - volatile, editable from the Web form: `exitGuard`, `tiers.{fast,quality}`,
62
62
  # `subagents.{eng,global}`, `subagents.{codex,claude}.*`
63
63
  # (enabled / executable / profile / permissionMode / defaultModel / models[]).
64
64
  # Changes do NOT reload this row.
@@ -70,7 +70,7 @@
70
70
  # enable only behind a trusted proxy.
71
71
  #
72
72
  # Presets are separate bundle-patch rows (presets/eng.patch.yml,
73
- # presets/eng-noask.patch.yml): a preset is an `insert` of a
73
+ # presets/eng-ptc.patch.yml): a preset is an `insert` of a
74
74
  # `@deepseek-ai/dsh-agent-preset` row read straight from that file — the old
75
75
  # sync-into-<dshHome>/.agent-presets delivery no longer exists.
76
76
  - insert:
@@ -2,7 +2,7 @@
2
2
 
3
3
  面向维护者、集成者和需要排查装配问题的用户。用户安装与配置请看 [README](../README.md);本文保留 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness)(DSH)插件的实现细节、历史兼容与验证方法。
4
4
 
5
- 当前实现版本:`0.3.0`;npm 包名是 `@menghuan1918/dsh-apollo`。纯 ESM,无构建步骤;宿主浏览器半边是直接加载的闭包工厂,不需要打包。
5
+ 当前实现版本:`0.4.1`;npm 包名是 `@menghuan1918/dsh-apollo`。纯 ESM,无构建步骤;宿主浏览器半边是直接加载的闭包工厂,不需要打包。
6
6
 
7
7
  ## 目录
8
8
 
@@ -25,14 +25,14 @@
25
25
 
26
26
  1. [cordis.patch.yml](../cordis.patch.yml):顶层宿主行;
27
27
  2. [presets/eng.patch.yml](../presets/eng.patch.yml):`eng` 预设;
28
- 3. [presets/eng-noask.patch.yml](../presets/eng-noask.patch.yml):`eng-noask` 预设。
28
+ 3. [presets/eng-ptc.patch.yml](../presets/eng-ptc.patch.yml):`eng-ptc` 预设。
29
29
 
30
30
  浏览器半边由 `dsh.client` 的注入列表发现;`exports["./client"]` 指向 [src/client.js](../src/client.js)。`exports["./presets/*"]` 让预设里的本地插件通过裸子路径引用本包内的模块。
31
31
 
32
32
  运行时依赖:
33
33
 
34
34
  - `@deepseek-ai/schemastery`:行配置 schema;
35
- - `dsh-better-goal`:独立的 goal 插件,依赖精确的 npm 版本 `0.1.0`(见 `dependencies`),不是 Git commit、分支、范围或 `file:` 说明符;
35
+ - `dsh-better-goal`:独立的 goal 插件,依赖精确的 npm 版本 `0.2.0`(见 `dependencies`),不是 Git commit、分支、范围或 `file:` 说明符;
36
36
  - `react` 是 peer dependency,由宿主提供。
37
37
 
38
38
  ### 为什么宿主只有一行 `apollo-skills`
@@ -41,7 +41,7 @@
41
41
 
42
42
  1. 向技能注册表的全局层注册包内 `skills/*/SKILL.md`;
43
43
  2. 挂载正式行配置(`src/config.js` 的 Schemastery schema)和浏览器配置页;
44
- 3. 注册只读能力探针 `/apollo/api/capabilities`;
44
+ 3. 注册只读能力探针 `/apollo/api/capabilities` 与模型自动发现 `/apollo/api/models`;
45
45
  4. 在已有 `subagent` 工具上安装 CLI 路由桥;
46
46
  5. 在行配置开启 `declareOwnsHost` 时注入宿主声明。
47
47
 
@@ -62,7 +62,7 @@ goal 行由独立插件提供,并注册三个键,都指向同一份配置和
62
62
  - `@menghuan1918/dsh-apollo#dsh-better-goal`:Apollo 以 scoped 包装配;
63
63
  - `dsh-apollo#dsh-better-goal`:历史 Apollo 装配。
64
64
 
65
- npm 包名和浏览器 closure id 已随发行名改为 scoped,但**行 id/name、预设 ID 和 CLI 路由名不随之改名**:`apollo-skills`、`dsh-better-goal`、`eng` / `eng-noask`、外部 provider `codex` / `claude` 和内部路由 `apollo-cli-codex` / `apollo-cli-claude` 都是兼容契约。只改发行名时,不迁移行 id、不重命名预设,也不改 CLI 路由。
65
+ npm 包名和浏览器 closure id 已随发行名改为 scoped,但**行 id/name、预设 ID 和 CLI 路由名不随之改名**:`apollo-skills`、`dsh-better-goal`、`eng` / `eng-ptc`、外部 provider `codex` / `claude` 和内部路由 `apollo-cli-codex` / `apollo-cli-claude` 都是兼容契约。只改发行名时,不迁移行 id、不重命名预设,也不改 CLI 路由。
66
66
 
67
67
  ### 顶层 patch 与 goal 行去重
68
68
 
@@ -102,9 +102,9 @@ DSH `0.2.1-rc.2` 的已知限制:
102
102
 
103
103
  ### 预设 ID 与历史会话
104
104
 
105
- `presets/eng.patch.yml` 和 `presets/eng-noask.patch.yml` 是预设行清单的唯一事实源。`config.id` 必须保持 `eng` / `eng-noask`,因为历史会话按预设 ID 恢复。`config.order` 分别是 10 和 11。
105
+ `presets/eng.patch.yml` 和 `presets/eng-ptc.patch.yml` 是预设行清单的唯一事实源。`config.id` 必须保持 `eng` / `eng-ptc`,因为历史会话按预设 ID 恢复。`config.order` 分别是 10 和 11。`eng-noask` 已在 0.4.0 删除,用它开的历史会话不再能按原预设恢复。
106
106
 
107
- `presets/eng/` 和 `presets/eng-noask/` 目录只承载预设本地插件模块(exit-guard、wait-subagent、mode-instructions),不承载第二份行清单。旧机制中的 `agent.cordis.yml` / `preset.yml` 已删除,结构测试会拒绝它们复活;旧的 `<dshHome>/.agent-presets` 同步副本机制也已移除。
107
+ `presets/eng/` 目录只承载两套预设共用的本地插件模块(exit-guard、wait-subagent、mode-instructions),不承载第二份行清单。旧机制中的 `agent.cordis.yml` / `preset.yml` 已删除,结构测试会拒绝它们复活;旧的 `<dshHome>/.agent-presets` 同步副本机制也已移除。
108
108
 
109
109
  ## 配置与投影
110
110
 
@@ -141,7 +141,7 @@ DSH `0.2.1-rc.2` 的已知限制:
141
141
 
142
142
  字段分为两类:
143
143
 
144
- - **volatile 运行时字段**:`exitGuard`、`subagents.eng`、`subagents.global`、`subagents.codex.*`、`subagents.claude.*`。保存后不重挂插件,消费方每次读取都拿到最新值。
144
+ - **volatile 运行时字段**:`exitGuard`、`tiers.fast`、`tiers.quality`、`subagents.eng`、`subagents.global`、`subagents.codex.*`、`subagents.claude.*`。保存后不重挂插件,消费方每次读取都拿到最新值。
145
145
  - **部署标志**:`trustedHosts`、`declareOwnsHost`。只在行配置里声明,改动会让 Loader 正常重挂本行。
146
146
 
147
147
  浏览器表单只允许写入 volatile 路径;`dsh-settings` 会拒绝其他路径。部署标志不能从网页改写。
@@ -170,7 +170,7 @@ DSH `0.2.1-rc.2` 的已知限制:
170
170
  [src/settings.js](../src/settings.js) 还负责:
171
171
 
172
172
  - 用 `settings.configure({ auto: false }, ctx.fiber)` 登记本行自带配置页,避免宿主按 schema 自动生成第二页;
173
- - 延迟注入 `webServer`,注册只读能力路由;
173
+ - 延迟注入 `webServer`,注册只读能力路由与模型发现路由;
174
174
  - 一次性只读导入旧配置文件。
175
175
 
176
176
  ### 旧配置导入
@@ -222,7 +222,7 @@ goal 行由独立插件拥有,三个字段都是 volatile:
222
222
 
223
223
  - 本地插件 [wait-subagent](../presets/eng/plugins/wait-subagent/index.js):`wait_subagent` 工具;
224
224
  - 本地插件 [exit-guard](../presets/eng/plugins/exit-guard/index.js):可选退出守卫;
225
- - 本地插件 [mode-instructions](../presets/eng/plugins/mode-instructions/index.js):工程模式专属提示词段。
225
+ - 本地插件 [mode-instructions](../presets/eng/plugins/mode-instructions/index.js):工程模式提示词段。
226
226
 
227
227
  有意的差异:
228
228
 
@@ -233,7 +233,38 @@ goal 行由独立插件拥有,三个字段都是 volatile:
233
233
  - `tool-plugin-manager` / `tool-plugin-market` 保持上游默认禁用;
234
234
  - 宿主行使用 `persona`、`agent-instructions`、`time-context` 等与 0.2.1 标准预设对齐的配置。
235
235
 
236
- [presets/eng-noask.patch.yml](../presets/eng-noask.patch.yml) 是 eng 的拷贝变体,只移除 `tool-ask-user` 行,并改写 plan-mode 的提问措辞;其余行清单保持一致。维护时先改 eng,再重做 noask 的差异;[tests/upstream-drift.test.mjs](../tests/upstream-drift.test.mjs) 会拦住超出这一处差异的分叉。
236
+ ### eng-ptc 的构成
237
+
238
+ [presets/eng-ptc.patch.yml](../presets/eng-ptc.patch.yml) 是 eng 的拷贝,差异恰好是上游 `ptc` 相对 `standard` 的差异,外加一个提示词开关:
239
+
240
+ - 在 `present` 前加 `tool-presentation { mode: ptc }`,所有工具经 `run_code` 的 TypeScript SDK 调用(依赖宿主 `ptc-runtime` 行);
241
+ - `workflow-ptc` / `tool-workflow` 设为 `disabled: true`,与上游一致;
242
+ - `eng-mode-instructions` 行带 `config: { ptc: true }`,追加「在一个 run_code 里派发多个子代理」的扇出规则(工程模式段不写 workflow 用法,eng 下以内置 workflow 说明为准);run_code 本身的用法由内置的 `tools:sdk` / `tools:ptc-only` 段说明,不重复。
243
+
244
+ 本地插件直接复用 `presets/eng/plugins/*`。维护时先改 eng,再重做这几处差异;[tests/upstream-drift.test.mjs](../tests/upstream-drift.test.mjs) 同时把 eng 对齐上游 `standard`、把 eng-ptc 对齐上游 `ptc`,并断言 eng-ptc 与 eng 的差异恰为上述几处。
245
+
246
+ ### 工程模式提示词
247
+
248
+ `eng:mode-instructions`(order 1)是两套预设共用的提示词段,`text` 是函数,每次组装时读取活配置渲染:
249
+
250
+ - 通用纪律:KISS / YAGNI、检查先行、修复根因、一个连贯变更、尊重既有约定、思考不预演代码与防循环、防过度设计与过度防御(借鉴 opencode AGENTS.md 的 General Principles)、验证与汇报、权限 / Git 身份 / 依赖边界、禁止全盘搜索、命令与进程纪律。这部分原在用户级 `~/.dsh/AGENTS.md`,0.4.0 起归插件所有;AGENTS.md 只留本机约定(ws-search、find-docs、rexec)。
251
+ - 委派与编排,以及按 `tiers.fast` / `tiers.quality` 渲染的模型分档;未配置的档位提示「省略 provider / model / reasoning_effort,沿用父会话路由」。
252
+ - `exitGuard` 开启时追加退出守卫说明;`ptc: true` 时切换扇出规则。
253
+ - 写法是弱约束:开头声明用户的明确指示优先。改设置会让下一次请求的提示词变化并失去一次前缀缓存。
254
+
255
+ ### 组装后的提示词快照
256
+
257
+ [prompts/eng.md](../prompts/eng.md) 和 [prompts/eng-ptc.md](../prompts/eng-ptc.md) 是真实宿主为两套预设组装出的完整系统提示词,供人审查;不要手改,改了提示词后用下面的命令重新生成:
258
+
259
+ ```sh
260
+ DSH_PACKAGE_ROOT=/path/to/node_modules/@deepseek-ai/dsh npm run prompts
261
+ ```
262
+
263
+ [scripts/render-prompts.mjs](../scripts/render-prompts.mjs) 用临时 home 启动 headless 宿主(与冒烟相同,不启动 Web 服务),设置为退出守卫关闭、分档用 `<fast-provider>` 等占位路由,渲染时去掉每次请求的运行时上下文(时间、工作目录),也不展开工具 schema;Web GUI 宿主独有的段落不在其中。[tests/prompts.test.mjs](../tests/prompts.test.mjs) 校验快照里的工程模式段与当前代码一致,忘了重新生成时普通 `npm test` 就会失败;内置段落随 DSH 版本变化,只在重新生成时更新。
264
+
265
+ ### 模型分档
266
+
267
+ 设置页的分档下拉框读取 `GET /apollo/api/routes`([src/panel.js](../src/panel.js) 的 `collectTierRoutes`):路由来自宿主 `subagentModelSelection.current()` 的 `allowedModels`,effort 来自 `llm.resolveModelInfo(...).reasoning`;单条解析失败只让该条 efforts 为空。白名单外的已存路由会阻止保存。分档只影响提示词,真正的路由校验仍由 `tool-subagent` 的模型选择策略执行。
237
268
 
238
269
  ### wait_subagent
239
270
 
@@ -242,7 +273,7 @@ goal 行由独立插件拥有,三个字段都是 volatile:
242
273
  行为细节:
243
274
 
244
275
  - 只接受当前 Agent 的直接子代理(depth 1);出现未知 id 时整批快速失败,不等待任何子代理;
245
- - 多个 id 共享一个 `timeout_ms` 窗口;
276
+ - 多个 id 共享一个 `timeout_ms` 窗口;传入值低于 15 分钟时自动提升到 15 分钟(子代理结束本就会通知父会话,短超时只会白白消耗回合);
246
277
  - 刚派发、尚未启动的子代理有 30 秒启动宽限,避免误报 “not running”;
247
278
  - 用户中断会中止等待;
248
279
  - 不操作 `agent.inbox`,不吞掉中途消息或结算通知。
@@ -268,15 +299,6 @@ goal 行由独立插件拥有,三个字段都是 volatile:
268
299
 
269
300
  测试在 [tests/exit-guard.test.mjs](../tests/exit-guard.test.mjs)。
270
301
 
271
- ### eng-noask 的实际行为
272
-
273
- `eng-noask` 与 eng 的差异是能力面的,不是提示词口号:
274
-
275
- - 不挂 `tool-ask-user`,所以会话没有 `ask_user_question` 工具;
276
- - mode-instructions 增加无提问纪律:不向用户提问、不以纯文本反问后停下等待;需要用户拍板时自主决策,把关键假设和被否掉的替代方案写进最终报告;
277
- - plan-mode 段改写为无 ask 工具版本,但仍保留 `exit_plan_mode` 的计划批准流程;
278
- - 用户中断和退出守卫行为与 eng 一致。
279
-
280
302
  ## CLI 子代理桥
281
303
 
282
304
  ### 路由与开关
@@ -288,7 +310,7 @@ CLI 桥不注册新工具;它在宿主已有的 `subagent` / `subagent_fork` /
288
310
  - `subagent_fork` 不能创建 CLI 子代理;
289
311
  - `agent_preset` 对 CLI 子代理不支持;
290
312
  - `run_in_background` 参数已移除,CLI 子代理由桥固定为后台运行;
291
- - `enabledIn` 判断:`subagents.global || (subagents.eng && 当前预设是 eng/eng-noask)`。当前预设优先从 `sessionProjections.stateOf(..., 'agentPreset')` 读取,取不到时退回 session header。
313
+ - `enabledIn` 判断:`subagents.global || (subagents.eng && 当前预设是 eng/eng-ptc)`。当前预设优先从 `sessionProjections.stateOf(..., 'agentPreset')` 读取,取不到时退回 session header。
292
314
  - 工程预设的 `tool-subagent` 行声明 `modelSelectionSettings: true`;该策略在会话创建时固定,旧会话缺少 `provider` / `model` 参数时需要新建会话。
293
315
 
294
316
  ### 模型、effort 与身份
@@ -361,7 +383,9 @@ Claude 的默认登录态与显式 `CLAUDE_CONFIG_DIR` 语义不同:
361
383
 
362
384
  ### 只读接口
363
385
 
364
- [src/panel.js](../src/panel.js) 提供 `GET /apollo/api/capabilities`,返回:
386
+ [src/panel.js](../src/panel.js) 提供两个只读接口。
387
+
388
+ `GET /apollo/api/capabilities`:
365
389
 
366
390
  ```text
367
391
  {
@@ -373,13 +397,41 @@ Claude 的默认登录态与显式 `CLAUDE_CONFIG_DIR` 语义不同:
373
397
  }
374
398
  ```
375
399
 
400
+ `GET /apollo/api/models?cli=codex|claude`(按需触发,不缓存):
401
+
402
+ ```text
403
+ {
404
+ cli,
405
+ models: [{ id, efforts: string[], defaultEffort }],
406
+ source: 'codex-catalog' | 'claude-models-api' | null,
407
+ error: null | { code, status? }
408
+ }
409
+ ```
410
+
411
+ 发现来源:
412
+
413
+ - **Codex**:本机 `<executable> debug models` 的 JSON catalog(失败退回
414
+ `debug models --bundled`)。只收 `visibility: "list"`,id 取 `slug`,effort 取
415
+ `supported_reasoning_levels[].effort`,默认 effort 取 `default_reasoning_level`。
416
+ `codex debug models` 不接受 `-p`,所以发现结果反映基础配置的 model_provider,
417
+ 不反映 Apollo 的 profile 设置。
418
+ - **Claude**:Claude CLI 没有模型清单命令,改读 Anthropic Messages 的
419
+ `GET {ANTHROPIC_BASE_URL}/v1/models`。端点取进程 env 的
420
+ `ANTHROPIC_BASE_URL`,其次 `<CLAUDE_CONFIG_DIR 或 ~/.claude>/settings.json` 的
421
+ `env`;凭据来源整体优先(进程 env 有任一凭据时整套用 env,不把两边的
422
+ token/key 各取一半)。effort 固定为 `--effort` 的实测五档,默认 `high`。
423
+ 系统钥匙串里的 OAuth 订阅凭据不参与发现。
424
+
376
425
  约束:
377
426
 
378
- - 只返回可执行文件名、解析路径、版本行和 Codex profile 名称;
379
- - **绝不返回配置正文或凭据**;
380
- - 只接受 GET;其他方法 405,且从不读取请求体;
381
- - 结果缓存 30 秒,避免每次打开设置页都 fork 两个 CLI;
382
- - 探针失败按字段降级,不拖垮整个接口。
427
+ - 只返回可执行文件名、解析路径、版本行、profile 名称、模型 id 与 effort;
428
+ - **绝不返回配置正文或凭据**;Claude 的 token 只在内存里拼进请求头,错误只回
429
+ `code`/`status`,不回 URL 或响应正文;
430
+ - 只接受 GET;其他方法 405,且从不读取请求体;`/apollo/api/models` 缺省/未知
431
+ `cli` 返回 400,并带 `cache-control: no-store`;
432
+ - 能力探针结果缓存 30 秒,避免每次打开设置页都 fork 两个 CLI;发现按按钮触发,
433
+ 不缓存;两者都有超时与结果长度上限(模型清单 200 条、响应 4 MiB);
434
+ - 探针/发现失败各自降级成 `error.code`,不拖垮接口。
383
435
 
384
436
  ### 信任边界
385
437
 
@@ -408,10 +460,10 @@ Claude 的默认登录态与显式 `CLAUDE_CONFIG_DIR` 语义不同:
408
460
  ### npm 安装
409
461
 
410
462
  ```sh
411
- dsh plugin --profile <profile> add @menghuan1918/dsh-apollo@0.3.0
463
+ dsh plugin --profile <profile> add @menghuan1918/dsh-apollo@0.4.1
412
464
  ```
413
465
 
414
- 包发布到 npm 官方 registry 后即可用此命令安装,并带入精确依赖 `dsh-better-goal@0.1.0`,同时应用三份 bundle patch。安装后需要重启对应 profile 的 DSH 进程。README 中的 npm 命令是发布后的安装路径;首发完成前不要宣称 registry 已有该版本。
466
+ 包发布到 npm 官方 registry 后即可用此命令安装,并带入精确依赖 `dsh-better-goal@0.2.0`,同时应用三份 bundle patch。安装后需要重启对应 profile 的 DSH 进程。README 中的 npm 命令是发布后的安装路径;首发完成前不要宣称 registry 已有该版本。
415
467
 
416
468
  ### GitHub 源码安装
417
469
 
@@ -419,7 +471,7 @@ dsh plugin --profile <profile> add @menghuan1918/dsh-apollo@0.3.0
419
471
  dsh plugin --profile <profile> add github:Menghuan1918/dsh-apollo
420
472
  ```
421
473
 
422
- GitHub main 仍是源码安装选项。它同样按 `package.json` 解析精确依赖 `dsh-better-goal@0.1.0`,因此不能早于 Goal 的 npm 发布推进 main:Goal 尚未在 registry 可取得时,源码安装会因依赖 404 失败。安装后重启 profile。
474
+ GitHub main 仍是源码安装选项。它同样按 `package.json` 解析精确依赖 `dsh-better-goal@0.2.0`,因此不能早于 Goal 的 npm 发布推进 main:Goal 尚未在 registry 可取得时,源码安装会因依赖 404 失败。安装后重启 profile。
423
475
 
424
476
  ### 本地 link 安装
425
477
 
@@ -432,7 +484,7 @@ dsh plugin --profile <profile> add link:/absolute/path/to/dsh-apollo
432
484
  注意:
433
485
 
434
486
  - `dsh plugin add link:` 只链接 Apollo 本身,不会代装它的依赖;所以必须先 `npm install`;
435
- - 开发时可将 `dsh-better-goal` 临时改为 `file:../dsh-better-goal`,但不要提交该改动;发布版必须保持精确 npm 版本 `0.1.0`,不要写成 Git SHA、分支或范围;
487
+ - 开发时可将 `dsh-better-goal` 临时改为 `file:../dsh-better-goal`,但不要提交该改动;发布版必须保持精确 npm 版本(当前 `0.2.0`),不要写成 Git SHA、分支或范围;
436
488
  - 不需要启动额外服务或构建 Web 资源;宿主提供 React。
437
489
 
438
490
  ### 核对
@@ -458,15 +510,14 @@ dsh plugin --profile <profile> remove @menghuan1918/dsh-apollo
458
510
 
459
511
  旧 unscoped 安装使用 `remove dsh-apollo`。卸载 Apollo 后,Apollo 插入的 `dsh-better-goal` 行也会消失。如果之前单独安装过独立 bundle,需要按独立插件的说明处理;不要留下两个 goal 状态服务或续跑驱动同时工作。
460
512
 
461
- ### npm 首发顺序
513
+ ### npm 发布顺序
462
514
 
463
- 首发只做人工发布,不把登录、2FA 或 publish 放进脚本:
515
+ 两个仓库都由 GitHub Release 触发 `.github/workflows/release.yml`,通过 npm trusted publishing(OIDC)发布,仓库里不存 npm token。tag 必须是 `v<package.json 的 version>`,CI 会先校验再跑测试和 `npm publish --provenance`。
464
516
 
465
- 1. 在 Goal 仓库人工发布 `dsh-better-goal@0.1.0` tarball;发布目标必须是 `https://registry.npmjs.org/`,`access` 为 `public`。
466
- 2. 在官方 registry 验证 `0.1.0` 已可取得(查询版本并下载 tarball),排除镜像或本地缓存造成的假象。
467
- 3. 再人工发布 `@menghuan1918/dsh-apollo@0.3.0` tarball,同样指向 `https://registry.npmjs.org/` 且 `access` 为 `public`。
468
- 4. 登录、2FA 和 publish 都由维护者在真实终端完成;OTP、token 和恢复码不得写入脚本、环境文件或仓库。
469
- 5. 在 Goal 发布并验证通过前,不要把 Apollo 的 `package.json` 精确依赖 `0.1.0` 合并或推送到 main,否则 GitHub 源码安装会解析到尚不存在的 Goal 版本并 404。
517
+ 1. 先发布 Goal:在 `dsh-better-goal` 仓库推 main 并发布 Release(如 `v0.2.0`)。
518
+ 2. 在官方 registry(`https://registry.npmjs.org/`)确认该版本已可取得,排除镜像或缓存造成的假象。
519
+ 3. 再把 Apollo 的精确依赖改到该版本,推 main 并发布 Apollo Release(如 `v0.4.1`)。
520
+ 4. Goal 版本可取得前,不要把指向它的精确依赖推到 Apollo main,否则 GitHub 源码安装会 404。
470
521
 
471
522
  ## 测试与冒烟
472
523
 
@@ -492,11 +543,11 @@ DSH_PACKAGE_ROOT=/path/to/node_modules/@deepseek-ai/dsh npm test
492
543
  | [tests/cli-adapter.test.mjs](../tests/cli-adapter.test.mjs) | 适配器元数据、白名单、身份固定、env 快照、并发、错误与不自动重试、投递游标 |
493
544
  | [tests/cli-sessions.test.mjs](../tests/cli-sessions.test.mjs) | profile 范围 KV 命名空间、记录校验、原子写、重开、关闭与失败路径 |
494
545
  | [tests/cli.test.mjs](../tests/cli.test.mjs) | JSONL 读取、错误脱敏、Codex / Claude 命令构造、事件解析与失败语义 |
495
- | [tests/client.test.mjs](../tests/client.test.mjs) | 浏览器半边装载、表单渲染、只读态、编辑与冲突、模型 effort 校验、能力探针降级 |
546
+ | [tests/client.test.mjs](../tests/client.test.mjs) | 浏览器半边装载、表单渲染、只读态、编辑与冲突、模型 effort 校验、能力探针降级、自动发现合并与失败 |
496
547
  | [tests/config.test.mjs](../tests/config.test.mjs) | 常量、schema 默认值与权限枚举、volatile 投影、normalize 规则、活配置读取 |
497
548
  | [tests/dsh-home.test.mjs](../tests/dsh-home.test.mjs) | `DSH_HOME` 的默认、绝对、`~`、相对与空白处理 |
498
549
  | [tests/exit-guard.test.mjs](../tests/exit-guard.test.mjs) | 运行中子代理 / 后台任务、终态过滤、fail-open、无豁免、用户中断 |
499
- | [tests/panel.test.mjs](../tests/panel.test.mjs) | `declareOwnsHost` tap、可执行文件与版本探测、profile 读取、能力接口、信任边界、只读方法 |
550
+ | [tests/panel.test.mjs](../tests/panel.test.mjs) | `declareOwnsHost` tap、可执行文件与版本探测、profile 读取、能力接口、模型解析与来源、发现接口、信任边界、只读方法 |
500
551
  | [tests/settings.test.mjs](../tests/settings.test.mjs) | 旧配置读取与导入优先级、Loader 等待、行配置页策略、反代 tap、headless 降级 |
501
552
  | [tests/subagents.test.mjs](../tests/subagents.test.mjs) | CLI 路由开关与范围、guard、只后台、fork 拒绝、白名单、稳定 id、cwd 解析 |
502
553
  | [tests/tap.test.mjs](../tests/tap.test.mjs) | index HTML 的 `<head>` 注入位置与匹配 |
@@ -602,21 +653,22 @@ node scripts/runtime-smoke.mjs
602
653
  |---|---|
603
654
  | [package.json](../package.json) | 包元数据、bundle patch 顺序、浏览器注入、运行时依赖 |
604
655
  | [cordis.patch.yml](../cordis.patch.yml) | 原生 goal 行禁用、goal 与 `apollo-skills` 顶层行 |
605
- | [presets/eng.patch.yml](../presets/eng.patch.yml) / [presets/eng-noask.patch.yml](../presets/eng-noask.patch.yml) | 两套预设的行清单唯一事实源 |
656
+ | [presets/eng.patch.yml](../presets/eng.patch.yml) / [presets/eng-ptc.patch.yml](../presets/eng-ptc.patch.yml) | 两套预设的行清单唯一事实源 |
606
657
  | [presets/eng/plugins/wait-subagent/index.js](../presets/eng/plugins/wait-subagent/index.js) | `wait_subagent` 工具 |
607
658
  | [presets/eng/plugins/exit-guard/index.js](../presets/eng/plugins/exit-guard/index.js) | 退出守卫 |
608
- | [presets/eng/plugins/mode-instructions/index.js](../presets/eng/plugins/mode-instructions/index.js) | 工程模式提示词段 |
659
+ | [presets/eng/plugins/mode-instructions/index.js](../presets/eng/plugins/mode-instructions/index.js) | 工程模式提示词段(纪律、委派、分档、退出守卫、PTC 变体) |
609
660
  | [src/index.js](../src/index.js) | 宿主行入口;注册技能 provider、设置与 CLI 桥 |
610
661
  | [src/config.js](../src/config.js) | 正式配置 schema、默认值、规整与活配置读取 |
611
662
  | [src/settings.js](../src/settings.js) | 设置页策略、能力路由装配、旧配置导入 |
612
663
  | [src/client.js](../src/client.js) | Plugins 浏览器表单,无构建闭包工厂 |
613
- | [src/panel.js](../src/panel.js) | 能力探针、可执行文件 / 版本 / profile 探测、信任检查、反代 tap |
664
+ | [src/panel.js](../src/panel.js) | 能力探针、模型自动发现、分档路由、可执行文件 / 版本 / profile 探测、信任检查、反代 tap |
614
665
  | [src/subagents.js](../src/subagents.js) | 在现有子代理工具上安装 CLI 路由与 guard |
615
666
  | [src/cli-adapter.js](../src/cli-adapter.js) | CLI 会话适配、权限与身份校验、事件流接线 |
616
667
  | [src/cli-sessions.js](../src/cli-sessions.js) | profile 范围 KV 记录、原子写与恢复 |
617
668
  | [src/cli/codex.js](../src/cli/codex.js) / [src/cli/claude.js](../src/cli/claude.js) | 命令构造与事件解析 |
618
669
  | [src/cli/jsonl.js](../src/cli/jsonl.js) | JSONL 读取、参数校验、错误脱敏 |
619
670
  | [scripts/runtime-smoke.mjs](../scripts/runtime-smoke.mjs) | 真实宿主 / CLI 冒烟脚本 |
671
+ | [scripts/render-prompts.mjs](../scripts/render-prompts.mjs) / [prompts/](../prompts/) | 组装后的系统提示词快照及其生成脚本 |
620
672
 
621
673
  ## 许可与致谢
622
674
 
@@ -624,6 +676,6 @@ node scripts/runtime-smoke.mjs
624
676
 
625
677
  | 内容 | 来源 | 许可 |
626
678
  |---|---|---|
627
- | `presets/eng.patch.yml` 的 `config.plugins` 块(改编自 DSH 标准预设) | DeepSeek Harness | MIT,见 [presets/eng/NOTICE](../presets/eng/NOTICE) 与 [third-party/LICENSE-MIT-dsh-standard-preset](../third-party/LICENSE-MIT-dsh-standard-preset) |
679
+ | `presets/eng.patch.yml` / `presets/eng-ptc.patch.yml` 的 `config.plugins` 块(改编自 DSH 标准 / PTC 预设) | DeepSeek Harness | MIT,见 [presets/eng/NOTICE](../presets/eng/NOTICE) 与 [third-party/LICENSE-MIT-dsh-standard-preset](../third-party/LICENSE-MIT-dsh-standard-preset) |
628
680
  | `skills/tdd/`、`skills/diagnosing-bugs/` | [mattpocock/skills](https://github.com/mattpocock/skills) | MIT,Copyright © 2026 Matt Pocock,见 [third-party/NOTICE-mattpocock-skills](../third-party/NOTICE-mattpocock-skills) |
629
681
  | 能力探针的请求信任边界 | dsh-better-sidebar,源自 DSH client connection | BSD-3-Clause |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@menghuan1918/dsh-apollo",
3
- "version": "0.3.0",
3
+ "version": "0.4.1",
4
4
  "description": "DSH plugin: 流程技能、工程模式、Codex/Claude 可续接子代理与统一设置。纯 ESM,无构建步骤。",
5
5
  "license": "GPL-3.0-or-later",
6
6
  "repository": {
@@ -20,7 +20,8 @@
20
20
  "dsh": ">=0.2.1-rc.2 <0.3.0"
21
21
  },
22
22
  "scripts": {
23
- "test": "node --test"
23
+ "test": "node --test",
24
+ "prompts": "node scripts/render-prompts.mjs"
24
25
  },
25
26
  "files": [
26
27
  "src",
@@ -52,7 +53,7 @@
52
53
  },
53
54
  "dependencies": {
54
55
  "@deepseek-ai/schemastery": "~3.18.4",
55
- "dsh-better-goal": "0.1.0"
56
+ "dsh-better-goal": "0.2.0"
56
57
  },
57
58
  "peerDependencies": {
58
59
  "react": "^18.2.0"
@@ -62,7 +63,7 @@
62
63
  "patch": [
63
64
  "./cordis.patch.yml",
64
65
  "./presets/eng.patch.yml",
65
- "./presets/eng-noask.patch.yml"
66
+ "./presets/eng-ptc.patch.yml"
66
67
  ]
67
68
  },
68
69
  "client": {
@@ -1,2 +1,3 @@
1
- presets/eng.patch.yml 的 config.plugins 块改编自 DeepSeek Harness 内置
2
- Standard preset(MIT)。原始 DeepSeek 版权和 MIT 许可声明见开源仓库。
1
+ presets/eng.patch.yml 与 presets/eng-ptc.patch.yml 的 config.plugins 块改编自
2
+ DeepSeek Harness 内置 Standard / PTC preset(MIT)。原始 DeepSeek 版权和 MIT
3
+ 许可声明见开源仓库。
@@ -34,7 +34,7 @@ const JOB_TERMINAL = new Set(['completed', 'killed', 'failed'])
34
34
 
35
35
  /** 渲染一条运行项清单行。 */
36
36
  function lineOf(prefix, id, detail) {
37
- return ` - ${prefix} ${id}${detail === undefined || detail === '' ? '' : `(${detail})`}`
37
+ return ` - ${prefix} ${id}${detail === undefined || detail === '' ? '' : ` (${detail})`}`
38
38
  }
39
39
 
40
40
  /**
@@ -48,17 +48,17 @@ function buildMessage(children, jobs) {
48
48
  for (const child of children) {
49
49
  // 0.1.1-rc.2 的条目是 meta:{mode,label},0.1.2 起 mode/label 升为顶级;
50
50
  // 兼容回退只影响展示措辞,绝不抛错。
51
- lines.push(lineOf('子代理', child.id, child.label ?? child.meta?.label))
51
+ lines.push(lineOf('subagent', child.id, child.label ?? child.meta?.label))
52
52
  }
53
53
  for (const job of jobs) {
54
- lines.push(lineOf('后台任务', job.id, job.label === undefined ? job.kind : `${job.label},${job.kind}`))
54
+ lines.push(lineOf('background job', job.id, job.label === undefined ? job.kind : `${job.label}, ${job.kind}`))
55
55
  }
56
56
  const text = [
57
- '⚠️ 以下后台工作仍在运行,回合不能结束:',
57
+ 'This background work is still running, so the turn cannot end yet:',
58
58
  ...lines,
59
59
  '',
60
- '请先用 wait_subagent 等待运行中的子代理(需要续用其对话用 send_message)、'
61
- + '用 job_output 收取后台命令的结果;确属不需要的用 job_kill 停止,全部处理完毕后再收尾。',
60
+ 'Wait for running subagents with wait_subagent (use send_message to continue one), '
61
+ + 'collect background command results with job_output, and stop work you no longer need with job_kill. Finish only after all of it is handled.',
62
62
  ].join('\n')
63
63
  return {
64
64
  role: 'user',