DSH Plugins Marketplace

DSH Plugins

Plugins

/

dsh-session-folders

T

dsh-session-folders

Manifest valid

One 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.

hasBundlePatchMachine translated

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
配置默认说明
enabledtrue总开关
roots[]需要按会话分目录的根工作区(可多个)。为空时插件不发生活用并记一条 warn
nameFormatYYYY-MM-DD-HH-mm-ss目录名格式,支持 YYYY MM DD HH mm ss
placeholderTitle新会话客户端侧工作区的初始显示名(不要用时间戳)
followSessionTitletrue会话标题生成后自动同步改工作区名;false 则一直用 placeholderTitle
dryRunfalse只记日志不落地,用于首次验证

安装

# 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)

插件会注册两处提示词贡献,内容都是「本次对话的产物目录 = <时间戳目录>」:

  1. 系统提示词 section(session-folders:output-dir)——每个模型步骤都在;
  2. 动态 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…