收工
證據綁定檔案
test、lint、typecheck 或 build 要同時符合:通過、由它自己的 exit code 決定結果、執行期間沒有檔案變動、檔案仍然是它跑的那一份,才算數。
可選
exact:只認完整指令,cwd指定它要在哪裡執行。scope(搭配exact):指定目錄以外的變更不會讓結果過期。ignore(整份 policy):檢查自己產生的輸出(例如 coverage)不算變更。
一個 Claude Code plugin:不讓 AI agent 拿過期的綠燈收工,也不讓它重複或疊加沒看到結果的副作用。它能做什麼,由你寫的 policy 檔決定,永遠不由 prompt 決定。
sum.mjs 的錯誤,不用重跑測試node --test 在檔案 a1f3 上通過sum.mjs,檔案變成 9c07test 上次通過是在 a1f3,之後檔案已經改過。node --test:1 個失敗,修好後在 b2e8 通過git push 在推送成功之後逾時git pushgit-push 在這個 commit 已經成功過。SENT BACKCore 擋下 agent 兩次:一次是拿舊的通過結果收工,一次是重複 push。兩次都附上原因退回。
節錄自 repository 裡的 stale-green demo,tree 編號為示意。不需要 Claude,幾秒鐘就能自己跑完整版。
01原則PRINCIPLES
模型越強,一次 session 寫的程式越多,自己跑的指令也越多。這三條規則不靠 agent 小心,不管它說什麼都成立。
RULE 01
agent 能不能 push、merge、release、publish,由它不能修改的 policy 檔決定。在 prompt 裡怎麼拜託都沒用。
RULE 02
測試通過只對它跑的那一份檔案有效。改一行,那次通過就不算了。
RULE 03
結果不明的副作用會擋下之後所有副作用,直到向 provider 查證,或由人結案。
| 情境 | 只有 agent | 加上 Core |
|---|---|---|
| 測試通過後又改了檔案 | 「測試都通過。」 | 退回,在現在的檔案上重跑。 |
npm test | tail | 算綠燈;但 exit code 是 tail 的。 | 永遠不算;收工時會說明原因。 |
| 只跑一個 spec 檔頂替整套 | 算「測試通過」。 | 設了 exact 就只認完整指令。 |
| push 成功後才逾時 | 再 push 一次。 | 同一個 commit 的同一個 push 會被拒絕。 |
| Prompt 寫「你可以發佈」 | 直接發佈。 | 由 policy 決定:allow、ask 或 deny。 |
由人撰寫與修改。Core 會拒絕 agent 直接修改它。
照樣有效。policy 的 allow 絕不給出比 Claude Code 更多的權限。
在每個指令、每次修改、每次收工時執行 policy。
描述目標,不帶任何授權。
02運作方式HOW IT WORKS
Core 跑在 Claude Code 自己的 hooks 裡。不用啟動服務、沒有伺服器、不用帳號;狀態存在每個 repository 的 .git/better-workflows/。
gh 卻無法使用時發出警告。證據綁定檔案
test、lint、typecheck 或 build 要同時符合:通過、由它自己的 exit code 決定結果、執行期間沒有檔案變動、檔案仍然是它跑的那一份,才算數。
可選
exact:只認完整指令,cwd 指定它要在哪裡執行。scope(搭配 exact):指定目錄以外的變更不會讓結果過期。ignore(整份 policy):檢查自己產生的輸出(例如 coverage)不算變更。最多一次,不明就停
push、建立與合併 PR、release、套件發佈,以及你自訂的種類,都要 policy 給 allow。只有 exit code 0 算確定的結果。
用來確認不明結果的唯讀查詢
git ls-remotegh pr list / viewgh release viewnpm viewpolicy 檔無效時,拒絕所有副作用,不會退回預設值。
權限過期就退回 ask。只有人能修改 policy 來延長。
Core 看不懂的指令(例如 eval、sh -c)一律當成 opaque,交給你決定。
帳本只能附加、以 hash 串接;bw verify 能偵測被修改或刪除的紀錄與寫到一半的最後一行,但偵測不到從尾端整筆截掉的紀錄。
03支援範圍HOSTS
Core 本身不綁特定工具,每個 host 只需要一層小的 adapter。Claude Code 是第一個,也是目前唯一支援的。
| Host | macOS | Linux | Windows |
|---|---|---|---|
| Claude Code第一個 host | 支援,CI 測試 | 支援,CI 測試 | 未測試 |
| Codex僅 V5,已凍結 | 規劃中 | 規劃中 | 規劃中 |
| Gemini CLI僅 V5,已凍結 | 規劃中 | 規劃中 | 規劃中 |
| Qwen Code僅 V5,已凍結 | 規劃中 | 規劃中 | 規劃中 |
每個 pull request 都會跑 Core 的 CI。macOS 15 與 Ubuntu 24.04,Node 22.23.3 與 24.21.0。
04開始使用GET STARTED
需要 Node.js 22.14 以上、Git,以及支援 plugin 的 Claude Code。
每台機器一次。這台跑過 V5 的話,先把 ~/.better-workflows 改名為 ~/.better-workflows-V5,並把 SBW_STATE_ROOT 指向它。
每個 repository 用 --scope local 安裝,不會寫進你要 commit 的檔案。
bw init 會建立 .better-workflows/policy.json。commit 它,大家就用同一套規則。
完整教學包含自訂檢查、副作用與結果不明的處理。 快速開始
git clone https://github.com/stephen-taipei/better-workflows ~/.better-workflowsclaude plugin marketplace add ~/.better-workflows/packages/bw-coreclaude plugin install better-workflows-core@better-workflows --scope localnode ~/.better-workflows/packages/bw-core/bin/bw.mjs init可選:不需要 Claude,幾秒鐘跑完兩個情境。
node ~/.better-workflows/packages/bw-core/examples/stale-green/demo.mjs接著試試看
幫我改這個 repository 的一行程式,不要跑測試。Claude Code 想收工時會被退回,並告訴它缺了哪一項檢查。
05限制LIMITS
知道邊界在哪裡,這道關卡才有用。
擋得住
exact 時,只跑一部分也擋|| true 蓋掉失敗做不到
scope 要列出檢查依賴的所有目錄交給你
expiresAt 繼續有效scope 涵蓋哪些目錄Core 擋得住上面列的錯誤。它能不能降低長任務的重工或錯誤決策,還沒有量測過;目前的自用期就是為了這件事。
eval 或 sh -c 裡的測試永遠不算證據。gh 對帳;沒有 gh 時會維持不明,直到你手動結案。06專案狀態STATUS
V6 用一個小的 Core 取代 V5 的工作流引擎。條件達成才訂日期。
DONE 已凍結
tag V5.0.rc1
多 host 的工作流引擎。凍結在 frozen/v5 分支,不再開發。
NOW 進行中
packages/bw-core
Claude Code hooks、證據 scope,在兩個 repository 上自用。
NEXT 自用期之後
第一個 tag 版本
自用期證明真的擋下錯誤、而且誤擋夠少,才會發佈。之後再以小型 adapter 支援更多 host。
PRE-ALPHA
Core 現在就能用,並在維護者自己的 repository 上運作。alpha 之前 policy 格式仍可能調整。
這裡的一切都免費、開源。沒有付費方案、帳號或遙測。
| 部分 | 授權 | 狀態 |
|---|---|---|
V6 Core(packages/bw-core) | Apache-2.0 | 使用中 |
| 網站與 repository 其他部分 | AGPL-3.0-only | 使用中 |
| V5 plugin | AGPL-3.0-only在 frozen/v5 | 已凍結 |
07文件DOCS
教學有英文與繁體中文兩個版本。本站每種語言在 GitHub 上都有一份簡短的 README。
08常見問題FAQ
還有其他問題?到 GitHub 開 issue。 GitHub Issues
處理檢查或副作用的 hook 會用 Git 計算一次工作目錄的 hash,一般大小的 repository 只要幾毫秒。非常大的 repository 每次這類呼叫會多花一些時間。
退回時會附上原因,以及這個 session 到目前的狀況:跑了幾次、連續失敗幾次、已經被退回幾次。agent 可以據此停下來,直接告訴你是哪一項檢查一直失敗。
不能直接關。Core 會拒絕 agent 修改 policy 與帳本,也拒絕 bw init 與手動結案。移除 plugin,或用迂迴方式改這些檔案,則由 Claude Code 自己的權限規則把關,所以請保留那些確認提示。
沒有伺服器,也沒有遙測。唯一的網路呼叫,是用你自己的 git、gh、npm 做唯讀查詢,確認副作用有沒有發生。帳本留在 .git/better-workflows/。
它們跑的是已凍結的 V5。Core 不綁特定工具,alpha 之後會規劃它們的 adapter。