前言¶
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 步骤操作:
- 在侧边栏悬停某会话行 → 「…」→ Move to project…
- 选择目标项目;若要高亮项表示「离开项目」,选 Ungrouped (leave the project)。
- 侧边栏刷新;对话框提示成功。若会话当前已加载,会提示已排队,下次启动再执行。
若主视图正打开被移动的会话,移动完成后刷新页面即可(数据本身未删)。对话框底部可用 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