dsh-workspace-mover 2.4.1 → 2.4.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 +345 -317
- package/README.md +389 -373
- package/README_EN.md +376 -360
- package/client/client.js +216 -23
- package/docs/ARCHITECTURE.md +224 -224
- package/docs/compatibility/dsh-0.2.0-rc.2-2026-10-13.md +45 -45
- package/docs/compatibility/immediate-migration-2026-10-26.md +68 -0
- package/docs/compatibility/issue-11-pr-12-review-2026-11-02.md +103 -0
- package/docs/compatibility/issue-5-desktop-acceptance-2026-10-22.md +106 -106
- package/docs/compatibility/pr-review-2026-10-22.md +56 -56
- package/lib/index.js +90 -29
- package/lib/lifecycle.js +104 -0
- package/package.json +104 -103
- package/test/client-dom.test.mjs +194 -4
- package/test/core.test.mjs +73 -73
- package/test/e2e-sandbox.test.mjs +82 -2
- package/test/live-migration.test.mjs +253 -0
- package/test/release-downloads.test.mjs +102 -102
- package/test/traffic-badge.test.mjs +80 -80
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# 2.4.2 即时迁移与标题修复验收
|
|
2
|
+
|
|
3
|
+
正式版本:2.4.2。验收候选:2.4.2-rc.4;正式版仅调整版本和发布文档,运行逻辑相同。
|
|
4
|
+
|
|
5
|
+
## 人工验收结论(2026-10-26)
|
|
6
|
+
|
|
7
|
+
用户在 DSH Desktop 0.2.1-rc.2 / Windows 上确认:
|
|
8
|
+
|
|
9
|
+
- 空闲会话拖动后立即出现在目标工作区,标题正常。
|
|
10
|
+
- rc.4 修复后不切换会话即可继续发送,未再出现“会话不可用”。
|
|
11
|
+
- 运行中拖动选择取消:任务继续、会话不移动。
|
|
12
|
+
- 明确选择停止任务并迁移:任务停止,迁移后可在当前界面继续发送。
|
|
13
|
+
- 彻底退出重启后标题、历史、归属正常,继续发送成功。
|
|
14
|
+
|
|
15
|
+
证据来源:维护者在本次验收会话中先确认“一切正常”,随后按最后三项测试回复“都成功。进入发布流程和issue解决流程”。这是维护者本机验收,不代表原报告者已在旧版 DSH 复测。
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
用户已在 rc.2 确认迁移后立即显示在目标工作区,且未出现未命名会话;随后发现当前输入框显示“会话不可用”,手动切走再切回才恢复。rc.3 尝试同步重新打开,但用户复验仍不可用,并出现重新连接失败提示。rc.4 改为等待引用释放后打开,用户随后确认通过。
|
|
19
|
+
|
|
20
|
+
## 迁移后的当前对话
|
|
21
|
+
|
|
22
|
+
官方 SessionController 在 dispose 时发布 api-session/removed;客户端 Session.handleRemoved 将 removed 置为 true,后续 added 事件只更新列表,并不清除此标记。因此后端已恢复的 Agent 对应的旧界面仍不可用。rc.3 在迁移 RPC 结束后检查仍选中的会话,仅在 removed 时通过 uiWorkspace.clearMain/openSession 释放旧视图并重新打开,等待新会话打开。失败回滚也执行同样检查;用户切换到其他会话或插件卸载后不主动跳转。不改宿主文件或私有 removed 字段。
|
|
23
|
+
|
|
24
|
+
rc.3 漏掉了延迟释放:clearMain 仅立即释放主视图引用,React Provider 的其他引用要等界面更新才释放,立刻 openSession 会重新持有 removed 的旧对象。rc.4 用 sessions.retainInfo 观察旧 binding 的实际退出后再打开;最多等待 3 秒,插件卸载会取消等待。等待期间用户选了其他会话则不重新打开。
|
|
25
|
+
|
|
26
|
+
新增已安装客户端验证:执行 Desktop 内的真实 ClientSessions / SessionManager / Session 代码,使用真实 Cordis,替换界面 store 和未使用的传输边界。确认 added 不清除 removed、双引用下同步重新取得旧对象、延迟释放最后引用后才能取得 removed=false 的新对象。该验证不运行 React 界面,不能替代 Desktop 复验。
|
|
27
|
+
|
|
28
|
+
若其他界面仍持有旧会话引用,或重新打开失败,明确提示彻底退出并重启,不重复执行物理迁移。自动回归覆盖成功、回滚、连接报错、用户切换、正常界面和插件卸载;完整 Desktop 界面、草稿及预设保持情况仍需实际验收。
|
|
29
|
+
|
|
30
|
+
## 行为
|
|
31
|
+
|
|
32
|
+
- 插件观察官方 agents.create/resume,保留返回的生命周期 dispose;不修改持久化 writer、不可变 Session header 或安装文件。
|
|
33
|
+
- 空闲且已接入生命周期的会话:锁定迁移操作,阻止新请求及后台恢复,等待官方 dispose 排空并关闭 writer,真实搬移档案,通过官方 SessionController.resolveAgent 重新按宿主预设加载。
|
|
34
|
+
- 运行中会话:弹窗明确显示“停止任务并迁移”;取消不调用迁移。状态在确认后发生变化时,后端返回 stop-required,不擅自停止。
|
|
35
|
+
- 放行操作使用 AsyncLocalStorage 限定为当前迁移的恢复调用,不放行其他并发恢复。旧 Agent 引用在替换后拒绝发送。
|
|
36
|
+
- 迁移失败沿用文件和工作区归属回滚,并请求宿主从原位置重新加载。若重新加载失败,明确返回错误,不伪称全部成功。
|
|
37
|
+
- 热更新前已打开、没有保留生命周期句柄的会话不强行释放。完全重启一次后重新打开会话即可接入;未知后端仍保留原安全检查。
|
|
38
|
+
- 拖动迁移不自动创建 pending。历史 API 的排队能力和已有队列保持兼容;没有明确停止授权的后台任务不取消正在运行的 Agent。
|
|
39
|
+
- 活跃子代理迁移暂不支持;不能在其父任务仍持有生命周期时单独卸载。
|
|
40
|
+
|
|
41
|
+
## Issue #10:标题
|
|
42
|
+
|
|
43
|
+
原实现调用底层 table.update,但已安装宿主的缓存表使用 get/put。现在以完整 identity/rows 读取并写回,在 attachSession 发布新归属之前对齐 identity.cwd;保留 title 行,移除旧 workingDirectory 行。attach 失败恢复原 identity/rows。
|
|
44
|
+
|
|
45
|
+
本机“标题保留测试”归档后,标题仍保存在新版 per-record 投影缓存中;修复面板原来只读取旧 session_projcache.json 汇总文件,因此误显示“未命名会话”。现在扫描、归档、预览和备份列表按内存缓存、新版单记录文件、旧版汇总、档案标题的顺序读取。回归测试覆盖新旧缓存共存、内存更新和损坏缓存降级。
|
|
46
|
+
|
|
47
|
+
报告者 DSH 0.2.0-rc.2 环境尚未直接复现;这是发现并修复的具体代码缺陷,不声称已完成该环境验收。
|
|
48
|
+
|
|
49
|
+
## 自动验证
|
|
50
|
+
|
|
51
|
+
- 常规套件包含即时迁移的 DOM 确认/取消、无自动排队、生命周期并发拒绝和卸载恢复检查。
|
|
52
|
+
- test/live-migration.test.mjs 的可选集成项使用从本机 Desktop 提取的 DSH 0.2.1-rc.2、真实 Cordis、SessionStore、AgentRegistry、AgentLoop、JSONL/Zstd writer 和原生文件锁。
|
|
53
|
+
- 检查真实 Agent 创建、释放、物理迁移、目标路径恢复、继续追加、失败回滚后恢复原路径,以及运行中拒绝/明确停止后迁移。
|
|
54
|
+
- 集成测试的 SessionController 入口使用精简实现调用真实 agents.resume;没有启动完整 Desktop、加载真实用户预设或调用在线模型。实际预设、权限与模型恢复依赖下面的 Desktop 人工验收。
|
|
55
|
+
- DSH_TEST_NODE_MODULES 指向已有 runtime/node_modules,运行 npm run test:installed-host;未配置时明确 skip。
|
|
56
|
+
- rc.2 本机 Windows / Node 22.23.2:npm run check 通过,319 项通过、1 项真实宿主可选测试按预期 skip;单独配置真实宿主后 npm run test:installed-host 的 3 项全部通过。rc.3 增补当前对话重新打开的回归检查。跨平台 CI 尚未运行。
|
|
57
|
+
- rc.3:npm run check 通过,325 项通过、1 项可选测试跳过;语法、打包预检和 git diff --check 通过。新增的 6 项界面回归使用 DOM 与宿主服务替身,尚不能替代 Desktop 人工复验。
|
|
58
|
+
- rc.4:npm run check 通过,327 项通过、2 项宿主可选测试跳过;配置真实宿主后 npm run test:installed-host 的 4 项全部通过,包括上述客户端引用释放复现。语法、打包预检和 git diff --check 通过。Desktop 人工复验通过,见本文开头。
|
|
59
|
+
|
|
60
|
+
## Desktop 验收
|
|
61
|
+
|
|
62
|
+
1. 保存正在做的工作,从应用菜单或托盘彻底退出 DSH,再启动。自检版本应为 2.4.2-rc.4。
|
|
63
|
+
2. 新建测试会话并命名“标题保留测试”,发送一句消息,等回复结束。拖到 B,确认后应直接显示在 B,无 pending、无需重启。
|
|
64
|
+
3. 不切换到其他会话,在 B 当前界面直接连续发两条消息,确认输入框可用、正常回复,模型/预设/权限及未发送草稿保持预期,有效工作目录为 B。
|
|
65
|
+
4. 让另一个测试会话执行可随时停止的任务,生成回复期间拖动。先取消,原任务继续;再次拖动选择“停止任务并迁移”,确认任务停止后会话出现在 B,可继续发送。
|
|
66
|
+
5. 重启后标题、历史、归属和工作目录仍正确。分别检查手动标题和自动生成标题,并在归档后检查设置中的会话修复列表标题。若异常,保留测试会话,不重复强行搬移。
|
|
67
|
+
|
|
68
|
+
发布后在 issue #10 说明修复及升级步骤,并邀请原报告者在 DSH 0.2.0-rc.2 复测;待其确认后关闭。
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# Issue #11 / PR #12 candidate review
|
|
2
|
+
|
|
3
|
+
Release: `2.4.3`, based on accepted candidate `2.4.3-rc.2`.
|
|
4
|
+
|
|
5
|
+
## Contribution review
|
|
6
|
+
|
|
7
|
+
PR #12 pinned head: `6101e720c69e3d512d84a9ab1c581e6c920afd10`, author EzraRT.
|
|
8
|
+
Reviewed all changes: `client/client.js`, `package.json`, `CHANGELOG.md`.
|
|
9
|
+
No new network requests, process execution, credential access, filesystem deletion,
|
|
10
|
+
installation scripts, workflow changes or runtime dependency downloads were found.
|
|
11
|
+
|
|
12
|
+
Local integration retains the contribution, adds locale notification/subscription
|
|
13
|
+
cleanup and regression coverage, and removes the new mandatory manifest injection
|
|
14
|
+
so hosts without the optional locale service can still load the plugin.
|
|
15
|
+
Language changes update the React repair panel and subsequent dialogs. An open
|
|
16
|
+
confirmation dialog retains its text until reopened; it never restarts a migration.
|
|
17
|
+
|
|
18
|
+
PR #6 remains excluded: private writer rebinding is superseded by the shipped
|
|
19
|
+
public lifecycle release/resume strategy.
|
|
20
|
+
|
|
21
|
+
## Issue #11 scope
|
|
22
|
+
|
|
23
|
+
Tracked idle sessions: release the public handle, move the archive to recycle,
|
|
24
|
+
preserve title/projection/ownership metadata, and do not reload on success.
|
|
25
|
+
Running sessions are refused without cancelling their task. Untracked resident
|
|
26
|
+
sessions retain the full-restart requirement. Failure reloads only if an archive
|
|
27
|
+
can be located; failed rollback keeps recovery files intact.
|
|
28
|
+
|
|
29
|
+
Ghost membership is diagnostic only: archives elsewhere in the active storage
|
|
30
|
+
root are distinguished from unknown locations, including unparsed files beyond
|
|
31
|
+
the scan limit. Other storage roots or external archives cannot be inferred.
|
|
32
|
+
Automatic or bulk roster deletion and an external detach API are deferred;
|
|
33
|
+
ownership and archived membership remain intact.
|
|
34
|
+
|
|
35
|
+
## Desktop acceptance (dedicated disposable conversation)
|
|
36
|
+
|
|
37
|
+
1. Fully quit DSH from its tray menu and restart from the updated desktop shortcut.
|
|
38
|
+
Repair-panel self-check must report `2.4.3-rc.2` (Desktop `0.2.1-rc.5`).
|
|
39
|
+
2. Create a test conversation, send one message and wait for completion. Delete it
|
|
40
|
+
from the plugin's repair panel. Expect no restart requirement, no duplicate
|
|
41
|
+
conversation, and no stuck removed view if it was selected.
|
|
42
|
+
3. Restore it from the plugin recycle bin. Title, history and workspace must remain
|
|
43
|
+
intact. If it was archived before deletion, the restore note explicitly says
|
|
44
|
+
it remains archived: use Restore under Archived sessions to return it to the
|
|
45
|
+
ordinary sidebar. Both lists must update without restarting; sending another
|
|
46
|
+
message must work.
|
|
47
|
+
4. While a test conversation is generating, attempt deletion. It must be refused,
|
|
48
|
+
and the original task must continue. Delete only after it becomes idle.
|
|
49
|
+
5. Switch DSH between English and Chinese. The repair panel and a newly opened
|
|
50
|
+
migration confirmation must follow DSH rather than the browser language.
|
|
51
|
+
Cancel the confirmation; no physical migration is needed for this check.
|
|
52
|
+
6. Move a disposable idle conversation across workspaces and send another message
|
|
53
|
+
to confirm the existing migration/reconnection behavior is preserved.
|
|
54
|
+
|
|
55
|
+
No manual movement or deletion of real session files is required. Automated
|
|
56
|
+
fixtures cover unknown/moved ghost records and failed physical rollback.
|
|
57
|
+
|
|
58
|
+
## Automated validation
|
|
59
|
+
|
|
60
|
+
- rc.2 `npm run check`: 337 tests, 334 passed, 3 installed-runtime tests skipped;
|
|
61
|
+
syntax and npm package dry-run passed.
|
|
62
|
+
- `npm run test:installed-host` against dependencies extracted from the installed
|
|
63
|
+
Desktop `0.2.1-rc.5`: 6 passed, none skipped. Includes real AgentLoop disposal,
|
|
64
|
+
physical migration, subsequent write, resident deletion and official locale.
|
|
65
|
+
- Final syntax check and candidate `npm pack` passed. Candidate hashes and command
|
|
66
|
+
logs are retained locally under `data/pr-review-20261102/` (not packaged).
|
|
67
|
+
- PR #12 GitHub workflow run `41188742982` required maintainer approval, granted
|
|
68
|
+
during release preparation. Cross-platform CI is required before merging.
|
|
69
|
+
- Desktop configuration already links to this checkout. A full quit/restart is
|
|
70
|
+
required to load the new host version; do not edit the Desktop application ASAR.
|
|
71
|
+
- The rc.2 installed-client check removes a Session from the real Controller's
|
|
72
|
+
list, refreshes its cold baseline through `ClientSessions.refresh()`, and checks
|
|
73
|
+
that it reappears without a restart or Agent-created event. DOM tests cover
|
|
74
|
+
refresh after all three restore/unarchive endpoints and failure without retrying
|
|
75
|
+
completed restoration.
|
|
76
|
+
|
|
77
|
+
## Desktop feedback on rc.1 — 2026-11-03
|
|
78
|
+
|
|
79
|
+
The user confirmed self-check `2.4.3-rc.1`, deletion of an idle archived test
|
|
80
|
+
conversation without restarting, successful English repair-panel/dialog text and
|
|
81
|
+
cross-workspace migration. Recycle restoration did not immediately populate the
|
|
82
|
+
sidebar; restarting restored visibility. This exposed a missing client Session
|
|
83
|
+
baseline refresh, since file restoration emits no Session-created event. rc.2
|
|
84
|
+
refreshes the public `sessions.refresh()` after restore/unarchive and explicitly
|
|
85
|
+
reports preserved archived status.
|
|
86
|
+
|
|
87
|
+
The screenshot of a running task showed the host's "Stop and archive" dialog;
|
|
88
|
+
the user approved it and archiving succeeded. This verifies host behavior, not
|
|
89
|
+
the plugin's running-session deletion refusal. The latter remains covered by
|
|
90
|
+
automated checks; no manual pass is claimed.
|
|
91
|
+
|
|
92
|
+
## Desktop acceptance of rc.2 — 2026-11-03
|
|
93
|
+
|
|
94
|
+
After the prescribed restore regression steps, the user reported “测试通过” and
|
|
95
|
+
authorized the complete release flow. This accepts deletion, recycle recovery,
|
|
96
|
+
immediate archived-list visibility, unarchiving back to the sidebar and continued
|
|
97
|
+
replies without restarting between those actions. rc.1 English repair-panel and
|
|
98
|
+
migration-dialog screenshots and successful migration remain the language/move
|
|
99
|
+
acceptance evidence. The host's Stop and archive dialog is not substituted for
|
|
100
|
+
manual testing of the plugin's running-deletion refusal.
|
|
101
|
+
|
|
102
|
+
Formal version promotion changes metadata/documentation only; runtime sources
|
|
103
|
+
match the accepted rc.2. No session data or personal screenshots are packaged.
|
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
# Issue #5:2.4.0-rc.1 Desktop 验收
|
|
2
|
-
|
|
3
|
-
状态:用户已完成候选版本 `2.4.0-rc.1` 的 Desktop 验收并授权提交、合并和发布。自动滚动的人工验收由用户明确豁免,保留自动 DOM 检查结果。
|
|
4
|
-
|
|
5
|
-
## 已确认的环境
|
|
6
|
-
|
|
7
|
-
- Desktop 安装目录:`E:\DeepSeekHarness\desktop`。
|
|
8
|
-
- 安装包中的持久化、会话和工具服务版本:`0.2.1-rc.2`;Cordis:`4.0.5`。
|
|
9
|
-
- Desktop profile 中 `dsh-workspace-mover` 链接到 `E:\DeepSeekHarness\dsh-workspace-mover`。
|
|
10
|
-
- 本地候选版本:`2.4.0-rc.1`。计划正式发布版本:`2.4.0`。
|
|
11
|
-
|
|
12
|
-
## 1. 加载候选版本
|
|
13
|
-
|
|
14
|
-
1. 等待正在运行的回合结束,正常退出 DeepSeek Harness。若关窗口后仍在托盘运行,使用托盘菜单的退出项。
|
|
15
|
-
2. 重新打开 `E:\DeepSeekHarness\desktop\DeepSeek Harness.exe`。
|
|
16
|
-
3. 打开设置中的会话修复面板,点击“自检”。结果摘要末尾应显示 `v2.4.0-rc.1`。
|
|
17
|
-
4. 也可以在测试对话中要求“调用 mover_doctor,原样报告 pluginVersion 和失败项”。应返回 `2.4.0-rc.1`。如果版本不符,先停止验收并反馈。
|
|
18
|
-
|
|
19
|
-
`filesystem-fallback` 提示本身不是失败:宿主尚无公开的原始档案迁移接口。自检如有 `fail` 项,请提供具体项目与内容。
|
|
20
|
-
|
|
21
|
-
## 2. 准备工作区
|
|
22
|
-
|
|
23
|
-
以下三个空目录已由本次工作创建。让 Agent 执行:
|
|
24
|
-
|
|
25
|
-
> 仅使用 mover_create_workspace,登记以下已有目录,不创建或搬动文件:
|
|
26
|
-
> 名称 WSM-A-1022,目录 E:\DeepSeekHarness\data\pr-review-20261022\acceptance\A;
|
|
27
|
-
> 名称 WSM-B-1022,目录 E:\DeepSeekHarness\data\pr-review-20261022\acceptance\B;
|
|
28
|
-
> 名称 WSM-C-1022,目录 E:\DeepSeekHarness\data\pr-review-20261022\acceptance\C。
|
|
29
|
-
|
|
30
|
-
预期:出现三个工作区;登记不弹插件审批框;重复登记应报告冲突,不能修改已有名称。
|
|
31
|
-
|
|
32
|
-
## 3. 已打开会话排队、重启迁移、继续发送
|
|
33
|
-
|
|
34
|
-
1. 在 A 新建测试会话,发送“迁移验收 A1,请只回复 A1 收到”,等待回复结束。
|
|
35
|
-
2. 将该会话拖到 B,确认迁移。预期:提示排队、等待释放写入句柄,可能需要重启;不能提示已经迁移完成。
|
|
36
|
-
3. 在原会话继续发送“A2,请只回复 A2 收到”。预期:正常回复,无旧路径写入报错。
|
|
37
|
-
4. 在 C 新建另一个测试会话,发送“重启停留页”。保持选中 C 的会话,再正常彻底退出 DSH。这样重启时不会自动打开待迁移的 A 会话、再次占用它的写入句柄。
|
|
38
|
-
5. 重启后先停留在 C,等待约 10 秒。在修复面板的迁移队列查看任务是否完成。等待期间不要打开待迁移会话。
|
|
39
|
-
6. 任务完成后,在 B 打开迁移会话,发送“B1,请只回复 B1 收到”。预期:正常回复,A1/A2 历史完整,没有重复会话。
|
|
40
|
-
7. 让 Agent 报告当前会话的有效工作目录。预期为 `E:\DeepSeekHarness\data\pr-review-20261022\acceptance\B`。
|
|
41
|
-
8. 再切换到 C,彻底退出并重启一次。确认会话仍在 B,再发送“B2,请只回复 B2 收到”。不应重复迁移、重复追加记录或出现旧目录错误。
|
|
42
|
-
|
|
43
|
-
如果任务一直等待,保留任务,提供自检结果和队列原因;不要手动移动 sessions 文件。
|
|
44
|
-
|
|
45
|
-
## 4. 工作区改名与审批
|
|
46
|
-
|
|
47
|
-
在普通权限模式下,让 Agent 使用 `mover_rename_workspace` 把 C 改名为 `WSM-C-1022-renamed`:
|
|
48
|
-
|
|
49
|
-
1. 第一次在审批框拒绝:名称必须保持不变。
|
|
50
|
-
2. 再次请求并批准:名称应更新,路径仍为 C,原会话可打开。
|
|
51
|
-
3. 改成 A 的已有名称:应直接拒绝,不弹一个注定失败的审批框。
|
|
52
|
-
4. 改成当前名称:应返回无需修改,不弹框。
|
|
53
|
-
|
|
54
|
-
在 DSH 的完全访问模式下,再把 C 改回 `WSM-C-1022`:应成功,插件不请求额外审批。切换权限模式属于宿主操作,如宿主另有确认按其提示处理。
|
|
55
|
-
|
|
56
|
-
审批服务缺失时,普通模式改名、迁移和修复工具必须拒绝执行,提示使用面板;不要求你卸载服务,这条由自动检查覆盖。登记已有目录无需审批;完全访问免审批仅适用于改名,未放宽原有迁移/修复审批。
|
|
57
|
-
|
|
58
|
-
## 5. 自动滚动
|
|
59
|
-
|
|
60
|
-
已有工作区足够多、侧栏出现滚动条时直接验证。如果不足,可让 Agent 使用 `mover_create_workspace`,登记验收目录下 `scroll-01` 到 `scroll-12` 的已有目录,名称设为 `WSM-scroll-01` 到 `WSM-scroll-12`。
|
|
61
|
-
|
|
62
|
-
1. 拖动专用测试会话,指针停在侧栏底部边缘。预期:持续向下滚动,能够看到原先在视口外的工作区。
|
|
63
|
-
2. 移到侧栏顶部:应向上滚动;移到中间、侧栏之外、松手或取消拖动:应停止。
|
|
64
|
-
3. 到达最顶部/最底部后应稳定停止,不抖动。
|
|
65
|
-
4. 实际投放一次:确认框目标应与投放工作区一致;已打开会话仍按第 3 节排队。
|
|
66
|
-
|
|
67
|
-
插件卸载时取消滚动动画由自动 DOM 检查覆盖,无需你反复卸载插件。
|
|
68
|
-
|
|
69
|
-
## 反馈格式
|
|
70
|
-
|
|
71
|
-
```text
|
|
72
|
-
版本:2.4.0-rc.1 / 其他
|
|
73
|
-
排队后 A2 回复:通过 / 失败(错误)
|
|
74
|
-
切换 C 并重启后任务:完成 / 等待(原因)/ 失败
|
|
75
|
-
B1、B2 回复及历史:通过 / 失败
|
|
76
|
-
有效工作目录:
|
|
77
|
-
普通模式拒绝/批准改名:通过 / 失败
|
|
78
|
-
完全访问改名:通过 / 失败
|
|
79
|
-
自动滚动与停止:通过 / 失败
|
|
80
|
-
自检 fail 项:无 / 内容
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
验收通过后才进行提交、推送、PR 合并及正式发布。失败时先修复并重新验证相关步骤。
|
|
84
|
-
|
|
85
|
-
## 2026-10-22 用户实际验收记录
|
|
86
|
-
|
|
87
|
-
以下为用户在本会话中报告的实测结果,未将自动检查冒充人工验收:
|
|
88
|
-
|
|
89
|
-
| 项目 | 结果 |
|
|
90
|
-
| --- | --- |
|
|
91
|
-
| 自检版本 | 摘要显示 `v2.4.0-rc.1`,自检正常 |
|
|
92
|
-
| 登记 A/B/C | 三个工作区出现,无插件审批框 |
|
|
93
|
-
| 打开会话拖到 B | 预览明确提示“会进入迁移等待队列(可能需重启)”,提示驻留会话/写入句柄尚未关闭 |
|
|
94
|
-
| 等待期间 A2 | 正常回复,无错误 |
|
|
95
|
-
| 切换 C 后彻底退出并重启 | 最近移动中记录迁移任务;会话从 A 消失并出现在 B |
|
|
96
|
-
| 迁移后 B1 与工作目录 | 正常回复,有效工作目录为 B |
|
|
97
|
-
| 再次重启后 B2 | 回复 B2 收到,无报错,自检正常 |
|
|
98
|
-
| 普通模式拒绝改名 | 名称仍为 WSM-C-1022 |
|
|
99
|
-
| 重试并批准改名 | 显示名更新,路径和 workspaceId 不变,会话仍可访问 |
|
|
100
|
-
| 重名/相同名称 | 重名直接 conflict;同名 changed:false,均无审批框 |
|
|
101
|
-
| 完全访问模式改回原名 | 成功 |
|
|
102
|
-
| 自动滚动 | 用户因工作区较少明确跳过人工验收,并授权直接提交;自动 DOM 检查通过 |
|
|
103
|
-
|
|
104
|
-
用户未逐字重述全部历史消息的完整性比对;已确认迁移后和两次重启后继续发送成功。此前真实后端检查验证完整记录数量和追加写入。
|
|
105
|
-
|
|
106
|
-
验收中提及 C 下的 `_acl-recovery` 属于另一会话的权限修复记录,本次不删除、不纳入插件发布。Desktop 启动权限修复独立于此版本;未把安装目录权限操作加入插件。
|
|
1
|
+
# Issue #5:2.4.0-rc.1 Desktop 验收
|
|
2
|
+
|
|
3
|
+
状态:用户已完成候选版本 `2.4.0-rc.1` 的 Desktop 验收并授权提交、合并和发布。自动滚动的人工验收由用户明确豁免,保留自动 DOM 检查结果。
|
|
4
|
+
|
|
5
|
+
## 已确认的环境
|
|
6
|
+
|
|
7
|
+
- Desktop 安装目录:`E:\DeepSeekHarness\desktop`。
|
|
8
|
+
- 安装包中的持久化、会话和工具服务版本:`0.2.1-rc.2`;Cordis:`4.0.5`。
|
|
9
|
+
- Desktop profile 中 `dsh-workspace-mover` 链接到 `E:\DeepSeekHarness\dsh-workspace-mover`。
|
|
10
|
+
- 本地候选版本:`2.4.0-rc.1`。计划正式发布版本:`2.4.0`。
|
|
11
|
+
|
|
12
|
+
## 1. 加载候选版本
|
|
13
|
+
|
|
14
|
+
1. 等待正在运行的回合结束,正常退出 DeepSeek Harness。若关窗口后仍在托盘运行,使用托盘菜单的退出项。
|
|
15
|
+
2. 重新打开 `E:\DeepSeekHarness\desktop\DeepSeek Harness.exe`。
|
|
16
|
+
3. 打开设置中的会话修复面板,点击“自检”。结果摘要末尾应显示 `v2.4.0-rc.1`。
|
|
17
|
+
4. 也可以在测试对话中要求“调用 mover_doctor,原样报告 pluginVersion 和失败项”。应返回 `2.4.0-rc.1`。如果版本不符,先停止验收并反馈。
|
|
18
|
+
|
|
19
|
+
`filesystem-fallback` 提示本身不是失败:宿主尚无公开的原始档案迁移接口。自检如有 `fail` 项,请提供具体项目与内容。
|
|
20
|
+
|
|
21
|
+
## 2. 准备工作区
|
|
22
|
+
|
|
23
|
+
以下三个空目录已由本次工作创建。让 Agent 执行:
|
|
24
|
+
|
|
25
|
+
> 仅使用 mover_create_workspace,登记以下已有目录,不创建或搬动文件:
|
|
26
|
+
> 名称 WSM-A-1022,目录 E:\DeepSeekHarness\data\pr-review-20261022\acceptance\A;
|
|
27
|
+
> 名称 WSM-B-1022,目录 E:\DeepSeekHarness\data\pr-review-20261022\acceptance\B;
|
|
28
|
+
> 名称 WSM-C-1022,目录 E:\DeepSeekHarness\data\pr-review-20261022\acceptance\C。
|
|
29
|
+
|
|
30
|
+
预期:出现三个工作区;登记不弹插件审批框;重复登记应报告冲突,不能修改已有名称。
|
|
31
|
+
|
|
32
|
+
## 3. 已打开会话排队、重启迁移、继续发送
|
|
33
|
+
|
|
34
|
+
1. 在 A 新建测试会话,发送“迁移验收 A1,请只回复 A1 收到”,等待回复结束。
|
|
35
|
+
2. 将该会话拖到 B,确认迁移。预期:提示排队、等待释放写入句柄,可能需要重启;不能提示已经迁移完成。
|
|
36
|
+
3. 在原会话继续发送“A2,请只回复 A2 收到”。预期:正常回复,无旧路径写入报错。
|
|
37
|
+
4. 在 C 新建另一个测试会话,发送“重启停留页”。保持选中 C 的会话,再正常彻底退出 DSH。这样重启时不会自动打开待迁移的 A 会话、再次占用它的写入句柄。
|
|
38
|
+
5. 重启后先停留在 C,等待约 10 秒。在修复面板的迁移队列查看任务是否完成。等待期间不要打开待迁移会话。
|
|
39
|
+
6. 任务完成后,在 B 打开迁移会话,发送“B1,请只回复 B1 收到”。预期:正常回复,A1/A2 历史完整,没有重复会话。
|
|
40
|
+
7. 让 Agent 报告当前会话的有效工作目录。预期为 `E:\DeepSeekHarness\data\pr-review-20261022\acceptance\B`。
|
|
41
|
+
8. 再切换到 C,彻底退出并重启一次。确认会话仍在 B,再发送“B2,请只回复 B2 收到”。不应重复迁移、重复追加记录或出现旧目录错误。
|
|
42
|
+
|
|
43
|
+
如果任务一直等待,保留任务,提供自检结果和队列原因;不要手动移动 sessions 文件。
|
|
44
|
+
|
|
45
|
+
## 4. 工作区改名与审批
|
|
46
|
+
|
|
47
|
+
在普通权限模式下,让 Agent 使用 `mover_rename_workspace` 把 C 改名为 `WSM-C-1022-renamed`:
|
|
48
|
+
|
|
49
|
+
1. 第一次在审批框拒绝:名称必须保持不变。
|
|
50
|
+
2. 再次请求并批准:名称应更新,路径仍为 C,原会话可打开。
|
|
51
|
+
3. 改成 A 的已有名称:应直接拒绝,不弹一个注定失败的审批框。
|
|
52
|
+
4. 改成当前名称:应返回无需修改,不弹框。
|
|
53
|
+
|
|
54
|
+
在 DSH 的完全访问模式下,再把 C 改回 `WSM-C-1022`:应成功,插件不请求额外审批。切换权限模式属于宿主操作,如宿主另有确认按其提示处理。
|
|
55
|
+
|
|
56
|
+
审批服务缺失时,普通模式改名、迁移和修复工具必须拒绝执行,提示使用面板;不要求你卸载服务,这条由自动检查覆盖。登记已有目录无需审批;完全访问免审批仅适用于改名,未放宽原有迁移/修复审批。
|
|
57
|
+
|
|
58
|
+
## 5. 自动滚动
|
|
59
|
+
|
|
60
|
+
已有工作区足够多、侧栏出现滚动条时直接验证。如果不足,可让 Agent 使用 `mover_create_workspace`,登记验收目录下 `scroll-01` 到 `scroll-12` 的已有目录,名称设为 `WSM-scroll-01` 到 `WSM-scroll-12`。
|
|
61
|
+
|
|
62
|
+
1. 拖动专用测试会话,指针停在侧栏底部边缘。预期:持续向下滚动,能够看到原先在视口外的工作区。
|
|
63
|
+
2. 移到侧栏顶部:应向上滚动;移到中间、侧栏之外、松手或取消拖动:应停止。
|
|
64
|
+
3. 到达最顶部/最底部后应稳定停止,不抖动。
|
|
65
|
+
4. 实际投放一次:确认框目标应与投放工作区一致;已打开会话仍按第 3 节排队。
|
|
66
|
+
|
|
67
|
+
插件卸载时取消滚动动画由自动 DOM 检查覆盖,无需你反复卸载插件。
|
|
68
|
+
|
|
69
|
+
## 反馈格式
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
版本:2.4.0-rc.1 / 其他
|
|
73
|
+
排队后 A2 回复:通过 / 失败(错误)
|
|
74
|
+
切换 C 并重启后任务:完成 / 等待(原因)/ 失败
|
|
75
|
+
B1、B2 回复及历史:通过 / 失败
|
|
76
|
+
有效工作目录:
|
|
77
|
+
普通模式拒绝/批准改名:通过 / 失败
|
|
78
|
+
完全访问改名:通过 / 失败
|
|
79
|
+
自动滚动与停止:通过 / 失败
|
|
80
|
+
自检 fail 项:无 / 内容
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
验收通过后才进行提交、推送、PR 合并及正式发布。失败时先修复并重新验证相关步骤。
|
|
84
|
+
|
|
85
|
+
## 2026-10-22 用户实际验收记录
|
|
86
|
+
|
|
87
|
+
以下为用户在本会话中报告的实测结果,未将自动检查冒充人工验收:
|
|
88
|
+
|
|
89
|
+
| 项目 | 结果 |
|
|
90
|
+
| --- | --- |
|
|
91
|
+
| 自检版本 | 摘要显示 `v2.4.0-rc.1`,自检正常 |
|
|
92
|
+
| 登记 A/B/C | 三个工作区出现,无插件审批框 |
|
|
93
|
+
| 打开会话拖到 B | 预览明确提示“会进入迁移等待队列(可能需重启)”,提示驻留会话/写入句柄尚未关闭 |
|
|
94
|
+
| 等待期间 A2 | 正常回复,无错误 |
|
|
95
|
+
| 切换 C 后彻底退出并重启 | 最近移动中记录迁移任务;会话从 A 消失并出现在 B |
|
|
96
|
+
| 迁移后 B1 与工作目录 | 正常回复,有效工作目录为 B |
|
|
97
|
+
| 再次重启后 B2 | 回复 B2 收到,无报错,自检正常 |
|
|
98
|
+
| 普通模式拒绝改名 | 名称仍为 WSM-C-1022 |
|
|
99
|
+
| 重试并批准改名 | 显示名更新,路径和 workspaceId 不变,会话仍可访问 |
|
|
100
|
+
| 重名/相同名称 | 重名直接 conflict;同名 changed:false,均无审批框 |
|
|
101
|
+
| 完全访问模式改回原名 | 成功 |
|
|
102
|
+
| 自动滚动 | 用户因工作区较少明确跳过人工验收,并授权直接提交;自动 DOM 检查通过 |
|
|
103
|
+
|
|
104
|
+
用户未逐字重述全部历史消息的完整性比对;已确认迁移后和两次重启后继续发送成功。此前真实后端检查验证完整记录数量和追加写入。
|
|
105
|
+
|
|
106
|
+
验收中提及 C 下的 `_acl-recovery` 属于另一会话的权限修复记录,本次不删除、不纳入插件发布。Desktop 启动权限修复独立于此版本;未把安装目录权限操作加入插件。
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
# Issue #5 / PR 整合审查与验证
|
|
2
|
-
|
|
3
|
-
日期:2026-10-22。候选版本 `2.4.0-rc.1`,正式目标 `2.4.0`。
|
|
4
|
-
状态:用户 Desktop 验收通过并授权交付;自动滚动人工验收明确豁免。生产代码 SHA256 与已验收候选一致,正式版只更新版本元数据和交付文档。
|
|
5
|
-
|
|
6
|
-
## 固定审查版本
|
|
7
|
-
|
|
8
|
-
| PR | 作者 | Head SHA | 本次处理 |
|
|
9
|
-
| --- | --- | --- | --- |
|
|
10
|
-
| [#6](https://github.com/PianoPrince/dsh-workspace-mover/pull/6) | Arrosam | `a2d333dca7fafdb2d0f973d0ac56f83809c89263` | 不合并;保留安全排队策略 |
|
|
11
|
-
| [#7](https://github.com/PianoPrince/dsh-workspace-mover/pull/7) | Arrosam | `689088a331c762af9f9bca721834e3238af4faec` | 本地整合,收紧缺失审批的处理 |
|
|
12
|
-
| [#8](https://github.com/PianoPrince/dsh-workspace-mover/pull/8) | Arrosam | `978b7f55c6a346b0641e6e7b1fd634ab91bc14aa` | 本地整合,仅吞 ENOENT |
|
|
13
|
-
| [#9](https://github.com/PianoPrince/dsh-workspace-mover/pull/9) | lsb0554 | `1dad18ebf8d43eb73edf0ca1b600b228da00c0c1` | 本地整合,补滚动停止与卸载释放 |
|
|
14
|
-
|
|
15
|
-
实施结束时通过 `git ls-remote` 再次确认,四个 Head 均未变化。原始提交已保留在本地 `refs/remotes/review/pr-N`,未改写贡献者分支。
|
|
16
|
-
|
|
17
|
-
## 代码安全审查
|
|
18
|
-
|
|
19
|
-
审查覆盖四个 PR 相对其 merge-base 的完整改动,包括生产代码、测试、文档和 package 脚本。未发现明显恶意代码或新增的外传请求、凭据读取、动态代码执行、子进程调用、混淆载荷。四个 PR 均未修改 CI/发布工作流,未新增依赖或安装生命周期脚本;#7 的 package 改动只增加测试入口。新增测试中的文件读写、环境变量和递归清理均围绕独立临时夹具目录。
|
|
20
|
-
|
|
21
|
-
发现并修正的实际风险:
|
|
22
|
-
|
|
23
|
-
- #6 重绑定失败时仍继续搬文件,且缺少宿主写入链的互斥;本次不采用其内部句柄重绑定实现。
|
|
24
|
-
- #7 移除必需审批服务注入后,旧的“服务缺失直接执行”分支变得可达。本次改为需要审批时拒绝执行;不允许缺失调用方会话却从全局策略推断完全访问。完全访问改名免审批、登记已有目录免审批保留。迁移和修复未新增完全访问豁免。
|
|
25
|
-
- #8 原实现使用吞掉所有 stat 错误的辅助函数,会将权限/I/O 故障显示为空库;改为直接读取,只把 ENOENT 视为空。
|
|
26
|
-
- #9 补齐横纵范围、滚动边界、dragend/drop/dragleave 和热卸载取消动画,避免侧栏外继续滚动或旧闭包持续排帧。
|
|
27
|
-
|
|
28
|
-
上述为指定版本的静态审查与运行检查结论。PR 后续更新时需复核新增差异。
|
|
29
|
-
|
|
30
|
-
## Issue #5 实现
|
|
31
|
-
|
|
32
|
-
- 驻留会话、JSONL tracker 中打开中(值为 null)或关闭中的 writer、旧 coordinator 中的句柄都阻止物理搬移。
|
|
33
|
-
- 未知 handle 后端或无法读取的写入状态暂停并进入队列;不把未知状态当成安全。
|
|
34
|
-
- 冷迁移前 flush 并重新检查。detach 后再检查,忙碌时恢复归属并保持可重试的 busy 错误码。
|
|
35
|
-
- 最后一次写入状态检查到 header 改写、目录移动和目标字节验证之间不让出 JavaScript 执行权,避免 await 引入的同进程写入竞态。
|
|
36
|
-
- 保留此前未提交的工作目录事件、投影失效、备份代际、标题和 Bundle 版本修复。
|
|
37
|
-
- 私有 tracker/coordinator 仅用于读取占用状态,不修改 writer/header。宿主改变内部结构时可能暂停迁移,需通过自检确认兼容性;没有承诺未知后端立即迁移。
|
|
38
|
-
|
|
39
|
-
## 已完成验证
|
|
40
|
-
|
|
41
|
-
- Windows / Node `22.23.2`:`npm run check` 通过,315 项测试全部通过,语法和 npm 打包预检通过。
|
|
42
|
-
- `git diff --check` 通过。
|
|
43
|
-
- 使用已安装 Desktop 的 DSH `0.2.1-rc.2` 和 Cordis `4.0.5`,在独立临时目录运行 `test/installed-host.test.mjs`,1 项通过。实际加载官方 Cordis、ToolRuntime、JSONL 和 Windows 原生锁实现,未替换持久化 writer。
|
|
44
|
-
- 真实后端检查:缺少 tools/approval 时 RPC 仍挂载;tools 服务装卸更新能力位;打开 writer 时请求迁移不改源文件;继续追加、缓冲 live 事件;关闭时排空;重新加载插件和后端后持久化队列自动完成;新路径重新打开可追加;重复重试不重复写;再加载后历史仍可读。
|
|
45
|
-
- 自动检查还覆盖回滚、v3/v4 与 plain/Zstd、缺失根目录、EACCES/EIO/ENOTDIR、创建/改名冲突和审批拒绝、自动滚动停止与热卸载。
|
|
46
|
-
|
|
47
|
-
可选真实后端检查通过 `DSH_TEST_NODE_MODULES` 指向已有宿主依赖,再运行 `npm run test:installed-host`。未设置变量时明确 skip,不用模拟结果冒充真实后端通过。依赖提取脚本与结果保留在 `E:\DeepSeekHarness\data\pr-review-20261022`;不读用户凭据、不改 Desktop 安装。
|
|
48
|
-
|
|
49
|
-
## 交付阶段
|
|
50
|
-
|
|
51
|
-
1. 用户已完成真实 UI 拖动、发送消息、两次进程重启、工作目录与改名验收,详见 [Desktop 验收记录](issue-5-desktop-acceptance-2026-10-22.md)。自动滚动人工验收由用户明确跳过。
|
|
52
|
-
2. 用户确认后,再提交修复,依次处理 #8、#9、#7 的合并冲突和修正;保留贡献者来源,#6 保持开放。
|
|
53
|
-
3. 合并后最终提交通过仓库现有跨平台 CI(Linux/macOS/Windows × Node 22/24)。当前只有本地 Windows 结果。
|
|
54
|
-
4. 正式版本改为 `2.4.0`,更新发布说明并重新验证版本相关输出,随后发布 GitHub/npm。最终记录提交、合并与发布链接。
|
|
55
|
-
|
|
56
|
-
用户已明确授权在上述验收结果基础上提交、合并和发布。既有未跟踪 `issue_page.html` 属于历史工作,本次保留,不纳入发布文件。
|
|
1
|
+
# Issue #5 / PR 整合审查与验证
|
|
2
|
+
|
|
3
|
+
日期:2026-10-22。候选版本 `2.4.0-rc.1`,正式目标 `2.4.0`。
|
|
4
|
+
状态:用户 Desktop 验收通过并授权交付;自动滚动人工验收明确豁免。生产代码 SHA256 与已验收候选一致,正式版只更新版本元数据和交付文档。
|
|
5
|
+
|
|
6
|
+
## 固定审查版本
|
|
7
|
+
|
|
8
|
+
| PR | 作者 | Head SHA | 本次处理 |
|
|
9
|
+
| --- | --- | --- | --- |
|
|
10
|
+
| [#6](https://github.com/PianoPrince/dsh-workspace-mover/pull/6) | Arrosam | `a2d333dca7fafdb2d0f973d0ac56f83809c89263` | 不合并;保留安全排队策略 |
|
|
11
|
+
| [#7](https://github.com/PianoPrince/dsh-workspace-mover/pull/7) | Arrosam | `689088a331c762af9f9bca721834e3238af4faec` | 本地整合,收紧缺失审批的处理 |
|
|
12
|
+
| [#8](https://github.com/PianoPrince/dsh-workspace-mover/pull/8) | Arrosam | `978b7f55c6a346b0641e6e7b1fd634ab91bc14aa` | 本地整合,仅吞 ENOENT |
|
|
13
|
+
| [#9](https://github.com/PianoPrince/dsh-workspace-mover/pull/9) | lsb0554 | `1dad18ebf8d43eb73edf0ca1b600b228da00c0c1` | 本地整合,补滚动停止与卸载释放 |
|
|
14
|
+
|
|
15
|
+
实施结束时通过 `git ls-remote` 再次确认,四个 Head 均未变化。原始提交已保留在本地 `refs/remotes/review/pr-N`,未改写贡献者分支。
|
|
16
|
+
|
|
17
|
+
## 代码安全审查
|
|
18
|
+
|
|
19
|
+
审查覆盖四个 PR 相对其 merge-base 的完整改动,包括生产代码、测试、文档和 package 脚本。未发现明显恶意代码或新增的外传请求、凭据读取、动态代码执行、子进程调用、混淆载荷。四个 PR 均未修改 CI/发布工作流,未新增依赖或安装生命周期脚本;#7 的 package 改动只增加测试入口。新增测试中的文件读写、环境变量和递归清理均围绕独立临时夹具目录。
|
|
20
|
+
|
|
21
|
+
发现并修正的实际风险:
|
|
22
|
+
|
|
23
|
+
- #6 重绑定失败时仍继续搬文件,且缺少宿主写入链的互斥;本次不采用其内部句柄重绑定实现。
|
|
24
|
+
- #7 移除必需审批服务注入后,旧的“服务缺失直接执行”分支变得可达。本次改为需要审批时拒绝执行;不允许缺失调用方会话却从全局策略推断完全访问。完全访问改名免审批、登记已有目录免审批保留。迁移和修复未新增完全访问豁免。
|
|
25
|
+
- #8 原实现使用吞掉所有 stat 错误的辅助函数,会将权限/I/O 故障显示为空库;改为直接读取,只把 ENOENT 视为空。
|
|
26
|
+
- #9 补齐横纵范围、滚动边界、dragend/drop/dragleave 和热卸载取消动画,避免侧栏外继续滚动或旧闭包持续排帧。
|
|
27
|
+
|
|
28
|
+
上述为指定版本的静态审查与运行检查结论。PR 后续更新时需复核新增差异。
|
|
29
|
+
|
|
30
|
+
## Issue #5 实现
|
|
31
|
+
|
|
32
|
+
- 驻留会话、JSONL tracker 中打开中(值为 null)或关闭中的 writer、旧 coordinator 中的句柄都阻止物理搬移。
|
|
33
|
+
- 未知 handle 后端或无法读取的写入状态暂停并进入队列;不把未知状态当成安全。
|
|
34
|
+
- 冷迁移前 flush 并重新检查。detach 后再检查,忙碌时恢复归属并保持可重试的 busy 错误码。
|
|
35
|
+
- 最后一次写入状态检查到 header 改写、目录移动和目标字节验证之间不让出 JavaScript 执行权,避免 await 引入的同进程写入竞态。
|
|
36
|
+
- 保留此前未提交的工作目录事件、投影失效、备份代际、标题和 Bundle 版本修复。
|
|
37
|
+
- 私有 tracker/coordinator 仅用于读取占用状态,不修改 writer/header。宿主改变内部结构时可能暂停迁移,需通过自检确认兼容性;没有承诺未知后端立即迁移。
|
|
38
|
+
|
|
39
|
+
## 已完成验证
|
|
40
|
+
|
|
41
|
+
- Windows / Node `22.23.2`:`npm run check` 通过,315 项测试全部通过,语法和 npm 打包预检通过。
|
|
42
|
+
- `git diff --check` 通过。
|
|
43
|
+
- 使用已安装 Desktop 的 DSH `0.2.1-rc.2` 和 Cordis `4.0.5`,在独立临时目录运行 `test/installed-host.test.mjs`,1 项通过。实际加载官方 Cordis、ToolRuntime、JSONL 和 Windows 原生锁实现,未替换持久化 writer。
|
|
44
|
+
- 真实后端检查:缺少 tools/approval 时 RPC 仍挂载;tools 服务装卸更新能力位;打开 writer 时请求迁移不改源文件;继续追加、缓冲 live 事件;关闭时排空;重新加载插件和后端后持久化队列自动完成;新路径重新打开可追加;重复重试不重复写;再加载后历史仍可读。
|
|
45
|
+
- 自动检查还覆盖回滚、v3/v4 与 plain/Zstd、缺失根目录、EACCES/EIO/ENOTDIR、创建/改名冲突和审批拒绝、自动滚动停止与热卸载。
|
|
46
|
+
|
|
47
|
+
可选真实后端检查通过 `DSH_TEST_NODE_MODULES` 指向已有宿主依赖,再运行 `npm run test:installed-host`。未设置变量时明确 skip,不用模拟结果冒充真实后端通过。依赖提取脚本与结果保留在 `E:\DeepSeekHarness\data\pr-review-20261022`;不读用户凭据、不改 Desktop 安装。
|
|
48
|
+
|
|
49
|
+
## 交付阶段
|
|
50
|
+
|
|
51
|
+
1. 用户已完成真实 UI 拖动、发送消息、两次进程重启、工作目录与改名验收,详见 [Desktop 验收记录](issue-5-desktop-acceptance-2026-10-22.md)。自动滚动人工验收由用户明确跳过。
|
|
52
|
+
2. 用户确认后,再提交修复,依次处理 #8、#9、#7 的合并冲突和修正;保留贡献者来源,#6 保持开放。
|
|
53
|
+
3. 合并后最终提交通过仓库现有跨平台 CI(Linux/macOS/Windows × Node 22/24)。当前只有本地 Windows 结果。
|
|
54
|
+
4. 正式版本改为 `2.4.0`,更新发布说明并重新验证版本相关输出,随后发布 GitHub/npm。最终记录提交、合并与发布链接。
|
|
55
|
+
|
|
56
|
+
用户已明确授权在上述验收结果基础上提交、合并和发布。既有未跟踪 `issue_page.html` 属于历史工作,本次保留,不纳入发布文件。
|