没有插件时
一个会话,一个可写根目录
- 跨仓库的改动需要为每个仓库各开一个会话。
- 上下文只能靠你在会话之间手动搬运。
- 智能体无法在一轮对话里同时修改 API 契约和它的客户端。
让 DSH 智能体在一次会话里跨多个仓库读取、编辑并运行命令。插件把工作区沙箱从单个根目录扩展为主根目录加 N 个附加根目录,智能体的其他工作方式保持不变。
问题
DSH 把会话起点视为唯一可写的根目录。当工作横跨某个服务、它的客户端和一套设计系统时,就得在多个会话之间来回切换。
没有插件时
使用 Multi-root Workspace
功能
插件只改变一个问题的答案:哪些目录属于这个工作区。所有建立在这个答案之上的能力照常工作。
多个根目录
主根目录是会话起点,不能被移除。附加根目录会被规范化,并与主根目录及彼此校验,保存为有序列表。每个根目录都可以设置别名、调整顺序、复制路径,或在文件管理器中显示。

原生工具
智能体继续使用 read、write、edit 和 bash,插件不添加任何 workspace_* 工具。它用子类替换两个沙箱提供者,让它们查询同一个共享范围,因此文件工具、bash 和终端看到的是同一组根目录。
对智能体保持不变
未添加
被扩展的部分
哪些目录属于这个工作区?
工作区管理
可以在会话里用 /workspace-folders 管理根目录,也可以在 Web 界面侧边栏底部的“文件夹”对话框里管理。两者都经过同一份经过校验的登记表,按主根目录持久化,并如实显示每个根目录的真实状态。
# 列出主根目录和附加根目录 /workspace-folders# 登记、命名、移除或在文件管理器中显示根目录 /workspace-folders add ~/code/another-repo /workspace-folders alias 1 payments /workspace-folders reveal 1 /workspace-folders remove 1跨仓库工作流
插件的 journey 测试会在 web 和 headless 两种组合下,驱动一次真实的智能体对话,跨两个 Git 仓库工作。测试使用脚本化的模型端点,所以不需要任何凭据。
把其他仓库加入会话的工作区。
描述一个同时涉及服务端和客户端的改动。
智能体在每个被授权的根目录里编辑文件并运行命令。
每个仓库保留自己的 Git 状态,改动依然便于审阅。
工作区指令
上游的发现逻辑从会话目录向上查找,因此永远到不了附加根目录。插件补上的正是这条缺失的路径,并附带严格的限制。
安全架构
附加根目录通过 Harness 本来就在用的机制授权,而不是靠提示词,也不是切换到完全访问。
登记时会记录被授权的规范目录。只有路径仍然解析到该目录时,范围才会授权;目录或符号链接被替换后会被标记为 redirected,不再授权。
进程内围栏和内核沙箱使用同一个范围。一项一致性矩阵测试会把围栏的写入判定与各内核配置文件实际授权的路径逐一对比。
如果无法识别上游的沙箱配置,插件会拒绝执行命令,而不是悄悄只授权主根目录。不受支持的 DSH 版本会让受门禁约束的组件根本不启动。
只读模式不授权任何附加根目录;workspace-write 授权主根目录和已登记的根目录;完全访问由上游决定,会绕过沙箱。
存储范围的内核租约保证同一时刻只有一个进程授予根目录。争用的进程会发布空范围并拒绝变更。面板请求绑定到存活的会话,而不是客户端提供的路径。
来自附加根目录的指令文件以用户角色的上下文送达,并像其他对模型可见的输入一样记录在会话日志里。
快速开始
插件通过 DSH 插件管理器安装。它已发布到 npm,适用于 web 和 desktop 两种 profile。
在受支持的 DSH 运行时中执行。Electron 桌面版请替换 profile。
推荐。安装预构建产物,首次 add 需要回答一次 allowBuilds。
$ dsh plugin --profile web add @dsh-electron/dsh-plugin-multi-root-workspace$ dsh --profile web预构建离线包,适合内网。也可从 GitHub Release 下载同名 tgz。
$ pnpm pack @dsh-electron/dsh-plugin-multi-root-workspace$ dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-0.1.6.tgz拉取源码并由 prepare 现场构建。需要两次 allowBuilds,请锁定标签。
$ dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace#v0.1.6链接本地 checkout,适合开发调试。无 TTY 时需要 export CI=true。
$ git clone https://github.com/cherrchen/dsh-plugin-multi-root-workspace.git$ cd dsh-plugin-multi-root-workspace$ export CI=true$ pnpm install$ pnpm build$ dsh plugin --profile web add "$PWD"首次安装会以 ERR_PNPM_IGNORED_BUILDS 停止。插件带有一个原生依赖 koffi,而 pnpm 10 及以后默认不运行依赖脚本,除非你允许。请在该 profile 的 pnpm-workspace.yaml 中把它设为 true,然后重新安装。这会让该脚本在你的机器上、智能体沙箱之外运行。
allowBuilds: koffi: true“文件夹”入口出现在侧边栏底部。在会话里也可以使用命令。
/workspace-folders add ~/code/another-repo /workspace-folders智能体现在在该目录中拥有与会话自身工作区相同的写入权限。
--profile web 换成 --profile desktop。从 GitHub 安装需要回答两次 allowBuilds。详见 README(在新标签页打开)。pnpm dsh 代替 dsh。兼容性
插件替换的沙箱提供者,其内部实现没有语义化版本承诺,所以只支持 CI 实际跑过的确切 DSH 版本——下表每一行都在已发布的 v0.1.6 包中。
| DSH 版本 | 状态 | 加入于 | 说明 |
|---|---|---|---|
| 0.1.5-rc.2 | 已验证 | v0.1.1 | 兼容性约定的基线版本。 |
| 0.1.6-alpha.1 | 已验证 | v0.1.1 | 从该版本起沙箱限制(confine)变为异步。 |
| 0.1.6-alpha.2 | 已验证 | v0.1.2 | 接口形态与 0.1.6-alpha.1 相同;修复了面板的会话查找。 |
| 0.1.7-alpha.1 | 已验证 | v0.1.2 | 需要适配:会话格式 4、进程内插件包、bash 的 execute().result()。 |
| 0.1.7-alpha.2 | 已验证 | v0.1.3 | 接口形态与 0.1.7-alpha.1 相同。 |
| 0.1.7-rc.1 | 已验证 | v0.1.3 | 从该版本起,安装时强制要求 peerDependencies 精确匹配。 |
| 0.1.7-rc.2 | 已验证 | v0.1.4 | 接口形态与 0.1.7-rc.1 相同。 |
| 0.2.0-rc.1 | 已验证 | v0.1.5 | DSH 0.2 候选版本。 |
| 0.2.0-rc.2 | 已验证 | v0.1.5 | Rivetdeck 0.2.0-beta.3 内置的运行时。 |
| 0.2.1-alpha.1 | 已验证 | v0.1.6 | 动态工作目录;登记表仍以会话起点为键。 |
| 0.2.1-alpha.2 | 已验证 | v0.1.6 | 插件的开发 pin。 |
| 其他任何版本 | 不支持 | — | 受门禁约束的组件不会启动;Harness 的表现就像没有安装该插件一样。 |
Seatbelt 配置文件加进程内围栏
bwrap 或 Landlock 加进程内围栏
按根目录集合授予 ACL 的运行器(受限令牌)加进程内围栏;受限 shell 为 pwsh
状态按版本逐项声明,绝不按版本号顺序推断。未列出的版本即使 CI 全绿,也只是证据,而不是支持。规则请阅读兼容性约定(在新标签页打开)。
一条命令安装,不需要学习新工具。移除根目录后,一切就像从未安装过一样。