dsh-workspace-folders:为 DSH 会话注册多个工作区根目录

前言

DeepSeek Harness(DSH)默认一个会话只绑定一个工作区目录,文件沙箱的写入也限定在这个根目录里。实际开发里经常在两个路径之间来回:例如本机 D:\AI工作区\deepseek 和旁边的 D:\AI工作区\另一个项目 要搬文件、跑脚本,或对着一份共享库改接口。第一次用绝对路径调用 write、edit、apply_patch 越界时,客户端会弹出审批;模型侧也未必知道这些目录存在。

下面介绍社区插件 dsh-workspace-folders(维护者 melody12311,分类:工作流)。它把额外目录提升为与会话工作区同等语义的根目录,并配合 workspace_roots 工具与运行时上下文,让文件类工具在这些目录内可直接读写,而无需反复审批。

这是什么

dsh-workspace-folders 是运行在 DeepSeekRuntime 上的 DSH 插件(当前发布版本 v0.1.0,MIT 许可证)。核心思路不是单纯「多几个可写路径」,而是让每个登记目录在会话里被视为真正的 workspace root:会话会列出它们,workspace_roots 会扫描每个根目录,读、写、编辑、补丁、移动、删除等文件工具在对应绝对路径下按工作区根目录同等对待,且不再触发写入审批。

插件以当前 DSH profile 的进程权限工作;安装前应自行查看 GitHub 仓库 源码与许可证。社区目录 SkillHub 插件页 提供收录信息,与 DeepSeek / 幻方无官方从属关系。

核心能力

层次 行为
工作区语义 运行时上下文列出本会话的根目录(自带工作区 + 登记的额外目录),说明与主工作区根同等对待
扫描入口 新增 Host 侧只读工具 workspace_roots:返回各根绝对路径、顶层条目、git 分支,以及 AGENTS.md / README / 清单类标记
写入边界 文件工具在登记目录内用绝对路径操作,不再审批;不改变会话模式(read-only 仍只读,danger-full-access 保持原样)
作用域 可按工作区单独登记(按会话 cwd 归属,支持嵌套、最长前缀优先),也可配置全局目录供所有工作区共用

实现上插件包装 ctx.sandboxPolicy.resolve(),在每次工具执行时把当前会话对应的额外目录合并进 additionalWritableRoots;包装 ctx.sandbox.confine() 时在进程沙箱策略中去掉追加目录,避免 Windows 下 pwsh 等因 ACL 受限令牌拒绝「额外可写目录」而无法启动。卸载插件后包装与会话上下文、workspace_roots 一并撤销,行为恢复默认。

尚未覆盖的部分(README 明确说明):侧边栏文件树、@ 文件补全、工作区变更 / diff 记录仍只认会话自带的工作区根;插件主要解决模型侧工作逻辑与写入边界。

安装与启用

在指定 profile 下从 GitHub 安装:

dsh plugin --profile <profile> add github:melody12311/dsh-workspace-folders

或从 release 安装 tgz(示例为 v0.1.0):

dsh plugin --profile <profile> add "https://github.com/melody12311/dsh-workspace-folders/releases/download/v0.1.0/dsh-workspace-folders-0.1.0.tgz"

也可在 dshmarket 搜索安装;本地目录安装与 plugin_manager 的 install_bundle 等价。运行时要求 Node.js >=22(见 package.json 的 engines)。

卸载:从 profile 的 dsh.profile.bundles 中移除 dsh-workspace-folders 即可;已保存的 folders.json 不会自动删除。

配置与存储

清单保存在 profile 数据目录:

<profile>/plugin-data/dsh-workspace-folders/folders.json

示例结构:

{
  "version": 1,
  "global": ["D:\\shared"],
  "workspaces": { "D:\\AI工作区\\deepseek": ["D:\\AI工作区\\另一个项目"] }
}

不存在的目录会保留在列表中(例如外接盘暂离),但不会进入沙箱策略、根目录清单和 workspace_roots 输出。某工作区下最后一个登记目录被删除后,该工作区条目会自动消失。若登记的目录包含了工作区本身(如给 D:\work 添加 D:\),会被拒绝。

典型用法

两个 UI 入口修改同一份清单,保存后立即生效,无需重启 DSH;下一次工具调用即按新沙箱边界执行,下一轮模型请求带上新的根目录列表。

A. 左侧栏(推荐) — 鼠标悬停某工作区名称,行尾文件夹图标(在「⋯」左侧)打开管理框:首行是会话自带根目录(「始终可写」、不可移除);下方为已登记目录,可移除;「添加文件夹」调系统选择框,「或输入绝对路径」作兜底。

B. 设置页 — 左下角齿轮 → 工作区文件夹:全局清单与各工作区卡片总览。

模型在每轮请求中会看到类似说明(路径因会话而异):

This session has extra workspace roots besides its own workspace folder:
- D:\AI工作区\shared-lib
Treat them as workspace roots of equal standing: when the task may involve them, list their
contents and read the relevant README/AGENTS.md/manifests before planning. The `workspace_roots`
tool returns every root with its top level, git branch and marker files.

调用 workspace_roots 时,输出会枚举各根、顶层条目、git 分支与标记文件,便于在规划或编辑前先读相关 README / 清单。

适用场景与注意

适合需要在同一 DSH 会话中稳定操作多个本地项目根、共享库或 monorepo 相邻目录的开发者;不适合指望 UI 文件树或多根 diff 与主工作区完全一致的场景。

权限与安全:

  • 沙箱主要限制写入;读取本身不受工作区限制。
  • 登记的目录等价于把该路径的写权限交给 agent,只添加信任目录。
  • 跨目录改文件优先用文件工具;pwsh 内写操作仍受进程沙箱的工作区限制,除非会话处于「完全权限」。
  • 按工作区登记的目录不会泄漏到其他工作区(依据会话 cwd 是否位于该工作区路径之下)。

Windows:文件工具支持追加目录,但 pwsh 等沙箱进程不支持在 ACL 受限令牌下携带追加可写目录;跨文件夹命令行写入需将会话切到「完全权限」。

结尾

dsh-workspace-folders 在 DSH「单工作区沙箱」之上补了一层多根目录语义:清单可视化管理、会话上下文告知模型、workspace_roots 统一扫描,文件工具在登记根内免审批写入。安装与细节以仓库 README 为准。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye