dsh-session-folders
Manifest validOne timestamped output directory per DSH session: sessions remain in the original workspace, the plugin injects the "output directory" rule; optional hard isolation mode. Per-conversation output directories for DeepSeek Harness sessions.
dsh-session-folders
让每一个新会话都落在自己的工作目录里。 不同任务的文件不再混在同一个文件夹下 —— 效果等同于 WorkBuddy 那种「一个对话一个时间戳目录」的结构。
它解决什么
DSH 的模型是 工作区 = 一个目录 = 会话的 cwd。同一个工作区里的所有会话共用同一个
cwd,所以「GitHub 限流插件」和「Minecraft 整合包工具」两个任务的文件会落在同一个
D:\AIWorkSpace\DSH\ 下。
本插件在宿主侧接管 session.create:当新会话要落在配置的根工作区里时,先建一个
时间戳子目录、把它注册成独立工作区,再让会话在那个子目录里创建。
D:\AIWorkSpace\DSH\ <- 根工作区(你平时在这里点「新对话」)
├── 2026-10-08-13-05-00\ <- 会话 A 的全部文件
├── 2026-10-08-14-20-11\ <- 会话 B 的全部文件
└── 2026-10-08-15-02-47\ <- 会话 C 的全部文件
侧边栏「视图选项 → 分组方式 → 按工作区树」时,这些子目录会嵌套显示在 DSH 之下。
两种模式
in-place(默认) | workspace | |
|---|---|---|
| 会话归属 | 留在原工作区(cwd 不变) | 迁到新目录(新工作区) |
| 侧边栏 | 不多任何层级,新会话与原会话同级 | 多出一层工作区分组 |
| 文件隔离 | 规则:系统提示词注入「本次对话产物目录」,agent 依此写入 | 强制:会话 cwd 就是那个目录 |
| 适用 | 想保持侧栏干净 | 想要文件系统级硬隔离(可用侧栏「单列表」视图隐藏分组) |
行为细节
| 情况 | 行为 |
|---|---|
| 在根工作区里新建会话 | 建 <root>/<YYYY-MM-DD-HH-mm-ss>/,注册成工作区,会话 cwd = 该目录 |
| 客户端侧的名称 | 先显示 placeholderTitle(默认「新会话」),不显示时间戳;会话标题(由首条消息生成)落地后自动把工作区改名成该标题 |
| 同一秒内再开一个 | 自动退到 …-2、…-3 |
| 会话已经在一个日期子目录里 | 不再套一层(只精确匹配根目录) |
| fork / 恢复已有会话 | 原样放行,继承来源会话的目录 |
其它工作区(例如 PackUp) | 完全不受影响 |
| 建目录或注册工作区失败 | 记一条 warn,然后按原请求放行 —— 永远不会挡住开会话 |
配置
cordis.patch.yml(装到 profile 后在 profile 的 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 | 会话标题生成后自动同步改工作区名;false 则一直用 placeholderTitle |
dryRun | false | 只记日志不落地,用于首次验证 |
安装
# profile 名按你的环境:桌面版是 desktop,命令行版通常是 web
dsh plugin --profile desktop add github:Tonywqs/dsh-session-folders
# 装完完全重启 DSH
也可以用 DSH 内置的插件管理器:设置 → 插件 → 安装插件,仓库地址填
github:Tonywqs/dsh-session-folders。
手动安装(不走 dsh CLI)
# 1) 复制到 profile 的共享 node_modules
copy-item -Recurse <本目录> "$env:USERPROFILE\.dsh\profiles\node_modules\dsh-session-folders"
# 2) 在 profile 的 cordis.patch.yml 追加 insert 条目(见上「配置」)
# 3) 重启 DSH
首次验证
先用 dryRun: true 重启一次,开一个新对话,然后看
%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 重启即可真正建目录。
已知限制
- 依赖宿主内部接缝
ctx.sessionController.commands.create;DSH 若改动这个结构, 插件会在日志里记 warn 并自动失活(会话创建不受影响)。 - 目录名用本地时间,秒级;同一秒内连开多个会话会得到
-2/-3后缀。 - 只改「新会话落在哪」,不迁移历史会话的 cwd,也不动已有文件。
卸载
dsh plugin --profile desktop remove dsh-session-folders
手动装的则删掉 profiles/node_modules/dsh-session-folders 并从 profile 的 cordis.patch.yml
移除那个 - insert: id: session-folders 块。已建出来的日期目录不会被删除。
in-place 模式的产物目录规则(v0.3.1)
插件会注册两处提示词贡献,内容都是「本次对话的产物目录 = <时间戳目录>」:
- 系统提示词 section(
session-folders:output-dir)——每个模型步骤都在; - 动态 runtime context(同名)——每轮以 user 角色快照刷新一次,更难被忽略。
两者共用变量 session_output_dir:不属于本插件的会话返回空串,空 section / 空 context 会被
渲染阶段丢弃,所以其它工作区看不到这段话。
坑(已修):宿主对提示词变量名有强制约束 /^[a-z][a-z0-9_]*$/,大小写混写(例如
sessionFoldersOutputDir)会直接抛错。v0.3.0 因此整个插件加载失败;v0.3.1 改成
session_output_dir,并把提示词注册整段 try/catch、移到 create 包装之后——
提示词出任何问题都不再影响建目录。
Comments
Loading…