前言¶
在 DSH 里做多个互不相关的任务时,常见做法是共用一个工作区目录:Agent 生成的文件、临时脚本和中间产物会堆在同一棵目录树下,后一个任务容易读到前一个任务的残留,侧栏里也难一眼区分「这次到底在哪个文件夹里干活」。手动每次新建文件夹、再在 DSH 里注册工作区并开新会话,步骤多且容易漏。
dsh-new-workdir 是社区插件,维护者为 miqian-nomad,分类为 admin-security。它把「在指定根目录下领一个带时间戳的新目录 → 注册为 DSH 工作区 → 打开一个干净会话」收成一次点击;目录即沙盒边界,不同任务的产物默认不再互相污染。实现上不改 DSH 官方源码,走 slot 注册、官方 Remote 与一个 loopback HTTP 端点,并在客户端对 uiWorkspace.startSession 做可选包装。
这是什么¶
一句话:一键在配置的根目录下创建时间戳工作目录,注册成 DSH workspace,并在其中启动新会话。
- 仓库:miqian-nomad/dsh-new-workdir
- 目录页:SkillHub 插件页
- 当前 package 版本:0.4.1(MIT,Node >= 22.19)
核心功能¶
入口¶
| 入口 | 位置 | 说明 |
|---|---|---|
| 文件夹+加号「新目录」 | 输入框右侧(模型选择器左边) | 一次点击跑完整流程,适合日常 |
| 「新目录会话」 | 设置页左侧列表 | 同样动作,并可配置根目录、已建数量、最近目录、可选目录名 |
| 新对话 / ⌘N / Ctrl+Alt+N | 侧栏顶部(官方入口) | 默认已接管:无工作区 id 时先领新目录再开会话 |
| 工作区行上的 ⊕ | 侧栏工作区行右侧 | 保持官方语义:在当前目录里再开会话(可能复用该目录下已有空会话) |
顶部「新对话」与行内 ⊕ 外观相近、语义不同:前者是「给我一个新地方」;后者是「就在这个目录里再开一个会话」。
点击后的流程¶
服务端与客户端大致按下面顺序协作:
POST /api/new-workdir/mkdir host 在 root 下创建目录
GET /api/new-workdir/state 询问 root;若本次可复用的空目录会话存在则直接切换
ctx.workspaces.create({ path }) 官方 Remote:注册工作区
ctx.sessions.create({ workspaceId }) 官方 Remote:新建会话
ctx.uiWorkspace.openSession(id) 切换到该会话
POST /api/new-workdir/prune 按需回收磁盘上确认为空的目录
目录名格式为 YYYY-MM-DD-HH-MM-SS,可选后缀 -自定义标签;工作区标题显示为 YYYY-MM-DD HH:MM:SS,便于在侧栏辨认。
连点不会无限堆目录:仅复用「本页会话内刚建且尚未发过消息」的那一个;刷新页面后内存状态清空,再次点击会新建。设置面板里填写了自定义名字则强制新建。
失败时的处理:sessions.create 失败会重试一次;仍失败则退注册工作区、删除空目录,并在 new-workdir.err.log 记一行。各步骤 fail-soft,原因会回显在按钮或设置面板。
对官方「新建会话」的接管(可选)¶
DSH 的 session.new(侧栏顶部 / ⌘N)最终会调用 uiWorkspace.startSession()。插件在无工作区 id 时先领新目录;带工作区 id 的调用(行内 ⊕、工作区选择器)仍走官方逻辑。
通过配置 bridgeNewSession: false(或 window.__dshNewWorkdirBridge = false)可关闭这层包装,官方「新对话」恢复为留在当前工作区。关闭后,插件自带的两个入口(输入框 chip、设置页卡片)仍可用。
接管 startSession 还会影响任务面板的「新建任务」等无参调用点;若需绝对避免对其它入口的副作用,建议关闭 bridgeNewSession,仅使用插件自有入口。
多根目录与清理¶
cordis.patch.yml 中可配置 root(默认根)与 roots(额外根)。建目录默认落在 root;清理空目录时会扫描清单内每个根。仅改 root 而不把旧根写入 roots 时,旧根下的目录仍是 DSH 工作区,但不会被本插件的清理扫到。
POST /api/new-workdir/prune 只 rmdir 空目录,且需满足:路径经 resolve / realpath 后落在配置的根之下、目录名为插件时间戳格式、readdir 为空、不在 keep 名单。客户端在拿不到工作区/会话快照时不会发起清理请求,避免误删。
安装与启用¶
web profile 由 CLI 托管,推荐按 tag 固定版本:
dsh plugin --profile web add github:miqian-nomad/dsh-new-workdir#v0.4.1
本地开发可 link 到源码目录:
dsh plugin --profile web add link:D:/dsh-plugins/dsh-new-workdir
安装后打开设置页「新目录会话」,将 root 改为你本机的工作目录根路径(README 中的 D:/work-harness 仅为示例)。
desktop profile 不由 dsh plugin 直接安装;需在 ~/.dsh/profiles/desktop/node_modules 建 junction,并在 package.json 的 dependencies 与 dsh.profile.bundles 中登记插件名,然后重启桌面端或 dsh web。具体命令见仓库 README。
典型用法¶
配置示例¶
插件包内 cordis.patch.yml 片段(安装后通过 Cordis patch 注入,勿在 profile 的 cordis.patch.yml 重复插入同 id 的 loader):
- insert:
- id: new-workdir
name: dsh-new-workdir
config:
enabled: true # false 时 mkdir 返回 403,仅保留只读展示
root: D:/work-harness # 主根
roots: # 可选额外根
- D:/work-sandbox
- E:/tmp/workdirs
# recent: 8 # 每个根展示的最近目录条数
未写 root 时的后备顺序:DSH_WORKDIRS 环境变量 → ~/.dsh/workdirs(0.4.0 起不再写死 D:/work-harness)。
loopback 接口(同源)¶
客户端仅请求 DSH webServer 上的:
GET /api/new-workdir/state— 查询 enabled、根列表、计数与最近目录POST /api/new-workdir/mkdir— 需头x-dsh-plugin: new-workdir,body 可选name、rootPOST /api/new-workdir/prune— 清理空目录,body 可选paths、keep、sweepPOST /api/new-workdir/log— 客户端上报日志
运行日志:~/.dsh/logs/new-workdir.log;错误:new-workdir.err.log。
适用场景与注意¶
适合:希望「一任务一目录」、侧栏用时间戳区分工作区、减少 Agent 产物交叉污染的 DSH 用户;需要多磁盘或多个根目录分区存放任务的用户。
安全与权限:插件在 DSH 进程权限下运行,会在配置的根下创建与删除(仅空)目录。安装前应阅读源码与 MIT 许可证;仓库 README 提供了删目录边界、无子进程执行、仅 loopback 网络等说明,并通过 @jieai/dsh-plugin-vet 静态扫描(README 记载 verdict 为 clean)。enabled: false 可一键停用 mkdir/prune,仅保留只读状态展示。
生态说明:DSH 社区插件目录(如 SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系;安装命令以仓库 README 为准,勿凭插件名自行拼接未文档化的 CLI 参数。
结尾¶
dsh-new-workdir 把「新目录 + 新工作区 + 新会话」收成一次操作,并用目录边界隔离任务产物;在需要时可关闭对官方「新对话」的接管,只使用自有入口。进一步了解配置与安全细节见 GitHub README。
- 目录页:https://www.skillhub.cn/plugins/miqian-nomad/dsh-new-workdir
- GitHub:https://github.com/miqian-nomad/dsh-new-workdir