前言¶
在 DeepSeek Harness(DSH)裏跑 agent 時,工作區往往同時放着已定稿的產出和還在改的草稿。模型一旦把 write、edit 或 str_replace_editor 直接寫到定稿目錄,事後用 diff 或版本歷史回滾成本很高。常見做法是口頭在系統提示里約定「只寫某子目錄」,但提示無法強制執行。
dsh-staging-guard 是 mdl233 維護的 DSH 插件,分類爲 admin-security。它在 tools/pre-execute 階段攔截對上述三個工具的寫入:若目標路徑落在「受保護根」下的 成果區/(目錄名可配置),則拒絕並提示應寫入 草稿區/。定稿進入成果區只能通過宿主進程外的人工腳本放行,模型側沒有解鎖入口。
這是什麼¶
一句話:dsh-staging-guard 是 DSH 的 pre-execute 鉤子,拒絕寫入受保護根下的只讀成果區,其餘寫入一律放行。
維護者:mdl233。源碼與說明見 GitHub 倉庫;社區目錄頁:SkillHub(獨立站點,與 DeepSeek / 幻方無官方從屬關係)。許可:MIT(package.json 版本 1.0.0)。
核心規則與行爲¶
下面介紹鉤子實際判定的幾條規則(與 README 一致)。
- 寫入目標落在
<受保護根>/成果區/⇒ deny,錯誤信息中會說明應改寫到草稿區。 - 受保護根 =
roots.json裏配置的根列表 ∪ 當前會話的 cwd(cwd 作兜底,避免配置丟失時完全失去保護)。 - 只檢查
write、edit、str_replace_editor,其他工具不攔截。 - 配置每次調用現讀;增刪
roots.json不必重啓宿主(修改lib/index.js才需要重啓 DSH)。
插件掛接方式見倉庫內的 cordis.patch.yml,入口爲 lib/index.js。
安裝與啓用¶
官方 README 給出兩種安裝方式,任選其一。
# 方式一:在插件倉庫目錄執行
node install.mjs
# 方式二:npm(若有發佈)
dsh plugin add dsh-staging-guard
install.mjs 會先備份 profile/package.json 基線,再寫入 dependencies 與 dsh.profile.bundles 各一行,最後執行 pnpm install。裝完後若宿主不支持熱加載,需要重啓 DSH。回滾可用倉庫中的 rollback.bat(還原 package.json 基線,不依賴 DSH / node / pnpm)。
配置¶
環境變量均可覆蓋默認值:
| 變量 | 默認 | 作用 |
|---|---|---|
DSH_STAGING_GUARD_DIR |
~/.dsh/staging-guard/ |
狀態目錄(日誌、roots.json、應急開關) |
DSH_STAGING_GUARD_RESULT_DIR |
成果區 |
只讀區目錄名 |
DSH_STAGING_GUARD_DRAFT_DIR |
草稿區 |
草稿區目錄名 |
DSH_PROFILE_DIR |
~/.dsh/profiles/desktop |
安裝目標 profile |
受保護根寫在狀態目錄下的 roots.json,例如:
{ "roots": ["D:\\projects\\alpha", "E:\\projects\\beta"] }
典型用法:草稿、放行與應急¶
1. 日常寫作路徑¶
agent 應把變更寫到各受保護根下的 草稿區/(默認目錄名)。鉤子不會攔成果區以外的路徑。
2. 人工放行進成果區¶
promote.mjs 必須在宿主進程之外由人啓動;插件本身沒有任何放行 API。
node promote.mjs <工作區根> [--check]
腳本讀取 草稿區/待定/清單.md,對每條內容用 git diff --no-index 展示差異,只有輸入 y 才複製到成果區,隨後歸檔草稿並記賬。
3. 應急開關與自檢¶
在狀態目錄創建 disabled 文件後,鉤子立即全放行,無需重啓:
# Windows 示例路徑
"%USERPROFILE%\.dsh\staging-guard\disabled"
倉庫還提供 emergency-allow-all.bat / emergency-restore-guard.bat。創建 throw-now 可驗證「鉤子拋異常 = fail-closed」:下一次寫操作會故意失敗;可用 clear-v2-flag.bat 清除該標記。
離線驗證判定邏輯:
node test-scope.mjs
適用場景與限制¶
適合誰:希望把「只讀真源(成果區)」和「agent 可寫草稿」在工具層分開、又願意配合人工 promote.mjs 定稿的 DSH 用戶。
務必知曉:
- 插件以當前 DSH 進程權限運行;安裝前應自行審閱
lib/index.js與 MIT 許可證。 - 這是防手滑的軟邊界,不是安全邊界:
pwsh、腳本、git等方式仍可寫文件;鉤子異常時 fail-closed(當次調用失敗),但不拖垮宿主。它主要防「模型忘了規矩」,不防惡意繞過。
結尾¶
dsh-staging-guard 用 pre-execute 在三個寫工具上守住成果區只讀,把定稿權留在宿主外的 promote.mjs。目錄與源碼: