dsh-composer-ux 0.16.1 → 0.16.3
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 +14 -2
- package/lib/index.js +6 -0
- 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.16.3] — 2026-10-01(真机验证通过:恢复框不再出现,窗口自己回来)
|
|
6
|
+
|
|
7
|
+
用户实测(Windows 桌面版,此前每次重启都会弹「应用无法启动或已意外停止」):
|
|
8
|
+
|
|
9
|
+
- 双击 `restart-webui.bat` 让 0.16.2 生效 → 点界面上的「重启」→ **没有弹出恢复框**;
|
|
10
|
+
- 追问后确认:窗口**自己回来了,大概几秒**(不是手动重开);
|
|
11
|
+
- 体检脚本:19:08:55 与 19:10:31 两次助手运行**一个错都没写**(助手只在失败时才写日志),
|
|
12
|
+
且 19:08 之后没有新的壳崩溃日志。
|
|
13
|
+
|
|
14
|
+
另外修掉 `发布工具/restart-doctor.mjs` 的一处判定缺陷:它原来只拿"最新一条崩溃日志"与
|
|
15
|
+
“最新一条助手日志"比大小,会把更早、但仍在安装之后的那条崩溃日志漏掉(结论对、理由错)。
|
|
16
|
+
现在改成**列出安装之后的全部崩溃日志**再下判断。
|
|
17
|
+
|
|
18
|
+
## [0.16.2] — 2026-09-30(杀壳之前先确认"能把应用拉回来")
|
|
19
|
+
|
|
20
|
+
这一版堵的是 **0.16.0 自己引入的**失败模式:先杀壳、再用 exe 重建 —— 如果 exe 路径拿不到或
|
|
21
|
+
文件已不在,就会变成"壳没了、应用也没起来",比原来的弹框糟糕得多。参考插件的 README 里
|
|
22
|
+
正好记着这条死法:`relaunch aborted: executable missing`。
|
|
23
|
+
|
|
24
|
+
**改法**:杀壳之前先 `fs.existsSync(appExe)`;**拿不到就绝不杀壳**,退回"只换宿主"那条老路
|
|
25
|
+
(壳还活着,它的恢复框至少还能救回来),并在日志里写明原因。
|
|
26
|
+
|
|
27
|
+
## 验证
|
|
28
|
+
|
|
29
|
+
- `npm test`:**24 个套件 2382 passed / 0 failed**(行为测试从 11 条涨到 14 条,
|
|
30
|
+
其中一条直接验证「exe 缺失 ⇒ 一次 taskkill 都没有」)。
|
|
31
|
+
- 变异:**164/164 全部咬住**。
|
|
32
|
+
|
|
5
33
|
## [0.16.1] — 2026-09-30(把桌面重启从「查文本的测试」升级成「真跑一遍」)
|
|
6
34
|
|
|
7
35
|
0.16.0 的测试断言是在**助手源码字符串**里找关键字 —— 这一版之前已经栽过三次同类问题
|
package/README.md
CHANGED
|
@@ -271,7 +271,19 @@ node scripts/recap.mjs --clear # 清空
|
|
|
271
271
|
|
|
272
272
|
台账文件超 512 KB 会从**最旧**的行开始丢(并留一条 `rotated` 标记说明丢了多少行);坏行逐行跳过并计数,不会因为一行坏掉就把整份台账判成"读不出来"。写台账失败**绝不影响优化本身**(旁路失败只少一条记录,不能拖垮一次已经跑完的调用)。开关在**设置 → 插件 → 输入快捷指令 → 记录每轮优化台账**(默认开:只写数字与原因,所以默认开不冒隐私风险)。
|
|
273
273
|
|
|
274
|
-
###
|
|
274
|
+
### 重启
|
|
275
|
+
|
|
276
|
+
### 真机验证(2026-10-01)
|
|
277
|
+
|
|
278
|
+
Windows 桌面版实测通过(此前会弹「应用无法启动或已意外停止」那个恢复框):
|
|
279
|
+
|
|
280
|
+
- 双击 `restart-webui.bat` 让新版本生效 → 点界面上的「重启」→ **没有弹出恢复框**;
|
|
281
|
+
- 窗口**自己回来了,大概几秒**(用户确认,非手动重开);
|
|
282
|
+
- 助手日志两次运行(19:08:55 / 19:10:31)**一个错都没写**,且此后无新的壳崩溃日志。
|
|
283
|
+
|
|
284
|
+
机制:桌面形态连壳一起换掉 —— `taskkill /F /PID <壳>`(只用 `/PID`)→ 等旧宿主退出 →
|
|
285
|
+
用应用 exe 重建(**删掉 `ELECTRON_RUN_AS_NODE`**);杀壳前先确认 exe 存在,拿不到就退回"只换宿主"。
|
|
286
|
+
后结果框还在
|
|
275
287
|
|
|
276
288
|
结果框原先只在内存里:关面板不清空,但**重启一次 DSH 就丢了刚跑出来的成品**,想看只能再花一次模型调用。0.13.0 起它会被存下来 —— 写进 `$DSH_HOME/composer-ux/optimize-dock.json`,下次启动或刷新页面时恢复。
|
|
277
289
|
|
|
@@ -640,7 +652,7 @@ node build.mjs # 产出 lib/index.js + lib/client.js
|
|
|
640
652
|
# ⚠️ 宿主半会**内联** schemastery / cosmokit:
|
|
641
653
|
# 优先用 DSH 检出里的 vendor 副本,检出不在时退到 node_modules
|
|
642
654
|
# 里同版本的 npm 包(两者逐字节相同)——CI 上走的就是退路
|
|
643
|
-
npm test # 24 个套件;当前
|
|
655
|
+
npm test # 24 个套件;当前 2382 passed, 0 failed(2026-09-29 实测;CI 三平台同样全绿)
|
|
644
656
|
# 走 scripts/run-tests.mjs:顺带把"多少套件/多少条"记进 test/.last-run.json
|
|
645
657
|
npm run test:mutations # 手动跑:变异测试,证明那套护栏真的在咬人(164 条,须单独跑)
|
|
646
658
|
# 同样记录结果,供下面的文档门禁核对
|
package/lib/index.js
CHANGED
|
@@ -4062,6 +4062,12 @@ function restartHelperSource(input) {
|
|
|
4062
4062
|
"const desktopMain = async () => {",
|
|
4063
4063
|
' const out = fs.openSync(logOut, "a")',
|
|
4064
4064
|
' const err = fs.openSync(logErr, "a")',
|
|
4065
|
+
" // \u8D77\u98DE\u524D\u68C0\u67E5\uFF1A\u62FF\u4E0D\u5230\u5E94\u7528 exe \u5C31**\u7EDD\u4E0D\u6740\u58F3** \u2014\u2014 \u6740\u5B8C\u6CA1\u4EBA\u80FD\u628A\u5B83\u62C9\u56DE\u6765",
|
|
4066
|
+
" //\uFF08\u53C2\u8003\u63D2\u4EF6 README \u91CC\u90A3\u6761 relaunch aborted: executable missing \u5C31\u662F\u8FD9\u4E2A\u6B7B\u6CD5\uFF09\u3002",
|
|
4067
|
+
" if (!desktop.appExe || !fs.existsSync(desktop.appExe)) {",
|
|
4068
|
+
' note("app executable missing (" + String(desktop.appExe) + "); falling back to host-only restart")',
|
|
4069
|
+
" return main()",
|
|
4070
|
+
" }",
|
|
4065
4071
|
' // \u53EA /PID\uFF1A/T \u4F1A\u628A"\u8D1F\u8D23\u91CD\u542F\u7684\u52A9\u624B\u81EA\u5DF1"\u4E00\u8D77\u5E26\u8D70\uFF08\u53C2\u8003\u63D2\u4EF6\u8E29\u8FC7\u7684\u5751\uFF09\u3002',
|
|
4066
4072
|
" try {",
|
|
4067
4073
|
' const killer = spawn("taskkill", ["/F", "/PID", String(desktop.shellPid)], { windowsHide: true, stdio: ["ignore", out, err] })',
|