dsh-session-workspace-organizer:DSH 工作区整理与会话管理插件

前言

DeepSeek Harness(DSH)把每个会话绑定到一个工作区目录,同一工作区的所有会话共享这个目录。脚本、日志、下载文件和截图会混在一起,时间一长就会变得杂乱。DSH 插件生态遵循「一切皆插件」的理念,这个插件不修改 DSH 本身,而是通过插件层提供四个能力:迁移工作区、为每个会话分配独立输出目录、会话管理(移动与删除)、从对话头部重启整个应用。

插件定位

dsh-session-workspace-organizer 是 DeepSeek Harness 的一个工作流插件,由 dream-fish69 维护。它解决的是 DSH 工作区目录杂乱、会话输出文件混在一起、会话迁移与清理不便的问题。插件通过扩展 DSH 的会话与工作区管理流程,为每个新会话创建独立的输出目录,支持工作区跨路径迁移,并提供会话的批量移动与删除功能。

安装与启用

从 npm 安装(预构建,无需编译):

dsh plugin --profile web add dsh-session-workspace-organizer

从 GitHub 源码安装:

dsh plugin --profile web add github:dream-fish69/dsh-session-workspace-organizer

本地开发安装:

dsh plugin --profile web add link:/absolute/path/to/the/checkout

在 DSH 桌面端,进入 Plugins 页面,先移除旧条目,再从安装字段输入上述任一命令。安装或升级后需要重启 DSH,插件的主机部分只在启动时加载。

卸载时执行:

dsh plugin --profile web remove dsh-session-workspace-organizer

卸载不会删除 sessions/ 文件夹及其内容。

核心功能

迁移工作区

在「Settings → Workspaces(工作区)」中选择一个已注册的工作区,指定新的父文件夹和名称,点击 Move workspace。

插件执行严格迁移:

  • 整个目录(含 sessions/)移动到新路径,旧路径被删除,不留下符号链接或 junction;
  • 每个会话日志的头部 cwd 被重写为新的路径:第一个 zstd 帧包含头部,仅替换其中的 cwd,其余帧保持字节不变;
  • 日志目录从 --<old cwd>-- 重命名为 --<new cwd>--;
  • 工作区从新路径重新注册,会话被重新关联;
  • 跨盘迁移时先复制并逐文件验证,源文件在验证通过前保留,失败则回滚;
  • 若旧目录被锁定(Windows EBUSY/EPERM/EACCES,例如 DSH 仍持有句柄),插件会回退到复制迁移:复制并验证、重写日志、切换注册、然后尝试删除旧目录,并报告无法删除的确切原因。

限制:正在运行的工作区不能迁移,因为会话日志是追加写入的,无法安全重写。需要在另一个工作区打开对话并从那里触发迁移。如果会话仍在运行,对话框会列出会话标题和 ID,提供取消当前回合、等待会话结束再继续,或切换到复制迁移的选项。如果当前对话就在目标工作区,必须从其他工作区触发迁移。

若旧路径是 DSH 的启动目录,插件会切换进程工作目录和沙盒回退根,但桌面快捷方式或启动器配置仍需手动更新。

会话结构整理

在「Organize structure」区域,插件会自动创建 sessions/ 和 sessions/README.md(如果缺失)。勾选「Move loose files」后,工作区根目录下的普通文件会被移动到 sessions/<date>_整理/;.gitignore、.dsh、README.md、AGENTS.md 等常见项目清单文件保持原位不动。

会话管理

在「Sessions」区域可以批量移动或删除空闲会话。

  • Move to workspace…:将空闲会话(单个或批量)移动到另一个工作区,同时移动其日志、sessions/ 目录及其内容,以及会话通过 write/edit 在源工作区其他位置创建的文件。
  • Unresolved files(预览):移动前点击「Preview unresolved files」,计划会列出未标记的遗留会话文件夹、相对写入路径(写入时 cwd 未知)、源工作区外的文件、目标冲突和可选的项目文件夹。对每一行可以选择目标会话文件夹、目标工作区根、自定义目录或取消该项。已知文件自动移动,取消的项保留在原处。
  • Legacy folders/projects:通过「Legacy session folder」和「Project folder」字段合并或移动指定项目。冲突文件保留目标文件,并生成带源标记的副本(例如 verify.COT中文翻译插件.md),不覆盖现有文件。
  • Delete:永久删除空闲会话,首次删除会显示预览,列出日志、会话文件夹以及将一同删除的外部文件。勾选选项后,文件才会被移除;仅限在会话的源工作区内。

批量移动使用已知的目标位置,未解析的项目会被报告并留在原地。需要逐项选择目标时使用单次移动。

每会话独立输出目录

对于每个新会话或恢复的会话,只要其 cwd 在已注册工作区内,插件会在该工作区下创建 <workspace>/sessions/<YYYY-MM-DD>_<title>/ 目录,并在会话标题变更时重命名(日期前缀保持,重复时追加 -2)。目录内放置一个 .dsh-session 标记文件,记录 sessionId、workspacePath 和 createdAt,以便恢复会话时找到目录,不要删除该文件。

模型通过会话作用域的系统提示被告知:新脚本、日志、下载、截图、临时数据和一次性产出应写入该目录,而现有项目代码保持原位。在工作区根目录使用 write 创建文件时,会触发确认对话框;常见的清单文件(README.md、AGENTS.md、package.json、锁文件、Makefile、Dockerfile 等)不受影响,直接创建。

从头部重启应用

对话头部的重启按钮会结束并重新启动整个 DSH 应用,因此所有缓存服务、插件和模块都会从磁盘重建,与页面刷新不同。

点击后首先弹出确认对话框,提示应用将关闭并重新启动,当前工作会中断。Esc、背景层和「Cancel」均可关闭对话框。

重启按钮会在以下情况变为不可用或变为红色「Restart anyway」:

  • 会话正在生成内容;
  • 有待处理的回合正在队列中;
  • 有后台任务在运行。

此时默认选择依然是「Cancel」,确保安全。服务器端可以通过 {"force": true} 覆盖该保护,但任何格式错误都不会被视为「force」。

适用场景与注意事项

适合需要频繁迁移工作区、整理会话输出目录、批量管理或清理会话的开发者。插件以当前 DSH 进程的权限运行,安装前应检查源码与许可证(MIT)。

总结

这个插件通过迁移工作区、为每个会话分配独立输出目录、批量移动与删除会话、以及从头部重启应用四个方面,缓解了 DSH 工作区杂乱和会话管理不便的问题。它不修改 DSH 本身,而是通过插件层扩展其能力,适合希望保持工作区整洁、会话隔离的开发者。

目录页:https://www.skillhub.cn/plugins/dream-fish69/dsh-session-workspace-organizer
GitHub:https://github.com/dream-fish69/dsh-session-workspace-organizer

羽毛球分组比赛记分
小程序二维码

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

Xiaoye