前言¶
在 DeepSeek Harness(DSH)里,同一进程往往挂多个工作区、多个 Agent。Profile 里启用的 Skill、MCP 服务器和插件,默认对所有工作区一视同仁。做安全审计、写文档、跑游戏引擎工具链时,你往往希望「这个目录里不要暴露某套 MCP」「那个项目里先关掉某个插件」,而不是改全局 Profile 或拆成多个 Harness 实例。
下面介绍社区插件 dsh-workspace-switch(维护者 liaoyuqing,SkillHub 分类 admin-security):为每个工作区单独决定本工作区会话能用哪些 plugins、MCP servers、skills,并在工作区行的菜单里用对话框编辑这些开关;未配置的工作区仍继承部署级 composition,行为与未装插件时一致。
这是什么¶
dsh-workspace-switch 是 DSH 的 bundle 插件(npm 包名 dsh-workspace-switch,当前资料中版本 0.2.0,MIT 许可证)。它解决的是 多工作区能力隔离:同一 Harness 进程内,两个工作区里的 Agent 可以看到不同的 Skill 目录、MCP 工具集合和插件工具集合。
插件由两半组成,对外仍是一个插件:
- Host 半(
lib/index.js):在创建 Agent 时读取该工作区的配置,并作用到该 Agent 自己的 Cordis scope。被关掉的 skill 在同名 scope 里被不可调用注册「遮住」,从模型可见的 skill 目录中消失;被关掉的 MCP 在该 scope 拒绝所有mcp__<serverName>__*工具;被关掉的插件则拒绝其 entry 声明的工具名。 - Browser 半(
lib/client.js):在工作区...菜单增加一行,打开对话框,按类别列出当前 composition 提供的 capability,每项一个开关。
Host 半同时提供对话框使用的配置路由。
核心功能¶
按工作区启停三类能力¶
- Skills:
enabled: false时在该工作区 scope 内 gate,不从目录暴露、不加载;文件仍留在磁盘(见下文限制)。 - MCP:按 server 名关闭后,该 scope 内拒绝对应
mcp__*工具。 - Plugins:按插件关闭后,拒绝该插件 entry 里
tools数组列出的工具名;未声明tools的插件条目无法被 gate 掉任何工具。
配置来源与优先级¶
同一工作区有两处可写配置,后者覆盖前者:
<DSH_HOME>/workspace-switch.json,workspaces以工作区目录路径为 key;<workspace>/.dsh/workspace-switch.json:存在时替换该工作区在共享文件里的条目。
缺省条目表示 enabled(开启)。enabled: false 表示在该工作区关闭该项。
对话框写入「当前对该工作区生效」的那份文件:若项目内存在 .dsh/workspace-switch.json 则写项目文件,否则写共享 store。写入通过临时文件再 rename 发布,避免读到半写文档。
示例(摘自官方 README):
{
"workspaces": {
"E:\\my_project\\godot-game": {
"plugins": { "mcp-godot-ai": { "enabled": false, "tools": ["mcp__godot-ai__run"] } },
"mcp": { "godot-ai": { "enabled": false } },
"skills": { "godot-scene-authoring": { "enabled": false } }
}
}
}
workspaces 的 key 需与实际工作区目录路径一致(示例为 Windows 路径;Linux 下换成你的绝对路径即可)。
未配置工作区¶
工作区在 workspace-switch.json 中 没有任何条目 时,完全继承部署的 composition,插件不改变行为。只有显式配置过的工作区才会做隔离。
安装与启用¶
插件以 DSH bundle 形式安装:加入 profile 并在 profile 里选中。
资料中的安装方式为本地 link(非 github:owner/repo 直装;仓库说明直装 clone 可能缺少已提交的 lib/ 入口,且独立 clone 无法在仓外完成 browser 构建):
dsh plugin add link:/path/to/dsh_workspace_switch
然后将 dsh-workspace-switch 加入该 profile 的 dsh.profile.bundles。下次启动 Harness 时会加载新 bundle 行。
运行环境要求 Node >= 22(来自 package.json 的 engines)。
典型用法¶
- 按上文完成安装并把 bundle 写入 profile,重启 DSH。
- 打开目标工作区,在工作区列表该行打开
...菜单,进入 workspace-switch 对话框。 - 在对话框中按 plugins / MCP / skills 分类查看当前 Host 能管理的项,用开关关闭不需要的能力;保存后配置写入项目内或
<DSH_HOME>的workspace-switch.json。 - 若需版本化或团队共享,可在仓库中维护
<workspace>/.dsh/workspace-switch.json;仅本机策略则常用<DSH_HOME>/workspace-switch.json。
手动编辑 JSON 时,插件条目务必带上要 gate 的 tools 名列表,与插件注册的工具名一致。
适用场景与注意¶
适合谁
- 同一 DSH 实例里混跑多个项目,且各项目对 Skill / MCP / 插件暴露面要求不同。
- 需要在「全局 Profile 仍启用某能力」的前提下,对单个工作区做最小暴露(admin-security 类管控)。
已知限制(官方 README)
- Skill 是 gate 而非卸载:关闭后文件仍在磁盘,只是该工作区 scope 不展示、不加载。
- 插件关闭依赖 entry 中的
tools声明;未声明则无法按名拒绝工具。 - 对话框只列出 Host 当前 composition 已暴露 的能力;未出现在 profile / 清单里的项无法在此配置。
安全与权限
DSH 插件在 当前 dsh 进程权限 下运行,并可读写配置、影响 Agent scope 内的工具与 Skill 可见性。安装前请自行查看 GitHub 源码 与 MIT 许可证,确认符合你的部署与合规要求。SkillHub 目录页为社区收录,与 DeepSeek / 幻方无官方从属关系。
开发者若在 Harness 源码树内改插件:browser 半需用仓库内 toolchain 构建,lib/ 已提交进库;改动了需重建 browser 半时应一并提交 lib/(详见仓库 README 的 Build 节)。
结尾¶
dsh-workspace-switch 把「哪个工作区能用哪些 Skill、MCP、插件」从全局 Profile 里拆出来,用配置文件和 UI 对话框统一管理,并在 Agent 创建时落到 Cordis scope,适合多工作区并行又需要能力隔离的场景。