dsh-workspace-switch:按工作区隔离 Skill、MCP 与插件

前言

在 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 半同时提供对话框使用的配置路由。

核心功能

按工作区启停三类能力

  1. Skills:enabled: false 时在该工作区 scope 内 gate,不从目录暴露、不加载;文件仍留在磁盘(见下文限制)。
  2. MCP:按 server 名关闭后,该 scope 内拒绝对应 mcp__* 工具。
  3. Plugins:按插件关闭后,拒绝该插件 entry 里 tools 数组列出的工具名;未声明 tools 的插件条目无法被 gate 掉任何工具。

配置来源与优先级

同一工作区有两处可写配置,后者覆盖前者:

  1. <DSH_HOME>/workspace-switch.json,workspaces 以工作区目录路径为 key;
  2. <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)。

典型用法

  1. 按上文完成安装并把 bundle 写入 profile,重启 DSH。
  2. 打开目标工作区,在工作区列表该行打开 ... 菜单,进入 workspace-switch 对话框。
  3. 在对话框中按 plugins / MCP / skills 分类查看当前 Host 能管理的项,用开关关闭不需要的能力;保存后配置写入项目内或 <DSH_HOME> 的 workspace-switch.json。
  4. 若需版本化或团队共享,可在仓库中维护 <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,适合多工作区并行又需要能力隔离的场景。

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

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

Xiaoye