跳过主要内容
A

dsh-workspace-move

ame-code/dsh-workspace-move

在工作区右键菜单里把整个工作区搬到另一个目录,顺带重命名:嵌套工作区与会话一起迁移并改写记录,失败自动回滚,移动后可一键撤销。首先在 Windows 上开发与验证;macOS 与 Linux 走同一套代码路径。

安装

dsh plugin --profile web add github:ame-code/dsh-workspace-move

README

@reed-io/dsh-workspace-move

English · 简体中文

把 DeepSeek Harness 的工作区连同它的文件夹、文件夹里的全部内容、其下注册的子工作区以及它保存的会话,一起搬到磁盘上的另一个位置。行为类似 mv:一个目标路径,一个原子结果。修改文件夹名时,工作区也会一并重命名。

一次移动会带上什么

跟着工作区一起走的东西方式
工作区文件夹及其整个目录树同一分区用 rename;跨分区复制、校验后再删源。
注册在该文件夹内的子工作区它们的注册路径会跟着文件夹一起改写,注册、标题和会话列表全部保留。
工作区列出的会话每个会话日志移动到目标项目目录,并就地改写日志头里的 cwd,历史与标题逐字节保留。
工作区标题仅当这次移动同时改了文件夹名、且标题仍是文件夹名时才改。

除此之外什么都不动。只有当移动把源目录搬空时才会删除源目录本身,它的上级目录永远不会被触碰。

使用方法

在侧边栏右键工作区(或点它的 … 按钮),选择 移动工作区…。在内置的目录浏览器里选目标文件夹,填写工作区在新位置的文件夹名,核对最终位置,然后确认。

以下情况会拒绝移动并给出原因:

  • 目标位置已经存在同名文件夹 —— 换个名字;
  • 目标在工作区内部,或工作区在目标自身的路径链里;
  • 还有会话正在运行 —— 先停掉它们;
  • 名字在这个平台上不是合法文件夹名。

移动成功后,浮动提示会提供 撤销;只要该次移动仍是本轮最近的一次,工作区菜单也会提供 撤销上次移动。撤销记录只保存在内存中,Harness 重启后失效。

一次移动要么完整完成,要么整体失败。任何一步出错,插件都会把文件夹、注册信息和已经动过的会话全部回滚,并报告失败原因。

Agent 工具

同一套引擎也注册为一个工具,Agent 可以直接调用:

move_workspace(workspaceId, targetParent, folderName?)

folderName 省略时沿用原文件夹名。工具会返回最终位置、一起搬走的会话数与子工作区数,以及这次移动是否还能撤销。

行为说明

  • 移动在 Host 进程内完成,工作区注册表和会话存储都由 Host 拥有;浏览器端只负责驱动。
  • 会话是就地改写:只重新压缩承载 cwd 的头部帧,其余事件帧逐字节复制。
  • 会话日志落到新路径后,再重新挂回工作区,因此工作区的会话顺序保持不变。
  • 移动后不需要重启 Harness 才能使用被移动的会话;正在运行的那个会话本身不能被移动,运行检查会拦住它。

平台

Windows、macOS 和 Linux 走同一套代码路径(CI 在三种系统上跑同一套测试),行为按运行时 实际所在的文件系统调整:

场景行为
同一卷内rename,原子完成,链接与权限原样保留
跨卷 / 跨设备复制 → 逐项校验(名称、类型、大小、链接文本)→ 删除源;校验不过就整体回滚
卷是否区分大小写运行时探测;仅改大小写的改名(proj → Proj)在两条路径上都成立
符号链接当作链接搬走:不跟随、不展开;复制分支重建链接并比对链接文本,悬空链接保持悬空
可执行位复制分支保留文件权限位
文件夹命名规则Windows 拒绝 \ : * ? " < > |、保留设备名、结尾的点与空格;POSIX 只拒绝 / 与控制字符
文件名编码按文件系统原样处理,不做额外归一化或大小写改写

依赖

  • DeepSeek Harness >=0.2.0-rc.1 <0.3.0-0
  • Node ^22.19.0 || >=24.0.0
  • Host 与浏览器在同一台机器上:目标选择对话框通过一条仅限回环地址的路由与 Host 通信。 在 WSL 里跑 web profile 时,Windows 侧开启 WSL 镜像网络(networkingMode=mirrored) 即可满足这一条。

安装

需要已安装并能正常运行 DeepSeek Harness。下面的 desktop 请换成你实际使用的 profile(web、desktop……)。

dsh plugin --profile desktop add @reed-io/dsh-workspace-move@latest

或者把该 bundle 加入某个 profile 的 dsh.profile.bundles,然后重启 DeepSeek Harness。 安装后刷新页面(Ctrl+R),侧边栏才会出现新的菜单项。

开发

npm run build     # src/client.js -> lib/client.js(浏览器 bundle)
npm run check     # 构建后校验客户端 bundle 契约与失败隔离
npm test          # 单元测试:路径编码、文件夹命名规则、会话日志改写
npm run test:e2e  # 端到端:真实 Cordis 服务 + 临时会话存储
npm run test:chain # 真机:起一个隔离的 dsh web,走 HTTP 完成移动与撤销

lib/client.js 是构建产物,请改 src/client.js。宿主侧(lib/*.js 中除 client.js 外)是普通 ESM,由 Node 直接加载。

两套端到端各有分工:test/e2e.mjs 把宿主换成测试替身,跑得快、每个平台都跑; test/chain.mjs 用真实的 dsh CLI 起一个隔离的 DSH_HOME,装包、建会话、开 Host,再通过 HTTP 走一遍移动与撤销,速度慢,只在 CI 的 macOS 与 Linux 上跑—— 那是没有 Mac 也能验证 macOS 代码路径的唯一办法。两者都需要 node_modules 里能 解析到 Harness 的包,因此不随发布包装分发。

许可证

MIT

相关插件