# @dsh-electron/dsh-plugin-multi-root-workspace 中文文档

规范地址：https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/

版本：0\.1\.18
npm 元数据更新时间：2026-11-12T17:47:54.758Z
中文译文更新时间：2026-11-12T22:20:46.409Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace
原文对照：https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/?lang=original
源码仓库：https://github.com/cherrchen/dsh-plugin-multi-root-workspace

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：3.3 MB，207 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：^22\.19\.0 \|\| \>=24\.0\.0
- 运行依赖：2 个
- peer 依赖：@deepseek-ai/cordis \>=4\.0\.1 \<5\.0\.0 \|\| 4\.0\.5-alpha\.1 \|\| 4\.0\.5-alpha\.2 \|\| 4\.0\.6-alpha\.1 \|\| 4\.0\.6-alpha\.2，@deepseek-ai/dsh-fs 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-llm 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-lsp 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-agent 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-skill 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-tools 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-sandbox 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-session 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/schemastery \>=3\.18\.2 \<4\.0\.0 \|\| 3\.18\.5-alpha\.1 \|\| 3\.18\.5-alpha\.2 \|\| 3\.18\.6-alpha\.1 \|\| 3\.18\.6-alpha\.2，@deepseek-ai/dsh-commands 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-fs-local 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-settings 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-lsp-stdio 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-subprocess 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-util-values 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-storage-json 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-sandbox-local 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-session-query 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-system-prompt 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/node-addon-system ^0\.1\.2，@deepseek-ai/dsh-sandbox-policy 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-storage-domain 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-typert-protocol 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-skill-filesystem 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-client-connection 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-agent-instructions 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-permission-presets 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-api-workspace-files 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-sandbox-windows-acl 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2，@deepseek-ai/dsh-api-session-controller 0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2
- 首次发布：2026-09-13T06:11:56.826Z
- 最新版本发布：2026-11-12T17:47:54.327Z
- 近 30 天下载量：4083（2026-10-13 至 2026-11-11，npm 官方下载统计）
- 已发布版本数：19（近 12 个月 19 个）

## 中文简介

Depseek Harness 的多根工作空间: 在工作空间沙盒范围中添加 N 额外的根作为树外捆绑

## 安装

```sh
npm install @dsh-electron/dsh-plugin-multi-root-workspace
```

也可以使用：`pnpm add @dsh-electron/dsh-plugin-multi-root-workspace`、`yarn add @dsh-electron/dsh-plugin-multi-root-workspace`、`bun add @dsh-electron/dsh-plugin-multi-root-workspace`

## README

![](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/public/multi-root-mark.svg)

# dsh-plugin-multi-root-workspace

中文 | [English](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/README.en.md)

## 项目简介

[DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) 默认把新建工作区所在的目录作为 Agent 的主目录，在默认的工作区读写模式（`workspace-write`）下，沙箱的读写范围也仅覆盖这一个目录。本插件将 DSH 的工作区范围拓展到“一个主目录 + 多个附加目录”。

并非所有项目都是 monorepo。一个开发项目往往由多个独立 Git 仓库组成，跨仓库干活原本得反复换会话。同类工具早已支持在一个工作区添加多个文件夹，本插件把同样的能力带给 DSH：把其他仓库登记为附加根，并按需授予只读、读写或不受限的访问级别，Agent 即可在授权范围内读写。

-   **不新增工具**：Agent 照旧使用原生 `read` / `write` / `edit` / `bash`，只是授权的目录变多了。
-   **沙箱约束**：附加根可继承会话（主目录）的权限设置，也可单独固定为只读或读写；在只读与读写下，约束不靠系统提示词，而由进程内文件围栏 + 内核级沙箱（macOS Seatbelt / Linux bwrap / Landlock / Windows ACL）执行，经本插件围栏的原生文件与 bash 共享同一份授权范围；自行启动 Worker 的第三方工具须单独验证，dsh-ops 的现存缺口见下方已知限制。
-   **Files 页签浏览附加根**：Files 页签头部可直接在主根与任一已登记附加根之间切换，附加根的目录树以与主根相同的原生 Files 视图呈现，打开文件、在外部应用打开、自动刷新等操作完全一致；文件预览页的 Folder 导航树同样落在被预览文件所在的根，定位、展开与高亮与原生一致。
-   **可选 Auto review（默认关闭）**：fork 上游实验性「自动授权审查」，向 Reviewer 补充附加目录的审查上下文——当前工作区拓扑、各根访问级别与实时指令文件；出厂关闭，需在插件管理器的行列表中显式打开 `@dsh-electron/dsh-plugin-multi-root-workspace/auto-review` 行后生效，启用时接管官方同名 bundle。
-   **附属根 Skills**：发现附属目录的 `.dsh/skills` 与 `.agents/skills`，附属根经 `/alias-id:skill-name` 命名空间调用原生 `skill` 工具；每根独立开关、可编辑 `aliasId`，全局设置默认开启。
-   **Worktree 附加根建议（实验性，默认关闭）**：primary 是 Git main 或 linked checkout 时，发现同 common 的其他 worktree，经用户确认后把其源码树登记为 `inherit` 附加根；发现只读取插件自己解析的 Git 元数据，不启动 Git 子进程、不自动增删。linked worktree 还可显式授权主 checkout 根，补齐受限 `git add` / `git commit` 的共享元数据写入缺口（[ADR-0039](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0039-worktree-aware-root-suggestions.md)）。
-   **不配等于没装**：未登记附加根时行为与未装插件逐项一致；配置错误一律明确报错，从不静默降级。

