前言¶
DSH 以插件機制擴展能力,社區裏也已經有把「多文件夾」做進工作流的插件。實際用下來,這類需求很具體:你的 Agent 會話工作目錄只有工作區本身,但代碼、文檔、腳本散落在工作區之外的多個目錄裏,模型要麼看不到,要麼只能在一個根目錄裏讀寫。
yanguohong1 維護的 dsh-project-sources 解決這個問題:把工作區之外的額外目錄掛進同一個會話,每個目錄起一個短別名,模型通過別名引用路徑,讀寫和執行權限跟隨當前 sandbox 模式。
這是什麼¶
一句話定位:Codex-style 的 project sources,掛在 DSH 上,一個 workspace、多 folder、各自帶別名。
- 維護者:yanguohong1
- 分類:工作流
- 許可證:MIT
- 版本:0.1.0(package.json 裏的
version) - 環境要求:DeepSeek Harness
0.2.1-rc.5 … 0.2.x(engines.dsh: ^0.2.1-rc.5),Node.js ≥ 20
核心設計:會話的 cwd 仍然是工作區,每個掛載的 source 拿到與工作區相同的 read / write / edit / command 權限,並各帶一個最多 48 字符的別名。別名在系統提示裏映射到絕對路徑,因此模型可以無歧義地引用 @web/src/a.ts。
核心功能¶
下面按插件實際提供的能力分節。
項目編輯器¶
兩個入口:
- 會話頭部的「編輯項目」對話框
- 會話創建頁 composer 上方的「📁 項目源文件夾」pill
在裏面可以添加目錄、改別名、移除目錄。工作區本身不能移除。
會話中的別名¶
系統提示裏有一個段落把每個別名映射到它的絕對路徑,模型引用別名時路徑是確定的,不需要猜。
@ 菜單覆蓋¶
DSH 自帶的 @ provider 是單根的。這個插件提供一個伴生 group,在所有 source 中搜索,可按別名、目錄名或絕對路徑匹配。
source 目錄裏的 skills¶
/ 命令會在 <source>/.dsh/skills、<source>/.agents/skills 和 <source>/skills 下遞歸查找 skills。
不新增工具¶
read / glob / grep Already 在任何位置可用;write / edit / pwsh / bash 被插件攔截並重新定位到匹配的 source 目錄。也就是說,模型不需要新的工具名,只是讓已有工具在多個根裏工作。
安裝與啓用¶
在 Web UI 上:
Settings → Plugins → Add,粘貼 dsh-project-sources。
在 CLI 上:
dsh plugin --profile <profile> add dsh-project-sources@0.1.0
也可以從本地目錄安裝,agent 工具 plugin_manager 接受目錄:
plugin_manager install_bundle target: D:\work\dsh-project-sources
安裝後如果做了 source 變更,需要重啓 Host(Host 模塊在啓動時 import);瀏覽器端 bundle 刷新頁面即可。
典型用法¶
先創建會話,在創建頁 composer 上方點「📁 項目源文件夾」,添加幾個目錄,比如 D:\work\api 和 D:\work\web,分別給別名 api 和 web。會話開始後,在提示裏寫 @web/src/a.ts,模型按系統提示裏的別名映射讀到正確路徑。
後續在會話頭部的「項目」按鈕可以隨時增刪。別名只允許字母、數字、.、_、-,最長 48 字符,重名會自動加 -2 後綴。
需要寫文件時,在 write / edit / bash 裏給出 source 內的路徑即可,權限和工作區當前 sandbox 模式下一致。命令如果要在具體 source 裏執行,把 workdir 寫成 source 內的絕對路徑。
數據放在哪¶
配置存於:
<DSH_HOME>/storages/project-sources/<workspace-key>.json
每個工作區一條記錄,位置在所有 agent sandbox root 之外。只有用戶驅動的流程會寫這個文件,Agent 不能給自己添加目錄。
平臺支持¶
文件夾選擇器的行爲:
- Windows:
powershell -STA+FolderBrowserDialog - macOS:
osascript … choose folder - Linux:先回退到 Host picker,再退回手動輸入路徑
sandbox re-rooting、@ 菜單和 skill 發現是平臺無關的。README 註明 macOS 支持已實現但未在 Mac 上測試。
適用場景與注意¶
適用場景:需要讓一個 DSH 會話同時處理工作區之外多個目錄的開發者,例如本地倉庫 + 另一個服務的代碼目錄,或文檔目錄與代碼目錄分開放。插件繼承會話當前的 sandbox 模式,權限與工作區同檔。
注意:
- 每條命令只有一個可寫根。shell 命令只會在它實際解析到的
workdir目錄裏寫。請傳 source 內的絕對workdir;相對路徑按工作區解析,命令內部cd <source>或git -C <source>也不會擴大根的範圍。 - 會話
cwd固定,沒有「主目錄」概念,工作區根仍然是默認工作目錄。 - 不能和攔截同一工具管線的其他插件並排運行,比如
dsh-multi-folder。 - 後臺 shell 通過 jobs runtime 支持,但如果權限拒絕發生在調用返回之後,只有
job_output裏能看到。 - 插件以當前 DSH 進程的權限運行,安裝前應查看源碼與許可證(MIT),確認目錄掛載範圍符合預期。
開發與測試¶
沒有構建步驟,npm test 在不依賴 DSH runtime 的情況下跑兩個套件:
node test/smoke.mjs # config store, interception, prompt, remote API
node test/skills.mjs # source-folder skill discovery
發佈流程(版本 bump、npm publish with passkey、回滾、注意事項)寫在 docs/RELEASING.md(中文)。工具攔截和 sandbox re-rooting 的思路來源於 AngelosZou 的 dsh-multi-folder(MIT),見 NOTICE。
結尾¶
dsh-project-sources 的價值在於把「一個工作區、多個目錄」變成會話的默認狀態,不用爲每個目錄開一個會話,也不用改 Agent 的工具集。適合目錄分散、希望在一個會話裏統一讀寫的人。
目錄頁:https://www.skillhub.cn/plugins/yanguohong1/dsh-project-sources
GitHub:https://github.com/yanguohong1/dsh-project-sources