dsh-plan-completion 0.1.0 → 0.1.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/cordis.patch.yml CHANGED
@@ -6,7 +6,11 @@
6
6
  maxTokensPatch: 400
7
7
  maxTokensRewrite: 1200
8
8
  warmBackfill: true
9
- # Debug endpoints (theme/experiment/autojob/steps/reset) stay off in production.
9
+ modelCalls: true # false: heuristic-only; no plugin model requests
10
+ # Plans + last suggestion are persisted per session so a DSH restart restores the UI.
11
+ persistPlans: true
12
+ storageDir: '~/.dsh/plan-completion-data'
13
+ # Debug endpoints (debug/diag/theme/experiment/autojob/steps/reset) stay off in production.
10
14
  enableDebugRoutes: false
11
15
  # Optional: set a local directory to persist debug logs / experiment data.
12
16
  # debugDir: '<local debug directory>'
@@ -1,104 +1,106 @@
1
- # 交付说明 · 会话计划补全插件(dsh-plan-completion)v0.1.0
2
-
3
- > 一期交付 · 2026-11-02 · 真机验收通过
4
- > 设计与实现说明见 `README.md`;设计规格见 `docs/design-v1.2.md`
5
- > 实验数据归档见 `docs/experiment-archive.md`
6
-
7
- ## 一、它是什么
8
-
9
- 在 DSH 输入框上方常驻的「计划补全」助手:
10
-
11
- - 每次 AI 回合结束,自动在输入框上方生成一句**可直接发送的下一句建议**;按 `Tab` 填入输入框(只填入、不发送)。
12
- - 左侧常驻 `▤ vX.Y` 入口,点开可看**隐式计划**:步骤列表、每步状态、证据与最近更新原因。
13
- - 计划与建议都是后台由独立模型调用生成,**不进入主对话、不改变 Agent 的提示词/工具/行为**。
14
-
15
- ## 二、交付物
16
-
17
- | 路径 | 说明 |
18
- |---|---|
19
- | `dsh-plan-completion/index.js` | Host 半:事件监听、计划/建议生成、HTTP 路由、slash 命令、用户编辑通道 |
20
- | `dsh-plan-completion/client.js` | Client 半:建议条 + 常驻入口 + 计划 Popover + Tab/快捷键 + 主题适配 |
21
- | `dsh-plan-completion/host/*.js` | 纯函数模块:plan / prompt / evidence / heuristics / config / store / job / experiment |
22
- | `dsh-plan-completion/test/` | 78 个单测(plan / prompt / heuristics / evidence / job / store / pipeline) |
23
- | `dsh-plan-completion/cordis.patch.yml` | 插件装配行 + **生产配置** |
24
- | `dsh-plan-completion/README.md` | 实现说明、触发链路、数据通道、配置、验证状态、已知限制 |
25
- | `research/archive/2026-11-02-plan-completion/` | 实验数据、真机样本、运行日志、验收截图、归档索引 |
26
-
27
- ## 三、安装 / 卸载
28
-
29
- 已安装在当前 profile(bundle id `dsh-plan-completion`)。重装 / 卸载:
30
-
31
- ```powershell
32
- plugin_manager install_bundle target='<repo>'
33
- plugin_manager remove_bundle target='dsh-plan-completion'
34
- ```
35
-
36
- - **Host 代码变更**:需要一次 profile 重组(`plugin_manager set_plugin` 开关一次,或重装)后生效。
37
- - **Client 代码变更**:需要刷新页面(Ctrl+R)后生效;链接的本地 bundle 不会自动热更。
38
-
39
- ## 四、使用
40
-
41
- | 操作 | 效果 |
42
- |---|---|
43
- | `Tab`(输入框聚焦) | 把当前建议填入输入框(不发送) |
44
- | `Alt+1..3` | 填入第 1~3 条备选建议 |
45
- | `Esc` | 关闭当前建议(只留 `▤` 入口) |
46
- | 点击 `▤ vX.Y` | 打开计划页(步骤 / 状态 / 证据 / 更新原因) |
47
- | `Ctrl+Alt+P` | 快速打开/关闭计划页 |
48
- | `/roadmap` | 在会话里查看当前计划(只读) |
49
- | `/replan <方向>` | 带方向强制重写计划(用户编辑过计划后,这是唯一能整体重写的入口) |
50
-
51
- ## 五、生产配置(已冻结)
52
-
53
- `cordis.patch.yml`:
54
-
55
- ```yaml
56
- - insert:
57
- - id: plan-completion
58
- name: 'dsh-plan-completion'
59
- config:
60
- evidenceChars: 1500 # patch 路径证据字符预算
61
- maxTokensPatch: 400 # patch 输出上限(实测只需 65~120)
62
- maxTokensRewrite: 1200 # rewrite/冷启动输出上限(输出完整步骤表)
63
- ```
64
-
65
- 改配置 → 重组插件 → 看 Host 启动日志 `host-ready.settings` 确认生效。
66
-
67
- ## 六、验证证据链
68
-
69
- 1. **单测**:78 tests / 78 pass / 0 fail。
70
- 2. **两轮隔离测试**(固定快照 + 固定计划;温度 0;每组 3 次;字符切片;跨模型盲评):
71
- - 证据 800/2000/4000 字符 → 盲评 4.67/5 持平;输出 200/300/500 → 4.63/4.67/4.70;27/27 解析成功、可用率 100%。
72
- - 结论:证据 800~1200 字符、输出 200~300 tokens 足够;增加上下文无收益。
73
- 3. **6 条真机 auto-job 样本**:输出 75~113 tok(均值 88)、延迟 1.25~1.53s、建议 21~36 字、6/6 可用;计划无实质变化时不 bump。
74
- 4. **配置生效**:`host-ready.config` 回显 1500/400/1200;force 调用 `maxTokens:1200`、patch 调用 `maxTokens:400`。
75
- 5. **UI 验收**:浅色 / 暗色主题截图、建议胶囊与会话卡片左缘对齐、无建议时只剩 `▤`、新会话/切会话行为符合预期。
76
- 6. **用户编辑通道**:标记 s4 done → `gen+1 / editedByUser=true / reason 记录`,之后模型只能 patch;整计划整理(分类)→ 7 步 `[交付]/[验证]/[冻结]/[收尾]/[二期]`。
77
-
78
- ## 七、已知限制(一期)
79
-
80
- 1. **不覆盖历史会话**:插件只处理「激活后观察到 turn/end」的会话;老会话在产生下一次回合结束前,只有 `▤` 入口、没有建议(当前行为,二期可加「挂载时回填」)。
81
- 2. **计划不持久化**:进程内存保存,DSH 重启后计划丢失,下个回合结束重新生成(二期接 `storageDomain`)。
82
- 3. **用户编辑锁**:`editedByUser=true` 后模型不能自动 rewrite 覆盖计划,只能 patch;需要整体重构用 `/replan`。
83
- 4. **调试路由**:`/plan-completion/experiment|autojob|steps|theme|diag` 仅监听本机回环,无鉴权(二期按 `connection.requestRejection`/`fetch` 收敛)。
84
- 5. **无「核对进度」按钮**:计划页当前只展示状态/证据;按需模型核对按钮在二期清单(见下)。
85
- 6. **模型选择固定策略**:默认优先非思考模型;用户三选一(跟随默认/固定/自动)设置页在二期。
86
-
87
- ## 八、二期清单
88
-
89
- - [ ] 计划持久化(`storageDomain` + 文件存储,重启不丢)
90
- - [ ] 模型选择设置页(跟随会话默认 / 固定模型 / 自动挑非思考模型)
91
- - [ ] 右栏计划页(`ctx.sidebarRightTabs.register`,替代/补充浮层)
92
- - [ ] 路由鉴权(`connection.requestRejection` / `connection.fetch`)
93
- - [ ] 「核对进度」按钮(按需一次调用,输出计划 vs 实际差异清单)
94
- - [ ] 挂载时回填(打开老会话时按需生成计划/建议)
95
- - [ ] 每日 token 预算闸(可选)
96
-
97
- ## 九、排障
98
-
99
- - 运行日志:`<debugDir>/plan-completion-runtime.jsonl`(Host 侧 debugLog;含 `host-ready` / `routes-registered` / `model-usage` / `client-diag` / `user-edit`)。
100
- - 状态自检:`GET /plan-completion/state?sessionId=…`、`GET /plan-completion/debug`。
101
- - 客户端自检:`POST /plan-completion/diag` 上报 `build / hasPill / hasEntry / entryText / suggestVisible / rowHeight` 与计算样式。
102
- - 插件「没显示」排查顺序:① Ctrl+R 刷新页面 → ② 确认 profile 里插件 enabled → ③ `/plan-completion/debug` 看 `host-ready` 服务是否齐全 → ④ 看 `client-diag` 是否有 `hasPill/hasEntry`。
1
+ # 交付说明 · 会话计划补全插件(dsh-plan-completion)v0.1.0
2
+
3
+ > 历史文档:以下保留 v0.1.0 的交付/评估/计划记录。**v0.1.1 已发布**(鉴权、状态一致性、隐私边界修复),详见 [security.md](security.md) 与 [CHANGELOG](../CHANGELOG.md);旧记录中的“无鉴权”、原始诊断字段与独立评审不代表当前实现。
4
+
5
+ > 一期交付 · 2026-11-02 · 真机验收通过
6
+ > 设计与实现说明见 `README.md`;设计规格见 `docs/design-v1.2.md`
7
+ > 实验数据归档见 `docs/experiment-archive.md`
8
+
9
+ ## 一、它是什么
10
+
11
+ 在 DSH 输入框上方常驻的「计划补全」助手:
12
+
13
+ - 每次 AI 回合结束,自动在输入框上方生成一句**可直接发送的下一句建议**;按 `Tab` 填入输入框(只填入、不发送)。
14
+ - 左侧常驻 `▤ vX.Y` 入口,点开可看**隐式计划**:步骤列表、每步状态、证据与最近更新原因。
15
+ - 计划与建议都是后台由独立模型调用生成,**不进入主对话、不改变 Agent 的提示词/工具/行为**。
16
+
17
+ ## 二、交付物
18
+
19
+ | 路径 | 说明 |
20
+ |---|---|
21
+ | `dsh-plan-completion/index.js` | Host 半:事件监听、计划/建议生成、HTTP 路由、slash 命令、用户编辑通道 |
22
+ | `dsh-plan-completion/client.js` | Client 半:建议条 + 常驻入口 + 计划 Popover + Tab/快捷键 + 主题适配 |
23
+ | `dsh-plan-completion/host/*.js` | 纯函数模块:plan / prompt / evidence / heuristics / config / store / job / experiment |
24
+ | `dsh-plan-completion/test/` | 111 个单测(plan / prompt / heuristics / evidence / job / store / pipeline / Host 接线 / Client 生命周期 / 安全与隐私) |
25
+ | `dsh-plan-completion/cordis.patch.yml` | 插件装配行 + **生产配置** |
26
+ | `dsh-plan-completion/README.md` | 实现说明、触发链路、数据通道、配置、验证状态、已知限制 |
27
+ | `docs/experiment-archive.md` | 实验与验收数据摘要(仓库内);原始数据仅本地保留(`research/archive/…`) |
28
+
29
+ ## 三、安装 / 卸载
30
+
31
+ 已安装在当前 profile(bundle id `dsh-plan-completion`)。重装 / 卸载:
32
+
33
+ ```powershell
34
+ plugin_manager install_bundle target='<repo>'
35
+ plugin_manager remove_bundle target='dsh-plan-completion'
36
+ ```
37
+
38
+ - **Host 代码变更**:需要一次 profile 重组(`plugin_manager set_plugin` 开关一次,或重装)后生效。
39
+ - **Client 代码变更**:需要刷新页面(Ctrl+R)后生效;链接的本地 bundle 不会自动热更。
40
+
41
+ ## 四、使用
42
+
43
+ | 操作 | 效果 |
44
+ |---|---|
45
+ | `Tab`(输入框聚焦) | 把当前建议填入输入框(不发送) |
46
+ | `Alt+1..3` | 填入第 1~3 条备选建议 |
47
+ | `Esc` | 关闭当前建议(只留 `▤` 入口) |
48
+ | 点击 `▤ vX.Y` | 打开计划页(步骤 / 状态 / 证据 / 更新原因) |
49
+ | `Ctrl+Alt+P` | 快速打开/关闭计划页 |
50
+ | `/roadmap` | 在会话里查看当前计划(只读) |
51
+ | `/replan <方向>` | 带方向强制重写计划(用户编辑过计划后,这是唯一能整体重写的入口) |
52
+
53
+ ## 五、生产配置(已冻结)
54
+
55
+ `cordis.patch.yml`:
56
+
57
+ ```yaml
58
+ - insert:
59
+ - id: plan-completion
60
+ name: 'dsh-plan-completion'
61
+ config:
62
+ evidenceChars: 1500 # patch 路径证据字符预算
63
+ maxTokensPatch: 400 # patch 输出上限(实测只需 65~120)
64
+ maxTokensRewrite: 1200 # rewrite/冷启动输出上限(输出完整步骤表)
65
+ ```
66
+
67
+ 改配置 → 重组插件 → 看 Host 启动日志 `host-ready.settings` 确认生效。
68
+
69
+ ## 六、验证证据链
70
+
71
+ 1. **单测**:78 tests / 78 pass / 0 fail。
72
+ 2. **两轮隔离测试**(固定快照 + 固定计划;温度 0;每组 3 次;字符切片;跨模型盲评):
73
+ - 证据 800/2000/4000 字符 → 盲评 4.67/5 持平;输出 200/300/500 → 4.63/4.67/4.70;27/27 解析成功、可用率 100%。
74
+ - 结论:证据 800~1200 字符、输出 200~300 tokens 足够;增加上下文无收益。
75
+ 3. **6 条真机 auto-job 样本**:输出 75~113 tok(均值 88)、延迟 1.25~1.53s、建议 21~36 字、6/6 可用;计划无实质变化时不 bump。
76
+ 4. **配置生效**:`host-ready.config` 回显 1500/400/1200;force 调用 `maxTokens:1200`、patch 调用 `maxTokens:400`。
77
+ 5. **UI 验收**:浅色 / 暗色主题截图、建议胶囊与会话卡片左缘对齐、无建议时只剩 `▤`、新会话/切会话行为符合预期。
78
+ 6. **用户编辑通道**:标记 s4 done → `gen+1 / editedByUser=true / reason 记录`,之后模型只能 patch;整计划整理(分类)→ 7 步 `[交付]/[验证]/[冻结]/[收尾]/[二期]`。
79
+
80
+ ## 七、已知限制(v0.1.1 现状)
81
+
82
+ 1. **旧会话回填已支持**(v0.1.1):打开插件从未观察过的会话时,Client 会 POST `/plan-completion/warm`,Host 从持久化会话日志重建计划+建议(同一会话 10 分钟内只回填一次;需要一次模型调用,可用 `warmBackfill:false` 关闭)。不触发回填时仍只有 `▤` 入口。
83
+ 2. **计划持久化已支持**(v0.1.2):计划+最近建议写入 `storageDir`(默认 `~/.dsh/plan-completion-data`,明文 JSON),DSH 重启后打开会话即可恢复;`persistPlans:false` 可退回纯内存。存储不加密、不自动清理,多 profile 共用默认目录时可能互相可见(见 `docs/security.md`)。
84
+ 3. **用户编辑锁**:`editedByUser=true` 后模型不能自动 rewrite 覆盖计划,只能 patch;需要整体重构用 `/replan`。
85
+ 4. **调试路由**:`experiment|autojob|steps|theme|diag|reset|debug` 仅在 `enableDebugRoutes:true` 时注册,且与其他路由一样必须通过宿主 `connection.requestRejection`(v0.1.1 起)。
86
+ 5. **无「核对进度」按钮**:计划页当前只展示状态/证据;按需模型核对按钮在二期清单(见下)。
87
+ 6. **模型路由**:v0.1.1 起只使用宿主当前默认 provider/model(不再自动改投其他供应商);`modelCalls:false` 可关闭插件全部模型调用。用户三选一设置页仍在二期。
88
+
89
+ ## 八、二期清单
90
+
91
+ - [ ] 计划持久化(`storageDomain` + 文件存储,重启不丢)
92
+ - [ ] 模型选择设置页(跟随会话默认 / 固定模型 / 自动挑非思考模型)
93
+ - [ ] 右栏计划页(`ctx.sidebarRightTabs.register`,替代/补充浮层)
94
+ - [x] 路由鉴权(`connection.requestRejection` / `connection.fetch`)——已在 v0.1.1 交付
95
+ - [ ] 「核对进度」按钮(按需一次调用,输出计划 vs 实际差异清单)
96
+ - [x] 挂载时回填(打开老会话时按需生成计划/建议)——已在 v0.1.1 交付
97
+ - [ ] 每日 token 预算闸(可选)
98
+
99
+ ## 九、排障
100
+
101
+ - 运行日志:`<debugDir>/plan-completion-runtime.jsonl`(Host 侧 debugLog;含 `host-ready` / `routes-registered` / `model-usage` / `client-diag` / `user-edit`)。
102
+ - 状态自检:`GET /plan-completion/state?sessionId=…`、`GET /plan-completion/debug`。
103
+ - 客户端自检:`POST /plan-completion/diag` 上报 `build / hasPill / hasEntry / entryText / suggestVisible / rowHeight` 与计算样式。
104
+ - 插件「没显示」排查顺序:① Ctrl+R 刷新页面 → ② 确认 profile 里插件 enabled → ③ `/plan-completion/debug` 看 `host-ready` 服务是否齐全 → ④ 看 `client-diag` 是否有 `hasPill/hasEntry`。
103
105
 
