dsh-workspace-folders:爲 DSH 會話註冊多個工作區根目錄

前言

DeepSeek Harness(DSH)默認一個會話只綁定一個工作區目錄,文件沙箱的寫入也限定在這個根目錄裏。實際開發裏經常在兩個路徑之間來回:例如本機 D:\AI工作區\deepseek 和旁邊的 D:\AI工作區\另一個項目 要搬文件、跑腳本,或對着一份共享庫改接口。第一次用絕對路徑調用 write、edit、apply_patch 越界時,客戶端會彈出審批;模型側也未必知道這些目錄存在。

下面介紹社區插件 dsh-workspace-folders(維護者 melody12311,分類:工作流)。它把額外目錄提升爲與會話工作區同等語義的根目錄,並配合 workspace_roots 工具與運行時上下文,讓文件類工具在這些目錄內可直接讀寫,而無需反覆審批。

這是什麼

dsh-workspace-folders 是運行在 DeepSeekRuntime 上的 DSH 插件(當前發佈版本 v0.1.0,MIT 許可證)。核心思路不是單純「多幾個可寫路徑」,而是讓每個登記目錄在會話裏被視爲真正的 workspace root:會話會列出它們,workspace_roots 會掃描每個根目錄,讀、寫、編輯、補丁、移動、刪除等文件工具在對應絕對路徑下按工作區根目錄同等對待,且不再觸發寫入審批。

插件以當前 DSH profile 的進程權限工作;安裝前應自行查看 GitHub 倉庫 源碼與許可證。社區目錄 SkillHub 插件頁 提供收錄信息,與 DeepSeek / 幻方無官方從屬關係。

核心能力

層次 行爲
工作區語義 運行時上下文列出本會話的根目錄(自帶工作區 + 登記的額外目錄),說明與主工作區根同等對待
掃描入口 新增 Host 側只讀工具 workspace_roots:返回各根絕對路徑、頂層條目、git 分支,以及 AGENTS.md / README / 清單類標記
寫入邊界 文件工具在登記目錄內用絕對路徑操作,不再審批;不改變會話模式(read-only 仍只讀,danger-full-access 保持原樣)
作用域 可按工作區單獨登記(按會話 cwd 歸屬,支持嵌套、最長前綴優先),也可配置全局目錄供所有工作區共用

實現上插件包裝 ctx.sandboxPolicy.resolve(),在每次工具執行時把當前會話對應的額外目錄合併進 additionalWritableRoots;包裝 ctx.sandbox.confine() 時在進程沙箱策略中去掉追加目錄,避免 Windows 下 pwsh 等因 ACL 受限令牌拒絕「額外可寫目錄」而無法啓動。卸載插件後包裝與會話上下文、workspace_roots 一併撤銷,行爲恢復默認。

尚未覆蓋的部分(README 明確說明):側邊欄文件樹、@ 文件補全、工作區變更 / diff 記錄仍只認會話自帶的工作區根;插件主要解決模型側工作邏輯與寫入邊界。

安裝與啓用

在指定 profile 下從 GitHub 安裝:

dsh plugin --profile <profile> add github:melody12311/dsh-workspace-folders

或從 release 安裝 tgz(示例爲 v0.1.0):

dsh plugin --profile <profile> add "https://github.com/melody12311/dsh-workspace-folders/releases/download/v0.1.0/dsh-workspace-folders-0.1.0.tgz"

也可在 dshmarket 搜索安裝;本地目錄安裝與 plugin_manager 的 install_bundle 等價。運行時要求 Node.js >=22(見 package.json 的 engines)。

卸載:從 profile 的 dsh.profile.bundles 中移除 dsh-workspace-folders 即可;已保存的 folders.json 不會自動刪除。

配置與存儲

清單保存在 profile 數據目錄:

<profile>/plugin-data/dsh-workspace-folders/folders.json

示例結構:

{
  "version": 1,
  "global": ["D:\\shared"],
  "workspaces": { "D:\\AI工作區\\deepseek": ["D:\\AI工作區\\另一個項目"] }
}

不存在的目錄會保留在列表中(例如外接盤暫離),但不會進入沙箱策略、根目錄清單和 workspace_roots 輸出。某工作區下最後一個登記目錄被刪除後,該工作區條目會自動消失。若登記的目錄包含了工作區本身(如給 D:\work 添加 D:\),會被拒絕。

典型用法

兩個 UI 入口修改同一份清單,保存後立即生效,無需重啓 DSH;下一次工具調用即按新沙箱邊界執行,下一輪模型請求帶上新的根目錄列表。

A. 左側欄(推薦) — 鼠標懸停某工作區名稱,行尾文件夾圖標(在「⋯」左側)打開管理框:首行是會話自帶根目錄(「始終可寫」、不可移除);下方爲已登記目錄,可移除;「添加文件夾」調系統選擇框,「或輸入絕對路徑」作兜底。

B. 設置頁 — 左下角齒輪 → 工作區文件夾:全局清單與各工作區卡片總覽。

模型在每輪請求中會看到類似說明(路徑因會話而異):

This session has extra workspace roots besides its own workspace folder:
- D:\AI工作區\shared-lib
Treat them as workspace roots of equal standing: when the task may involve them, list their
contents and read the relevant README/AGENTS.md/manifests before planning. The `workspace_roots`
tool returns every root with its top level, git branch and marker files.

調用 workspace_roots 時,輸出會枚舉各根、頂層條目、git 分支與標記文件,便於在規劃或編輯前先讀相關 README / 清單。

適用場景與注意

適合需要在同一 DSH 會話中穩定操作多個本地項目根、共享庫或 monorepo 相鄰目錄的開發者;不適合指望 UI 文件樹或多根 diff 與主工作區完全一致的場景。

權限與安全:

  • 沙箱主要限制寫入;讀取本身不受工作區限制。
  • 登記的目錄等價於把該路徑的寫權限交給 agent,只添加信任目錄。
  • 跨目錄改文件優先用文件工具;pwsh 內寫操作仍受進程沙箱的工作區限制,除非會話處於「完全權限」。
  • 按工作區登記的目錄不會泄漏到其他工作區(依據會話 cwd 是否位於該工作區路徑之下)。

Windows:文件工具支持追加目錄,但 pwsh 等沙箱進程不支持在 ACL 受限令牌下攜帶追加可寫目錄;跨文件夾命令行寫入需將會話切到「完全權限」。

結尾

dsh-workspace-folders 在 DSH「單工作區沙箱」之上補了一層多根目錄語義:清單可視化管理、會話上下文告知模型、workspace_roots 統一掃描,文件工具在登記根內免審批寫入。安裝與細節以倉庫 README 爲準。

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

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

小夜