@lightjunction/dsh-red-green:在 DSH 裏用證據驅動的 RED-GREEN-REFACTOR

前言

在 DSH 裏讓智能體寫測試和實現代碼時,常見做法是口頭約定「先寫失敗測試再寫實現」。模型仍可能跳過 RED、改測試湊綠,或在沒有真實測試命令的情況下宣稱通過。DeepSeek Harness 採用插件化擴展;社區目錄 skillhub.cn 上的工作流類插件,可以把階段約束落到 ToolRuntime 工具與本地子進程證據上。

下面介紹維護者 LIghtJUNction 發佈的 @lightjunction/dsh-red-green(倉庫 LIghtJUNction/dsh-red-green)。它在用戶明確請求 TDD 之後,才啓動 RED → GREEN → REFACTOR → COMPLETE 循環,用固定測試命令的輸出與文件內容指紋綁定證據,而不是默認接管每個會話。

這是什麼

一句話定位:面向 DSH 0.2.1-rc.2、Node 24+ 的可選 TDD 工作流插件(簡介:Evidence-driven RED GREEN REFACTOR workflow for DSH)。

加載插件後,每個會話默認處於 idle;只有用戶在對話中明確要求使用 TDD 時,調用方纔應帶 userRequested: true 啓動週期。Real ToolRuntime 工具會執行你聲明的測試命令,並把結果與跟蹤文件內容關聯。

核心功能

顯式 opt-in

插件不會在加載後自動進入 TDD,也不提供默認 TDD 提示或強制 TDD。週期由 tdd_start 開啓,由 tdd_reset 結束並移除守衛;tdd_reset 不會回滾磁盤上的文件。

四階段與 revision

典型推進方式:

  1. 先創建測試文件(以及你聲明的源碼路徑)。
  2. 用戶說「use TDD」或等價明確請求後,調用 tdd_status、tdd_start。
  3. 每次改代碼後調用 tdd_run,使用上一次結果返回的 revision 作爲下一次變異的參數。
  4. 識別到失敗的斷言後,從 RED 進入 GREEN,並鎖定測試內容;實現通過後進入 REFACTOR,再運行直至 COMPLETE。

tdd_status 會報告自上次證據以來,跟蹤文件是否相對快照發生變化。調用會拒絕過期的 revision 與重疊的變異。

RED 階段的工具守衛

在 RED 階段,插件會限制名稱中包含 write、edit、patch、bash、shell、exec 或 terminal 的工具。僅允許對聲明列表裏、且路徑完全匹配的測試文件做編輯;實現代碼與 shell 類工具在觀察到失敗測試之前會被拒絕。RED 之外,工作流約束多爲建議性質;自定義工具別名、直接寫主機文件或其他插件的編輯不在守衛邊界內。

證據與指紋

測試、源碼以及 root 內的 symlink 目標會被指紋化;遍歷或指向 root 外的 symlink 會被拒絕。測試命令運行期間若跟蹤文件被改動,結果會被丟棄。RED 之後若再改測試內容,需要 tdd_reset 後重新開始。非零退出碼加上可識別的失敗文本(如 not ok、AssertionError、FAIL/FAILED 或失敗計數)用於啓發式判斷 RED;語法或模塊錯誤不會推進 RED。GREEN/REFACTOR 依賴退出碼爲零,應配置真實測試 runner,不要用空操作命令。標準輸出/錯誤僅保留最後 64 KiB。

作用域與生命週期

每個週期綁定到 agent 與 canonical workspace;無 agent 的調用有獨立狀態。Abort、超時、卸載會終止並回收 Unix 進程組;agent 銷燬會移除其週期。狀態在內存中,卸載即消失;無磁盤歷史、覆蓋率、Pi TUI、斜槓命令或手動繞過證據。

安裝與啓用

要求:DSH 0.2.1-rc.2、Node >= 24。安裝包內含 dsh.bundle patch;若 profile 未啓用 HMR,安裝後需重啓 DSH。

README 給出的安裝模式(說明爲 pattern,不表示該 release 一定已發佈):

dsh plugin --profile headless add https://github.com/LIghtJUNction/dsh-red-green/releases/download/v0.1.0/lightjunction-dsh-red-green-0.1.0.tgz

可選 profile 配置(cordis.patch.yml 中示例):

- id: dsh-red-green
  name: '@lightjunction/dsh-red-green'
  config:
    root: /absolute/host/project
    timeoutMs: 120000

root 默認爲調用 agent 的工作目錄;無 agent 的調用必須設置 root。timeoutMs 範圍爲 100–600000 ms。TypeScript 直接註冊時使用 import * as plugin 與 await ctx.plugin(plugin, { root, timeoutMs: 120000 })。

包版本在 package.json 中爲 0.1.0,許可證 MIT。

典型用法

README 示例:先建測試文件,用戶明確要求 TDD 後依次調用:

tdd_status {}
tdd_start {"revision":0,"userRequested":true,"task":"return one","command":["node","--test","test/example.test.cjs"],"tests":["test/example.test.cjs"],"files":["src/example.cjs"]}
tdd_run {"revision":1}

後續每一步使用返回的 revision。實現行爲後再次 tdd_run 進入 REFACTOR,重構後再運行直至完成。需要停止週期時:

tdd_reset {"revision":4}

(示例中的 revision 需與當前會話實際返回值一致。)

適用場景與注意

適合:已在本地用 Node 跑真實測試命令、希望 agent 在 DSH ToolRuntime 內按 RED-GREEN-REFACTOR 推進、並願意在用戶口頭 opt-in 後再啓動週期的開發者。

環境與限制(摘自 README Limits):

  • 僅支持主機本地 Node 文件系統與子進程;遠程 DSH world/sandbox 不支持。命令繼承 DSH 主機環境,以主機權限運行,未沙箱化;無 shell 展開,顯式調用 shell 時 shell 同樣享有主機權限。
  • 所有跟蹤文件必須事先存在;須在 tdd_start 中聲明相關源碼、測試與 fixture;未跟蹤的依賴、併發編輯在最終快照前被還原等情況無法檢測。快照是內容校驗,不是 OS 級事務,也不能防 hostile symlink 競態。
  • userRequested: true 由調用方斷言,插件無法證明人類已請求;工具描述要求模型必須取得用戶明確請求。
  • 僅 Unix;Windows 進程生命週期未實現。安裝前請閱讀倉庫源碼與 LICENSE,確認命令不會打印密鑰等敏感信息。

社區目錄頁:skillhub.cn - LIghtJUNction/dsh-red-green(獨立站點,與 DeepSeek / 幻方無官方從屬關係)。源碼與問題跟蹤:GitHub。

結尾

@lightjunction/dsh-red-green 把 TDD 循環做成 DSH 裏可選、證據驅動的工作流:真實測試命令、revision 協議、RED 寫守衛與文件指紋,用於減少「沒跑測試就宣稱完成」的漂移。默認不打擾 idle 會話;需要時在用戶明確請求後 tdd_start,按 tdd_run 返回的 revision 逐步推進即可。

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

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

小夜