104
106
 
@@ -1,69 +1,73 @@
1
- # 会话计划补全插件 · 二期计划
2
-
3
- > 版本:v2.0 计划草案 · 2026-11-02
4
- > 依据:一期交付(见 `dsh-plan-completion/交付说明.md`)+ 本次真机反馈(常驻、计划页视觉、GitHub 发布评估)
5
- > 目标:把「能用」的一期做成「稳、好看、可发布」的二期
6
-
7
- ---
8
-
9
- ## 一、二期范围与优先级
10
-
11
- ### P0(必须,决定可用性与发布)
12
-
13
- | # | 事项 | 现状问题 | 方案 | 验收标准 | 预估 |
14
- |---|---|---|---|---|---|
15
- | P0-1 | **挂载时回填(旧会话也能有建议)** | 插件只处理「激活后观察到 turn/end」的会话;老会话打开只有裸入口 | client 挂载时若 `state.stale && !plan`,POST `/plan-completion/warm {sessionId}`;host 用 `session.snapshotEvents` 回填一次计划+建议(可在会话无新回合时工作) | 打开任意历史会话 ≤5s 出现建议;同一会话只回填一次(按 session+seq 去重) | 0.5d |
16
- | P0-2 | **真·常驻(hero / 新会话也有入口)** | `conversation.input.dock` 在无 Session 的 hero 页不渲染;删除全部消息后栏位消失 | 在 `shell.overlay` 增加一个随 composer 定位的轻量 `▤ 计划` 入口(hero 时显示;已有 dock 时隐藏避免重复);无计划时保留虚线提示胶囊(一期已做) | 新会话 hero、删除全部消息、旧会话、正常会话四种状态都有入口且不重叠 | 0.5d |
17
- | P0-3 | **计划持久化** | 进程内存,DSH 重启丢失 | `storageDomain` 持久化 plan(按 sessionId 分 key)+ 启动时恢复 + 版本号 `gen.rev` 保留 | 重启 DSH 后同一会话仍显示原计划与版本;schema 变更可迁移 | 1d |
18
- | P0-4 | **路由鉴权** | `/plan-completion/*` 调试路由无鉴权(本机回环) | 使用 `connection.requestRejection` 校验来源、或改用 `connection.fetch` 同源校验;调试路由默认仅本机、可配置关闭 | 非本机/非 DSH 页面的请求被拒;客户端不受影响 | 0.5d |
19
- | P0-5 | **「核对进度」按钮** | 计划页只能看状态,无法对照实际进度 | 计划页底部加「核对进度」→ POST `/plan-completion/verify` → 一次模型调用生成「计划 vs 实际差异 + 建议修正」→ 展示在计划页(可折叠、可采纳) | 点击后 ≤5s 返回差异清单;采纳后生成 patch;失败有降级文案 | 1d |
20
- | P0-6 | **发布工程化** | 无 git 仓库 / LICENSE / CI / 包元数据、README 含本地绝对路径 | 见 `发布评估-GitHub.md` 的 P0 清单 | 全部 P0 项 PASS,`node --test` 绿,仓库可公开 | 1d |
21
-
22
- ### P1(体验增强)
23
-
24
- | # | 事项 | 方案 | 验收 |
25
- |---|---|---|---|
26
- | P1-1 | 模型三选一设置页 | 跟随会话默认 / 固定模型 / 自动挑非思考模型;落插件 config + 设置页 | UI 可切换并即时生效,日志记录实际路由 |
27
- | P1-2 | 右栏计划页 | `ctx.sidebarRightTabs.register` 提供常驻计划 tab,浮层保留为快捷入口 | 右栏可打开、与浮层状态一致 |
28
- | P1-3 | 建议「依据」展示 | 保持一行;hover tooltip 显示 `plan.reason`;`suggestionLines: 1\|2` 作为配置项(默认 1) | 默认视觉不变,hover 可看依据 |
29
- | P1-4 | 计划页编辑能力 | 状态点击切换(走 `/steps`)、步骤增删、`/replan` 入口按钮;`editedByUser` 语义保持 | 用户编辑后 gen+1、模型只 patch |
30
- | P1-5 | 每日 token 预算闸 | 配置 `dailyTokenBudget`,超限降级启发式并提示 | 超预算时无模型调用、UI 有提示 |
31
- | P1-6 | 单元测试补强 | client 纯逻辑(normalize/format/fill 决策)抽到可测模块;新增 shared-host 生命周期测试 | 测试 ≥120 且 CI 绿 |
32
-
33
- ### P2(打磨)
34
-
35
- - 计划导出 Markdown / 复制为 checklist;
36
- - 建议历史(最近 5 条,可回填);
37
- - 多语言补全(en 全文案);
38
- - 图标与空态插画;
39
- - 性能:轮询降频策略、页面隐藏时暂停;
40
- - 失败重试策略统一(模型超时/空输出/非法 JSON 的退避)。
41
-
42
- ---
43
-
44
- ## 二、本轮已顺带修复的技术债(记录)
45
-
46
- 1. **重复 handler 泄漏**:插件 toggle/hot reload 后旧模块的 HTTP 路由仍存活,导致同一路径出现新旧两个处理实例(`/state` 读旧、`/reset` 写新)。已改为 `globalThis` 共享状态 + 注册前 dispose 旧 disposers。
47
- 2. **客户端不清空计划**:服务端返回 `plan:null` 时客户端仍保留旧计划,导致「计划/建议不消失」。已加 `handlePlanFetch → clearPlanResult`。
48
- 3. **常驻兜底**:无计划时显示虚线提示胶囊 + `▤ 计划` 入口(已验证 `entryText=▤计划`、`suggestVisible=false`)。
49
- 4. **计划页视觉 v2**:卡片式面板(16px 圆角、双层阴影、分区 header/body/footer、状态胶囊、建议高亮卡、底部操作栏),截图验证通过。
50
- 5. **调试日志路径可配置**:`config.debugDir` / `DSH_PLAN_COMPLETION_DEBUG_DIR`,为空不写文件(为发布清路径做准备)。
51
-
52
- ---
53
-
54
- ## 三、里程碑
55
-
56
- | 里程碑 | 内容 | 出口标准 |
57
- |---|---|---|
58
- | M2.0 | P0-1/2/3(回填、常驻、持久化) | 四类会话状态都有入口;重启不丢计划 |
59
- | M2.1 | P0-4/5(鉴权、核对按钮) | 安全审计 + 核对可用 |
60
- | M2.2 | P0-6 + P1-1/2(发布工程化、设置页、右栏) | GitHub 公开、CI 绿、文档齐 |
61
- | M2.3 | P1-3/4/5/6(依据、编辑、预算、测试) | 体验与稳定性达标 |
62
-
63
- ## 四、风险
64
-
65
- - **回填成本**:打开旧会话触发一次模型调用;用「每个会话一次 + 预算闸」控制。
66
- - **跨版本兼容**:持久化 schema 需版本字段与迁移器。
67
- - **鉴权改动**:可能影响现有同源 fetch 契约(一期已验证的通道),需回归。
68
- - **用户编辑锁**:编辑后模型不能 rewrite,需在 UI 明确「/replan 可整体重写」。
1
+ # 会话计划补全插件 · 二期计划
2
+
3
+ > 历史文档:以下保留 v0.1.0 的交付/评估/计划记录。**v0.1.1 已发布**(鉴权、状态一致性、隐私边界修复),详见 [security.md](security.md) 与 [CHANGELOG](../CHANGELOG.md);旧记录中的“无鉴权”、原始诊断字段与独立评审不代表当前实现。
4
+
5
+ > 版本:v2.0 计划草案 · 2026-11-02
6
+ > 依据:一期交付(见 `dsh-plan-completion/交付说明.md`)+ 本次真机反馈(常驻、计划页视觉、GitHub 发布评估)
7
+ > 目标:把「能用」的一期做成「稳、好看、可发布」的二期
8
+
9
+ ---
10
+
11
+ ## 一、二期范围与优先级
12
+
13
+ ### P0(必须,决定可用性与发布)
14
+
15
+ > 更新(v0.1.2):P0-1(挂载回填)、P0-2(Hero 常驻)、P0-3(计划持久化)、P0-4(路由鉴权)已交付;以下保留原始规划记录,未完成项为 P0-5 / P0-6。
16
+
17
+ | # | 事项 | 现状问题 | 方案 | 验收标准 | 预估 |
18
+ |---|---|---|---|---|---|
19
+ | P0-1 | ✅ **挂载时回填(旧会话也能有建议)** | 插件只处理「激活后观察到 turn/end」的会话;老会话打开只有裸入口 | client 挂载时若 `state.stale && !plan`,POST `/plan-completion/warm {sessionId}`;host 用 `session.snapshotEvents` 回填一次计划+建议(可在会话无新回合时工作) | 打开任意历史会话 ≤5s 出现建议;同一会话只回填一次(按 session+seq 去重) | ✅ 已交付(v0.1.1) |
20
+ | P0-2 | ✅ **真·常驻(hero / 新会话也有入口)** | `conversation.input.dock` 在无 Session 的 hero 页不渲染;删除全部消息后栏位消失 | 在 `shell.overlay` 增加一个随 composer 定位的轻量 `▤ 计划` 入口(hero 时显示;已有 dock 时隐藏避免重复);无计划时保留虚线提示胶囊(一期已做) | 新会话 hero、删除全部消息、旧会话、正常会话四种状态都有入口且不重叠 | ✅ 已交付(v0.1.1) |
21
+ | P0-3 | ✅ **计划持久化** | 进程内存,DSH 重启丢失 | 本地文件持久化(`storageDir`,按 sessionId 原子写)+ 启动/打开会话时 hydrate + 版本号 `gen.rev` 保留 | 重启 DSH 后同一会话仍显示原计划与版本;schema 变更可迁移 | ✅ 已交付(v0.1.2,文件存储方案) |
22
+ | P0-4 | ✅ **路由鉴权** | `/plan-completion/*` 调试路由无鉴权(本机回环) | 使用 `connection.requestRejection` 校验来源、或改用 `connection.fetch` 同源校验;调试路由默认仅本机、可配置关闭 | 非本机/非 DSH 页面的请求被拒;客户端不受影响 | ✅ 已交付(v0.1.1) |
23
+ | P0-5 | **「核对进度」按钮** | 计划页只能看状态,无法对照实际进度 | 计划页底部加「核对进度」→ POST `/plan-completion/verify` → 一次模型调用生成「计划 vs 实际差异 + 建议修正」→ 展示在计划页(可折叠、可采纳) | 点击后 ≤5s 返回差异清单;采纳后生成 patch;失败有降级文案 | 1d |
24
+ | P0-6 | **发布工程化** | 无 git 仓库 / LICENSE / CI / 包元数据、README 含本地绝对路径 | 见 `发布评估-GitHub.md` 的 P0 清单 | 全部 P0 项 PASS,`node --test` 绿,仓库可公开 | 1d |
25
+
26
+ ### P1(体验增强)
27
+
28
+ | # | 事项 | 方案 | 验收 |
29
+ |---|---|---|---|
30
+ | P1-1 | 模型三选一设置页 | 跟随会话默认 / 固定模型 / 自动挑非思考模型;落插件 config + 设置页 | UI 可切换并即时生效,日志记录实际路由 |
31
+ | P1-2 | 右栏计划页 | `ctx.sidebarRightTabs.register` 提供常驻计划 tab,浮层保留为快捷入口 | 右栏可打开、与浮层状态一致 |
32
+ | P1-3 | 建议「依据」展示 | 保持一行;hover tooltip 显示 `plan.reason`;`suggestionLines: 1\|2` 作为配置项(默认 1) | 默认视觉不变,hover 可看依据 |
33
+ | P1-4 | 计划页编辑能力 | 状态点击切换(走 `/steps`)、步骤增删、`/replan` 入口按钮;`editedByUser` 语义保持 | 用户编辑后 gen+1、模型只 patch |
34
+ | P1-5 | 每日 token 预算闸 | 配置 `dailyTokenBudget`,超限降级启发式并提示 | 超预算时无模型调用、UI 有提示 |
35
+ | P1-6 | 单元测试补强 | client 纯逻辑(normalize/format/fill 决策)抽到可测模块;新增 shared-host 生命周期测试 | 测试 ≥120 且 CI 绿 |
36
+
37
+ ### P2(打磨)
38
+
39
+ - 计划导出 Markdown / 复制为 checklist;
40
+ - 建议历史(最近 5 条,可回填);
41
+ - 多语言补全(en 全文案);
42
+ - 图标与空态插画;
43
+ - 性能:轮询降频策略、页面隐藏时暂停;
44
+ - 失败重试策略统一(模型超时/空输出/非法 JSON 的退避)。
45
+
46
+ ---
47
+
48
+ ## 二、本轮已顺带修复的技术债(记录)
49
+
50
+ 1. **重复 handler 泄漏**:插件 toggle/hot reload 后旧模块的 HTTP 路由仍存活,导致同一路径出现新旧两个处理实例(`/state` 读旧、`/reset` 写新)。已改为 `globalThis` 共享状态 + 注册前 dispose 旧 disposers。
51
+ 2. **客户端不清空计划**:服务端返回 `plan:null` 时客户端仍保留旧计划,导致「计划/建议不消失」。已加 `handlePlanFetch → clearPlanResult`。
52
+ 3. **常驻兜底**:无计划时显示虚线提示胶囊 + `▤ 计划` 入口(已验证 `entryText=▤计划`、`suggestVisible=false`)。
53
+ 4. **计划页视觉 v2**:卡片式面板(16px 圆角、双层阴影、分区 header/body/footer、状态胶囊、建议高亮卡、底部操作栏),截图验证通过。
54
+ 5. **调试日志路径可配置**:`config.debugDir` / `DSH_PLAN_COMPLETION_DEBUG_DIR`,为空不写文件(为发布清路径做准备)。
55
+
56
+ ---
57
+
58
+ ## 三、里程碑
59
+
60
+ | 里程碑 | 内容 | 出口标准 |
61
+ |---|---|---|
62
+ | M2.0 | P0-1/2/3(回填、常驻、持久化) | 四类会话状态都有入口;重启不丢计划 |
63
+ | M2.1 | P0-4/5(鉴权、核对按钮) | 安全审计 + 核对可用 |
64
+ | M2.2 | P0-6 + P1-1/2(发布工程化、设置页、右栏) | GitHub 公开、CI 绿、文档齐 |
65
+ | M2.3 | P1-3/4/5/6(依据、编辑、预算、测试) | 体验与稳定性达标 |
66
+
67
+ ## 四、风险
68
+
69
+ - **回填成本**:打开旧会话触发一次模型调用;用「每个会话一次 + 预算闸」控制。
70
+ - **跨版本兼容**:持久化 schema 需版本字段与迁移器。
71
+ - **鉴权改动**:可能影响现有同源 fetch 契约(一期已验证的通道),需回归。
72
+ - **用户编辑锁**:编辑后模型不能 rewrite,需在 UI 明确「/replan 可整体重写」。
69
73
 
