收工
证据绑定文件
test、lint、typecheck 或 build 必须同时满足:通过、由它自己的 exit code 决定结果、运行期间没有文件变动、文件仍是它运行时的那一份,才算数。
可选
exact:只认完整命令,cwd指定它必须在哪里运行。scope(配合exact):指定目录以外的改动不会让结果过期。ignore(整个 policy):检查自己产生的输出(例如 coverage)不算改动。
一个 Claude Code 插件:不让 AI agent 拿过期的绿灯收工,也不让它重复或叠加从未看到结果的副作用。它能做什么,由你写的 policy 文件决定,绝不由 prompt 决定。
sum.mjs 里的 bug,不用重跑测试node --test 在文件 a1f3 上通过sum.mjs,文件变为 9c07test 上次通过是在 a1f3,之后文件已经改动。node --test:1 个失败,修复后在 b2e8 上通过git push 在推送成功之后超时git pushgit-push 在这个 commit 上已经成功过。SENT BACKCore 两次拦下 agent:一次是拿旧的通过结果收工,一次是再次 push。两次都附上原因退回。
节选自仓库中的 stale-green 演示,tree 编号仅为示意。无需 Claude,几秒即可自己运行完整版。
01原则PRINCIPLES
模型越强,一次会话写的代码越多,自己运行的命令也越多。这三条规则不依赖 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 里。无需启动服务、没有服务器、无需账号;状态存放在每个仓库的 .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,交由你决定。
账本只能追加、以哈希链接;bw verify 能检测被修改或删除的条目以及写了一半的最后一行,但检测不到从末尾整条截掉的条目。
03支持范围HOSTS
Core 本身与 host 无关,每个 host 只需要一层小的适配器。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,以及支持插件的 Claude Code。
每台机器一次。如果这台机器运行过 V5,先把 ~/.better-workflows 重命名为 ~/.better-workflows-V5,并让 SBW_STATE_ROOT 指向它。
在每个仓库中用 --scope local 安装,不会写入你要提交的文件。
bw init 会生成 .better-workflows/policy.json。提交它,大家就使用同一套规则。
完整教程涵盖自定义检查、副作用以及结果不明的处理。 快速入门
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然后试一试
帮我改这个仓库里的一行代码,不要跑测试。Claude Code 试图收工时会被退回,并被告知缺少哪一项检查。
05限制LIMITS
知道边界在哪里,这道关卡才有用。
拦得住
exact 时,只跑了一部分也会拦下|| true 掩盖失败做不到
scope 必须列出检查依赖的所有内容交给你
expiresAt 之后继续有效scope 覆盖哪些内容Core 能拦下上面列出的错误。它能否在长任务中减少返工或错误决策,尚未经过测量;当前的自用期正是为此。
eval 或 sh -c 里的测试永远不算证据。gh 对账;没有它,结果会一直不明,直到你手动结案。06项目状态STATUS
V6 用一个小巧的 Core 取代 V5 的工作流引擎。条件达成时才定日期。
DONE 已冻结
tag V5.0.rc1
多 host 工作流引擎。冻结在 frozen/v5 分支,不再开发。
NOW 进行中
packages/bw-core
Claude Code hooks、证据 scope,在两个仓库上自用。
NEXT 自用期之后
第一个打 tag 的版本
等自用期证明确实能拦下问题、且误拦很少,才会发布。之后以小型适配器支持更多 host。
PRE-ALPHA
Core 现在就能用,并运行在维护者自己的仓库上。alpha 之前 policy 格式仍可能变化。
这里的一切都免费、开源。没有付费版、账号或遥测。
| 部分 | 许可证 | 状态 |
|---|---|---|
V6 Core(packages/bw-core) | Apache-2.0 | 活跃 |
| 网站及仓库其余部分 | AGPL-3.0-only | 活跃 |
| V5 插件 | AGPL-3.0-only在 frozen/v5 | 已冻结 |
07文档DOCS
指南有英文和繁体中文两个版本。本站的每种语言在 GitHub 上都有一份简短的 README。
08常见问题FAQ
还有其他问题?在 GitHub 上提 issue。 GitHub Issues
处理检查或副作用的 hook 会用 Git 计算一次工作区的哈希,普通大小的仓库只需几毫秒。超大仓库每次这类调用会多花一些时间。
退回时会附上原因,以及这次会话到目前的情况:运行次数、连续失败次数、已被退回的次数。agent 可以据此停下来,直接告诉你哪一项检查一直失败。
不能直接关闭。Core 会拒绝 agent 修改 policy 和账本,也会拒绝 bw init 和手动结案。卸载插件,或以迂回方式修改这些文件,则由 Claude Code 自身的权限规则把关,所以请保持这些确认提示开启。
没有服务器,也没有遥测。唯一的网络调用,是用你自己的 git、gh 和 npm 做只读查询,确认副作用是否发生。账本保存在 .git/better-workflows/。
它们运行的是已冻结的 V5。Core 与 host 无关,alpha 之后计划为它们开发适配器。