当前发布版本 `v0.1.18`。各版本的用户可见变更见 [CHANGELOG](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/CHANGELOG.md)；进度与发布状态见[路线图 §进度总账](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/plans/active/2026-09-12-multi-root-workspace.md#%E8%BF%9B%E5%BA%A6%E6%80%BB%E8%B4%A6)。

## 快速开始

插件已发布到 [npm](https://www.npmjs.com/package/@dsh-electron/dsh-plugin-multi-root-workspace)。在 DSH 侧栏的**插件**页点**添加插件**、填入包名 `@dsh-electron/dsh-plugin-multi-root-workspace` 即可安装；也可以用命令行两步装完：

```sh
dsh plugin --profile web add @dsh-electron/dsh-plugin-multi-root-workspace
dsh --profile web       # --profile 按你的启动方式选择，可选值见 DSH 文档
```

tarball、GitHub、本地源码等其他安装方式见[安装](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/#readme-%E5%AE%89%E8%A3%85)。

启动后侧栏底部出现 **Folders**（`🗂`）动作；在 DSH `0.2.1-alpha.3` 及更新的运行时上，新会话页工作区行右端也会出现同一入口（与相邻的工作区/模式选择器同高同字号，无下拉箭头，窄窗口只显示图标）。也可以直接在会话里：

```text
/workspace-folders add ~/code/another-repo [--inherit|--read-only|--read-write]
```

之后 Agent 即可在该目录读写、跑 bash——默认 `inherit`，访问级别跟随会话模式。DSH 的动态 working directory 只影响新操作的相对路径和执行目录，切换 cwd 不会新增授权，也不会改变注册表归属。

## 环境要求

**使用本插件**：一个下表中的 DSH 版本（精确匹配，不是范围）。`dsh plugin` 负责安装，无需本地 Node 工具链。

| DSH 系列 | 受支持的版本 |
| --- | --- |
| `0.1.5` | `0.1.5-rc.2` |
| `0.1.6` | `0.1.6-alpha.1`、`0.1.6-alpha.2` |
| `0.1.7` | `0.1.7-alpha.1`、`0.1.7-alpha.2`、`0.1.7-rc.1`、`0.1.7-rc.2` |
| `0.2.0` | `0.2.0-rc.1`、`0.2.0-rc.2` |
| `0.2.1` | `0.2.1-alpha.1`、`0.2.1-alpha.2`、`0.2.1-alpha.3`、`0.2.1-alpha.4`、`0.2.1-alpha.5`、`0.2.1-rc.1`、`0.2.1-rc.2`、`0.2.1-rc.3`、`0.2.1-rc.4`、`0.2.1-rc.5` |
| `0.2.2` | `0.2.2-alpha.2`、`0.2.2-alpha.3`、`0.2.2-rc.1`、`0.2.2-rc.2` |

DSH 版本不在表内、或 `@deepseek-ai/dsh-*` 各包版本不一致时，插件不会启动，行为等同没装。

**从源码构建 / 贡献**：Node.js `^22.19.0 || >=24`，pnpm `11.25.0`（建议经 corepack 启用）；开发 pin 的 DSH 为 `0.2.2-rc.2`（Node ≥24.9）。

**运行平台**：macOS（Seatbelt）、Linux（bwrap / Landlock）、Windows（root-set ACL runner）。

## 安装

不使用命令行时，DSH 侧栏的**插件**页提供同一安装入口：点**添加插件**，填入 npm 包名（或 Git 地址、tarball、本地绝对路径）。

`dsh plugin` 支持四种安装来源。以下均以 web profile 为例；桌面端（Electron）把 `--profile web` 换成 `--profile desktop`，安装方式同源。

| 来源 | 命令 | 说明 |
| --- | --- | --- |
| npm 注册表（推荐） | `dsh plugin --profile web add @dsh-electron/dsh-plugin-multi-root-workspace` | 预构建产物，即装即用 |
| GitHub | `dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace` | 安装时自动从源码构建；`allowBuilds` 需含本包，建议锁定版本 |
| tarball | `dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-<version>.tgz` | 预构建离线包，适合内网/离线 |
| 从源码安装 | `dsh plugin --profile web add /path/to/package/dsh-plugin-multi-root-workspace` | pnpm `link:` 链接本地 checkout，适合开发调试；无需 `allowBuilds` |

**首次安装时 `dsh plugin add` 会以 `[ERR_PNPM_IGNORED_BUILDS]` 失败**：在该 profile 的 `pnpm-workspace.yaml` 里补上下面这行，再执行一次 `add` 即可：

```yaml
allowBuilds:
  koffi: true
```

如果重跑 `退出 0` 但插件没有进入 `dsh.profile.bundles`，做一次 `remove` + `add`。更多排查见[故障排查](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/troubleshooting/install-stops-at-build-approval.md)。

### 从 npm 安装（推荐）

```sh
dsh plugin --profile web add @dsh-electron/dsh-plugin-multi-root-workspace
```

安装的是预构建产物，首次安装需要添加 `allowBuilds`。

### 从 tarball 安装

```sh
pnpm pack @dsh-electron/dsh-plugin-multi-root-workspace
# 或从 GitHub Release 资产下载，例如：
# https://github.com/cherrchen/dsh-plugin-multi-root-workspace/releases/download/v0.1.18/dsh-electron-dsh-plugin-multi-root-workspace-0.1.18.tgz
dsh plugin --profile web add ./dsh-electron-dsh-plugin-multi-root-workspace-0.1.18.tgz
```

同样是预构建产物，适合内网或离线环境交付；首次安装同样需要添加 `allowBuilds`。

### 从 GitHub 安装

```sh
dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace
```

GitHub 来源装的是源码，`add` 时会自动构建，不需要手动编译；但 `allowBuilds` 要写两行——本包自身和 `koffi`：

```yaml
allowBuilds:
  '@dsh-electron/dsh-plugin-multi-root-workspace': true
  koffi: true
```

建议锁定版本（如 `#v0.1.18`），让后续推送无法悄悄改变实际运行的内容：

```sh
dsh plugin --profile web add github:cherrchen/dsh-plugin-multi-root-workspace#v0.1.18
```

### 从本地源码安装

```sh
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 /path/to/repo
```

> \[!TIP\] `dsh` 不在 PATH 里时（例如用源码仓库跑 DSH），把命令里的 `dsh` 换成 `pnpm dsh`。

## 运行方法

开发自检：

```sh
pnpm lint && pnpm typecheck
pnpm test
pnpm kernel:probe
pnpm smoke
pnpm docs:check
```

安装进 DSH 运行时并验证组合：

```sh
dsh plugin --profile web add /path/to/repo
dsh --profile web --dump-config | grep -A3 'multi-root'
```

预期输出：

```text
# == @deepseek-ai/dsh-base, patched by @dsh-electron/dsh-plugin-multi-root-workspace
- id: sandbox
  name: '@deepseek-ai/dsh-sandbox-local'
  disabled: true
--
# == @deepseek-ai/dsh-base, patched by @dsh-electron/dsh-plugin-multi-root-workspace
- id: fs-sandbox
  name: '@deepseek-ai/dsh-fs-sandbox'
  disabled: true
--
# == @dsh-electron/dsh-plugin-multi-root-workspace
- id: multi-root-compat
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/compat'
- id: multi-root-fs
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/fs'
- id: multi-root-sandbox
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/sandbox'
- id: multi-root-providers
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/providers'
- id: multi-root-scope
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/scope'
  config:
    toolAccess: {}
- id: multi-root-registry
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/registry'
  config:
    sharedStorageRoot: !!js dshHomePath('storages')
    leasePath: !!js dshHomePath('storages/multi_root_workspace.lock')
    maxAdditionalRoots: 16
- id: multi-root-instructions
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/instructions'
  config:
    maxBytes: 65536
- id: multi-root-lsp
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/lsp'
- id: multi-root-workspace-files
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/workspace-files'
- id: multi-root-command
  name: '@dsh-electron/dsh-plugin-multi-root-workspace/command'
- id: multi-root-client
  name: '@dsh-electron/dsh-plugin-multi-root-workspace'
```

即上游 `fs-sandbox` 与 `sandbox` 两行被禁用、由插件同名服务接管，插件自身的 `multi-root-*` 行全部挂载。启动后侧栏底部会出现 **Folders** 动作；DSH `0.2.1-alpha.3` 及更新的运行时还会在新会话页工作区行右端显示同一入口。

## 使用方法

### 命令

```text
/workspace-folders [list]                                                   # 列出主根与附加根（含每根访问级别与状态）
/workspace-folders add <absolute path> [--inherit|--read-only|--read-write] # 不带路径时打开系统目录选择器；新登记默认 inherit
/add-dirs [absolute path] [--inherit|--read-only|--read-write]              # /workspace-folders add 的快捷命令
/workspace-folders access <order|path> inherit|read-only|read-write         # 切换访问级别（扩权要求该根此刻可用）
/workspace-folders skills <order|path> on|off                               # 独立切换附属根 Skills，不改变写权限
/workspace-folders alias-id <order|path> <kebab-case>                        # 编辑稳定 Skill 命名空间
/workspace-folders alias <order|path> [alias]                               # 不带别名则清除已有别名
/workspace-folders remove <order|path>                                      # 序号即 list 输出的编号
/workspace-folders reveal <order|path>                                      # 在文件管理器中显示
/workspace-folders isolate-profiles [--apply]                               # 检查 $DSH_HOME profile 依赖导入方式与多链接文件；--apply 写入 copy 配置
/workspace-folders help                                                     # 查看命令帮助
```

路径可带引号；与已有根重复、嵌套在已有根内部、或就是主根本身的路径会被拒绝。

访问级别是三态的（[ADR-0017](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0017-three-state-root-access-and-sandbox-modes.md)，语义细节见[使用指南](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/guide/README.md#%E8%AE%BF%E9%97%AE%E7%BA%A7%E5%88%AB%E6%95%B0%E9%87%8F%E4%B8%8A%E9%99%90%E4%B8%8E-per-tool-%E5%B0%81%E9%A1%B6)）：`inherit` 跟随会话模式——`workspace-write` 可写、`read-only` 拒写、`danger-full-access` 不受限；`read-only` 在任何模式下都拒写（包括 Full-access）；`read-write` 固定在只读会话里仍可写。唯一例外：用户在单次调用上批准的 `danger-full-access` 一次性提权会解除该调用的只读根与 per-tool 封顶拒绝（`$DSH_HOME` 与 Registry 失权降级除外，[ADR-0036](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0036-approved-escalation-override.md)）。旧版插件登记的可写记录升级后按 `inherit` 读。每个主根最多登记 16 个附加根（`maxAdditionalRoots` 配置可调至 64）。宿主还可以在 `multi-root-scope` 行配置 `toolAccess`，例如 `{ bash: 'read-only' }` 让 bash 永远不能写任何附加根（仍可写主根；同一批准的一次性提权对该调用同样解除封顶）。

`add` 后执行 `list` 的预期输出（`workspace-write` 会话，website 登记为只读）：

```text
Workspace root (primary; access follows the current sandbox mode): /home/me/monorepo
  1 /home/me/payments-service [支付] (inherit)
  2 /home/me/website (read-only)
2 of 16 additional roots.
Writable additional roots under the current mode: 1 of 2.
```

### 附属根 Skills

发现附属目录的 `.dsh/skills` 和 `.agents/skills`，首个模型步骤可见名称与描述，正文按需加载。主根使用 `/skill-name`；附属根始终使用 `/alias-id:skill-name`，可在 Slash 菜单补全或手动输入。模型通过原生 `skill` 工具调用内部名称；工具日志中可能显示内部 ID，人类菜单只列命名空间引用。

新登记的 `inherit` / `read-write` 根默认开启，`read-only` 根默认关闭；Workspace Folders Dialog 可独立切换 Skills 并编辑 `aliasId`。显示 Alias 的修改不改变 `aliasId`。只有登记权限的实际变化才重置开关；切换会话沙箱模式、同值权限设置和未改变权限的重新登记都保留手动选择。只读根开启 Skills 后仍没有写权限。

Settings → Plugins → Multi-root Workspace 中的 **启用附属根 Skills** 控制全部附属根，默认开启。关闭后阻止新的发现与调用，保留每根选择；恢复后按原值发现。主根 Skills、指令、LSP、文件浏览及沙箱权限不受此开关影响。旧版宿主使用兼容的插件设置页。命名空间引用按普通用户输入显示，不添加背景、高亮或点击预览；草稿内的原生 Skill 高亮暂不支持冒号引用。

升级时旧 `inherit` / `read-write` 登记会默认开启 Skills。持久化迁移保留原有 grant；旧版写回可能剥离 `aliasId` 和手动开关，再升级时重新按默认值迁移，**不保证 Skills 配置无损降级**。如需保留选择，降级前备份 `$DSH_HOME/storages/multi_root_workspace.json`。已投递正文仍留在历史中，禁用不会结束已经启动的进程。

架构与验收边界见 [ADR-0023](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0023-multi-root-skill-discovery-and-invocation.md)，实施和平台状态见[路线账本](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/plans/active/2026-09-12-multi-root-workspace.md#multi-root-skills-%E6%9E%B6%E6%9E%84%E9%AA%8C%E8%AF%812026-10-23)。

### Worktree 附加根建议（实验性，默认关闭）

primary root 本身是 Git main 或 linked checkout 根时，插件会发现与本仓库共享 common git dir 的其他 worktree —— 包括会话开始前就存在、由终端、IDE、forge 或其他 DSH 创建的 —— 并在用户确认后把该 worktree 的源码树登记为 `inherit` 附加根。发现只读取插件自己打开并解析的 Git 元数据（`.git` 指针、admin、common 的 config/HEAD/index 与完整祖先链），**不启动任何 Git 子进程，也不解析 commit 对象**，并且**不会自动添加或删除**。该功能**实验性、默认关闭**，需在插件详情卡显式开启。

默认 pool 没有特殊规则：主仓库作为 primary 时 `.agents/worktrees/<id>` 位于 primary 内，按既有包含规则过滤；primary 本身是 pool worktree 时，兄弟 worktree 仍是候选（仍受登记、上限与「不再提示」约束）。submodule（含 linked worktree 本身是 submodule）、bare 派生的 linked worktree、`--separate-git-dir` 主 checkout、`extensions.worktreeConfig`、`core.repositoryformatversion=1` / `--relative-paths` 以及 split/sparse index 一律不提示。

提示按 workspace 共享、按 session 的沙箱模式过滤：读写会话可确认读写，只读会话显示只读但登记策略仍是 `inherit`，Full-access 不提示。**恰好一个可见候选时显示原确认对话框；两个及以上时显示可勾选的列表**（B 默认勾选，A 默认不勾且内联披露），一次确认多个目录。登记是 workspace 级的，**其他读写会话也会获得该目录的写权限**，对话框会明确说明。确认后由 Registry owner 在既有串行队列内再次复验 primary/candidate、primary/common/admin 的 HEAD 语法与目录身份；等待期间任何变化都会让该项失效（`worktree/prompt-stale`），列表中的其余项继续处理，失效项保持未登记。

worktree 被删除或移动后，Workspace Folders 面板会显示徽标；**永不自动清理**。只有登记路径被确认缺失（`ENOENT`/`ENOTDIR`）且 `rootId + path + addedAt` 仍匹配时，面板才提供逐条或批量清理；目录仍存在、无法访问，或旧 admin 消失但 checkout 仍有效时只提供普通 Remove。缺失根会继续占用 `maxAdditionalRoots`，直到清理或手动移除；清理前，同一路径出现的新目录可能继承旧授权，面板会显示该提示。

Settings → Plugins → Multi-root Workspace 同一张设置卡中的 **启用 Worktree 附加根建议** 带“实验性”Tag，**默认关闭**，与「启用附属根 Skills」相互独立；只有显式开启后才进行发现、提示与专用清理。关闭后已有登记根仍按普通根管理。决策与验收边界见 [ADR-0039](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0039-worktree-aware-root-suggestions.md)。

### 主 checkout 授权（A）

当 session 的 workspace 本身是 linked worktree、且当前为 `workspace-write` 时，插件会提示把该仓库的\*\*主 checkout 根 `<main>`（共享 common 的父目录，通常是主 checkout 的源码根）\*\*登记为 `inherit` 附加根。对话框明确显示实际路径与范围：主 checkout 的源码树、共享 config、hooks、refs/objects 以及所有 worktree 的 admin 数据，可能影响同仓库的其他 checkout；登记仍是 workspace 级。

A 只在该 primary 的完整快照证明 common 身份、且 `<main>/.git` 仍是该 common 的真实目录时出现。它补上受限 `workspace-write` 会话执行 `git add` / `git commit` 的写入缺口，同时**把主 checkout 的源码树纳入授权**。默认 pool 的 primary 位于 `<main>` 内，`primary-overlap` 会拒绝，因此 pool 没有 A；`--separate-git-dir` 时推导出的路径可能是 store 的父目录而非真正主 checkout，对话框会显示实际路径并提示核对。等待确认期间，primary/admin/common 的文件系统身份、双向指针、admin HEAD、祖先索引、主根身份或 `<main>/.git` 被替换都会让提示失效，不会写入。

`read-only` 与 `danger-full-access` 不提示 A；模式变化或关闭开关会作废旧提示。A 根不进入 worktree 清理映射，删除 linked checkout 也不会清理它；需要撤回时使用普通 Remove。受限 shell 的真实 Git 旅程按内核能力探针执行，宿主无法嵌套沙箱时显式 skip 并打印原因。

### 面板

侧栏底部的 **Folders** 入口，以及 DSH `0.2.1-alpha.3` 及更新运行时新会话页工作区行右端的同一入口，打开的是同一个对话框；它列出主根与附加根，支持添加、移除、别名、切换只读/可写、复制路径与在文件管理器中显示。新会话入口与相邻的工作区/模式选择器同一套几何与交互，但因为打开对话框而不是下拉菜单，**没有 chevron**；窗口宽度 `≤560px` 时只显示图标，名称仍由 `aria-label` / 悬停提示承载。首条消息发出后 hero 行消失，侧栏入口照常可用；旧运行时只有侧栏入口。

### 模型侧

附加根的拓扑信息会注入系统提示词，让模型知道当前有哪些目录可用，授权变化时信息随之更新，不需要向模型提供新的工具。

## 可选 Auto Review 适配

需要 Auto Review 多根上下文时，在插件管理器的主包行列表中启用默认关闭的 [Auto Review 入口](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/src/auto-review/README.md)；同一详情页设置卡中的「多根 Auto Review（实验性）」开关与该行开关等价，默认同样关闭。该集成仅面向 DSH `0.2.1-rc.2`；普通安装保持原支持范围且不会启用或选择 Auto。

## 项目结构

```text
.
├── src/
│   ├── roots.ts                      纯规则层：canonical 化、冲突校验、登记状态分类（available/missing/redirected/invalid）
│   ├── registry.ts                   根注册表：dsh-storage-domain 持久化，唯一存储核心与 Host facade，store-wide 准入/变更排序
│   ├── registry-lease.ts             跨进程 Registry Authority：POSIX flock（进程死亡由内核释放）
│   ├── registry-lease-win32.ts       同上，Windows named semaphore 实现
│   ├── scope.ts                      ctx.multiRootScope：唯一的授权源，兼发模型可见的拓扑快照
│   ├── fs.ts                         多根文件系统 provider（进程内 fence，子类自上游 LocalFileSystem）
│   ├── sandbox.ts                    多根内核沙箱 provider（子类自上游 LocalSandboxProvider）
│   ├── dialects.ts                   Seatbelt / bwrap / Landlock profile 的识别与附加 grant 拼装（不认识即响亮报错）
│   ├── windows-*.ts                  Windows root-set ACL runner 与 restricted-token 执行
│   ├── containment.ts                路径包含判定（词法快速路径 + dev/ino 别名回退）
│   ├── instructions.ts               附加根 AGENTS.md / CLAUDE.md 的发现、增量投递、预算与撤回（顶层 + 本会话触碰过的子目录，经 agent/pre-step 注入）
│   ├── lsp.ts                        附加根按所在根初始化独立 LSP workspace
│   ├── workspace-files.ts            Files 页签附加根文件浏览的 host 路由与 confinement
│   ├── compat.ts                     multi-root-compat 启动门禁（版本 allowlist 与混装判定）
│   ├── compat/                       版本差异适配层：dsh-version / sandbox-confine / agent-instructions / llm-message 等（可选 peer 按需加载）
│   ├── command.ts                    /workspace-folders 命令与面板 RPC 的 host 半部
│   ├── worktrees.ts                 Worktree 附加根建议行：发现/激活/watcher、prompt 队列与等待者、确认与显式清理
│   ├── worktrees/                   受控 Git 元数据快照（config/HEAD/index/祖先链）、inventory、sidecar 与 owner 复验（不启动 Git）
│   ├── worktrees-contract.ts         Worktree 端点的双端严格契约（判别联合，禁止 retry 字段）
│   ├── contract.ts                   面板线协议（zod 双端校验，可内联进浏览器 bundle）
│   └── client/                       浏览器半部：侧栏动作、Folders 对话框、Files 页签根切换器、双语词典
├── tests/                            差分 parity、方言真实执行矩阵、契约往返、组件与 locale 门禁、跨进程 lease e2e、指令注入
├── scripts/                          冒烟（compose / behavior / journey）、文档与内核 runner 检查、兼容性契约检查、升级流程
└── docs/                             需求、架构、决策记录（ADR）、计划、开发工作流
```

## 贡献指南

欢迎 Issue 与 PR：

1.  先读 [`AGENTS.md`](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/AGENTS.md)（仓库级规则）与[开发工作流](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/development/plugin-development-workflow.md)（环境、命令、运行时支持矩阵、升级流程）。
2.  从 `main` 拉分支；提交信息遵循 conventional commits（`feat` / `fix` / `perf` / `refactor` + scope），参见现有历史。
3.  PR 前本地必须全部通过：`pnpm lint`、`pnpm typecheck`、`pnpm build`、`pnpm test`、`pnpm docs:check`、`pnpm smoke`（CI 按同序执行，先 build 后 test）。
4.  影响行为的变更需同批更新 `docs/` 下的对应文档；README 保持中英双语同步；有取舍的工程决策请新增 ADR。
5.  硬约束：**不修改上游仓库（deepseek-harness）任何包**；插件只做 out-of-tree 扩展。

## 已知限制

-   **dsh-ops 只读限制绕过（F01，历史基线）**：审计版本在 Full-access 下，OPS Native `ops_write_file` 实际写入了显式只读附属根，而原生 fs 同次对照被拒。启用 OPS 兼容模式时，本轮有限适配已在 Full-access 下复验 explicit RO/cap deny 对 OPS Native 与真实 PTC 生效（deny 执行复验见[审计§16](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/reviews/dsh-ops-compatibility-audit.md#16-%E9%80%82%E9%85%8D%E5%90%8E%E5%A4%8D%E9%AA%8C)），版本、测试范围与原始证据见[兼容性审计](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/reviews/dsh-ops-compatibility-audit.md)。
-   **dsh-ops 的合法写入与子目录指令缺口（F04/F05，历史基线）**：WW 下 inherit/固定读写附属根及 RO 下固定读写附属根被 OPS 预检拒写的问题未解决；OPS 读取不触发子目录指令发现（F05）已在启用模式的本轮 live 索引 + 真实 AgentLoop 下复验恢复（Native 与 PTC 成功触碰的子目录指令进入下一模型请求，见[审计§16](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/reviews/dsh-ops-compatibility-audit.md#16-%E9%80%82%E9%85%8D%E5%90%8E%E5%A4%8D%E9%AA%8C)）；不影响已验证的根级指令和 Skills 路径。
-   **Linux bwrap 的 WW batch/result 降级（F07）**：审计版本的共享 Registry 下，所有到达启动分支且取得有效 cache 的 `ops_batch` / `ops_result`（含 `page`）都会因 confine 后追加 bind 而失去 argv 归属证明，源码路径将拒绝 Worker 启动并报 `EXECUTOR_UNAVAILABLE`。函数级冲突已复现，Linux 端到端未测；普通 RO、Landlock 和无 cache 对照不在此结论内。需 OPS 提供 confine 前的 cache 声明接口，目前没有已验证的 MR 单侧缓解，见[审计 F07](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/reviews/dsh-ops-compatibility-audit.md#131-n1--f07confine-%E5%90%8E%E7%9A%84-cache-bind-%E4%B8%8E%E4%B8%A5%E6%A0%BC%E8%AF%81%E6%98%8E%E5%86%B2%E7%AA%81)。
-   **其他 OPS 可用性边界**：共享 WW 下，调度外 purge 无有效 admission 时会被拒，结果缓存可能残留并告警；PTC 嵌套调用及后台 Bash 也有证明归属/过期导致的拒绝风险。本轮已完成保守拒绝边界的三平台验证；正常后台与清理能力仍未恢复，且已无限期延后，见 [ADR-0029 最终范围](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0029-ops-file-authorization-and-activity-adapter.md#%E6%9C%80%E7%BB%88%E8%8C%83%E5%9B%B4%E4%B8%8E%E6%97%A0%E9%99%90%E6%9C%9F%E5%BB%B6%E5%90%8E2026-11-05)。
-   附加根的指令文件按需到达模型：根目录顶层的那一份在会话第一步之前注入，子目录里的那一份在本会话**成功**触碰过该目录之后注入；nested 文件只会在其目录被考察到时重新检查（根层每一步，子目录依赖已投递或有新触碰），投递状态是进程内的（resume 后可能再告知一次）；官方识别 `read` / `write` / `edit`，启用 OPS 兼容模式后，OPS 工具经 live 证据同样驱动投递（resume 后 OPS 历史缺 live 证据不参与投递）。主根与 user-global 的指令链仍由上游负责，本插件不重复注入（[ADR-0010](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0010-additional-root-instruction-scope.md)）。
-   多 Host 共享同一登记服务：只有一个 Host 管理存储，各实例逐操作取得授权；断线停止新附加授权，权威退出后按内核锁接管。限同机器、同用户及同锁命名空间；Linux 共享连接需要 SO\_PEERPIDFD，Windows 限同登录会话。旧进程/PTY 保留启动快照（[共享架构](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/architecture/registry-authority-service.md)）。
-   支持矩阵是精确版本 allowlist：宿主版本不在清单上、或核心包混装了不同版本时，`fs` / `sandbox` / `registry` / `instructions` / `lsp` / `workspace-files` 六行**不启动**，组合退化为"没装这个插件"（[ADR-0009](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0009-dsh-compat-contract.md)）。
-   Windows 多根 runner 继承上游 partial enforcement、caller-owned 目录及 private temp 分离条件；已启动进程保留启动时根集合，后续进程使用更新后的集合（[ADR-0011](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0011-multi-root-workspace-consumers.md)）。
-   **Windows 上的网络与设备路径不能成为附加根**：UNC（`\\server\share`）、`\\?\`、`\\.\` 与映射网络盘在登记时即以 `unsupported-path` 拒绝——restricted token 的 capability SID 无法绑定 SMB 访问（[ADR-0011 修订](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0011-multi-root-workspace-consumers.md)）。
-   **Windows 受限 shell 是 pwsh，不含 Git Bash**：MSYS 在 restricted Low-integrity token 下无法启动（上游 runner 与插件 runner 表现一致，属上游限制）；上游 runner 的 confined 子进程因继承 ignore-Ctrl+C 标志而收不到 Ctrl+C，插件 runner 下子进程能收到并由 runner 镜像其退出码。
-   附加根访问级别是三态的：新登记默认 `inherit`（跟随会话模式），`--read-only` 在任何模式下都拒写（包括 Full-access；唯一的例外是用户针对单次调用批准的一次性提权，见 [ADR-0036](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0036-approved-escalation-override.md)），`--read-write` 固定在只读会话里仍可写（写授权问题，不是读 confinement；[ADR-0017](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0017-three-state-root-access-and-sandbox-modes.md)）。已启动的进程与持久终端保留启动时的 deny 集——一个在某根变为只读之前就启动的终端保持不受限，直到重启；cap/access 变化只约束之后的调用与新进程（[ADR-0013](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0013-per-root-and-per-tool-access.md)）；提供 workingDirectory 的宿主可以把附加根作为后续工具的执行目录，Session 原始项目与登记身份不变（[ADR-0012](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0012-session-origin-and-effective-cwd.md)）。
-   **上游选择 Landlock 的 Linux 主机上，受限 Full-access 需要 bwrap**：Landlock 的 allowlist 表达不了「全部可写、除这些根」，该组合改选 bubblewrap 拼出拒写边界；主机没有可用的 bwrap（未安装或禁用非特权 userns）时，存在任何拒写边界（只读根或受保护的 `$DSH_HOME`）的 Full-access 命令在启动前失败关闭。启用 bwrap，或在该主机上避免在 Full-access 下使用显式只读根（[ADR-0017](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0017-three-state-root-access-and-sandbox-modes.md)）。
-   附加根文件树由 **Files 页签的根选择器**承载：头部入口列出主根与全部附加根，旁边仍显示选中根的完整路径；选中附加根时逐字节复刻的上游 Files 树体接管树区（懒加载目录、原生行式与图标、watch 自动刷新、文件点击进宿主 viewer、header 原位提供手动刷新），header 右侧「在应用中打开」按钮同时由逐字节复刻的上游控件顶替、对选中根而非主根发起打开；切回主根即恢复原生视图；对话框回归纯管理。该接管依赖上游 `data-*` DOM 钩子，钩子失效时静默退化为原生观感（[ADR-0015](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0015-files-tab-plugin-owned-browsing.md)、[ADR-0016](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0016-files-tab-native-tree-fork.md)）。LSP 按附加文件所在根初始化独立 workspace；需要宿主配置对应语言服务器（[ADR-0011](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0011-multi-root-workspace-consumers.md)）。
-   命令的输出文案为英文（host 侧没有活动语言信息），面板文案中英双语跟随界面语言。
-   Workspace Folders 面板是「侧栏底部动作 + 对话框」，不是独立全屏面板：`sidebar.footer.action` 是所有受支持版本都提供的插槽，而 `sidebar.panellist`/`main` 不是。DSH `0.2.1-alpha.3` 起额外在新会话页的 `conversation.hero.options` 槽挂一个增量入口：它与相邻的工作区/模式选择器同几何、无 chevron，`≤560px` 视口下退化为 28×28 图标按钮；该槽在旧运行时缺席时注册静默不触发，侧栏入口不受影响（[ADR-0037](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0037-conversation-hero-workspace-folders-entry.md)）。

## dsh-ops 适配现状（受限能力说明）

当前实现作为 **OPS 兼容模式（实验性，可能存在限制）** 开放：在 `Settings → Plugins → Multi-root Workspace` 中设置 `multi-root-ops-compatibility.enabled`，默认 `false`，必须显式开启。该功能仅允许在现有精确支持矩阵内的 DSH `0.2.*` 上启用；`0.1.*` 即使手工配置 `enabled: true` 也保持关闭，不提供旧版 Settings UI（[版本范围决定](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0029-ops-file-authorization-and-activity-adapter.md#ops-%E7%89%88%E6%9C%AC%E8%8C%83%E5%9B%B4%E4%BF%AE%E8%AE%A22026-11-06)）。 从设置界面开启时，须阅读官方风险弹窗、勾选已了解限制并再次确认；确认前保持关闭，取消、关闭弹窗或按 Esc 均不保存开启设置。

-   **开启**：激活 OPS 执行保护、实时活动与 Review 增强。Full-access（`danger-full-access`）在已验证的 macOS/Linux 车道用内核围栏保护 explicit RO/cap deny；Windows 有 deny 时在 Worker 准备前保守拒绝 OPS 执行（包括读取），尚不支持该组合下的受保护准备与合法写入。WW/RO 一旦存在不可写附加根或工具只读上限，整次 OPS 执行调用（包括读取/page）会在准备与正文前拒绝。所有模式在 Registry 失权时拒绝 OPS 执行调用，纯发现/发布除外。没有执行域或当次有效 profile 证明的 subprocess 启动也会拒绝，防止后台清理绕过边界；这可能连带拒绝第三方后台进程，但不拦截面板中用户自己的终端。
-   **关闭**：OPS 恢复本轮适配前的行为，不提供这些兜底——**显式只读附加根可能被 OPS 写入**。普通多根功能、原生工具围栏和 Auto Review 自身开关不受影响。已投递的指令不会回溯抹除，已进入保护域的调用与已启动进程保留原快照；关闭后开始的新调用不再激活本次适配。
-   **实验限制**：仅提供 Phase A live 活动索引，无持久事件桥。开启时，resume 后 OPS 历史缺 live 证据、动态 pending（replace/batch/result/bash/unknown）会使 Review 技术失败；非白名单诊断如 `ops_status` 也受此保守规则影响。

P5 的本仓兜底不修改 OPS：合法附加根写入仍可能被误拒，后台结果缓存可能因拒绝清理而残留；legacy 非共享模式下，WW/RO 的 PTC 也可能在启动代码进程前被拒。持久活动仍关闭：DSH 的 `appendPluginRecord` 明确禁止外部插件调用，不能用普通事件或私写日志代替。P6 已按限定范围完成技术验收；P5 剩余功能及全功能兼容验收**无限期延后**，不构成本次完成条件，未来若恢复也仅以实验性能力开放。延期清单见 [ADR-0029](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/ADR-0029-ops-file-authorization-and-activity-adapter.md#%E6%97%A0%E9%99%90%E6%9C%9F%E5%BB%B6%E5%90%8E%E6%B8%85%E5%8D%95%E5%94%AF%E4%B8%80%E7%9C%9F%E6%BA%90)，验收范围见[已完成计划](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/plans/completed/2026-11-01-ops-compatibility-adaptation.md)。

本次实验性保守兜底随 `v0.1.15` 发版，不声明完整 OPS 兼容，不提升支持版本。审计 §16 的历史复验发生在本开关加入之前，对应启用路径；后续复跑须显式 `enabled: true`。

## 文档

项目长期文档位于 [`docs/`](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/README.md)：

-   [版本变更记录（CHANGELOG）](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/CHANGELOG.md)
-   [用户指南](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/guide/README.md)
-   [需求](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/requirements/multi-root-workspace.md)
-   [目标架构](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/architecture/multi-root-workspace.md)
-   [上游调研](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/reference/multi-root-workspace-research.md)
-   [决策记录（ADR）](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/decisions/README.md)
-   [计划](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/plans/README.md)
-   [开发工作流](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/development/plugin-development-workflow.md)
-   [常见问题排查](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/docs/troubleshooting/README.md)

Coding Agent 的仓库级规则定义于 [`AGENTS.md`](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/AGENTS.md)。

## 许可证

[MIT](https://npmcn.com/package/%40dsh-electron/dsh-plugin-multi-root-workspace/LICENSE)

## 常见问题

### @dsh-electron/dsh-plugin-multi-root-workspace 是什么？

Depseek Harness 的多根工作空间: 在工作空间沙盒范围中添加 N 额外的根作为树外捆绑

### 如何安装 @dsh-electron/dsh-plugin-multi-root-workspace？

在项目目录运行 npm install @dsh-electron/dsh-plugin-multi-root-workspace，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：@deepseek-ai/cordis（\>=4\.0\.1 \<5\.0\.0 \|\| 4\.0\.5-alpha\.1 \|\| 4\.0\.5-alpha\.2 \|\| 4\.0\.6-alpha\.1 \|\| 4\.0\.6-alpha\.2）、@deepseek-ai/dsh-fs（0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2）、@deepseek-ai/dsh-sandbox（0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2）、@deepseek-ai/schemastery（\>=3\.18\.2 \<4\.0\.0 \|\| 3\.18\.5-alpha\.1 \|\| 3\.18\.5-alpha\.2 \|\| 3\.18\.6-alpha\.1 \|\| 3\.18\.6-alpha\.2）、@deepseek-ai/dsh-fs-local（0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2）、@deepseek-ai/dsh-sandbox-local（0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2）、@deepseek-ai/node-addon-system（^0\.1\.2）、@deepseek-ai/dsh-sandbox-policy（0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2）、@deepseek-ai/dsh-storage-domain（0\.1\.5-rc\.2 \|\| 0\.1\.6-alpha\.1 \|\| 0\.1\.6-alpha\.2 \|\| 0\.1\.7-alpha\.1 \|\| 0\.1\.7-alpha\.2 \|\| 0\.1\.7-rc\.1 \|\| 0\.1\.7-rc\.2 \|\| 0\.2\.0-rc\.1 \|\| 0\.2\.0-rc\.2 \|\| 0\.2\.1-alpha\.1 \|\| 0\.2\.1-alpha\.2 \|\| 0\.2\.1-alpha\.3 \|\| 0\.2\.1-alpha\.4 \|\| 0\.2\.1-alpha\.5 \|\| 0\.2\.1-rc\.1 \|\| 0\.2\.1-rc\.2 \|\| 0\.2\.1-rc\.3 \|\| 0\.2\.1-rc\.4 \|\| 0\.2\.1-rc\.5 \|\| 0\.2\.2-alpha\.2 \|\| 0\.2\.2-alpha\.3 \|\| 0\.2\.2-rc\.1 \|\| 0\.2\.2-rc\.2）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。

### @dsh-electron/dsh-plugin-multi-root-workspace 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @dsh-electron/dsh-plugin-multi-root-workspace 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @dsh-electron/dsh-plugin-multi-root-workspace 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js ^22\.19\.0 \|\| \>=24\.0\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @dsh-electron/dsh-plugin-multi-root-workspace 可以商用吗？

@dsh-electron/dsh-plugin-multi-root-workspace 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @dsh-electron/dsh-plugin-multi-root-workspace 的下载量有多少？

根据 npm 官方下载统计，@dsh-electron/dsh-plugin-multi-root-workspace 在 2026/10/13 – 2026/11/11 这 30 天内被下载 4,083 次，日均约 136 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @dsh-electron/dsh-plugin-multi-root-workspace 还在维护吗？

最新版本 0\.1\.18 发布于 2026/11/13（今天）；至今共发布 19 个版本，其中过去 12 个月发布了 19 个；首次发布于 2026/09/13。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

