dsh-composer-ux 0.19.1 → 0.19.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/CHANGELOG.md +28 -0
- package/README.md +4 -3
- package/lib/index.js +18 -1
- package/lib/index.js.map +2 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。
|
|
4
4
|
|
|
5
|
+
## [0.19.2] — 2026-10-09(修:设置字段必须进宿主 schema —— 补回 0.17.0 漏掉的 5 个通知字段)
|
|
6
|
+
|
|
7
|
+
**怎么发现的**:给「工作区目录选择」加开关时顺手核对宿主 schema(`src/host.ts` 的 `ownSchema()`)
|
|
8
|
+
与设置契约,发现那张表到 `priceAutoSync` 就结束了 —— **0.17.0 的 5 个通知字段
|
|
9
|
+
(`notifyEnabled` / `notifyChannel` / `notifyPushplusToken` / `notifyWecomWebhook` / `notifyKinds`)
|
|
10
|
+
从来没进去过**。
|
|
11
|
+
|
|
12
|
+
**为什么这不是"界面少一块"而是真故障**:写设置走宿主设置服务的 `settings.mutate`,它对每个
|
|
13
|
+
path 先查 `isVolatilePath(schema, path)`,字段没声明就**直接抛**
|
|
14
|
+
`Config field "…" is not volatile`(DSH 源码 `packages/settings/settings/src/index.ts` 的 `write`)。
|
|
15
|
+
所以通知卡那几个开关**一直存不住**:用户一拨就会看到本插件那条「写入失败」提示条,值也不会留下。
|
|
16
|
+
本期的目录选择开关若不补 schema,会是同一个下场。
|
|
17
|
+
|
|
18
|
+
**改动**:
|
|
19
|
+
|
|
20
|
+
- `src/host.ts`:`ownSchema()` 补 6 个字段(5 个通知 + `DIRECTORY_PICK_ENABLED_FIELD`),
|
|
21
|
+
并把这段事故与判据写在注释里。
|
|
22
|
+
- `test/client-registration.mjs` 第 16 节(新增 9 条):**逐字段核对** —— 设置契约里所有
|
|
23
|
+
`*_FIELD` 常量(49 个)必须都出现在 `ownSchema()` 里,再点名 6 个关键字段。
|
|
24
|
+
以后任何新字段漏进 schema 都会当场变红,而不是等用户去拨开关。
|
|
25
|
+
- `test/mutation-guards.mjs`:新增 `HG`(schema 漏目录选择字段)、`HH`(schema 再漏通知总开关)。
|
|
26
|
+
|
|
27
|
+
**验证**:`npm test` —— **29 个套件 2549 passed / 0 failed**(`client-registration` 256→265);
|
|
28
|
+
`npm run test:mutations` —— **182 条全部咬住**。
|
|
29
|
+
|
|
30
|
+
**注意**:0.17.0 那 5 个通知字段此前存不住值 —— 如果你之前拨过通知卡上的开关、看到过「写入失败」
|
|
31
|
+
或"拨了又弹回",那不是你看错,就是这个原因;现在可以正常拨了。
|
|
32
|
+
|
|
5
33
|
## [0.19.1] — 2026-10-09(只改文档:README 的变异条数写旧了)
|
|
6
34
|
|
|
7
35
|
0.19.0 发版时 README 里那句变异条数还写着上一版的 **174**,而这一版实际跑出来是 **180**
|
package/README.md
CHANGED
|
@@ -553,8 +553,9 @@ Windows 上 DSH 给模型的终端工具是 **PowerShell**(工具名 `pwsh`)
|
|
|
553
553
|
| 工具循环的消息形状 / 轮次封顶 / 异常必须降级 | 同上第 6 节(假 llm 驱动整条循环,逐条检查 `role:'tool'` 与 `toolCallId`) |
|
|
554
554
|
| 工具路径:默认关、开了才派、**查完吐散文必须回落**、拿不到工作目录就不派 | `test/quick-commands.mjs` 5g 节(13 条,真路由 + 假 llm) |
|
|
555
555
|
| 工具读到的内容不进台账 | 同 5g 节:断言台账里只有工具名与次数、没有读到的文件内容 |
|
|
556
|
-
| 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**
|
|
556
|
+
| 变异守卫真的会咬人,且**必须是指定的那条测试变红** | `npm run test:mutations`:**182 条全部咬住**(判据是 `red.some(line => line.includes(item.expect))`,不是"有红就行") |
|
|
557
557
|
| **桌面应用里弹系统文件夹框**(0.18.0 起;0.19.0 起默认关、设置页可开) | ✅ **有真机证据**:2026-10-09 用户在桌面应用点「选择工作区目录」,实测「成功替换为系统文件管理器」(先用 profile 补丁验过一次,之后的插件内 shadow 版走的是同一条 preload 桥);`node test/directory-flow.mjs` 49 条 + 变异 FS–FY(判定/状态机)与 GZ/HA(开关幂等装卸)罩着 |
|
|
558
|
+
| **设置字段全部进了宿主 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 才发现并修掉 |
|
|
558
559
|
| 发布门禁三条判据 | `npm run gates` 全过;`check:tag` 实测 `v0.12.0` 的 tag 名与所指提交里的版本一致 |
|
|
559
560
|
| 三平台 CI | GitHub Actions:ubuntu / windows / macos × Node 20(`npm ci → typecheck → build → test → check:pack → check:docs`) |
|
|
560
561
|
|
|
@@ -689,9 +690,9 @@ node build.mjs # 产出 lib/index.js + lib/client.js
|
|
|
689
690
|
# ⚠️ 宿主半会**内联** schemastery / cosmokit:
|
|
690
691
|
# 优先用 DSH 检出里的 vendor 副本,检出不在时退到 node_modules
|
|
691
692
|
# 里同版本的 npm 包(两者逐字节相同)——CI 上走的就是退路
|
|
692
|
-
npm test # 29 个套件;当前
|
|
693
|
+
npm test # 29 个套件;当前 2549 passed, 0 failed(2026-10-09 实测;CI 三平台同样全绿)
|
|
693
694
|
# 走 scripts/run-tests.mjs:顺带把"多少套件/多少条"记进 test/.last-run.json
|
|
694
|
-
npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(
|
|
695
|
+
npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(182 条,须单独跑)
|
|
695
696
|
# 同样记录结果,供下面的文档门禁核对
|
|
696
697
|
npm run gates # 发版门禁三条一起跑:tag 指向 / 包内容 / 文档数字
|
|
697
698
|
npm run check:tag # ① tag 名里的版本 == 该 tag 所指提交里的 package.json 版本
|
package/lib/index.js
CHANGED
|
@@ -6713,7 +6713,24 @@ function ownSchema() {
|
|
|
6713
6713
|
// 与 priceOverrides 同一个理由用 `z.any()`。第三方价目本体不进设置(见 price-sync.ts)。
|
|
6714
6714
|
[SYNCED_PRICES_FIELD]: Schema.any().required(false),
|
|
6715
6715
|
// 「金额」(0.10.0)自动同步官方价:默认关(会自动出网的开关不默认开)。
|
|
6716
|
-
[PRICE_AUTO_SYNC_FIELD]: Schema.boolean().default(DEFAULT_SETTINGS.priceAutoSync)
|
|
6716
|
+
[PRICE_AUTO_SYNC_FIELD]: Schema.boolean().default(DEFAULT_SETTINGS.priceAutoSync),
|
|
6717
|
+
// 微信通知(0.17.0)。⚠️ 2026-10-09 补:这 5 个字段在 0.17.0 漏了 —— 只加进了设置契约
|
|
6718
|
+
// 与设置页,**没加进这张 schema**。后果不是"界面少了什么",而是宿主设置服务的写路径会
|
|
6719
|
+
// 直接拒绝:`settings.mutate` 对每个 path 先查 `isVolatilePath(schema, path)`,
|
|
6720
|
+
// 没声明就抛 `Config field "notifyEnabled" is not volatile`(见 DSH 源码
|
|
6721
|
+
// packages/settings/settings/src/index.ts 的 `write`),于是通知卡那几个开关根本存不住。
|
|
6722
|
+
// 教训写进测试:`test/client-registration.mjs` 第 16 节逐字段核对契约与这张表。
|
|
6723
|
+
[NOTIFY_ENABLED_FIELD]: Schema.boolean().default(DEFAULT_SETTINGS.notifyEnabled),
|
|
6724
|
+
[NOTIFY_CHANNEL_FIELD]: Schema.string().default(DEFAULT_SETTINGS.notifyChannel),
|
|
6725
|
+
[NOTIFY_PUSHPLUS_FIELD]: Schema.string().default(DEFAULT_SETTINGS.notifyPushplusToken),
|
|
6726
|
+
[NOTIFY_WECOM_FIELD]: Schema.string().default(DEFAULT_SETTINGS.notifyWecomWebhook),
|
|
6727
|
+
[NOTIFY_KINDS_FIELD]: Schema.object({
|
|
6728
|
+
"needs-input": Schema.boolean().default(DEFAULT_SETTINGS.notifyKinds["needs-input"]),
|
|
6729
|
+
done: Schema.boolean().default(DEFAULT_SETTINGS.notifyKinds.done),
|
|
6730
|
+
error: Schema.boolean().default(DEFAULT_SETTINGS.notifyKinds.error)
|
|
6731
|
+
}),
|
|
6732
|
+
// 工作区目录选择(0.19.0):默认关(接管官方槽位这件事必须由用户自己点)。
|
|
6733
|
+
[DIRECTORY_PICK_ENABLED_FIELD]: Schema.boolean().default(DEFAULT_SETTINGS.directoryPickEnabled)
|
|
6717
6734
|
});
|
|
6718
6735
|
}
|
|
6719
6736
|
function markVolatileField(node) {
|