dsh-local-devkit:爲 Harness 補齊本地事實層

前言

在 DeepSeek Harness(DSH)裏跑智能體,模型經常需要知道「環境裏有什麼」「倉庫現在什麼狀態」「改完能不能過檢查」。宿主自帶的工具未必覆蓋這些本地事實;市場上也有回合末自動門禁類插件,但不一定註冊模型可調用的檢查入口。下面介紹社區插件 dsh-local-devkit:用純 Node 內置模塊、無第三方依賴、不修改宿主文件,把環境探測、git 操作、寫入前快照和項目自檢串成一組工具。

這是什麼

dsh-local-devkit 由維護者 alice0721021-web 發佈在 GitHub(倉庫 alice0721021-web/dsh-local-devkit),當前 package 版本爲 0.1.0,MIT 許可證。定位是:爲 Harness 補齊「本地事實層」——探測執行環境、檢查功能是否還在產出、把 git 變成模型可直接調用的一等工具、在每次寫文件前自動留快照,並能跑項目自帶的檢查。

社區目錄頁:skillhub.cn/plugins/alice0721021-web/dsh-local-devkit(獨立站點,與 DeepSeek / 幻方無官方從屬關係)。DSH 生態理念是「一切皆插件」;安裝前建議自行查看源碼與許可證,插件以當前 DSH 進程權限運行。

核心工具一覽

插件註冊的工具如下(寫操作列來自 README 工具表):

工具 作用 寫操作
env_probe 探測 bash / pwsh / node / pnpm / git / python 與 DSH profile 可寫性,給出修復建議 否
git_status 分支、上游、ahead/behind、已暫存 / 未暫存 / 未跟蹤 / 衝突 否
git_diff 工作區或暫存區 diff,支持路徑過濾、--stat、字節上限截斷 否
git_log 提交歷史(短 hash、作者、日期、標題、引用) 否
git_commit 可選先 git add 再提交;dryRun 只預覽;不暴露 --amend / --force 是
fs_checkpoints 列出當前項目的寫入前快照,可按路徑過濾 否
fs_restore 回滾:給 path 撤銷該文件上一次寫入;給 id 精確恢復;恢復前會再拍快照 是
project_check 探測並運行項目檢查(Node scripts / Python pytest·ruff·mypy / Go test),結構化返回結果 部分是
health_probe 檢查功能是否還在產出:recall 快照、工作區體積、profile bundles 等 否

非 git 目錄統一返回 NO_REPO 而不是拋異常;越界路徑返回 PATH_OUTSIDE_REPO。

設計約束上,子進程一律 execFile 且 shell: false,避免注入;默認超時 15s、輸出緩衝 1MB。git_commit 的路徑先 resolveRepo 再 assertInside 校驗。

寫入前快照

插件掛到宿主的 tools/execute waterfall:write / edit(以及 fs_write / fs_edit / multi_edit / apply_patch)在真正落盤之前,把目標文件的原始內容存到 <DSH_HOME>/devkit/checkpoints/<projectHash>/。

要點:

  • 快照失敗只 console.warn,絕不阻斷工具執行;
  • 文件此前不存在時記錄 existed: false,恢復即刪除;
  • 單文件超過 checkpoint.maxFileBytes(默認 4 MB)只記元數據、標 skipped: too-large;
  • 每個項目最多保留 checkpoint.maxEntries(默認 500)條,超出刪最舊;
  • 快照目錄自身不會被再次快照,避免遞歸。

在 profile 的 cordis.patch.yml 中可調整 checkpoint(示例來自 README):

- id: devkit
  name: dsh-local-devkit
  config:
    checkpoint:
      maxEntries: 500
      maxFileBytes: 4194304

按路徑連續回退時,被用掉的快照會標記 consumed: true;pre-restore 快照不參與路徑選擇,因此連續調用是逐版後退。典型用法:

