dsh-session-folders:为每个 DSH 会话分配时间戳产物目录

前言

DeepSeek Harness(DSH)里,工作区通常对应一个目录,也是会话的工作目录(cwd)。在同一个根工作区里连续开多个对话时,所有任务生成的文件都会落在同一文件夹下——例如限流排查脚本和 Minecraft 整合包工具混在一个目录里,后续整理和版本管理都很麻烦。

社区里有人用 WorkBuddy 一类方案实现「一个对话一个时间戳目录」。dsh-session-folders 是 DSH 插件形态下的同类能力:在宿主侧接管新会话创建流程,在配置的根工作区下自动建时间戳子目录,让不同会话的文件分开存放。维护者为 Tonywqs,分类为工作流;仓库见 GitHub,社区目录页见 SkillHub。

这是什么

插件在 session.create 接缝处介入:当新会话要落在已配置的根工作区里时,先创建 <根>/<时间戳>/,将其注册为独立工作区,再让会话在该目录中创建(具体 cwd 行为取决于模式,见下文)。

目录结构示意:

D:\AIWorkSpace\DSH\                     <- 根工作区(在此点「新对话」)
├── 2026-10-08-13-05-00\                  <- 会话 A 的全部文件
├── 2026-10-08-14-20-11\                  <- 会话 B 的全部文件
└── 2026-10-08-15-02-47\                  <- 会话 C 的全部文件

侧边栏若选择「视图选项 → 分组方式 → 按工作区树」,这些子目录会嵌套显示在根工作区之下。

两种模式

in-place(默认) workspace
会话归属 留在原工作区(cwd 不变) 迁到新目录(新工作区)
侧边栏 不多任何层级,新会话与原会话同级 多出一层工作区分组
文件隔离 规则:系统提示词注入「本次对话产物目录」,agent 依此写入 强制:会话 cwd 就是那个目录
适用 想保持侧栏干净 想要文件系统级硬隔离(可用侧栏「单列表」视图隐藏分组)

README 中 in-place 对应 v0.3.1 的产物目录规则:插件注册系统提示词 section 与动态 runtime context,告知模型「本次对话的产物目录 = 时间戳目录」;变量名为 session_output_dir,非本插件管理的会话该变量为空,其它工作区不会看到多余提示。

行为细节

下面几种情况插件会按固定规则处理:

情况 行为
在根工作区里新建会话 建 <root>/<YYYY-MM-DD-HH-mm-ss>/,注册成工作区,会话 cwd = 该目录(workspace 模式)或依 in-place 规则
客户端侧名称 先显示 placeholderTitle(默认「新会话」),不显示时间戳;会话标题由首条消息生成后,若 followSessionTitle 为 true,工作区名会同步为该标题
同一秒内再开一个 自动退到 …-2、…-3
会话已在日期子目录里 不再套一层(只精确匹配根目录)
fork / 恢复已有会话 原样放行,继承来源会话的目录
其它工作区 完全不受影响
建目录或注册工作区失败 记 warn,按原请求放行——不会挡住开会话

安装与配置

安装

PowerShell 示例(profile 名按环境选择:桌面版多为 desktop,命令行版多为 web):

dsh plugin --profile desktop add github:Tonywqs/dsh-session-folders

装完需完全重启 DSH。也可在 设置 → 插件 → 安装插件 中填写仓库地址 github:Tonywqs/dsh-session-folders。

插件当前版本为 0.3.1(见仓库 package.json),依赖 Node >= 22,peer 依赖 @deepseek-ai/cordis ^4.0.2,许可证 MIT。插件以当前 DSH 进程权限运行,安装前建议自行查看源码与许可证。

配置

安装后配置写在 profile 的 cordis.patch.yml(patch 片段示例):

- insert:
    - id: session-folders
      name: dsh-session-folders
      config:
        enabled: true
        roots:
          - 'D:\AIWorkSpace\DSH'
        nameFormat: YYYY-MM-DD-HH-mm-ss
        dryRun: false
配置 默认 说明
enabled true 总开关
roots [] 需要按会话分目录的根工作区(可多个);为空时插件不生效并记 warn
nameFormat YYYY-MM-DD-HH-mm-ss 目录名格式,支持 YYYY MM DD HH mm ss
placeholderTitle 新会话 客户端工作区初始显示名
followSessionTitle true 会话标题生成后是否同步改工作区名
dryRun false 只记日志不落地,用于首次验证

首次验证

建议先把 dryRun 设为 true,重启 DSH 后新开一个对话,再查看日志(桌面版示例路径):

%USERPROFILE%\.dsh\logs\desktop-next.log

期望看到类似:

dsh-session-folders: active for D:\AIWorkSpace\DSH (format YYYY-MM-DD-HH-mm-ss, dry-run)
dsh-session-folders: [dry-run] would create D:\AIWorkSpace\DSH\2026-10-08-16-01-22

第二行表示接缝命中;确认无误后将 dryRun 改回 false 并再次重启,即可真正创建目录。

适用场景与注意

适合:在同一 DSH 根工作区里并行多个互不相关的编码或文档任务,希望文件按会话分文件夹,或需要接近 WorkBuddy 的「一对话一时间戳目录」体验。

已知限制(来自 README):

  • 依赖宿主内部接缝 ctx.sessionController.commands.create;DSH 若改动该结构,插件会记 warn 并失活,会话创建本身不受影响。
  • 目录名使用本地时间、秒级精度;同一秒内连开多个会话会得到 -2、-3 后缀。
  • 只影响新会话落在哪,不迁移历史会话 cwd,也不移动已有文件。

卸载命令:

dsh plugin --profile desktop remove dsh-session-folders

手动安装时还需删除 profiles/node_modules/dsh-session-folders 并移除 patch 中对应 insert 块;已建出的日期目录不会被删除。

结尾

dsh-session-folders 把「按会话分目录」做成可配置的 DSH 工作流插件:在指定根工作区新开对话时自动建时间戳子目录,并在 in-place 与 workspace 两种隔离粒度之间选择。DSH 生态强调「一切皆插件」;SkillHub 等社区目录独立于 DeepSeek / 幻方,并非官方应用商店。

  • 目录页:https://www.skillhub.cn/plugins/Tonywqs/dsh-session-folders
  • 源码与文档:https://github.com/Tonywqs/dsh-session-folders
羽毛球分组比赛记分
小程序二维码

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

Xiaoye