前言¶
DeepSeek Harness(DSH)的插件生態強調模塊化與安全性。在處理跨目錄項目時,開發者常面臨兩難:要麼授予模型 danger-full-access 權限,風險較高;要麼通過繁瑣的手動授權操作,效率低下。dsh-codex-project 插件源自 Codex 的項目處理思想,它允許一個工作區掛載任意數量的共享子目錄(支持跨盤符),並且全程保持 workspace-write 權限,無需升級到 danger-full-access。
核心功能¶
該插件主要包含以下能力:
- 共享子目錄配置:支持跨盤符掛載,支持裸目錄(非註冊工作區)。
- GUI 交互:提供「編輯工作區」彈窗、「項目文件夾」側邊欄 Tab、「打開本地目錄」入口。
- 運行時安全:多根沙箱 runner 與多根 fs fence,確保子目錄讀寫在
workspace-write邊界內。 - 上下文管理:會話上下文提醒,在模型推理時摺疊列出共享目錄清單。
- 管理與持久化:支持配置的 CRUD 操作,數據持久化存儲。
- 交互工具:提供
add_dir模型工具與/adddir指令,支持用戶與模型主動添加目錄。
工作原理¶
插件通過 Cordis(DSH 的 IoC 框架)提供的鉤子切入 DSH 運行循環,不侵入源碼。
- HTTP 路由橋樑:啓動時掛載
/codex-project/api路由,client 通過fetch調用,host 處理配置 CRUD 與文件讀寫。 - 上下文注入:監聽
agent/pre-step事件,根據當前會話命中的配置生成<system-reminder>消息,告知模型可寫的目錄集合。 - 工具註冊:註冊
add_dir模型工具,模型可調用此工具請求添加目錄,經用戶確認後生效。 - 沙箱包裝:wrap
sandbox.confine方法。無共享目錄時透傳;有多根目錄時,使用runner.js創建受限令牌(Windows ACL + 空間級 SID),在令牌下執行子進程。 - FS 隔離:通過
ctx.fs提供者(bundle patch)替換核心 fs-sandbox,在進程內通過fs fence按可寫根集合放行或拒絕操作。
使用方法¶
1. 通過 GUI 添加/移除目錄¶
在側邊欄的「項目文件夾」Tab 或工作區菜單的「編輯工作區」彈窗中,可以查看當前主根與共享子目錄列表。點擊「添加」或「移除」按鈕,選擇目標目錄即可完成配置。使用「設爲主要」可以改變目錄在上下文提醒中的排序和標註。
2. 通過命令行添加¶
在 composer 中輸入 /adddir 並回車。系統會彈出原生目錄選擇框,選中目錄後直接加入當前會話工作區的附加可寫集合。
3. 通過模型工具添加¶
模型在推理過程中可以通過調用 add_dir 工具請求添加目錄。此時會彈出確認框,用戶批准後,目錄被寫入 SQLite 數據庫並立即生效。
安全與注意事項¶
- 權限不升級:插件全程保持
workspace-write權限。它使用 Windows ACL 受限令牌和空間級 SID 來隔離不同根目錄的權限,拒絕列表與空間級 SID 寫授權確保不會越權訪問其他目錄。 - 失效根處理:配置中的共享子目錄如果被物理刪除(失效),可寫集合會自動收窄(僅保留現存根)。插件不會自動清理失效記錄,但會在上下文提醒中標註
(⚠ directory missing)。 - 根目錄衝突:同一目錄不能同時作爲兩條記錄的
path。如果會話的 cwd 落在衝突目錄,會命中配置文件中靠前的那條記錄。 - 無只讀共享:當前版本所有根都授予讀寫權限,不支持只讀共享功能。
配置與數據¶
配置文件默認存儲於 SQLite 數據庫:~/.dsh-codex-project/dirs.db。環境變量 DSH_CODEX_PROJECT_CONFIG 可覆蓋該路徑。
數據表 workspaces 的邏輯模型如下:
{
"workspaces": {
"<workspaceId>": {
"path": "主根(該工作區自身的路徑)",
"dirs": ["共享子目錄1", "共享子目錄2"],
"primary": "展示層主要根(可選)"
}
}
}
源碼與文檔¶
- GitHub 倉庫:https://github.com/luoxunhao/dsh-codex-project
- 社區目錄:https://www.skillhub.cn/plugins/luoxunhao/dsh-codex-project
- 許可證:MIT