dsh-new-workdir:一键领独立工作目录并开干净会话

前言

在 DSH 里做多个互不相关的任务时,常见做法是共用一个工作区目录:Agent 生成的文件、临时脚本和中间产物会堆在同一棵目录树下,后一个任务容易读到前一个任务的残留,侧栏里也难一眼区分「这次到底在哪个文件夹里干活」。手动每次新建文件夹、再在 DSH 里注册工作区并开新会话,步骤多且容易漏。

dsh-new-workdir 是社区插件,维护者为 miqian-nomad,分类为 admin-security。它把「在指定根目录下领一个带时间戳的新目录 → 注册为 DSH 工作区 → 打开一个干净会话」收成一次点击;目录即沙盒边界,不同任务的产物默认不再互相污染。实现上不改 DSH 官方源码,走 slot 注册、官方 Remote 与一个 loopback HTTP 端点,并在客户端对 uiWorkspace.startSession 做可选包装。

这是什么

一句话:一键在配置的根目录下创建时间戳工作目录,注册成 DSH workspace,并在其中启动新会话。

核心功能

入口

入口 位置 说明
文件夹+加号「新目录」 输入框右侧(模型选择器左边) 一次点击跑完整流程,适合日常
「新目录会话」 设置页左侧列表 同样动作,并可配置根目录、已建数量、最近目录、可选目录名
新对话 / ⌘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、root
  • POST /api/new-workdir/prune — 清理空目录,body 可选 paths、keep、sweep
  • POST /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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye