dsh-composer-ux 0.13.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,83 @@
2
2
 
3
3
  本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
4
4
 
5
+ ## [0.14.0] — 2026-09-30(照 dsh-prompt-optimizer 移植:优化选项卡片 + 它的提示词与本体)
6
+
7
+ 起因(用户原话):**「https://github.com/WestFox-AwA/dsh-prompt-optimizer 全面模仿他的 UI 和 UI 中的所有功能,效果是与快捷指令部分 ui 拼接在一起,也模仿他的内部提示词」**。
8
+
9
+ ### 1. 「优化选项」卡片进面板(不再需要去设置页)
10
+
11
+ 「快捷指令」面板的**优化提示词那一半**顶部现在有一张卡片,七行控件(每行 tooltip 都写清了它到底做什么):
12
+ 权限 审查/自动 · 协作基调 普通/硬邦邦 · 模型 跟随会话/指定 · 上下文 回合 0–10 或全文 ·
13
+ 只读工具 开/关 · 内置 Bash 开/关(默认关)· 详情(改**当前档位**的提示词 / 恢复内置)。
14
+ 档位(关闭 / 轻度 / 标准 / 重度)留在面板标题行 —— 一眼看到强度再点 ✨。
15
+ **每个开关都真的有用**:上下文回合数会真的改变发出去的往来条数(0 = 不带、全文 = 尽量给全);
16
+ 权限「自动」= 跑完自动写回输入框,但**只在输入框仍停在发起时那份原文**时才写(你在优化期间
17
+ 手写的字绝不会被吃掉);关闭档不调用模型(面板把 ✨ 变灰并说明原因)。
18
+
19
+ ### 2. 提示词与条目本体换成它那一套
20
+
21
+ 硬规则 1–8 逐字搬(含「轮次之间不遗传」)、四档策略照 `strategy.js`、可选「硬邦邦」基调、
22
+ 六领域质量维度。条目本体换成它的六类:`user_requirement` / `quality_interpretation` /
23
+ `observed_fact` / `implementation_option` / `proposal` / `unknown`(+ `unknownClass` + `candidates`),
24
+ 并各自带必填依据:要求必须逐字引文、质量解读必须有 `rationale`、事实必须有 `sourceRefs`。
25
+
26
+ ### 3. 成品 = 「原话原样 + 辅助小节」;**撤掉记忆链**
27
+
28
+ 旧本体的 `rewrite` 回填(唯一能改写你原话的路径)整条撤掉:成品永远以你的原话开头,
29
+ 条目只作为【你要的】等小节追加在后面 —— 这是**结构不变量**,有变异守护。
30
+ 记忆链(0.12.0 的"接着改时把上一轮成品一起给")也撤了:它是"轮次之间不遗传"的直接违反,
31
+ 宿主/客户端/台账里都不再有它。
32
+
33
+ ### 4. 内置 Bash 真做(默认关)
34
+
35
+ 解释层可以跑 shell 命令核对事实:**锁定会话工作目录**、单条**超时 20 秒并杀掉整棵进程树**、
36
+ 输出截断(4000 字,如实标注)、命令长度上限、逐条记账。关着的时候**不把工具注册给模型**
37
+ (模型看不到它),与上游同一做法。它是"有界的、记账的、可关的",**不是沙箱**。
38
+
39
+ ### 5. 保留我们自己的机制
40
+
41
+ 结果框(逐条流水 + 依据)、「插入输入框」、✕ = 收起 / 点两次 = 丢弃、逐轮台账、只读工具默认关,
42
+ 以及 0.13.2 的那些"别让一次真花了钱的结果消失"的细节,全部照旧。
43
+
44
+ ### 归属
45
+
46
+ 移植文本出自 [WestFox-AwA/dsh-prompt-optimizer](https://github.com/WestFox-AwA/dsh-prompt-optimizer)
47
+ (BSD-3-Clause,© 2026 啃轮胎的西狐);完整许可与逐文件清单见 [NOTICE](NOTICE)。本插件自身仍按 MIT 发布。
48
+
49
+
50
+ ## [0.13.2] — 2026-09-30(✕ 改成「收起」:结果不再被删;另给一个点两次的「丢弃」;结果框不再像浮窗)
51
+
52
+ 起因(用户原话):**「快捷指令面板和提示词优化面板在同一页面。现在它提示词优化是悬浮的特别是我点叉关闭之后居然恢复不了」**。
53
+
54
+ ### 1. ✕ = 收起,不再是丢弃
55
+
56
+ 0.12.0 起那个 ✕ 的语义是「丢弃」(tooltip 也这么写),用户真点了一次就发现**恢复不了** —— 一次真花了钱的
57
+ 优化结果不该因为点一下 ✕ 就没了。现在:
58
+
59
+ - ✕ 只把结果**收起**(内容照旧在内存与磁盘上),面板切回「快捷指令」那半;
60
+ - 切换按钮会写「上次的结果在这儿」,点它就能再展开;
61
+ - **新跑一轮(✨ / 重新优化)自动展开**,不会被收起状态挡住;
62
+ - **收起状态跨重启记住**:状态信封加了可选的 `hidden` 字段,**不升版本号、向后兼容** ——
63
+ 没收起时不写该字段(文件形状与 0.13.0/0.13.1 完全一致,降级回旧版也认得),老文件没有该字段 = 没收起。
64
+
65
+ ### 2. 新增「丢弃」(点两次)
66
+
67
+ 放在结果框标题行、✕ 左边,样式弱化:**第一次点只换成「点第二次丢弃」**(4 秒后自己复位),
68
+ 第二次点才真丢(清状态 + 删磁盘那份)。与「插入输入框」覆盖确认是同一套做法,不弹模态框。
69
+
70
+ ### 3. 结果框不再像"浮窗"
71
+
72
+ 去掉它自己的背景与圆角边框(只留一条细分隔线)—— 用户说的「提示词优化是悬浮的」指的就是
73
+ 面板里又叠了一张独立卡片。现在它看起来是面板里的一段。
74
+
75
+ ### 内部
76
+
77
+ - 新增变异 5 条(EE ✕ 又变回丢弃 / EF 丢弃不真清 / EG 收起也抢面板 / EH 收起不存盘 / EI 恢复不读收起),
78
+ **137/137 全部咬住**;`optimize-state.mjs` 加 §5b(收起落盘/兼容/非布尔值防御),
79
+ `panel-split-render.mjs` 加 §6(收起时不渲染结果框本体、不抢面板、切换按钮提示正确)。
80
+ - 测试从 **2190 条** 涨到 **2214 条**(22 套件,全绿)。
81
+
5
82
  ## [0.13.1] — 2026-09-30(面板分两半:优化提示词 / 快捷指令二选一;修「展开后看不到 插入/重新优化/复制」)
6
83
 
7
84
  起因(用户原话):**「现在是点击提示词优化按钮才能展开优化输入框,我想要点开快捷指令分为两个部分:一部分是优化提示词部分,一部分是快捷指令部分。」**
package/NOTICE ADDED
@@ -0,0 +1,60 @@
1
+ dsh-composer-ux(本插件)
2
+ Copyright (c) 2026 fangwen9527
3
+ 本项目按 MIT 许可发布,全文见 LICENSE。
4
+
5
+ ================================================================================
6
+ 第三方组件与移植文本的归属(0.14.0 起)
7
+ ================================================================================
8
+
9
+ 上游项目:dsh-prompt-optimizer
10
+ 仓库:https://github.com/WestFox-AwA/dsh-prompt-optimizer
11
+ 作者:啃轮胎的西狐(WestFox-AwA)
12
+ 版权:Copyright (c) 2026 啃轮胎的西狐
13
+ 许可:BSD 3-Clause License(全文见本文件末尾)
14
+
15
+ 本插件在 0.14.0 里**逐字移植**了它的下列内容(只把「输出格式」那一节改写成我们自己的成品契约,
16
+ 其余一字未改;三处刻意差异与理由写在对应源文件的文件头):
17
+
18
+ · `po06/lib/interpreter.js` 的 `SYSTEM_PROMPT`(硬规则 1–8)与 `HARD_NOTE_SYSTEM`(硬邦邦基调)
19
+ · `po06/lib/strategy.js` 的 `TIER_STRATEGY`(四档策略:mode / candidates / maxItems / qualityDims / depth)
20
+ · `po06/lib/strategy.js` 的 `DOMAINS`(六个领域的质量维度与两条不许越的线)
21
+
22
+ 落在本插件的这些文件里(每个文件头都写明了出处与差异):
23
+ · src/optimizer-transplant.ts —— 上述移植文本本体
24
+ · src/optimizer-prompt.ts —— 装配顺序与档位策略的接线
25
+ · src/optimizer-assemble.ts —— 条目本体(六类)、必填依据校验、成品装配
26
+
27
+ 接口与机制层面另有借鉴(0.6 线):条目化产出、逐字引文、只丢单条、降级出声、
28
+ 固定节序与篇幅预算。这些是机制而非文本,同样致谢。
29
+
30
+ ================================================================================
31
+ BSD 3-Clause License(dsh-prompt-optimizer 的原许可,随附全文)
32
+ ================================================================================
33
+
34
+ Copyright (c) 2026 啃轮胎的西狐
35
+ All rights reserved.
36
+
37
+ Redistribution and use in source and binary forms, with or without
38
+ modification, are permitted provided that the following conditions are met:
39
+
40
+ 1. Redistributions of source code must retain the above copyright notice, this
41
+ list of conditions and the following disclaimer.
42
+
43
+ 2. Redistributions in binary form must reproduce the above copyright notice,
44
+ this list of conditions and the following disclaimer in the documentation
45
+ and/or other materials provided with the distribution.
46
+
47
+ 3. Neither the name of the copyright holder nor the names of its
48
+ contributors may be used to endorse or promote products derived from
49
+ this software without specific prior written permission.
50
+
51
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
52
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
53
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
54
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
55
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
56
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
57
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
58
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
59
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
60
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/README.en.md CHANGED
@@ -188,7 +188,8 @@ edited in settings; the JSON output contract is always appended and cannot be ov
188
188
  | Read-only tool fence (including symlinks) / every cap / out-of-bounds rejection | `node test/optimize-tools.mjs` (66 checks against a **real temporary directory**) |
189
189
  | Tool-loop message shape / round cap / exceptions must degrade | same file, section 6 (a fake `llm.stream` drives the whole loop; `role:'tool'` and `toolCallId` are asserted) |
190
190
  | Tool path: off by default, fires only when enabled, **prose after lookups falls back**, no cwd ⇒ no tool at all | `test/quick-commands.mjs` 5g (13 checks) |
191
- | Mutation guards really bite, and **the *named* test must be the one going red** | `npm run test:mutations`: **132/132 bite** |
191
+ | Mutation guards really bite, and **the *named* test must be the one going red** | `npm run test:mutations`: **137/137 bite** |
192
+ | 0.13.2: `✕` collapses (result kept) + a two-click 丢弃 | `node test/panel-split-render.mjs` §6, mutations EE–EI |
192
193
  | Panel split + pinned result-box buttons (0.13.1) | `node test/panel-split-render.mjs` (20 checks, real `react-dom/server` render) |
193
194
  | Release gates | `npm run gates` (tag target / packed file list / docs drift) |
194
195
  | Three-platform CI | GitHub Actions: ubuntu / windows / macos × Node 20 |
package/README.md CHANGED
@@ -129,12 +129,12 @@ dsh plugin --profile web add <你克隆或解压出来的目录>
129
129
  - 两种模式**同时存在**时,新会话的第一条消息里**两批都附**:「每次」的那几条在前、「仅首次」的那几条在后,一起拼到末尾(第二条起就只剩「每次」的了)。
130
130
  - 为什么是一个三选一控件、而不是两个勾选框:「每次」与「仅首次」互斥,两个独立勾选框能造出「同时又每次又仅首次」的矛盾状态;三选一只发出一个 mode,由 `withInsertMode` 一次把两个标志写对。
131
131
  - 手工编辑文件时若把 `autoSend` 与 `autoSendFirst` 都写成 `true`,按「每次」处理(每次插入本来就包含第一次),并在下次写盘时修正回互斥状态。
132
- - **优化提示词**:把输入框里的话交给**另一个 AI** 整理成一条能直接发给工作 AI 的清晰指令。三档强度:普通 / 高级(默认)/ 极端。
132
+ - **优化提示词**:把输入框里的话交给**另一个 AI** 整理成一条能直接发给工作 AI 的清晰指令。四档强度(0.14.0 起照 dsh-prompt-optimizer):**关闭 / 轻度 / 标准(默认)/ 重度** —— 档位=依据预算与思考方式;旧设置里的 普通/高级/极端 会自动迁移成 轻度/标准/重度。
133
133
  - **0.12.0 起结果进「结果框」,不再自动改写你的输入框**:点「优化提示词」(或工具行的 ✨ 按钮)后面板里展开一个结果框 —— 跑的时候**逐条**显示它在核实什么,跑完把**成品**放进一个可编辑的文本框;你原来写的话一直留在输入框里,改都还能改。
134
134
  - **逐条流式,而且每条都已通过校验**:宿主边收边扫,把**已经闭合、且引文在你原话里逐字存在**的条目一条条推过来;对不上的走 `dropped` 如实记账。所以框里出现的每一条都是"成品里可能出现的那条",不会先闪一下再消失。成品要等整段输出到齐、逐条校验装配完才存在,由最后的 `done` 一次给出。
135
135
  - **「插入输入框」由你决定何时写回**:覆盖全文(`Ctrl+Z` 可还原),斜杠命令前缀(`/goal`)原样拼回。**若你在优化期间改过输入框**,第一次点只提示、第二次点才覆盖 —— 不静默吃掉你刚写的内容。
136
136
  - **「重新优化」= 用框里那一轮的原文再跑一轮**(不是拿输入框现在的内文:那时你多半已经把成品插进去了);你手改过框里的成品时会先提示一次。
137
- - **「取消」/ `Esc` 在跑的时候 = 中止并保留已生成的部分**:条目流水留着,成品如实留空(取消时它本来就不存在)。空闲时 `Esc` = 关面板;结果框的「✕」只收起结果框,输入框里已插入的内容不受影响;**面板关掉不会清空结果框** —— 一次优化是真花了钱的,不该因为你点了一下别处就没了。
137
+ - **「取消」/ `Esc` 在跑的时候 = 中止并保留已生成的部分**:条目流水留着,成品如实留空(取消时它本来就不存在)。空闲时 `Esc` = 关面板;结果框的「✕」**只收起**(0.13.2 起结果留着,点面板那一半就能再展开);输入框里已插入的内容不受影响;**面板关掉不会清空结果框** —— 一次优化是真花了钱的,不该因为你点了一下别处就没了。
138
138
  - **0.12.0 起默认携带会话上下文**(设置里可关):优化时会把当前会话最近的往来
139
139
  (**你的话与工作 AI 的话各取最近 4 条**、共约 1600 字)一并交给模型 —— "它那个也顺手改一下"
140
140
  这种离开上文就没意义的短句,只有带上上文才能猜对"它"指谁。三条边界写死在提示词里:
@@ -151,6 +151,40 @@ dsh plugin --profile web add <你克隆或解压出来的目录>
151
151
  (条目多 + 成品多行)就把列表挤没、再把自己底部的**「插入输入框 / 重新优化 / 复制」顶出面板边界被裁掉**。
152
152
  现在两半互斥、各自内部滚,而且结果框拆成「可滚内容区 + **钉在底部的按钮行**」—— 面板再矮也不裁那排按钮。
153
153
  - **优化只从「快捷指令」面板进**(0.12.0 起):工具行只有一枚「快捷指令」按钮,点开面板再点「✨ 优化提示词」。
154
+
155
+ #### 0.13.2:✕ = 收起(结果留着),另给一个「丢弃」
156
+
157
+ > 起因(用户原话):**「现在它提示词优化是悬浮的特别是我点叉关闭之后居然恢复不了」**。
158
+
159
+ - **✕ 改成「收起」**:结果不再被删,只是标记成"先别显示";面板切回「快捷指令」那半,切换按钮写
160
+ 「上次的结果在这儿」,点它就能再展开(按钮 tooltip 明确写「结果留着」)。
161
+ - **新增「丢弃」**(结果框标题行里、✕ 左边,样式弱化):**点两次才真丢**(第一次换成「点第二次丢弃」,
162
+ 4 秒后自己复位),丢掉时才清状态 + 删磁盘那份。
163
+ - **收起状态跨重启记住**(用户选的 A):状态信封加了一个可选的 `hidden`,**不升版本号** ——
164
+ 没收起时不写这个字段,文件形状与 0.13.0/0.13.1 完全一致,降级回旧版也认得;老文件没有该字段 = 没收起。
165
+ - **新跑一轮(✨ / 重新优化)会自动把框显示出来**,不会被收起状态挡住。
166
+ - **结果框不再画成一张独立卡片**(去掉自己的背景与圆角边框,只留一条细分隔线)——
167
+ 这就是用户说的"悬浮"观感:它现在看起来是面板里的一段,而不是浮在上面的小窗。
168
+
169
+ #### 实机(0.13.1,2026-09-30 重启后当场核过)
170
+
171
+ **① 中部是「快捷指令」那半(默认)**:分类标签 + 条目列表 + 底部计数;标题行始终有「快捷指令 + 普通/高级/极端 + ✨ 优化提示词」,
172
+ 中间的切换按钮是 `▸ 优化提示词`,右侧写明另一半的状态(这里写的是「上次的结果在这儿」):
173
+
174
+ ![快捷指令那半](https://raw.githubusercontent.com/fangwen9527/dsh-composer-ux/v0.13.1/docs/panel-split-quick-0.13.1.png)
175
+
176
+ **② 点切换按钮 → 换成「优化提示词」那半**(列表收起,`▾` + 「点此回到快捷指令」):结果框里是条目流水、可编辑成品与记账行,
177
+ **底部那排「插入输入框 / 重新优化 / 复制」完整可见** —— 这正是 0.13.1 修的 bug:以前结果框一长,这排按钮会被面板裁掉:
178
+
179
+ ![优化提示词那半:三个按钮都在](https://raw.githubusercontent.com/fangwen9527/dsh-composer-ux/v0.13.1/docs/panel-split-optimize-0.13.1.png)
180
+
181
+ **③ 面板已经到了自己的高度上限(约 60vh),按钮依然在**:成品输入框右侧出现自己的滚动条,内容区滚而按钮不动 ——
182
+ 这就是"两半互斥 + 结果框拆成可滚区 + 钉底按钮行"的现场效果:
183
+
184
+ ![触到高度上限时按钮仍在](https://raw.githubusercontent.com/fangwen9527/dsh-composer-ux/v0.13.1/docs/panel-split-capped-0.13.1.png)
185
+
186
+ > 说明:面板里那份结果是**用户自己跑的一次优化**(`go/deepseek-flash`,用时 9.7 秒,7 条补全),不是我为了截图新花的调用;
187
+ > 截图时也没有改动它(没点「插入输入框」、没点 ✕,只切换了两半、开关了面板)。
154
188
  0.11.1 曾试过在工具行加一枚独立的「✨ 优化」按钮(点一下 = 开面板 + 立刻开跑),用户看到实机后明确否掉 ——
155
189
  「我让你集合到快捷指令里的提示词优化按钮里」,于是 0.12.0 删掉它,回到单一入口。
156
190
  - **秒表**:面板主按钮与结果框都显示已等待秒数,结束时报「用时 x.x 秒」。**边界如实说**:阶段只能到"等待模型响应" —— 更细的进度由逐条流水本身给出(它就是"它在干活"的证据)。
@@ -209,7 +243,13 @@ dsh plugin --profile web add <你克隆或解压出来的目录>
209
243
 
210
244
  出网请求由宿主的模型适配器发出,浏览器侧碰不到模型路由;宿主半与客户端半之间也没有别的受支持通道。所以「优化提示词」是一次往返:浏览器 `POST /composer-ux/optimize` → 宿主用 `ctx.get('llm').stream(...)` 独立跑一次模型调用 → 把装配好的正文回给浏览器填进输入框。这条路径与 [WestFox-AwA/dsh-prompt-optimizer](https://github.com/WestFox-AwA/dsh-prompt-optimizer) 同构。
211
245
 
212
- **提示词的来历(如实写)**:0.5.x 那三档是逐字提取自它 0.5 线的 `lib/index.js`(BSD-3-Clause,作者「啃轮胎的西狐」)。0.6.0 起机制与提示词都改按它 **0.6 线**(`po06/lib/interpreter.js` 的 `SYSTEM_PROMPT` + `validateProvenance`、`po06/lib/compiler.js` 的固定节序与预算丢弃)**重写**,不再是逐字提取 —— 那些文件里没有现成可抄的"三档改写提示词",能借的是机制本身:条目化产出、逐字引文、只丢单条、降级出声。落在 `src/optimizer-prompt.ts`(提示词)与 `src/optimizer-assemble.ts`(校验 + 装配)两个文件,署名与来源说明保留在各个文件头。
246
+ **提示词的来历(如实写)**:**0.14.0 起,解释层的提示词与条目本体是逐字移植它的**(见 [NOTICE](NOTICE)):
247
+ `po06/lib/interpreter.js` 的 `SYSTEM_PROMPT`(硬规则 1–8)与 `HARD_NOTE_SYSTEM`(硬邦邦基调)、
248
+ `po06/lib/strategy.js` 的 `TIER_STRATEGY`(四档策略)与 `DOMAINS`(六领域质量维度)一字未改,
249
+ 只把【输出格式】那一节改写成我们自己的成品契约(我们产出条目、由宿主装配成「原话 + 辅助小节」)。
250
+ 三处刻意差异与理由写在 `src/optimizer-transplant.ts` 的文件头。
251
+
252
+ 更早的来历:0.5.x 那三档是逐字提取自它 0.5 线的 `lib/index.js`(BSD-3-Clause,作者「啃轮胎的西狐」)。0.6.0 起机制与提示词都改按它 **0.6 线**(`po06/lib/interpreter.js` 的 `SYSTEM_PROMPT` + `validateProvenance`、`po06/lib/compiler.js` 的固定节序与预算丢弃)**重写**,不再是逐字提取 —— 那些文件里没有现成可抄的"三档改写提示词",能借的是机制本身:条目化产出、逐字引文、只丢单条、降级出声。落在 `src/optimizer-prompt.ts`(提示词)与 `src/optimizer-assemble.ts`(校验 + 装配)两个文件,署名与来源说明保留在各个文件头。
213
253
 
214
254
  优化用的模型**跟随你当前的默认模型**(`agentDefaultModel.currentSelection()`),不额外配置;每次优化会花一次模型调用,但**不占对话轮次、不进会话历史**。
215
255
 
@@ -466,7 +506,7 @@ Windows 上 DSH 给模型的终端工具是 **PowerShell**(工具名 `pwsh`)
466
506
  | 工具循环的消息形状 / 轮次封顶 / 异常必须降级 | 同上第 6 节(假 llm 驱动整条循环,逐条检查 `role:'tool'` 与 `toolCallId`) |
467
507
  | 工具路径:默认关、开了才派、**查完吐散文必须回落**、拿不到工作目录就不派 | `test/quick-commands.mjs` 5g 节(13 条,真路由 + 假 llm) |
468
508
  | 工具读到的内容不进台账 | 同 5g 节:断言台账里只有工具名与次数、没有读到的文件内容 |
469
- | 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**132 条全部咬住**(判据是 `red.some(line => line.includes(item.expect))`,不是"有红就行") |
509
+ | 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**153 条全部咬住**(判据是 `red.some(line => line.includes(item.expect))`,不是"有红就行") |
470
510
  | 发布门禁三条判据 | `npm run gates` 全过;`check:tag` 实测 `v0.12.0` 的 tag 名与所指提交里的版本一致 |
471
511
  | 三平台 CI | GitHub Actions:ubuntu / windows / macos × Node 20(`npm ci → typecheck → build → test → check:pack → check:docs`) |
472
512
 
@@ -475,7 +515,10 @@ Windows 上 DSH 给模型的终端工具是 **PowerShell**(工具名 `pwsh`)
475
515
  | 缺口 | 说明 |
476
516
  |---|---|
477
517
  | **效果(最重要的一条)** | 我们**没有任何受控评估** —— 没有留出集、没有 A/B、没有成本基线。"这样优化之后模型做得更好"在本仓里没有一条证据,只是设计意图。上游花钱做过一次,结论是"没测出差别",所以这一格必须留空。 |
478
- | **0.13.0 的真机(实机)行为** | ①重启恢复、②台账落盘、⑤只读工具这三块**只在测试与假 llm 里跑过**,没有在真实 DSH 里点过。真机验收要等重启后做(重启由用户执行);0.12.0 那 5 张截图是上一版的实机证据,**不覆盖新功能**。 |
518
+ | **0.13.0 的真机(实机)行为** | ①重启恢复、②台账落盘、⑤只读工具这三块**只在测试与假 llm 里跑过**,没有在真实 DSH 里点过(0.12.0 那 5 张截图也不覆盖新功能)。 |
519
+ | 0.13.2 的「✕ = 收起 / 丢弃 / 收起跨重启」 | `test/panel-split-render.mjs` 第 6 节(**真渲染**:收起时不渲染结果框本体、自动切换不抢面板)+ 变异 EE/EF/EG/EH/EI → **真机待重启后验**(本人 2026-09-30 报的就是这条) |
520
+ | 0.13.1 的面板分半 | ✅ **有真机证据**:2026-09-30 08:14 重启后当场验过「默认哪半、切换按钮换半、跑完自动切到优化半、**到了高度上限按钮仍在**」
521
+ (三张截图见上面「实机(0.13.1)」);但**没验**"没有结果框时首次打开"的默认态(那要开一次干净的会话),这条只有渲染测试罩着。 |
479
522
  | 只读工具的收益与成本 | 真实项目里派工具能省多少来回、多花多少 token 与时间,**没有数据**。默认关闭正是因为这份不确定。 |
480
523
  | "工具内容不会被当成引文"在真实模型上的表现 | 结构上成立(`quote` 必须逐字命中用户原话,否则逐条丢弃,有测试)。但模型会不会因此产出更差的结果,**没测**。 |
481
524
  | **原子写的原子性本身** | 单线程测试观测不到"写到一半";只有"不留临时文件"这条卫生断言,**没有变异证明**(已在提交信息里写明,不假装验过)。 |
@@ -596,9 +639,9 @@ node build.mjs # 产出 lib/index.js + lib/client.js
596
639
  # ⚠️ 宿主半会**内联** schemastery / cosmokit:
597
640
  # 优先用 DSH 检出里的 vendor 副本,检出不在时退到 node_modules
598
641
  # 里同版本的 npm 包(两者逐字节相同)——CI 上走的就是退路
599
- npm test # 22 个套件;当前 2190 passed, 0 failed(2026-09-29 实测;CI 三平台同样全绿)
642
+ npm test # 22 个套件;当前 2282 passed, 0 failed(2026-09-29 实测;CI 三平台同样全绿)
600
643
  # 走 scripts/run-tests.mjs:顺带把"多少套件/多少条"记进 test/.last-run.json
601
- npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(132 条,须单独跑)
644
+ npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(153 条,须单独跑)
602
645
  # 同样记录结果,供下面的文档门禁核对
603
646
  npm run gates # 发版门禁三条一起跑:tag 指向 / 包内容 / 文档数字
604
647
  npm run check:tag # ① tag 名里的版本 == 该 tag 所指提交里的 package.json 版本