@@ -1,99 +1,103 @@
1
- # GitHub 发布评估 · 会话计划补全插件(2026-11-02)
2
-
3
- > **2026-11-02 晚更新:P0 清单已全部完成,状态从「不满足全 PASS」→「可按 GitHub 源码仓库发布」。**
4
- >
5
- > | 项 | 状态 |
6
- > |---|---|
7
- > | B1 git 仓库 | ✅ 已 `git init` + 提交(见 git log) |
8
- > | B2 LICENSE | ✅ MIT(`LICENSE`) |
9
- > | B3 包元数据 | ✅ `name=dsh-plan-completion`、license/repository/keywords/engines/scripts/author;`private:false`;profile 已完成改名并验证运行 |
10
- > | B4 本地绝对路径 | ✅ README/config 已无绝对路径;发布版 patch 不含 `debugDir` |
11
- > | B5 调试路由鉴权/收敛 | ✅ 默认关闭(`enableDebugRoutes:false`),生产路由仅 state/debug/diag/replan/warm |
12
- > | B6 运行时数据不入库 | ✅ `.gitignore` 排除 research/*.jsonl 等;仓库仅含源码+文档+脱敏截图 |
13
- > | B7 CI | ✅ `.github/workflows/test.yml` 已启用(GitHub Actions,Node 20/22 矩阵,push/PR 触发;README 带 badge) |
14
- > | B8 CHANGELOG/CONTRIBUTING | ✅ 已补 |
15
- >
16
- > 发布状态:GitHub 仓库 public、`main` 已推送、tag `v0.1.0` + Release 已创建;GitHub Actions 已启用并 **CI 全绿**(run [41364200848](https://github.com/Xumi0920/dsh-plan-completion/actions/runs/41364200848),Node 20/22 两 job success)。npm 账号已登录(`xumi_frm`),但**发布因账号开启 2FA 被拒(E403)**,需 `--otp` 或带 2FA bypass 的 granular token。
17
- > 包名改名已完成并在本机 profile 验证(`remove @local/...` + `install <repo>`,运行状态与计划在重装后保持)。
18
-
19
- 结论先说:**代码与文档质量达到"可以开源",但当前状态"不满足全 PASS"**。
20
- 按下面的 P0 清单做完(约 1 天工作量),即可公开;P1 是加分项。
21
-
22
- 评估范围:`<repo>`(插件源码,含 78 个单测)+ 两份设计/交付文档 + 实验归档。
23
- 结论依据:代码走查、`node --test` 实测、目录/元数据检查、敏感信息扫描。
24
-
25
- ---
26
-
27
- ## 一、总览评分
28
-
29
- | 维度 | 状态 | 说明 |
30
- |---|---|---|
31
- | 代码质量 | ✅ PASS | Host/Client 分层清晰,纯函数模块(plan/prompt/evidence/heuristics/config/store/job)可单测 |
32
- | 测试 | ✅ PASS | `node --test`:**78 tests / 78 pass / 0 fail**(含 pipeline 集成测试) |
33
- | 文档 | 🟡 部分 | README/交付说明/设计文档齐全,但 README 有 6 处本地绝对路径、缺 CHANGELOG/CONTRIBUTING |
34
- | 安全 | 🟡 部分 | 源码无密钥/密码(已扫描);但 6 个调试路由无鉴权、默认写本地日志目录 |
35
- | 隐私/数据 | 🟡 部分 | 运行日志与实验档包含 sessionId、UA、对话摘要片段;不应进公开仓库 |
36
- | 包元数据 | ❌ FAIL | `private:true`、`name=@local/...`、无 license/repository/keywords/engines/author |
37
- | 仓库工程 | ❌ FAIL | 工作区**不是 git 仓库**;无 LICENSE、.gitignore、CI workflow、CHANGELOG |
38
- | 可移植性 | 🟡 部分 | 默认 `debugDir` 可配置(已改),但 patch 示例仍带本地路径;README 路径需泛化 |
39
- | 视觉/演示资产 | 🟡 部分 | 有真机截图(归档目录),但仓库内无 screenshots/demo 目录 |
40
- | 许可证合规 | ❌ FAIL | 无 LICENSE 文件,无法合法声明开源许可 |
41
-
42
- **当前结论:6 项 PASS / 4 项部分 / 4 项 FAIL → 不满足"全 PASS"。**
43
-
44
- ---
45
-
46
- ## 二、P0 阻塞项(发布前必须修)
47
-
48
- | # | 阻塞项 | 现状 | 修复动作 |
49
- |---|---|---|---|
50
- | B1 | 无 git 仓库 | 工作区不是 repo | 只把插件目录+文档纳入仓库:`git init` → `.gitignore` → 首次提交(建议独立 repo,不要把 research/、其他项目带进去) |
51
- | B2 | 无 LICENSE | 缺失 | 选 MIT(或 Apache-2.0)→ `LICENSE` + package.json `license` 字段 |
52
- | B3 | package.json 元数据不全 | `private:true`、`@local/` 前缀、无 license/repository/author/keywords/engines | 改名 `dsh-plan-completion`(或保留 scoped),补全字段;若只做 GitHub 源码分发可保留 private=false 但不发 npm |
53
- | B4 | 本地绝对路径 | README 与文档中存在本地绝对路径;`cordis.patch.yml` 有本地 `debugDir` | README/文档改成相对路径/占位符;发布版 patch 去掉 `debugDir`(代码已支持 env 覆盖) |
54
- | B5 | 调试路由无鉴权 | `/plan-completion/experiment|autojob|steps|reset|diag|theme` | 发布版:默认关闭调试路由(config `enableDebugRoutes:false`),或加来源校验(`connection.requestRejection`) |
55
- | B6 | 运行时数据/实验档不应入库 | `research/plan-completion-runtime.jsonl`(含 sessionId/UA/对话片段)、`research/archive` | `.gitignore` 排除 `research/`、`*.jsonl`、实验/样本 JSON;如需展示数据,脱敏后放 `docs/` |
56
- | B7 | 无 CI | — | `.github/workflows/test.yml`:Node 20/22 矩阵跑 `node --test test/*.test.js`;可选 markdown lint |
57
- | B8 | 缺 CHANGELOG / CONTRIBUTING | — | 加 `CHANGELOG.md`(0.1.0 初始)+ `CONTRIBUTING.md`(本地安装/调试命令) |
58
-
59
- ## 三、P1 建议(发布后 1~2 周)
60
-
61
- 1. 仓库结构建议:
62
- ```
63
- dsh-plan-completion/ # 根即插件包(保持现在结构)
64
- ├── index.js client.js host/ locale/ test/
65
- ├── cordis.patch.yml package.json icon.svg
66
- ├── README.md LICENSE CHANGELOG.md CONTRIBUTING.md .gitignore
67
- ├── docs/ # 设计计划 v1.2、二期计划、交付说明
68
- ├── docs/screenshots/ # 建议新增 3 张(浅色/暗色/计划页)
69
- └── .github/workflows/test.yml
70
- ```
71
- 2. 安全:调试路由默认 off + 请求来源校验;README 增加「隐私说明:插件会把会话摘要发送给模型」。
72
- 3. 质量:把 client 纯逻辑抽出来补测试(目标 ≥120 用例);host 生命周期(重载不重复注册)加回归测试。
73
- 4. 发布:打 tag `v0.1.0` + GitHub Release notes(引用交付说明);可选 npm publish(需 dsh 生态约定)。
74
- 5. 版本要求:package.json 增加 `engines.dsh` 或 README 明确最低 DSH 版本(本插件依赖 `dsh.client/slots/webServer/llm/commands` 契约)。
75
-
76
- ## 四、已具备的发布优势
77
-
78
- - **契约经过探测验证**:槽位、InputActions、同源 HTTP、斜杠命令均在真机日志中有证据(`research/p0-contract.md`)。
79
- - **可量化验收**:两轮隔离测试 + 6 条真机样本 + 78 单测 + 配置生效日志,README/交付说明可复现。
80
- - **成本与预算有结论**:稳态 ~1.2k tokens/回合、patch 输出 75~113 tokens,有明确默认值与依据。
81
- - **无第三方运行时依赖**:只用 Node 标准库 + React(宿主提供),发布门槛低。
82
- - **面向失败的设计**:模型失败走启发式 fallback、CAS 版本冲突、用户编辑优先、超时降级。
83
-
84
- ## 五、发布命令草稿(确认后执行)
85
-
86
- ```powershell
87
- cd <repo>
88
- git init
89
- # 先补 LICENSE / .gitignore / CI / CHANGELOG / 元数据 / 移除本地路径与调试路由默认值
90
- git add .
91
- git commit -m "feat: initial release v0.1.0"
92
- git remote add origin https://github.com/<you>/dsh-plan-completion.git
93
- git push -u origin main
94
- git tag v0.1.0 && git push --tags
95
- ```
96
-
97
- > 建议:**先把 P0 B1~B8 全部打勾,再公开仓库**;否则许可证与数据问题会成为不可逆的历史提交。
98
-
1
+ # GitHub 发布评估 · 会话计划补全插件(2026-11-02)
2
+
3
+ > 历史文档:以下保留 v0.1.0 的交付/评估/计划记录。**v0.1.1 已发布**(鉴权、状态一致性、隐私边界修复),详见 [security.md](security.md) 与 [CHANGELOG](../CHANGELOG.md);旧记录中的“无鉴权”、原始诊断字段与独立评审不代表当前实现。
4
+ >
5
+ > v0.1.1 发布记录(2026-11-02):tag `v0.1.1` + [Release](https://github.com/Xumi0920/dsh-plan-completion/releases/tag/v0.1.1);GitHub Actions [run 41366651557](https://github.com/Xumi0920/dsh-plan-completion/actions/runs/41366651557)(Ubuntu/Windows × Node20/22 四 job 全绿);npm `dsh-plan-completion@0.1.1`(31 files,shasum `18989b0f50b72d5c8c332f3fdee7f43ccb5fd91a`)。
6
+
7
+ > **2026-11-02 晚更新:P0 清单已全部完成,状态从「不满足全 PASS」→「可按 GitHub 源码仓库发布」。**
8
+ >
9
+ > | 项 | 状态 |
10
+ > |---|---|
11
+ > | B1 git 仓库 | ✅ 已 `git init` + 提交(见 git log) |
12
+ > | B2 LICENSE | ✅ MIT(`LICENSE`) |
13
+ > | B3 包元数据 | ✅ `name=dsh-plan-completion`、license/repository/keywords/engines/scripts/author;`private:false`;profile 已完成改名并验证运行 |
14
+ > | B4 本地绝对路径 | ✅ README/config 已无绝对路径;发布版 patch 不含 `debugDir` |
15
+ > | B5 调试路由鉴权/收敛 | ✅ 默认关闭(`enableDebugRoutes:false`),生产路由仅 state/debug/diag/replan/warm |
16
+ > | B6 运行时数据不入库 | ✅ `.gitignore` 排除 research/*.jsonl 等;仓库仅含源码+文档+脱敏截图 |
17
+ > | B7 CI | ✅ `.github/workflows/test.yml` 已启用(GitHub Actions,Node 20/22 矩阵,push/PR 触发;README 带 badge) |
18
+ > | B8 CHANGELOG/CONTRIBUTING | ✅ 已补 |
19
+ >
20
+ > 发布状态:GitHub 仓库 public、`main` 已推送、tag `v0.1.0` + Release 已创建;GitHub Actions 已启用并 **CI 全绿**(Node 20/22 双 job success);**npm 已发布 `dsh-plan-completion@0.1.0`**(https://www.npmjs.com/package/dsh-plan-completion,shasum `274044abe5906d0551802033b4dfe16ac05e45`,integrity `sha512-Q3bf67…Ka7D9w==`,与发布输出一致)。
21
+ > 包名改名已完成并在本机 profile 验证(`remove @local/...` + `install <repo>`,运行状态与计划在重装后保持)。
22
+
23
+ 结论先说:**代码与文档质量达到"可以开源",但当前状态"不满足全 PASS"**。
24
+ 按下面的 P0 清单做完(约 1 天工作量),即可公开;P1 是加分项。
25
+
26
+ 评估范围:`<repo>`(插件源码,含 78 个单测)+ 两份设计/交付文档 + 实验归档。
27
+ 结论依据:代码走查、`node --test` 实测、目录/元数据检查、敏感信息扫描。
28
+
29
+ ---
30
+
31
+ ## 一、总览评分
32
+
33
+ | 维度 | 状态 | 说明 |
34
+ |---|---|---|
35
+ | 代码质量 | ✅ PASS | Host/Client 分层清晰,纯函数模块(plan/prompt/evidence/heuristics/config/store/job)可单测 |
36
+ | 测试 | ✅ PASS | `node --test`:**78 tests / 78 pass / 0 fail**(含 pipeline 集成测试) |
37
+ | 文档 | 🟡 部分 | README/交付说明/设计文档齐全,但 README 有 6 处本地绝对路径、缺 CHANGELOG/CONTRIBUTING |
38
+ | 安全 | 🟡 部分 | 源码无密钥/密码(已扫描);但 6 个调试路由无鉴权、默认写本地日志目录 |
39
+ | 隐私/数据 | 🟡 部分 | 运行日志与实验档包含 sessionId、UA、对话摘要片段;不应进公开仓库 |
40
+ | 包元数据 | ❌ FAIL | `private:true`、`name=@local/...`、无 license/repository/keywords/engines/author |
41
+ | 仓库工程 | ❌ FAIL | 工作区**不是 git 仓库**;无 LICENSE、.gitignore、CI workflow、CHANGELOG |
42
+ | 可移植性 | 🟡 部分 | 默认 `debugDir` 可配置(已改),但 patch 示例仍带本地路径;README 路径需泛化 |
43
+ | 视觉/演示资产 | 🟡 部分 | 有真机截图(归档目录),但仓库内无 screenshots/demo 目录 |
44
+ | 许可证合规 | ❌ FAIL | 无 LICENSE 文件,无法合法声明开源许可 |
45
+
46
+ **当前结论:6 项 PASS / 4 项部分 / 4 项 FAIL → 不满足"全 PASS"。**
47
+
48
+ ---
49
+
50
+ ## 二、P0 阻塞项(发布前必须修)
51
+
52
+ | # | 阻塞项 | 现状 | 修复动作 |
53
+ |---|---|---|---|
54
+ | B1 | 无 git 仓库 | 工作区不是 repo | 只把插件目录+文档纳入仓库:`git init` → `.gitignore` → 首次提交(建议独立 repo,不要把 research/、其他项目带进去) |
55
+ | B2 | 无 LICENSE | 缺失 | 选 MIT(或 Apache-2.0)→ `LICENSE` + package.json `license` 字段 |
56
+ | B3 | package.json 元数据不全 | `private:true`、`@local/` 前缀、无 license/repository/author/keywords/engines | 改名 `dsh-plan-completion`(或保留 scoped),补全字段;若只做 GitHub 源码分发可保留 private=false 但不发 npm |
57
+ | B4 | 本地绝对路径 | README 与文档中存在本地绝对路径;`cordis.patch.yml` 有本地 `debugDir` | README/文档改成相对路径/占位符;发布版 patch 去掉 `debugDir`(代码已支持 env 覆盖) |
58
+ | B5 | 调试路由无鉴权 | `/plan-completion/experiment|autojob|steps|reset|diag|theme` | 发布版:默认关闭调试路由(config `enableDebugRoutes:false`),或加来源校验(`connection.requestRejection`) |
59
+ | B6 | 运行时数据/实验档不应入库 | `research/plan-completion-runtime.jsonl`(含 sessionId/UA/对话片段)、`research/archive` | `.gitignore` 排除 `research/`、`*.jsonl`、实验/样本 JSON;如需展示数据,脱敏后放 `docs/` |
60
+ | B7 | 无 CI | — | `.github/workflows/test.yml`:Node 20/22 矩阵跑 `node --test test/*.test.js`;可选 markdown lint |
61
+ | B8 | 缺 CHANGELOG / CONTRIBUTING | — | 加 `CHANGELOG.md`(0.1.0 初始)+ `CONTRIBUTING.md`(本地安装/调试命令) |
62
+
63
+ ## 三、P1 建议(发布后 1~2 周)
64
+
65
+ 1. 仓库结构建议:
66
+ ```
67
+ dsh-plan-completion/ # 根即插件包(保持现在结构)
68
+ ├── index.js client.js host/ locale/ test/
69
+ ├── cordis.patch.yml package.json icon.svg
70
+ ├── README.md LICENSE CHANGELOG.md CONTRIBUTING.md .gitignore
71
+ ├── docs/ # 设计计划 v1.2、二期计划、交付说明
72
+ ├── docs/screenshots/ # 建议新增 3 张(浅色/暗色/计划页)
73
+ └── .github/workflows/test.yml
74
+ ```
75
+ 2. 安全:调试路由默认 off + 请求来源校验;README 增加「隐私说明:插件会把会话摘要发送给模型」。
76
+ 3. 质量:把 client 纯逻辑抽出来补测试(目标 ≥120 用例);host 生命周期(重载不重复注册)加回归测试。
77
+ 4. 发布:打 tag `v0.1.0` + GitHub Release notes(引用交付说明);可选 npm publish(需 dsh 生态约定)。
78
+ 5. 版本要求:package.json 增加 `engines.dsh` 或 README 明确最低 DSH 版本(本插件依赖 `dsh.client/slots/webServer/llm/commands` 契约)。
79
+
80
+ ## 四、已具备的发布优势
81
+
82
+ - **契约经过探测验证**:槽位、InputActions、同源 HTTP、斜杠命令均在真机日志中有证据(`research/p0-contract.md`)。
83
+ - **可量化验收**:两轮隔离测试 + 6 条真机样本 + 78 单测 + 配置生效日志,README/交付说明可复现。
84
+ - **成本与预算有结论**:稳态 ~1.2k tokens/回合、patch 输出 75~113 tokens,有明确默认值与依据。
85
+ - **无第三方运行时依赖**:只用 Node 标准库 + React(宿主提供),发布门槛低。
86
+ - **面向失败的设计**:模型失败走启发式 fallback、CAS 版本冲突、用户编辑优先、超时降级。
87
+
88
+ ## 五、发布命令草稿(确认后执行)
89
+
90
+ ```powershell
91
+ cd <repo>
92
+ git init
93
+ # 先补 LICENSE / .gitignore / CI / CHANGELOG / 元数据 / 移除本地路径与调试路由默认值
94
+ git add .
95
+ git commit -m "feat: initial release v0.1.0"
96
+ git remote add origin https://github.com/<you>/dsh-plan-completion.git
97
+ git push -u origin main
98
+ git tag v0.1.0 && git push --tags
99
+ ```
100
+
101
+ > 建议:**先把 P0 B1~B8 全部打勾,再公开仓库**;否则许可证与数据问题会成为不可逆的历史提交。
102
+
99
103