dsh-chat-projects: Moving Chat Sessions Between Projects (Workspaces) in DSH

前言

DeepSeek Harness(DSH)在创建会话时会把会话绑定到当前工作区(项目),侧边栏里可以创建、重命名、排序和删除项目,但没有「把已有会话挪到另一个项目」这类操作。会话一旦建错项目,或目录已经对应某个项目却显示在「未分组」里,只能接受现状或手动折腾存储结构。

dsh-chat-projects 由社区维护者 Tzh0109 发布,分类为工作流,在 npm 上的包名是 dsh-chat-projects(GitHub 仓库名为 dsh-projects)。它补的是 DSH 原生缺失的能力:从会话行菜单把会话移到目标项目,以及批量把符合条件的未分组会话归档回对应项目;项目的创建与管理仍走 DSH 自带侧边栏,不替换原生 UI。

这是什么

插件一句话定位:面向 DSH 桌面端的 ChatGPT Projects 式会话整理——在工作区(项目)之间移动会话,并把未分组但目录已属于某项目的会话收回去。

维护者:Tzh0109。许可证:MIT(见仓库 README)。当前 package.json 中版本为 0.1.0。社区目录页:https://www.skillhub.cn/plugins/Tzh0109/dsh-chat-projects ;源码与说明:https://github.com/Tzh0109/dsh-projects 。

核心功能

下面介绍 README 中已写明、且与 DSH 存储语义一致的几项能力。

会话行「移到项目…」

悬停侧边栏某条会话 → 「…」→ Move to project…(界面文案为移到项目)。对话框列出所有项目(路径与会话数量),当前所在项目高亮;选当前项目时等价于 Ungrouped(leave the project),即离开项目、保持未分组,历史不会被删除。

批量「File ungrouped sessions」

对话框底部提供 File ungrouped sessions (N):只处理「未分组且 header 里记录的目录已经是已注册项目」的会话;已归档会话会跳过。

已加载会话:排队到下次启动

当前 DSH 运行中已加载的会话带有冻结 header 与写租约,不能当场改路径。对此类会话选择目标项目时,移动会写入队列文件 <DSH_HOME>/dsh-chat-projects/pending-moves.json,在下一次 DSH 启动时、任何 agent 恢复之前自动执行;对话框里可以取消已排队的移动。从未打开过的会话可以立即移动。

安全拒绝与恢复

插件在下列情况拒绝移动而非强行改盘:会话仍被 agent 占用、仍有运行中的 turn/subagent/job/schedule、子 agent 会话、header 无 cwd、目标目录不存在、旧版 on-disk 格式、目标项目下已存在同 id 的会话目录等。

移动过程会写 journal、备份原始 header frame,失败时自动回滚;崩溃后启动时会读 <DSH_HOME>/dsh-chat-projects/journal.json 尝试恢复,备份在 <DSH_HOME>/dsh-chat-projects/backups/, staging 目录为 <DSH_HOME>/.dsh-chat-projects-trash/。

实现上,移动会同步改 workspace 的 sessionIds、重写 session log 第 0 帧的 cwd、把会话目录迁到目标 project key 下,并用 DSH 持久化后端做校验;header.cwd 也是 workspace-write 沙箱根,移动后工具边界随新项目目录变化。

环境与依赖

  • DSH 桌面 0.2.1-rc.x 及自带 runtime;Host 侧需要 Node 内置 Zstandard API(Node >= 22.15;DSH 自带 24.x)。
  • 插件为纯 ESM + React,react 来自 DSH client baseline,无额外 npm 依赖。

安装与启用

使用 DSH 桌面自带的 CLI。若 dsh 不在 PATH,可用 <DSH install>\resources\runtime\cli\bin\dsh.cmd(Windows 示例;Linux/macOS 请按本机 DSH 安装路径使用对应入口)。

# 从 npm(README 推荐的最省事方式)
dsh plugin --profile desktop add dsh-chat-projects

# 从 GitHub(仓库名为 dsh-projects)
dsh plugin --profile desktop add github:Tzh0109/dsh-projects

# 本地开发链接(路径改成本机 checkout)
dsh plugin --profile desktop add "link:C:\path\to\dsh-chat-projects"

安装后重启一次 DSH 桌面(Host 半需要重启);之后对 lib/client.js 的修改可通过 client HMR 热更新。

卸载:

dsh plugin --profile desktop remove dsh-chat-projects

安装前建议自行查看仓库源码与 MIT 许可证;插件在 DSH 进程权限下读写 ~/.dsh 与会话 log,属于对非官方存储语义的直接操作。

典型用法

经过上面的安装与重启,可按 README 步骤操作:

  1. 在侧边栏悬停某会话行 → 「…」→ Move to project…
  2. 选择目标项目;若要高亮项表示「离开项目」,选 Ungrouped (leave the project)。
  3. 侧边栏刷新;对话框提示成功。若会话当前已加载,会提示已排队,下次启动再执行。

若主视图正打开被移动的会话,移动完成后刷新页面即可(数据本身未删)。对话框底部可用 File ungrouped sessions 一次性整理符合条件的未分组会话。

适用场景与注意

适合谁: 经常在多个 repo/项目目录间切换、需要把误建项目的会话迁走,或希望未分组列表与磁盘上 project key 对齐的 DSH 桌面用户。

务必知晓的限制(来自 README):

  • 存储语义非官方:DSH 升级若改 session/workspace 格式,校验失败时会拒绝移动;升级后建议先用 disposable 会话试移,开发者可在仓库跑 npm test(node --test test/core.test.mjs)。
  • 已打开会话只能下次启动移动;Never-opened 的会立刻移动。
  • 新项目目录需满足 DSH workspace-write 沙箱授权(Windows 上涉及 DACL);使用 danger-full-access 时 README 称与此无关。
  • 移动不删除数据;「未分组」仅改变归属关系。

DSH 生态强调「一切皆插件」;SkillHub 等社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系,本文介绍的是社区插件而非官方功能包。

参考链接

  • 社区目录:https://www.skillhub.cn/plugins/Tzh0109/dsh-chat-projects
  • GitHub:https://github.com/Tzh0109/dsh-projects
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye