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,適合多工作區並行又需要能力隔離的場景。

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

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

小夜