dsh-staging-guard:用 pre-execute 鉤子把「成果區」設爲只讀

前言

在 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 一致)。

  1. 寫入目標落在 <受保護根>/成果區/ ⇒ deny,錯誤信息中會說明應改寫到草稿區。
  2. 受保護根 = roots.json 裏配置的根列表 ∪ 當前會話的 cwd(cwd 作兜底,避免配置丟失時完全失去保護)。
  3. 只檢查 write、edit、str_replace_editor,其他工具不攔截。
  4. 配置每次調用現讀;增刪 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。目錄與源碼:

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

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

小夜