dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
A plug-in for Deepseek Harness that easy to move/rename session from old workspace to new workspace.
English | 中文
DeepSeek Harness (DSH) 插件:把 DSH 会话/工作区迁移 (改名、改项目名、改路径)做成一条工具调用 + 一次重启 + 一条校验命令。
安装 → 会话里说一句"把工作区 X 迁移到 Y" → 重启 dsh web(唯一一次)→ 删 symlink → verify 校验闭环
目录重命名后 DSH 不会自动迁移会话,会出现:旧会话仍绑旧路径(工具 cwd 失效 ENOENT)、 DSH 自动为新路径创建空工作区 + 空会话、会话 header cwd / sessions 目录 / workspace 注册表 / 投影缓存四处不一致。完整迁移需要修改 4 处持久化状态 + 磁盘目录(2026-08-24 实战验证)。
输出:自动执行全部管理更新(含备份),并报告剩余人工步骤(重启 dsh web、删 symlink、回滚方式)。
session.jsonl.zstd 是多帧 zstd 流,boot 时 DSH 要求第 0 帧恰好一行 header
(assertZstdHeaderFrame)。"整份日志解压→改第一行→整体重压"会把它塌缩成单帧,
dsh web 启动即崩("first frame is not exactly one header line",2026-08-24 实战踩坑)。
本插件只重写第 0 帧、其余帧字节不动;历史塌缩帧日志自动修复为每行一帧;
写盘前按 boot 同款断言自检 + tmp/rename 原子替换(详见
docs/dsh-session-migration-internals.md §2.5)。
dsh plugin --profile web add dsh-mv-session # npm 发布后
dsh plugin --profile web add /path/to/packages/dsh-mv-session # 本地/源码
# 重启 dsh web 一次,插件生效
在任何 DSH 会话里直接说:"把工作区 /path/old 迁移到 /path/new,标题改成 New Name"。
Agent 会先 dry_run 演练给你看计划,确认后再实跑;收尾用 verify 只读校验。
node migrate_session.cjs --from /old --to /new --title "New" --mkdir --dry-run # 1 演练
node migrate_session.cjs --from /old --to /new --title "New" --mkdir --yes # 2 实跑(自动备份;不写 projcache)
# 3 停服 dsh web → node migrate_session.cjs --fix-projcache --from /new # 停服窗口对齐缓存(幂等)
# 4 启动 dsh web → GUI 确认 → 打开最大会话确认无 "signal timed out" → 删除过渡 symlink
node migrate_session.cjs --verify --from /new # 5 只读校验,闭环
迁移改的是磁盘,但运行中的 dsh web 持有一整套内存态(会话 header cwd、日志追加路径映射、 工作区注册表),重启前不读盘刷新,还会用内存旧值写回注册表/缓存。重启后进程从磁盘重建, 一切指向新路径。过渡 symlink 只服务于"迁移 → 重启"这段窗口;重启后删除即安全。
不需要第二次重启:删 symlink 后的确认用 --verify(只读)替代——核对注册表记录 ↔
会话 header cwd ↔ 帧不变式 ↔ 会话目录 ↔ 缓存,ok:true 即闭环;出现 problem 或 GUI 异常才再重启。
(零重启做不到:DSH 没有"在线改归属"的 API,唯一受支持的内存刷新机制就是重启。)
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
from | string | 二选一 | 当前工作区路径(可为 symlink) |
session | string | 二选一 | 会话 id;自动定位其工作区 |
to | string | ✅ | 目标工作区路径 |
title | string | — | 新标题(默认取 to 的 basename) |
dry_run | bool | — | 只打印计划,不写任何东西 |
mkdir | bool | — | 允许创建目标目录 |
merge_dir | bool | — | 目标非空时显式同意合并(默认拒绝) |
backup_dir | string | — | 备份位置(默认 <dsh-home>/migration-backups/) |
cleanup_empty | bool | — | 清理目标处自动产生的空会话(默认 true) |
verify | bool | — | 只读一致性校验,替代第二次重启 |
node --check lib/migrate_session.js
node tests/migrate_e2e_scratch.js [真实会话日志] --boot # 帧不变式 + 真实 dsh web boot 验证
node tests/migrate_edge_cases.js # 合并/symlink/无zstd/--session/守卫/预检
npm 包在 packages/dsh-mv-session/;包内 lib/migrate_session.cjs 由仓库根
lib/migrate_session.js 同步而来(包是 ESM,CLI 以 CJS 子进程执行)。
mv_session)dsh plugin add 安装 + 跨重启持久--verify 闭环)--fix-projcache 停服幂等对齐、冷读冒烟 + 时序回归测试--verify/预检/守卫/verify 参数/分发文档)dsh-plugin)dsh-mv-session@0.1.1(latest 标签,keywords 含 dsh-plugin,仓库/许可元数据齐)