fs_restore({ path: "src/app.ts" })   # 撤銷這個文件的上一次寫入
fs_restore({ path: "src/app.ts" })   # 再調一次 → 再退一版
fs_restore({ id: "1793376673288-..." })  # 知道 id 時精確回到某一版

想把某次回退本身也撤掉,用 fs_checkpoints 找到 pre-restore 記錄,按 id 恢復。

項目驗證 project_check

project_check 按項目形態自行探測,按 typecheck → lint → test → build 順序執行,第一個失敗就停。只運行項目自己聲明的檢查,不接受自定義命令;dryRun: true 只列出將執行的命令。

Node:從 package.json scripts 匹配 typecheck / lint / test / build 等常見名稱;包管理器按 packageManager 或 lock 文件推斷,不在 PATH 時回落 DSH 內置 pnpm。

Python:依據 mypy.ini、ruff.toml、pytest.ini 等標記決定是否跑 python -m mypy .、python -m ruff check .、python -m pytest;只有 pyproject.toml 而沒有對應聲明時不會臆造目標。解釋器優先項目內 .venv,其次 DSH 內置 python。

Go(存在 go.mod):go test ./...;go 不在 PATH 時返回 MANAGER_MISSING。

每個目標默認 180s 超時(上限 600s),輸出截斷到 8 KB。README 說明:與 @jayyuen66/dsh-quality-gate(回合末門禁、不註冊模型工具)和 dsh-flakefinder(flaky 調查)相比,模型可主動調用的檢查入口仍是本插件要填的缺口之一。

健康檢查

env_probe 回答「二進制在不在、能不能跑」;health_probe 回答「功能還在不在產出」。後者檢查 recall 快照新鮮度(默認 stalenessHours 24h)、工作區可快照體積(默認上限 256 MB)、本插件 checkpoint 條數與時間、以及 dsh.profile.bundles 是否在 node_modules 中裝齊。工作區掃描有 scanBudgetMs(默認 1500 ms)預算,超時會標記 partial。

調用示例:

health_probe({ cwd, stalenessHours?, workspaceLimitBytes?, scanBudgetMs? })

安裝與啓用

官方方式是在插件目錄執行安裝腳本(冪等,寫前自動備份 package.json / cordis.patch.yml / pnpm-lock.yaml)。先做預覽,再正式寫入:

node scripts/install.mjs --dry-run   # 先預覽改動
node scripts/install.mjs             # 寫入 package.json / cordis.patch.yml 並 pnpm install

腳本會:在 profiles/<profile>/package.json 增加對插件的 link 依賴、把 dsh-local-devkit 追加到 dsh.profile.bundles、在 cordis.patch.yml 寫入 devkit 標記塊,並調用內置 pnpm 執行 install。README 中的 link 路徑示例爲本地開發路徑,實際以你 clone 或放置插件的位置爲準。

安裝完成後重啓 DSH,在會話裏調用 env_probe 驗證。卸載:

node scripts/install.mjs --uninstall

package.json 要求 Node ^22.19.0 || >=24.0.0,DSH >=0.2.1-rc.3 <0.3.0。

適用場景與注意

適合需要在會話內主動查環境、讀 git 狀態與 diff、在模型改文件前自動留檔、改完後跑項目聲明過的 typecheck/lint/test/build 的 DSH 用戶。不適合指望插件做結構化代碼檢索(README 明確宿主無 LSP/tree-sitter,與 ops_grep 重疊且投入產出比不成立)。

返回值須滿足宿主契約:lossless JSON;schema 裏聲明爲 string 的字段不能返回 null。改 schema 後可在插件目錄跑 node --test test/schema.test.mjs 本地復現校驗。

結尾

dsh-local-devkit 把本地開發裏常見的事實與護欄收成一組模型工具:環境與健康、git、寫入快照、項目檢查,實現上堅持無第三方依賴與不改宿主文件。進一步瞭解可打開 社區目錄頁 與 GitHub 倉庫。

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

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

小夜