dsh-workspace-mover 2.1.0 → 2.2.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/README.md CHANGED
@@ -1,267 +1,325 @@
1
- # dsh-workspace-mover
2
-
3
- **_> 非官方项目,由社区成员独立开发和维护。_**
4
-
5
- <!-- Hero -->
6
- <div align="center">
7
- <b style="font-size: 1.15em;">在侧边栏把会话拖到另一个工作区——真迁移原始档案,而不是复制</b><br /><br />
8
- <p style="font-size: 0; line-height: 1;">
9
- <a href="https://github.com/PianoPrince/dsh-workspace-mover/actions/workflows/test.yml"><img alt="CI" src="https://github.com/PianoPrince/dsh-workspace-mover/actions/workflows/test.yml/badge.svg" style="height:20px; margin:0 2px;" /></a>
10
- <a href="https://www.npmjs.com/package/dsh-workspace-mover"><img alt="npm version" src="https://img.shields.io/npm/v/dsh-workspace-mover" style="height:20px; margin:0 2px;" /></a>
11
- <img alt="plugin version" src="https://img.shields.io/badge/dsh--plugin-2.1.0-4d6bfe" style="height:20px; margin:0 2px;" />
12
- <img alt="DSH engines" src="https://img.shields.io/badge/DSH-%E2%89%A50.1.5--rc.1-339933" style="height:20px; margin:0 2px;" />
13
- <a href="https://github.com/PianoPrince/dsh-workspace-mover/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/PianoPrince/dsh-workspace-mover" style="height:20px; margin:0 2px;" /></a>
14
- <a href="./LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-yellow.svg" style="height:20px; margin:0 2px;" /></a>
15
- <img alt="Node" src="https://img.shields.io/badge/Node-%E2%89%A522-339933" style="height:20px; margin:0 2px;" />
16
- <img alt="npm 依赖:0" src="https://img.shields.io/badge/npm%20%E4%BE%9D%E8%B5%96-0-4d6bfe" style="height:20px; margin:0 2px;" />
17
- <a href="https://awesome-dsh-plugin.com"><img alt="Awesome DSH Plugin" src="https://awesome-dsh-plugin.com/badge.svg" style="height:20px; margin:0 2px;" /></a>
18
- </p>
19
- <p style="font-size: 0; line-height: 1;">
20
- <img alt="真迁移" src="https://img.shields.io/badge/-真迁移-4d6bfe" style="height:20px; margin:0 2px;" />
21
- <img alt="零 token 消耗" src="https://img.shields.io/badge/-零%20token%20消耗-4d6bfe" style="height:20px; margin:0 2px;" />
22
- <img alt="备份回滚" src="https://img.shields.io/badge/-备份回滚-4d6bfe" style="height:20px; margin:0 2px;" />
23
- <img alt="GitHub clones observed(含 unique)" src="https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FPianoPrince%2Fc14345658550a4a308570acfbaf9d170%2Fraw%2Fwsm-clones-total.json" style="height:20px; margin:0 2px;" />
24
- <!-- release-downloads-badge:start --><!-- release-downloads-badge:end -->
25
- </p>
26
- </div>
27
-
28
- <div align="center">
29
- 🌏 中文 · <a href="./README_EN.md">English</a>
30
- </div>
31
-
32
- ## 📑 目录
33
-
34
- - [✨ 功能](#-功能)
35
- - [🚀 安装](#-安装)
36
- - [🖼️ 特性巡礼](#️-特性巡礼)
37
- - [⌨️ 使用](#️-使用)
38
- - [🔌 如何接入 DSH](#-如何接入-dsh)
39
- - [🤝 与其他插件共存](#-与其他插件共存)
40
- - [🧩 兼容性与卸载](#-兼容性与卸载)
41
- - [🔐 安全承诺](#-安全承诺)
42
- - [⚠️ 已知限制](#️-已知限制)
43
- - [🆕 最近版本](#-最近版本)
44
-
45
- ---
46
-
47
- ## ✨ 功能
48
-
49
- DeepSeek Harness 侧边栏可以拖拽排序**同一工作区**内的会话,但拖到**另一个工作区**上会被静默忽略。本插件补上跨工作区迁移:
50
-
51
- - **🖱️ 拖拽迁移**:把空闲会话行拖到目标工作区标题行,确认后完成移动
52
- - **📦 批量迁移 / 分组合并**:Ctrl/Shift 多选后整批拖移,或用组标题「⋯」菜单「整组迁移…」;源分组清空后可一键删除,两条命令完成合并(单批至多 50 个,失败互不牵连)
53
- - **🚚 真迁移 · 零 token**:会话 ID 与完整历史原样保留,不复制副本、不重新注入上下文
54
- - **🏠 工作区搬家向导**:项目文件夹被移动/改名后,一键把失效分组原地重定向到新位置;id、标题、排序、归档位保持,名下会话连同旧路径散件一起迁移
55
- - **🛟 会话救援**(设置 → 会话救援):一键找回「失联」「未记账」「挂错分组」的会话;已归档会话可恢复;支持一键修复与筛选
56
- - **🗑️ 回收站与备份**:删除先进回收站,可还原到原位置或任意分组;迁移自动生成备份,可按会话恢复或清理
57
- - **⏪ 移动历史与撤回**:记录最近 100 次跨工作区移动,批量聚合为一条,整批可一键撤回
58
- - **📂 空分组清理 / 打开文件夹**:只列出真正零成员的工作区;组菜单可直达系统文件管理器
59
- - **🤖 Agent 工具**:`mover_list_sessions` / `mover_move_session` / `mover_repair_sessions` 三个模型可调用工具——在对话里说「把这个会话挪到某组」即可触发与面板完全相同的备份回滚管线;迁移与修复执行前经宿主审批弹窗确认,未装 dsh-tools 的宿主自动停用
60
-
61
- ## 🚀 安装
62
-
63
- ```bash
64
- dsh plugin --profile web add "github:PianoPrince/dsh-workspace-mover"
65
- # 重启 dsh web 一次
66
- ```
67
-
68
- > **零构建授权**:纯 JavaScript 源码即产物(无 TypeScript、无构建步骤)。从 GitHub 安装时**不需要** `allowBuilds` 构建授权。
69
-
70
- <details>
71
- <summary><b>npm 渠道</b></summary>
72
-
73
- ```bash
74
- dsh plugin --profile web add dsh-workspace-mover
75
- ```
76
-
77
- </details>
78
-
79
- <details>
80
- <summary><b>本地开发安装</b></summary>
81
-
82
- ```bash
83
- dsh plugin --profile web add "link:C:/path/to/dsh-workspace-mover"
84
- ```
85
-
86
- </details>
87
-
88
- <details>
89
- <summary><b>桌面版安装(DSH v0.2 桌面客户端)</b></summary>
90
-
91
- 1. 安装并打开官方桌面版,左侧进入「插件」页;
92
- 2. 点右上角「添加插件」,搜索 `dsh-workspace-mover` 安装并启用;
93
- 3. 完成——桌面 profile 与 web profile 相互独立,需要各自安装一次。
94
-
95
- > 桌面 profile 由 Electron 应用专属管理(独立 CLI 不接受 `--profile desktop`),请以应用内插件页为准。
96
-
97
- </details>
98
-
99
- <details>
100
- <summary><b>常见问题</b></summary>
101
-
102
- | 现象 | 原因与解决 |
103
- |---|---|
104
- | 拖了但没反应 | 请在**分组视图**把会话行拖到**工作区标题行**;「扁平列表」视图没有标题行,本插件在该视图不激活 |
105
- | 提示会话正在运行中 | 等该会话回合结束再拖即可 |
106
- | 移动失败的 toast | 操作前有自动备份、失败会回滚;按提示处理后重试。详细原因见宿主日志中的 `MOVE FAILED` |
107
- | 移动成功但侧边栏没归位 | 刷新页面即可 |
108
- | 有些会话从侧边栏不见了 | 打开 **设置 → 会话救援** 自动扫描并找回 |
109
-
110
- </details>
111
-
112
- ## 🖼️ 特性巡礼
113
-
114
- > 以下均为真实界面实拍(点击可放大)。
115
-
116
- ### 拖拽跨工作区迁移
117
-
118
- | | |
119
- |---|---|
120
- | **把空闲会话行拖到目标工作区标题行,出现虚线高亮** | **确认框亮出目标工作区路径,一键移动** |
121
- | ![把一个会话拖到另一个工作区](docs/media/drag_session_to_another_workspace.png) | ![跨工作区移动确认框](docs/media/confirm_popup.png) |
122
- | **设置 → 会话救援:一键找回失联与未记账的会话** | |
123
- | ![会话救援设置面板](docs/media/setting_dialogue_repair.png) | |
124
-
125
- ### 批量迁移 · 多选拖拽
126
-
127
- | |
128
- |---|
129
- | **Ctrl+点击选中多个会话(当前打开的会话自动带上),左下角亮出计数徽章;拖到目标工作区标题行即整批移动,Esc 清空** |
130
- | ![批量移动选中时:三个会话高亮,左下角显示已选计数徽章](docs/media/batch_move_selection.png) |
131
- | **组标题「⋯」菜单里的「整组迁移…」:整组搬移,迁入后可删除已空的源分组(分组合并)** |
132
- | ![组标题菜单中的整组迁移入口](docs/media/workspace_move.png) |
133
-
134
- ### 工作区搬家向导 · 实测全程
135
-
136
- 以下为一次真实搬家的完整记录:把 `Test1` 文件夹改名为 `Test2` 后,用向导原地修复工作区。
137
-
138
- | | |
139
- |---|---|
140
- | **改名前:`Test1` 分组正常工作** | **改名后侧边栏仍显示旧分组(磁盘上文件夹已不在)** |
141
- | ![改名前的工作区](docs/media/original_workspace.png) | ![改名后的工作区](docs/media/workspace_after_rename.png) |
142
- | **打开设置 → 会话修复:「工作区体检」把分组标为「路径失效」,填入新路径** | **确认框亮出起讫路径与将要迁移的会话数** |
143
- | ![工作区体检面板](docs/media/workspace_examination.png) | ![搬家确认弹窗](docs/media/remove_popup.png) |
144
- | **搬家完成:分组原地更名为 Test2,会话与历史原样保留** | |
145
- | ![搬家后的工作区](docs/media/workspace_after_move.png) | |
146
-
147
- ## ⌨️ 使用
148
-
149
- ### 拖拽跨工作区迁移
150
-
151
- 1. 重启后在侧边栏**分组视图**里,按住任意空闲会话行;
152
- 2. 拖到目标工作区的标题行(出现虚线高亮)松手;
153
- 3. 确认框显示目标工作区路径 → 点「移动」;
154
- 4. 完成 toast 提示;若侧边栏未自动刷新,手动刷新页面即可。
155
-
156
- 运行中的会话会被拒绝;移动失败会自动回滚并在 toast 中说明原因。
157
-
158
- ### 会话救援面板
159
-
160
- 1. 重启后打开 **设置 → 会话救援**,面板自动完成首次扫描;
161
- 2. **失联**行:选目标工作区 → 点「迁移过去」;
162
- 3. **未记账**行:点「补挂账」原地挂到路径匹配的工作区;
163
- 4. **挂错分组**行:点「归位」或「全部归位」;
164
- 5. **一键修复**:自动跑完可修复项,失败项隔离;
165
- 6. 支持按标题 / 会话 ID / 路径 / 分组筛选;
166
- 7. **已归档 / 回收站 / 备份**:归档可恢复;删除进回收站,可还原或确认后彻底删除;迁移备份可恢复或清理。
167
-
168
- ### 对话里迁移(Agent 工具)
169
-
170
- 1. 装有 `dsh-tools` 的宿主(web 默认)自动注册三个模型工具:清单(只读)、迁移、一键修复;
171
- 2. 在对话里说「列出我的会话」「把会话 X 挪到 Y 组」「跑一次修复」——模型先用清单工具把名字解析成精确 id,再执行动作;
172
- 3. 迁移与修复在动手前经宿主审批弹窗请你确认(与面板确认同级);拒绝或关闭弹窗则不执行;
173
- 4. 宿主没有 `dsh-tools` 时自动停用,不影响面板与拖拽。
174
-
175
- ### 批量迁移
176
-
177
- 1. **Ctrl/Cmd+点击**加入多选,**Shift+点击**组内范围选择,**Esc** 清空;
178
- 2. 拖任一选中行到目标工作区标题行 →「全部移动」;
179
- 3. 或用 **「⋯」菜单 →「整组迁移…」**;源分组清空时可确认后删除(分组合并)。
180
-
181
- ### 工作区搬家向导
182
-
183
- 1. 文件夹被移动/改名后,**工作区体检**会把对应分组标为「路径失效」;
184
- 2. 填入文件夹现在的完整路径,点「搬家」;
185
- 3. 确认起讫路径与会话数量后执行;运行中的会话本次跳过,结束后可续跑剩余部分。
186
-
187
- ## 🔌 如何接入 DSH
188
-
189
- 本插件面向使用者只承诺以下接入原则(实现细节见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)):
190
-
191
- 1. 使用 DSH **官方扩展点**挂载,不修改 DSH 或 dsh-market 的安装文件;
192
- 2. 会话归属变更走宿主提供的**正式接口**,不伪造持久化数据;
193
- 3. 插件自有数据(历史、备份、回收站)写在**独立数据目录**,与会话档案分开;
194
- 4. 与官方侧边栏同组排序**互不干扰**,只处理跨工作区场景。
195
-
196
- ## 🤝 与其他插件共存
197
-
198
- 设计上按「与生态共生」标准实现,冲突面很小:通信与样式使用独立命名空间;不改写官方安装文件;会话归属写入使用宿主正式接口。
199
-
200
- | 同装插件类目 | 兼容性 | 说明 |
201
- | --- | --- | --- |
202
- | 侧边栏增强 / better-sidebar / 终端 / 费用统计 / 记忆 / 导出分享 | ✅ 无冲突 | 面板与数据面完全不同 |
203
- | 归档管理类插件 | ✅ 兼容 | 双方都使用官方归档数据,数据层一致(面板功能可能有些重复) |
204
- | 排序 / 置顶类插件 | ⚠️ 基本兼容 | 移动后会精确重排「最近更新」;与置顶/排序插件并存通常无碍,仅各自面板展示顺序可能不完全一致 |
205
- | 重画侧边栏的插件(自绘工作区树) | ⚠️ 降级共存 | 对方若替换官方侧边栏结构,本插件可能暂时无法识别会话行——表现为功能不触发,**不会损坏数据** |
206
- | 其他会话移动器 | ❌ 建议二选一 | 同类插件可能重复处理同一次拖拽;本插件已覆盖移动 / 批量 / 合并 / 归位 / 归档恢复 |
207
-
208
- ## 🧩 兼容性与卸载
209
-
210
- ### 版本兼容矩阵
211
-
212
- | 插件版本 | 已验证 DeepSeek Harness | Node | 备注 |
213
- |----------|-------------------------|------|------|
214
- | 2.1.0 | `0.1.5-rc.1`、`0.1.5-rc.2`、**`0.2.0 桌面版`**(0.2.0-rc.2 内核) | `≥22` | Agent 工具 + 桌面版实测(拖拽迁移、确认框、热重载修复);宿主缺 `dsh-tools` 时工具自动停用 |
215
- | 2.0.3 | `0.1.5-rc.1`、`0.1.5-rc.2` | `≥22` | 真迁移 / 批量 / 救援 / 回收站 / 备份;首次发布 npm |
216
- | — | `0.2.0 web`(0.2.0-rc.2) | `≥22` | 与桌面版同内核,已按同一代码路径适配;web 启动场景待回归 |
217
-
218
- - **engines 声明**:`package.json` → `engines.dsh` ≥ `0.1.5-rc.1`,`engines.node` ≥ `22`(与 CI 矩阵 Node 22/24 一致)。
219
- - **其他已知组合**:dsh-market `1.45.1`。不修改 DSH 源码,仅通过官方扩展点接入。
220
- - **质量门禁**:提交前运行 `npm run check`(语法检查 + 测试 + `npm pack --dry-run`);CI 在 ubuntu / windows / macos × Node 22/24 上执行同等步骤。
221
- - **市场卡片的「宿主要求未知」**:GitHub-only 插件没有 npm 发布清单时,dsh-market 可能无法从远端元数据推导宿主版本;显示「未知」**不代表**运行时不兼容。
222
- - **卸载可逆**:移除插件不会删除会话档案、工作区或官方记账。插件自己的历史、任务、备份和回收站数据仍保留在插件数据目录(见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md));移除后刷新或重启 DSH 即可清理注入的界面。
223
- - **共存建议**:不要与另一个跨工作区拖拽移动器同时启用;其他类型插件可按上表共存。
224
-
225
- 部分高级操作依赖较新的 DSH 能力;不支持时界面会明确提示,而不是静默失败。
226
-
227
- ## 🔐 安全承诺
228
-
229
- - **移动前自动备份**;搬运落地后再核对会话身份与路径,不符则整体回退;
230
- - **失败时恢复到移动前状态**(文件与记账一并恢复);
231
- - **删除先进回收站**,可还原到原位置或任意分组;彻底删除需二次确认;
232
- - **无法自动恢复时**,会在救援面板明确标出,需要人工确认;会话文件与备份始终保留,**绝不静默丢弃**;
233
- - **近期打开过、仍驻留在 Harness 内存中的会话**不能直接删除,需重启 Harness 后再删(界面会给出明确提示)。
234
-
235
- > 失败路径优先保数据,不静默丢会话。<br>
236
- > 并非「任何错误都能自动恢复」:极端情况下会要求人工处理,但数据会留在原处。
237
-
238
- ## ⚠️ 已知限制
239
-
240
- - 不支持把会话移入「Ungrouped」桶;
241
- - 常驻内存的会话(近期打开过)不能直接删除,请重启 Harness 后再删;
242
- - 若第三方插件整页重绘侧边栏,本插件可能暂时无法识别会话行(功能不触发,**不损坏数据**);
243
- - 「扁平列表」视图无工作区标题行,本插件在该视图不激活;
244
- - 宿主大版本升级若改变内部结构,相关能力可能降级或需重启后生效;搬家向导在无法安全写入时会在改动任何文件之前中止并提示。
245
-
246
- ## 🆕 最近版本
247
-
248
- ### v2.1.0 · 2026-10-04
249
-
250
- - Agent 工具:`mover_list_sessions`(只读清单)/ `mover_move_session`(迁移单个会话)/ `mover_repair_sessions`(一键修复)注册进官方 `dsh-tools`,在对话里即可调用
251
- - 变更类工具执行前经宿主审批接缝请用户确认:拒绝 / 关闭 / 无应答一律不执行(fail-closed)
252
- - 与面板共用同一条加锁、先备份、迁移后校验的管线;无 `dsh-tools` 宿主自动跳过注册
253
- - 桌面版(0.2)实测通过:修复热重载后「inactive context」移动报错;确认框改为不透明,不再与底层文字重叠
254
- - `mover.status` 新增 `agentTools` 能力位
255
-
256
- ### v2.0.3 · 2026-09-21
257
-
258
- - 首次发布到 npm:`dsh plugin --profile web add dsh-workspace-mover`
259
- - 本地质量门禁 `npm run check`;CI 与之对齐
260
- - README 增加 npm / DSH 徽章与宿主兼容矩阵
261
-
262
- 完整变更记录见 [CHANGELOG.md](CHANGELOG.md)。<br>
263
- 实现与架构说明见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。
264
-
265
- ## License
266
-
267
- MIT
1
+ # dsh-workspace-mover
2
+
3
+ > [!IMPORTANT]
4
+ > 非官方项目,由社区成员独立开发和维护。
5
+
6
+ <!-- Hero -->
7
+ <div align="center">
8
+ <b style="font-size: 1.15em;">在侧边栏把会话拖到另一个工作区——真迁移原始档案,而不是复制</b><br /><br />
9
+ <p style="font-size: 0; line-height: 1;">
10
+ <a href="https://github.com/PianoPrince/dsh-workspace-mover/actions/workflows/test.yml"><img alt="CI" src="https://github.com/PianoPrince/dsh-workspace-mover/actions/workflows/test.yml/badge.svg" style="height:20px; margin:0 2px;" /></a>
11
+ <a href="https://www.npmjs.com/package/dsh-workspace-mover"><img alt="npm version" src="https://img.shields.io/npm/v/dsh-workspace-mover" style="height:20px; margin:0 2px;" /></a>
12
+ <img alt="plugin version" src="https://img.shields.io/badge/dsh--plugin-2.2.0-4d6bfe" style="height:20px; margin:0 2px;" />
13
+ <img alt="DSH tested 0.2.0-rc.2" src="https://img.shields.io/badge/DSH_tested-0.2.0--rc.2-4c8dff" style="height:20px; margin:0 2px;" />
14
+ <img alt="Node" src="https://img.shields.io/badge/Node-%E2%89%A522-339933" style="height:20px; margin:0 2px;" />
15
+ </p>
16
+ <p style="font-size: 0; line-height: 1;">
17
+ <a href="https://github.com/PianoPrince/dsh-workspace-mover/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/PianoPrince/dsh-workspace-mover" style="height:20px; margin:0 2px;" /></a>
18
+ <a href="./LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/License-MIT-yellow.svg" style="height:20px; margin:0 2px;" /></a>
19
+ <a href="https://awesome-dsh-plugin.com"><img alt="Awesome DSH Plugin" src="https://awesome-dsh-plugin.com/badge.svg" style="height:20px; margin:0 2px;" /></a>
20
+ <a href="https://www.dsh.so/artifact/dsh-workspace-mover/"><img alt="dsh.so risk: low" src="https://www.dsh.so/badge/dsh-workspace-mover.svg" style="height:20px; margin:0 2px;" /></a>
21
+ <img alt="真迁移" src="https://img.shields.io/badge/-真迁移-4d6bfe" style="height:20px; margin:0 2px;" />
22
+ <img alt="零 token 消耗" src="https://img.shields.io/badge/-零%20token%20消耗-4d6bfe" style="height:20px; margin:0 2px;" />
23
+ <img alt="备份回滚" src="https://img.shields.io/badge/-备份回滚-4d6bfe" style="height:20px; margin:0 2px;" />
24
+ </p>
25
+ <p style="font-size: 0; line-height: 1;">
26
+ <img alt="GitHub clones observed(自 2026-08-25 累计,含 unique)" src="https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2FPianoPrince%2Fc14345658550a4a308570acfbaf9d170%2Fraw%2Fwsm-clones-total.json" style="height:20px; margin:0 2px;" />
27
+ <!-- release-downloads-badge:start --><!-- release-downloads-badge:end -->
28
+ </p>
29
+ </div>
30
+
31
+ <div align="center">
32
+ 🌏 中文 · <a href="./README_EN.md">English</a>
33
+ </div>
34
+
35
+ ## 📑 目录
36
+
37
+ - [✨ 功能](#-功能)
38
+ - [🚀 安装](#-安装)
39
+ - [🖼️ 特性巡礼](#️-特性巡礼)
40
+ - [⌨️ 使用](#️-使用)
41
+ - [🔌 如何接入 DSH](#-如何接入-dsh)
42
+ - [🤝 与其他插件共存](#-与其他插件共存)
43
+ - [🧩 兼容性与卸载](#-兼容性与卸载)
44
+ - [🔐 安全台账](#-安全台账safety-ledger)
45
+ - [⚠️ 已知限制](#️-已知限制)(含 [可调策略](#-可调策略环境变量))
46
+ - [🆕 最近版本](#-最近版本)
47
+
48
+ ---
49
+
50
+ ## ✨ 功能
51
+
52
+ DeepSeek Harness 侧边栏可以拖拽排序**同一工作区**内的会话,但拖到**另一个工作区**上会被静默忽略。本插件补上跨工作区迁移:
53
+
54
+ - **🖱️ 拖拽迁移**:把空闲会话行拖到目标工作区标题行,确认后完成移动
55
+ - **📦 批量迁移 / 分组合并**:Ctrl/Shift 多选后整批拖移,或用组标题「⋯」菜单「整组迁移…」;源分组清空后可一键删除,两条命令完成合并(单批至多 50 个,失败互不牵连)
56
+ - **🚚 真迁移 · 零 token**:会话 ID 与完整历史原样保留,不复制副本、不重新注入上下文
57
+ - **🏠 工作区搬家向导**:项目文件夹被移动/改名后,一键把失效分组原地重定向到新位置;id、标题、排序、归档位保持,名下会话连同旧路径散件一起迁移
58
+ - **🛟 会话救援**(设置 → 会话救援):一键找回「失联」「未记账」「挂错分组」的会话;已归档会话可恢复;支持一键修复与筛选
59
+ - **🗑️ 回收站与备份**:删除先进回收站,可还原到原位置或任意分组;迁移自动生成备份,可按会话恢复或清理
60
+ - **🛡️ 数据保护**:回收站与备份的份数/占用一屏可见;「清理 30 天前数据」先预览释放量,确认后执行
61
+ - **⏪ 移动历史与撤回**:记录最近 100 次跨工作区移动,批量聚合为一条,整批可一键撤回
62
+ - **🧾 迁移任务中心**:批量迁移逐项持久化记录(完成/失败、最后错误与尝试时间),失败项一键重试——按会话当前位置重新迁移,不用陈旧路径
63
+ - **📂 空分组清理 / 打开文件夹**:只列出真正零成员的工作区;组菜单可直达系统文件管理器
64
+ - **🤖 Agent 工具**:`mover_list_sessions` / `mover_move_session` / `mover_repair_sessions` / `mover_doctor` 四个模型可调用工具——在对话里说「把这个会话挪到某组」即可触发与面板完全相同的备份回滚管线;迁移与修复执行前经宿主审批弹窗确认,未装 dsh-tools 的宿主自动停用
65
+
66
+ ## 🚀 安装
67
+
68
+ ```bash
69
+ dsh plugin --profile web add "github:PianoPrince/dsh-workspace-mover"
70
+ # 重启 dsh web 一次
71
+ ```
72
+
73
+ > **零构建授权**:纯 JavaScript 源码即产物(无 TypeScript、无构建步骤)。从 GitHub 安装时**不需要** `allowBuilds` 构建授权。
74
+
75
+ <details>
76
+ <summary><b>npm 渠道</b></summary>
77
+
78
+ ```bash
79
+ dsh plugin --profile web add dsh-workspace-mover
80
+ ```
81
+
82
+ </details>
83
+
84
+ <details>
85
+ <summary><b>本地开发安装</b></summary>
86
+
87
+ ```bash
88
+ dsh plugin --profile web add "link:C:/path/to/dsh-workspace-mover"
89
+ ```
90
+
91
+ </details>
92
+
93
+ <details>
94
+ <summary><b>桌面版安装(DSH v0.2 桌面客户端)</b></summary>
95
+
96
+ 1. 安装并打开官方桌面版,左侧进入「插件」页;
97
+ 2. 点右上角「添加插件」,搜索 `dsh-workspace-mover` 安装并启用;
98
+ 3. 完成——桌面 profile 与 web profile 相互独立,需要各自安装一次。
99
+
100
+ > 桌面 profile 由 Electron 应用专属管理(独立 CLI 不接受 `--profile desktop`),请以应用内插件页为准。
101
+
102
+ </details>
103
+
104
+ <details>
105
+ <summary><b>常见问题</b></summary>
106
+
107
+ | 现象 | 原因与解决 |
108
+ |---|---|
109
+ | 拖了但没反应 | 请在**分组视图**把会话行拖到**工作区标题行**;「扁平列表」视图没有标题行,本插件在该视图不激活 |
110
+ | 提示会话正在运行中 | 等该会话回合结束再拖即可 |
111
+ | 移动失败的 toast | 操作前有自动备份、失败会回滚;按提示处理后重试。详细原因见宿主日志中的 `MOVE FAILED` |
112
+ | 移动成功但侧边栏没归位 | 刷新页面即可 |
113
+ | 有些会话从侧边栏不见了 | 打开 **设置 → 会话救援** 自动扫描并找回 |
114
+ | 升级 DSH 0.2 后,旧会话切换模型报 `Unknown agent preset` | 0.2 不再读取 0.1.x 旧格式的自定义预设目录,需迁移为声明行——与插件无关,完整步骤见 [docs/dsh-0.2-preset-migration.md](docs/dsh-0.2-preset-migration.md) |
115
+
116
+ </details>
117
+
118
+ ## 🖼️ 特性巡礼
119
+
120
+ > 以下均为真实界面实拍(点击可放大)。
121
+
122
+ ### 拖拽跨工作区迁移
123
+
124
+ | | |
125
+ |---|---|
126
+ | **把空闲会话行拖到目标工作区标题行,出现虚线高亮** | **确认框亮出目标工作区路径,一键移动** |
127
+ | ![把一个会话拖到另一个工作区](docs/media/drag_session_to_another_workspace.png) | ![跨工作区移动确认框](docs/media/confirm_popup.png) |
128
+ | **设置 → 会话救援:一键找回失联与未记账的会话** | |
129
+ | ![会话救援设置面板](docs/media/setting_dialogue_repair.png) | |
130
+
131
+ ### 批量迁移 · 多选拖拽
132
+
133
+ | |
134
+ |---|
135
+ | **Ctrl+点击选中多个会话(当前打开的会话自动带上),左下角亮出计数徽章;拖到目标工作区标题行即整批移动,Esc 清空** |
136
+ | ![批量移动选中时:三个会话高亮,左下角显示已选计数徽章](docs/media/batch_move_selection.png) |
137
+ | **组标题「⋯」菜单里的「整组迁移…」:整组搬移,迁入后可删除已空的源分组(分组合并)** |
138
+ | ![组标题菜单中的整组迁移入口](docs/media/workspace_move.png) |
139
+
140
+ ### 工作区搬家向导 · 实测全程
141
+
142
+ 以下为一次真实搬家的完整记录:把 `Test1` 文件夹改名为 `Test2` 后,用向导原地修复工作区。
143
+
144
+ | | |
145
+ |---|---|
146
+ | **改名前:`Test1` 分组正常工作** | **改名后侧边栏仍显示旧分组(磁盘上文件夹已不在)** |
147
+ | ![改名前的工作区](docs/media/original_workspace.png) | ![改名后的工作区](docs/media/workspace_after_rename.png) |
148
+ | **打开设置 → 会话修复:「工作区体检」把分组标为「路径失效」,填入新路径** | **确认框亮出起讫路径与将要迁移的会话数** |
149
+ | ![工作区体检面板](docs/media/workspace_examination.png) | ![搬家确认弹窗](docs/media/remove_popup.png) |
150
+ | **搬家完成:分组原地更名为 Test2,会话与历史原样保留** | |
151
+ | ![搬家后的工作区](docs/media/workspace_after_move.png) | |
152
+
153
+ ## ⌨️ 使用
154
+
155
+ ### 拖拽跨工作区迁移
156
+
157
+ 1. 重启后在侧边栏**分组视图**里,按住任意空闲会话行;
158
+ 2. 拖到目标工作区的标题行(出现虚线高亮)松手;
159
+ 3. 确认框显示目标工作区路径 → 点「移动」;
160
+ 4. 完成 toast 提示;若侧边栏未自动刷新,手动刷新页面即可。
161
+
162
+ 运行中的会话会被拒绝;移动失败会自动回滚并在 toast 中说明原因。
163
+
164
+ ### 会话救援面板
165
+
166
+ 1. 重启后打开 **设置 → 会话救援**,面板自动完成首次扫描;
167
+ 2. **失联**行:选目标工作区 → 点「迁移过去」;
168
+ 3. **未记账**行:点「补挂账」原地挂到路径匹配的工作区;
169
+ 4. **挂错分组**行:点「归位」或「全部归位」;
170
+ 5. **一键修复**:自动跑完可修复项,失败项隔离;
171
+ 6. 支持按标题 / 会话 ID / 路径 / 分组筛选;
172
+ 7. **已归档 / 回收站 / 备份**:归档可恢复;删除进回收站,可还原或确认后彻底删除;迁移备份可恢复或清理。
173
+
174
+ ### 对话里迁移(Agent 工具)
175
+
176
+ 1. 装有 `dsh-tools` 的宿主(web 与桌面版默认)自动注册四个模型工具:清单与会话清单(只读)、迁移、一键修复、自检(只读);
177
+ 2. 在对话里说「列出我的会话」「把会话 X 挪到 Y 组」「跑一次修复」「自检一下」——模型先用清单工具把名字解析成精确 id,再执行动作;
178
+ 3. 迁移与修复在动手前经宿主审批弹窗请你确认(与面板确认同级);拒绝或关闭弹窗则不执行;两个只读工具(清单 / 自检)不弹确认;
179
+ 4. 宿主没有 `dsh-tools` 时自动停用,不影响面板与拖拽。
180
+
181
+ ### 批量迁移
182
+
183
+ 1. **Ctrl/Cmd+点击**加入多选,**Shift+点击**组内范围选择,**Esc** 清空;
184
+ 2. 拖任一选中行到目标工作区标题行 →「全部移动」;
185
+ 3. 或用 **「⋯」菜单 →「整组迁移…」**;源分组清空时可确认后删除(分组合并)。
186
+
187
+ ### 工作区搬家向导
188
+
189
+ 1. 文件夹被移动/改名后,**工作区体检**会把对应分组标为「路径失效」;
190
+ 2. 填入文件夹现在的完整路径,点「搬家」;
191
+ 3. 确认起讫路径与会话数量后执行;运行中的会话本次跳过,结束后可续跑剩余部分。
192
+
193
+ ## 🔌 如何接入 DSH
194
+
195
+ 本插件面向使用者只承诺以下接入原则(实现细节见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)):
196
+
197
+ 1. 使用 DSH **官方扩展点**挂载,不修改 DSH 或 dsh-market 的安装文件;
198
+ 2. 会话归属变更走宿主提供的**正式接口**,不伪造持久化数据;
199
+ 3. 插件自有数据(历史、备份、回收站)写在**独立数据目录**,与会话档案分开;
200
+ 4. 与官方侧边栏同组排序**互不干扰**,只处理跨工作区场景。
201
+
202
+ ## 🤝 与其他插件共存
203
+
204
+ 设计上按「与生态共生」标准实现,冲突面很小:通信与样式使用独立命名空间;不改写官方安装文件;会话归属写入使用宿主正式接口。
205
+
206
+ | 同装插件类目 | 兼容性 | 说明 |
207
+ | --- | --- | --- |
208
+ | 官方内置插件(0.2 起的 8 个:终端 / 网页搜索 / 子智能体等) | ✅ 无冲突 | 功能面不相交;Agent 工具经官方 `dsh-tools` 注册表共存,本插件工具名以 `mover_` 前缀隔离 |
209
+ | 侧边栏增强 / better-sidebar / 终端 / 费用统计 / 记忆 / 导出分享 | ✅ 无冲突 | 面板与数据面完全不同 |
210
+ | 归档管理类插件 | ✅ 兼容 | 双方都使用官方归档数据,数据层一致(面板功能可能有些重复) |
211
+ | 回收站 / 会话删除类插件 | ✅ 数据隔离 | 各插件维护独立的回收站目录,互不读写;建议只启用一家的删除入口,避免操作混淆 |
212
+ | 排序 / 置顶类插件 | ⚠️ 基本兼容 | 移动后会精确重排「最近更新」;与置顶/排序插件并存通常无碍,仅各自面板展示顺序可能不完全一致 |
213
+ | 重画侧边栏的插件(自绘工作区树) | ⚠️ 降级共存 | 对方若替换官方侧边栏结构,本插件可能暂时无法识别会话行——表现为功能不触发,**不会损坏数据** |
214
+ | 其他会话移动器 | ❌ 建议二选一 | 同类插件可能重复处理同一次拖拽;本插件已覆盖移动 / 批量 / 合并 / 归位 / 归档恢复 |
215
+
216
+ ## 🧩 兼容性与卸载
217
+
218
+ ### 版本兼容矩阵
219
+
220
+ | 插件版本 | 已验证 DeepSeek Harness | Node | 备注 |
221
+ |----------|-------------------------|------|------|
222
+ | 2.1.0 | `0.1.5-rc.1`、`0.1.5-rc.2`、**`0.2.0 桌面版`**(0.2.0-rc.2 内核) | `≥22` | Agent 工具 + 桌面版实测(拖拽迁移、确认框、热重载修复);宿主缺 `dsh-tools` 时工具自动停用 |
223
+ | 2.0.3 | `0.1.5-rc.1`、`0.1.5-rc.2` | `≥22` | 真迁移 / 批量 / 救援 / 回收站 / 备份;首次发布 npm |
224
+ | — | `0.2.0 web`(0.2.0-rc.2) | `≥22` | 与桌面版同内核,已按同一代码路径适配;web 启动场景待回归 |
225
+
226
+ - **engines 声明**:`package.json` → `engines.dsh` ≥ `0.1.5-rc.1`,`engines.node` ≥ `22`(与 CI 矩阵 Node 22/24 一致)。
227
+ - **其他已知组合**:dsh-market `1.45.1`。不修改 DSH 源码,仅通过官方扩展点接入。
228
+ - **质量门禁**:提交前运行 `npm run check`(语法检查 + 测试 + `npm pack --dry-run`);CI 在 ubuntu / windows / macos × Node 22/24 上执行同等步骤。
229
+ - **市场卡片的「宿主要求未知」**:GitHub-only 插件没有 npm 发布清单时,dsh-market 可能无法从远端元数据推导宿主版本;显示「未知」**不代表**运行时不兼容。
230
+ - **升级到 DSH 0.2 的预设迁移**:0.2 不再读取 0.1.x 旧格式的自定义预设目录(`$DSH_HOME\.agent-presets\`),旧会话恢复会报 `Unknown agent preset`(与本插件无关,属宿主变更)。迁移步骤与实测记录见 [docs/dsh-0.2-preset-migration.md](docs/dsh-0.2-preset-migration.md)。
231
+ - **卸载可逆**:移除插件不会删除会话档案、工作区或官方记账。插件自己的历史、任务、备份和回收站数据仍保留在插件数据目录(见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md));移除后刷新或重启 DSH 即可清理注入的界面。
232
+ - **共存建议**:不要与另一个跨工作区拖拽移动器同时启用;其他类型插件可按上表共存。
233
+
234
+ 部分高级操作依赖较新的 DSH 能力;不支持时界面会明确提示,而不是静默失败。
235
+
236
+ ## 🔐 安全台账(Safety Ledger)
237
+
238
+ 每一次迁移都走同一条带安全边界的管线:**字节级备份先行 → 逐步回滚 → 迁移后校验 → 恢复账本兜底**。任何一步失败都会回到移动前的状态;连回滚都失败的极端情况会写入持久化恢复记录并在救援面板标红,等待人工确认——数据永不消失。
239
+
240
+ **Never-does(绝不):**
241
+
242
+ - 绝不执行任何 git 写操作(commit / stash / reset / checkout 都不碰);
243
+ - 绝不在字节级备份落盘之前改动任何文件;
244
+ - 绝不静默丢弃会话数据——恢复不了的极端情况会明确标红并保留现场;
245
+ - 绝不绕过确认执行破坏性操作(对话内的迁移 / 修复还须经宿主审批弹窗);
246
+ - 绝不上传任何本地数据——插件无网络请求,全部工作在本机完成。
247
+
248
+ **具体承诺:**
249
+
250
+ - **移动前自动备份**;搬运落地后再核对会话身份与路径,不符则整体回退;
251
+ - **失败时恢复到移动前状态**(文件与记账一并恢复);
252
+ - **删除先进回收站**,可还原到原位置或任意分组;彻底删除需二次确认;
253
+ - **无法自动恢复时**,会在救援面板明确标出,需要人工确认;会话文件与备份始终保留;
254
+ - **近期打开过、仍驻留在 Harness 内存中的会话**不能直接删除,需重启 Harness 后再删(界面会给出明确提示)。
255
+
256
+ > 失败路径优先保数据,不静默丢会话。<br>
257
+ > 并非「任何错误都能自动恢复」:极端情况下会要求人工处理,但数据会留在原处。
258
+
259
+ ## ⚠️ 已知限制
260
+
261
+ - 不支持把会话移入「Ungrouped」桶;
262
+ - 常驻内存的会话(近期打开过)不能直接删除,请重启 Harness 后再删;
263
+ - 若第三方插件整页重绘侧边栏,本插件可能暂时无法识别会话行(功能触发不了,**不损坏数据**);批量拖拽时无法确认身份的行会被跳过并明确告知,不会猜一个 id 去移动;
264
+ - 「扁平列表」视图无工作区标题行,本插件在该视图不激活;
265
+ - 宿主大版本升级若改变内部结构,相关能力可能降级或需重启后生效;搬家向导在无法安全写入时会在改动任何文件之前中止并提示;
266
+ - **没有图形化设置页**:官方设置页需要宿主提供 `schemastery`(插件目录下不可解析,静态引入会打断启动)。策略改用环境变量配置,见下表;`mover_doctor` 会报告宿主服务与存储布局的降级情况;
267
+ - **降级是可观测的**:插件优先使用官方接口(取消归档 `registry.unarchiveSession`、改名 `entity.setTitle`),宿主没有时自动回退到等价实现。回退是静默的(功能不变),所以 `mover.status.capabilities` 会同时给出 `unarchiveApi` / `setTitleApi` 能力位,`degradedFeatures` 里也会列出 `unarchive-official-api` / `set-title-official-api`——真机上一眼能看出走的是哪条路。
268
+
269
+ ### 🔧 可调策略(环境变量)
270
+
271
+ | 策略 | 默认 | 环境变量 |
272
+ |------|------|----------|
273
+ | 每个会话保留的备份份数 | 20 | `DSH_WORKSPACE_MOVER_BACKUP_KEEP` |
274
+ | 移动历史保留条数 | 100 | `DSH_WORKSPACE_MOVER_HISTORY_LIMIT` |
275
+ | 单批移动 / 修复上限 | 50 | `DSH_WORKSPACE_MOVER_BATCH_LIMIT` |
276
+ | 单个工作区搬家上限 | 200 | `DSH_WORKSPACE_MOVER_REPOINT_LIMIT` |
277
+ | 救援扫描解析上限 | 400 | `DSH_WORKSPACE_MOVER_SCAN_LIMIT` |
278
+ | 「清理 N 天前数据」默认天数 | 30 | `DSH_WORKSPACE_MOVER_CLEANUP_DAYS` |
279
+
280
+ 取值非法或越界时回退默认值——配置写错不会让功能失效。
281
+
282
+ ## 🆕 最近版本
283
+
284
+ ### v2.2.0 · 2026-10-09
285
+
286
+ - **批量移动不再"猜"会话身份**:权威 id 通道不可用时,旧兜底会按顺序顶替一个 id;现在无法确认的行一律跳过并在确认框里如实说明(全部无法识别则整体中止,不动任何文件)
287
+ - **目标分组解析必须自证**:标题/路径都不匹配时不再按 DOM 序号回退——官方侧边栏会隐藏目录已失效的分组,按序号回退会把会话搬进相邻分组
288
+ - **客户端热重载不再叠加实例**:7 个监听器与菜单 observer 全部经宿主 effect 释放,并加防重复装载;此前重载会叠加第二份,出现双确认框与双请求
289
+ - **存储布局自检**:反推一个真实会话的目录并验证,结果进入 `mover.status` 与自检面板(`data-layout`),把"某天突然全都找不到"提前变成可见的降级提示
290
+ - **孤儿备份可见可清**:会话彻底删除后其迁移备份会永久残留;现在会标记孤儿组并支持一键清理,「彻底删除」时也可顺带勾选清理
291
+ - **归档列表说明截断**:扫描只解析最新 400 条,较旧的归档会话可能不在列表中——UI 现在会说明
292
+ - **策略可调**:备份份数 / 历史条数 / 单批上限 / 搬家上限 / 扫描上限 / 清理天数支持环境变量覆盖(`DSH_WORKSPACE_MOVER_*`)
293
+ - **官方接口替代私有耦合**:取消归档改走官方 `registry.unarchiveSession`(保留回退通道);标题同步改用官方 `entity.setTitle` 并与路径重定向解耦;`record.sessionIds` 的读取收敛为单一访问器
294
+ - **可达性与文案**:弹窗补 `aria-labelledby`、打开即聚焦、Tab 循环;Esc 尊重"输入框聚焦时不清空";清理死文案与两处漏出的英文硬编码,新增中英词条对账告警
295
+ - **生态元数据**:新增 `screenshots.json`(自主控制市场卡片截图);声明宿主包 `peerDependencies`(全部 `*` 且标 optional——它们只是元数据,真正的版本下限是 `engines.dsh`,运行时不匹配由能力位如实上报);修正 README/ARCHITECTURE 中长期存在的工具数量与兼容性描述漂移
296
+ - **修正**:上述 peer 范围最初按生态惯例写成"显式预发布分支",结果宿主把本插件判为**与 `0.2.0-rc.2` 不兼容**——`<0.2.0-0` 这个上界会排除**所有** 0.2.0 预发布版(npm 的预发布规则按 `||` 集合逐条判定,且 `0.2.0-rc.2 > 0.2.0-0`)。现全部改为 `*`,并加了回归测试覆盖 0.1.5-rc.1 ~ 1.0.0
297
+ - 测试 108 → 144(新增客户端 DOM 用例 10 个、策略/Config 与 peer 范围回归用例 13 个,以及能力位/自检/备份 GC 等宿主侧用例)
298
+
299
+ ### v2.1.1 · 2026-10-05
300
+
301
+ - `mover.doctor` 自检:面板新增「自检」按钮 + `mover_doctor` 模型工具——服务、数据目录、恢复记录、工作区路径约 13 项检查,pass/warn/fail 三态汇报,DSH 升级后先自检再动手
302
+ - 信任资产:tagline 下突出 npm 一行安装命令(`dsh://` 深链按钮因 GitHub 剥离自定义协议而移除)、dsh.so 风险徽章(已收录且 L5 实测 / risk low)、dsh-plugin-registry 收录徽章、"DSH tested 0.2.0-rc.2" 徽章
303
+ - 兼容性报告:`docs/compatibility/` 落地桌面版实测记录,此后每适配一个 DSH 版本新增带日期报告
304
+ - 安全承诺章节品牌化为「安全台账(Safety Ledger)」+ never-does 清单
305
+
306
+ ### v2.1.0 · 2026-10-04
307
+
308
+ - Agent 工具:`mover_list_sessions`(只读清单)/ `mover_move_session`(迁移单个会话)/ `mover_repair_sessions`(一键修复)注册进官方 `dsh-tools`,在对话里即可调用
309
+ - 变更类工具执行前经宿主审批接缝请用户确认:拒绝 / 关闭 / 无应答一律不执行(fail-closed)
310
+ - 与面板共用同一条加锁、先备份、迁移后校验的管线;无 `dsh-tools` 宿主自动跳过注册
311
+ - 桌面版(0.2)实测通过:修复热重载后「inactive context」移动报错;确认框改为不透明,不再与底层文字重叠
312
+ - `mover.status` 新增 `agentTools` 能力位
313
+
314
+ ### v2.0.3 · 2026-09-21
315
+
316
+ - 首次发布到 npm:`dsh plugin --profile web add dsh-workspace-mover`
317
+ - 本地质量门禁 `npm run check`;CI 与之对齐
318
+ - README 增加 npm / DSH 徽章与宿主兼容矩阵
319
+
320
+ 完整变更记录见 [CHANGELOG.md](CHANGELOG.md)。<br>
321
+ 实现与架构说明见 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。
322
+
323
+ ## License
324
+
325
+ MIT