dsh-composer-ux 0.19.2 → 0.21.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 +73 -0
- package/README.md +58 -9
- package/lib/client.js +292 -216
- package/lib/client.js.map +2 -2
- package/lib/index.js +22 -4
- package/lib/index.js.map +3 -3
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,79 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
4
4
|
|
|
5
|
+
## [0.21.0] — 2026-10-10(「优化提示词」默认收缩:面板打开回到快捷指令那半 + 优化选项加折叠)
|
|
6
|
+
|
|
7
|
+
用户 2026-10-10(截图):「让优化提示词默认收缩起来」。确认后两处都改:
|
|
8
|
+
|
|
9
|
+
### 1. 打开面板回到默认那一半(不再被"上次的结果"顶过去)
|
|
10
|
+
|
|
11
|
+
- 旧规则:结果框"从无到有"就自动切到优化那半 —— 但**重开面板时上一轮的结果也算"从无到有"**,
|
|
12
|
+
于是每次打开都直接落在优化那半、外加一整组选项,把「优化完成」顶到看不见(截图里只剩一行)。
|
|
13
|
+
- 现在:每次**打开**面板 ⇒ 回到「快捷指令」那半,哪怕上一轮结果还摆着(打开那一刻就有的结果框算
|
|
14
|
+
**基线**,不抢视图;切换按钮写「上次的结果在这儿」)。
|
|
15
|
+
- 保留的:**面板已经开着**时结果框从无到有照旧自动切过去(点 ✨ 必须看得到结果,不能"点了没反应");
|
|
16
|
+
「**正在跑**」是打开时唯一的例外 —— 那时要能看见进度与「取消」。
|
|
17
|
+
- 点 ✨ 另外**明确**切一次那半:上一轮结果还在时它不是"从无到有",只靠那条规则会看起来没反应。
|
|
18
|
+
|
|
19
|
+
### 2. 「优化选项」加一层折叠,默认收起
|
|
20
|
+
|
|
21
|
+
- 收起时标题行右侧给一行当前值摘要(权限 · 上下文 · 只读工具 · Bash;指定过模型时才带模型),
|
|
22
|
+
不点开也看得见关键值;展开后与 0.14.0 的形态完全一致(七个控件 + 详情)。
|
|
23
|
+
- 卡片改成**受控**(`open` / `onToggle` 由面板给):折叠要在每次打开面板时复位,卡片只负责画。
|
|
24
|
+
|
|
25
|
+
### 验证
|
|
26
|
+
|
|
27
|
+
- `npm test`:30 套件 **2591 passed / 0 failed**。`panel-split-render` 40→55:
|
|
28
|
+
新增 §0(把"打开=默认""从无到有才切"这两条跨渲染规则抽成纯函数钉住 —— SSR 一次渲染测不到转换)、
|
|
29
|
+
§2 改成"有结果框也不抢视图"、§2c 直接渲卡片验收起/展开两态、§3 直接渲结果框验布局;
|
|
30
|
+
`client-registration` 271→276(旧的那条源码断言改写 + 5 条新契约)。
|
|
31
|
+
- `npm run test:mutations`:**195 条全部咬住**(EB 的 expect 跟着改,新增 HP–HU 5 条:
|
|
32
|
+
打开不回到默认、不复位折叠、折叠初值改展开、收起照样渲七个控件、摘要丢了、✨ 不明确切换)。
|
|
33
|
+
|
|
34
|
+
## [0.20.0] — 2026-10-10(适配 DSH 0.2.1-alpha.2:真机测出并修掉三处真问题)
|
|
35
|
+
|
|
36
|
+
用户 2026-10-10:把 `D:\DeepSeek Harness`(未封装版检出)升到最新(`dsh-v0.2.1-alpha.2`)并用它测插件。
|
|
37
|
+
|
|
38
|
+
升级步骤(踩过的坑写在括号里):`git fetch --tags` → 新建分支 `upgrade-0.2.1-alpha.2` 检出该 tag →
|
|
39
|
+
**`pnpm run clean`(必须清:`lib/` 是 gitignore 的,0.1.7 时代的旧产物会让新构建直接 `MISSING_EXPORT`)**
|
|
40
|
+
→ `pnpm install` → `pnpm run build`。
|
|
41
|
+
|
|
42
|
+
### 真机测出来的三处真问题(都已修)
|
|
43
|
+
|
|
44
|
+
1. **设置页点开关直接炸**:`TypeError: setField is not a function`(新实例 + 真浏览器实测的控制台原话)。
|
|
45
|
+
根因:0.17.0(通知卡)与 0.19.0(工作区目录选择卡)都把 `setField` 当成**槽位给的 props** 用
|
|
46
|
+
(`setField={setField}`),而 `0.1.7-rc.1` / `0.2.0-rc.2` / `0.2.1-alpha.2` 三版
|
|
47
|
+
`settings.section` 的持有方契约**都只有 `close`**;正确路径是插件自己注入的 `actions.setField`
|
|
48
|
+
(同一个设置页里其它开关用的都是它)⇒ **这个 bug 在 0.19.x 上同样存在**,点一下就炸。
|
|
49
|
+
为什么 tsc 没拦住:手写类型面把该 props 写成开放索引,组件的 props 类型又并了 `PropsRuntime` /
|
|
50
|
+
`InjectFace`(两者都带 `[key: string]: any`)。三处一起收紧,并反向验证过:写错 props 名
|
|
51
|
+
`npx tsc --noEmit` 当场 `TS2339`。
|
|
52
|
+
2. **依赖窗口不含新运行时**:`>=0.2.0-rc.1 <0.3.0` 在 semver 下**不覆盖** `0.2.1-alpha.2`(带预发布的版本
|
|
53
|
+
只有在同号段比较符也带预发布时才算满足)⇒ pnpm 装了 `0.2.0-rc.2`,宿主按 tool-terminal 的**精确
|
|
54
|
+
peerDeps** 对齐检查后把 `composer-ux-tool-terminal` 那一行**禁用**(只禁一行,插件其余部分照常加载)。
|
|
55
|
+
新窗口:`>=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1-alpha.0 || >=0.2.1-alpha.1 <0.3.0`。
|
|
56
|
+
3. **启动期迁移撞锁被静默跳过**:`quick section migration skipped Error: atomic-write: timed out waiting
|
|
57
|
+
for the writer lock … package.json.lock` —— 迁移跑在插件 apply 时,而宿主启动期自己也在写 profile
|
|
58
|
+
清单。新增 `retryWrite`(退避重试:4 次 / 基数 300ms),迁移改走它,并单测覆盖。
|
|
59
|
+
|
|
60
|
+
### 顺带修掉的两处真机渲染瑕疵(干净 profile 上才看得见)
|
|
61
|
+
|
|
62
|
+
- 「微信通知」概览被 `FoldCard` 前缀两次 ⇒ 显示成「未启用 · 未启用 · 只能通知,不能回」;
|
|
63
|
+
- 「设置面板」概览在没存过尺寸时显示 `undefined×undefined` ⇒ 改成「尺寸用官方默认」。
|
|
64
|
+
|
|
65
|
+
### 形状核对脚本扩写(升级时的第一道门)
|
|
66
|
+
|
|
67
|
+
`scripts/dsh-shape-check.mjs` 原来只有 4 节、只认识 0.13 时代的依赖;现在补到 7 节:新增
|
|
68
|
+
客户端槽位 shadow(0.18.0 目录选择的地基:优先级 / fail-loud / 持有方 prop 名)、四个通知事件
|
|
69
|
+
(两个 waterfall 必须原样透传)、`configForms` + 终端依赖范围;并修掉一条**过期断言**
|
|
70
|
+
(0.2.1 起官方拒绝 `0.0.0.0`,改成核对 `normalizeBindAddress` / `isWildcardAddress`)。
|
|
71
|
+
对着 0.2.1-alpha.2 跑:**36 条全过**。
|
|
72
|
+
|
|
73
|
+
**验证**:`npm test` —— **30 个套件 2569 passed / 0 failed**(新增 `test/retry-write.mjs` 9 条;
|
|
74
|
+
`settings-render` 102→107;`client-registration` 265→271;`terminal-mount` 的依赖窗口断言改为按语义
|
|
75
|
+
核对三条预发布线)。`npm run test:mutations` —— **189 条全部咬住**(新增 HI–HO 7 条:顶层 setField 复发、
|
|
76
|
+
props 类型放宽、类型面改回开放索引、迁移不重试、通知概览双前缀、面板概览不兜底、retryWrite 不重试)。
|
|
77
|
+
|
|
5
78
|
## [0.19.2] — 2026-10-09(修:设置字段必须进宿主 schema —— 补回 0.17.0 漏掉的 5 个通知字段)
|
|
6
79
|
|
|
7
80
|
**怎么发现的**:给「工作区目录选择」加开关时顺手核对宿主 schema(`src/host.ts` 的 `ownSchema()`)
|
package/README.md
CHANGED
|
@@ -143,10 +143,17 @@ dsh plugin --profile web add <你克隆或解压出来的目录>
|
|
|
143
143
|
- **0.12.0 起有记忆链**:你把成品插进输入框、改了几处、又点一次优化时,宿主会把**上一版成品**
|
|
144
144
|
一起给模型(截断 1500 字),它只需围绕变化点调整、不必从零重写(你已确认过的地方不会被改回去)。
|
|
145
145
|
不带的三种情况:同一段原文重跑(同文重试)、草稿就是上一轮成品(对成品重跑)、上一轮失败/取消;“重新优化”只在你手改过框里成品时才带。
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
146
|
+
- **面板分两半(0.13.1)**:中部现在是「**优化提示词**」(结果框 + 优化选项)与「**快捷指令**」(分类 + 条目列表)**二选一**,
|
|
147
|
+
中间一个切换按钮(▸ / ▾)换着看;标题行的**三档档位与 ✨ 按钮始终露在外面**
|
|
148
|
+
—— 所以「跑一次优化」永远是一步,不必先展开。**点 ✨ 会自己切到优化那半**(否则结果被藏在收起的一半里,
|
|
149
|
+
看起来像没反应);手动切回快捷指令不会被抢回去;点结果框的「✕」会顺手切回快捷指令。
|
|
150
|
+
- **默认收缩(0.21.0,用户 2026-10-10 的截图)**:每次**打开面板**都回到「快捷指令」那半,
|
|
151
|
+
哪怕上一轮的结果还摆着 —— 旧规则是"结果框从无到有就自动切过去",而重开面板时旧结果也算"从无到有",
|
|
152
|
+
于是每次打开都直接落在优化那半、外加一整组选项,把「优化完成」顶到看不见。
|
|
153
|
+
现在:打开那一刻就有的结果框算**基线**(不抢视图,切换按钮会写「上次的结果在这儿」);
|
|
154
|
+
**面板已经开着**时结果框从无到有照旧自动切过去;「**正在跑**」是打开时唯一的例外(要能看见进度与「取消」)。
|
|
155
|
+
同一张面板里的「**优化选项**」也加了一层折叠、**默认收起** —— 收起时标题行右侧给一行当前值摘要
|
|
156
|
+
(权限 / 上下文 / 只读工具 / Bash,指定过模型时才带模型),不点开也看得见关键值。
|
|
150
157
|
- **修掉「展开后看不到按钮」(0.13.1)**:以前结果框和快捷指令列表**挤同一块固定高度**,结果框一长
|
|
151
158
|
(条目多 + 成品多行)就把列表挤没、再把自己底部的**「插入输入框 / 重新优化 / 复制」顶出面板边界被裁掉**。
|
|
152
159
|
现在两半互斥、各自内部滚,而且结果框拆成「可滚内容区 + **钉在底部的按钮行**」—— 面板再矮也不裁那排按钮。
|
|
@@ -553,7 +560,7 @@ Windows 上 DSH 给模型的终端工具是 **PowerShell**(工具名 `pwsh`)
|
|
|
553
560
|
| 工具循环的消息形状 / 轮次封顶 / 异常必须降级 | 同上第 6 节(假 llm 驱动整条循环,逐条检查 `role:'tool'` 与 `toolCallId`) |
|
|
554
561
|
| 工具路径:默认关、开了才派、**查完吐散文必须回落**、拿不到工作目录就不派 | `test/quick-commands.mjs` 5g 节(13 条,真路由 + 假 llm) |
|
|
555
562
|
| 工具读到的内容不进台账 | 同 5g 节:断言台账里只有工具名与次数、没有读到的文件内容 |
|
|
556
|
-
| 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**
|
|
563
|
+
| 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**195 条全部咬住**(判据是 `red.some(line => line.includes(item.expect))`,不是"有红就行") |
|
|
557
564
|
| **桌面应用里弹系统文件夹框**(0.18.0 起;0.19.0 起默认关、设置页可开) | ✅ **有真机证据**:2026-10-09 用户在桌面应用点「选择工作区目录」,实测「成功替换为系统文件管理器」(先用 profile 补丁验过一次,之后的插件内 shadow 版走的是同一条 preload 桥);`node test/directory-flow.mjs` 49 条 + 变异 FS–FY(判定/状态机)与 GZ/HA(开关幂等装卸)罩着 |
|
|
558
565
|
| **设置字段全部进了宿主 schema**(0.19.2 起) | `test/client-registration.mjs` 第 16 节:把设置契约里 49 个 `*_FIELD` 常量逐个核对 `ownSchema()`,再点名 6 个(5 个通知 + 目录选择)+ 变异 HG/HH。**为什么值得单列一行**:写设置走 `settings.mutate`,字段没进 schema 会被直接抛 `Config field "…" is not volatile` —— 0.17.0 的 5 个通知字段就是这么漏的(症状是"开关拨不动 + 写入失败提示"),2026-10-09 才发现并修掉 |
|
|
559
566
|
| 发布门禁三条判据 | `npm run gates` 全过;`check:tag` 实测 `v0.12.0` 的 tag 名与所指提交里的版本一致 |
|
|
@@ -690,9 +697,9 @@ node build.mjs # 产出 lib/index.js + lib/client.js
|
|
|
690
697
|
# ⚠️ 宿主半会**内联** schemastery / cosmokit:
|
|
691
698
|
# 优先用 DSH 检出里的 vendor 副本,检出不在时退到 node_modules
|
|
692
699
|
# 里同版本的 npm 包(两者逐字节相同)——CI 上走的就是退路
|
|
693
|
-
npm test #
|
|
700
|
+
npm test # 30 个套件;当前 2591 passed, 0 failed(2026-10-09 实测;CI 三平台同样全绿)
|
|
694
701
|
# 走 scripts/run-tests.mjs:顺带把"多少套件/多少条"记进 test/.last-run.json
|
|
695
|
-
npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(
|
|
702
|
+
npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(195 条,须单独跑)
|
|
696
703
|
# 同样记录结果,供下面的文档门禁核对
|
|
697
704
|
npm run gates # 发版门禁三条一起跑:tag 指向 / 包内容 / 文档数字
|
|
698
705
|
npm run check:tag # ① tag 名里的版本 == 该 tag 所指提交里的 package.json 版本
|
|
@@ -766,5 +773,47 @@ Remove-Item "$env:USERPROFILE\.dsh\profiles\web\package.json.lock" -Force
|
|
|
766
773
|
|
|
767
774
|
## 与官方版本兼容提示
|
|
768
775
|
|
|
769
|
-
|
|
770
|
-
|
|
776
|
+
**实测过的 DSH 版本**(每次升级都对着源码跑形状核对,再在未封装版上真机点一遍):
|
|
777
|
+
|
|
778
|
+
| DSH 版本 | 状态 | 备注 |
|
|
779
|
+
|---|---|---|
|
|
780
|
+
| 0.1.7-rc.1 / rc.2 | 可用 | 依赖窗口的第一段 |
|
|
781
|
+
| 0.2.0-rc.1 / rc.2 | 可用 | 桌面版装的这一版 |
|
|
782
|
+
| **0.2.1-alpha.1 / alpha.2** | **可用(0.20.0 起)** | 2026-10-10 把 `D:\DeepSeek Harness` 未封装版升上去后真机验证(含设置页开关点击与写入落盘) |
|
|
783
|
+
|
|
784
|
+
**依赖窗口**:`@deepseek-ai/dsh-tool-terminal` 声明为
|
|
785
|
+
`>=0.1.7-rc.1 <0.1.8 || >=0.2.0-rc.1 <0.2.1-alpha.0 || >=0.2.1-alpha.1 <0.3.0`。
|
|
786
|
+
|
|
787
|
+
⚠️ **为什么预发布线必须单列一段**:semver 下「带预发布的版本」只有在**同号段的比较符也带预发布**时才算被
|
|
788
|
+
满足 —— 旧的 `>=0.2.0-rc.1 <0.3.0` 并不包含 `0.2.1-alpha.2`。后果不只是"装错个版本":pnpm 会装
|
|
789
|
+
`0.2.0-rc.2`,而宿主对每个插件行做**精确版本对齐检查**(tool-terminal 的 peerDeps 是精确版本),
|
|
790
|
+
于是那一行被直接禁用:
|
|
791
|
+
|
|
792
|
+
```
|
|
793
|
+
dsh: disabling profile plugin row "composer-ux-tool-terminal":
|
|
794
|
+
Plugin @deepseek-ai/dsh-tool-terminal@0.2.0-rc.2 is incompatible with dsh 0.2.1-alpha.2
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
**升级 DSH 后怎么自查**(都只读,不改任何东西):
|
|
798
|
+
|
|
799
|
+
```sh
|
|
800
|
+
node scripts/dsh-shape-check.mjs "D:/DeepSeek Harness" # 形状核对:服务名 / 返回字段 / 槽位契约 / 事件 / 依赖范围
|
|
801
|
+
npm test && npm run gates # 本仓 30 个套件 + 门禁
|
|
802
|
+
```
|
|
803
|
+
|
|
804
|
+
形状核对覆盖七块:会话与用量(`sessions` / `sessionQuery`)、设置服务两代读法(`describe` / `mutate` +
|
|
805
|
+
volatile)、路由与信任关卡(`webServer.register` / `connection.requestRejection` + 绑定策略)、
|
|
806
|
+
客户端槽位 shadow(目录选择「影子接管」的地基:优先级、fail-loud、持有方 prop 名)、四个通知事件
|
|
807
|
+
(两个 waterfall 必须原样透传 `next()`)、客户端设置表单 `configForms`、终端依赖范围。
|
|
808
|
+
|
|
809
|
+
**已知的版本敏感点**(升级后优先看这几处):
|
|
810
|
+
|
|
811
|
+
- **`settings.section` 槽位的持有方 props 只有 `close`**:设置页要写设置必须走**自己注入的** `actions`
|
|
812
|
+
(0.20.0 修:0.17~0.19 期间通知卡与目录选择卡误用了不存在的顶层 `setField` ⇒ 真机上点一下必炸
|
|
813
|
+
`TypeError: setField is not a function`)。类型面已按真实契约收紧,写错 props 名 `tsc` 当场红。
|
|
814
|
+
- **插件行的启用与否由宿主按 `dsh-tool-terminal` 的 peerDeps 精确对齐判定**:版本对不上时**只禁用那一行**,
|
|
815
|
+
插件其余部分照常加载(优雅降级,不崩)。
|
|
816
|
+
- **启动期写设置会撞宿主自己的 profile 写锁**(`atomic-write: timed out waiting for the writer lock
|
|
817
|
+
… package.json.lock`)⇒ 凡启动期的写都要退避重试(见 `retryWrite` 与「快捷指令」迁移)。
|
|
818
|
+
- **`0.0.0.0` 从 0.2.1 起被官方拒绝**(只接受具体 IP 字面量)—— 不影响本插件,但形状核对里那条
|
|
819
|
+
「连接可绑非回环地址」的断言依据随之改了。
|