Skip to content

24 · 规则与钩子(Rules & Hooks):给 Codex 装上“卡点”和“扳机”

前面讲了权限、安全、配置。 这一篇更进一步:能不能让 Codex 在关键时刻自动停一下、自动检查一下?

Rules 和 Hooks 就是干这个的。

Rules 与 Hooks 边界

先用规则,后用钩子

小白不要一上来写 Hook。

推荐顺序:

  1. 当前对话里先说清规则。
  2. 稳定后写进 AGENTS.md
  3. 还经常忘,再考虑 Rules。
  4. 需要自动卡点时,最后才考虑 Hooks。

能用文字规则解决的,先别自动化。

先把规则写成人话

不要一上来写复杂配置。 先把规则写成普通话:

  1. 删除文件前必须说明影响范围。
  2. 安装依赖前必须说明为什么需要。
  3. 部署前必须先构建通过。
  4. 涉及密钥时不能展示原文。

如果这些规则经常被忘,再考虑放进规则系统。 如果你只是偶尔提醒一次,写在对话或 AGENTS.md 就够了。

01 先分清:规则管“闸门”,钩子管“扳机”

先记住区别:

  • Rules:规定某类命令能不能执行。
  • Hooks:在某个时机触发一段脚本或检查。

类比:

  • Rules 像门卫,判断能不能过。
  • Hooks 像开关,到了某个时机自动扣一下。

小白先学 Rules,再学 Hooks。

02 规则(Rules):给单条命令立规矩

Rules 适合拦危险命令。

比如:

  • 删除大量文件。
  • 强制覆盖。
  • 执行未知脚本。
  • 访问不该访问的目录。

规则文件长什么样、放哪

规则通常会写在专门配置文件里。 不要凭空猜位置。

先问:

text
请告诉我 Codex Rules 通常放在哪里。
当前项目是否已有规则文件?
只查看和解释,不要修改。

一个救命的安全设计:复合命令会被拆开判

危险命令有时会藏在一串命令里。 好的规则系统应该能把复合命令拆开判断。

所以不要只看整句表面意思。 要问:

text
这条命令里是否包含删除、覆盖、强制、重置等危险动作?
请拆开逐段解释。

改完规则,先用 execpolicy check 验一把

如果环境支持检查命令,改完规则要先验证。

提示词:

text
请告诉我如何检查 Rules 是否生效。
如果需要命令,先解释命令作用,再给最小命令。

03 钩子(Hooks):有哪些“时机”能挂

Hooks 关注的是时机。

常见思路:

  1. 工具调用前。
  2. 工具调用后。
  3. 任务完成前。
  4. 修改文件后。
  5. 执行命令前。

不同环境支持的时机可能不一样。 以当前官方说明为准。

04 钩子配在哪、matcher 怎么把它收窄

钩子放在哪几个文件

Hooks 可能放在配置文件里。 小白不要直接手写。

先让 Codex 解释:

text
请告诉我当前环境支持哪些 Hook 配置位置。
只解释,不要创建或修改。

钩子配置长什么样

一个 Hook 通常至少要说明:

  1. 什么时机触发。
  2. 匹配什么动作。
  3. 执行什么命令。
  4. 失败时怎么处理。

matcher 的作用就是收窄范围。 不要让 Hook 对所有动作都触发。

05 信任机制:为什么你的新钩子“默认不跑”

Hook 能执行命令,所以必须谨慎。 很多环境不会默认信任新 Hook。

这是好事。 它防止别人往项目里塞一个脚本,Codex 就自动执行。

看到确认提示时,先问:

text
这个 Hook 会执行什么命令?
什么时候触发?
会不会读写文件、联网或删除内容?

06 钩子和 Codex 怎么对话:stdin、退出码、stdout

输入:Codex 从 stdin 递给你一坨 JSON

Hook 触发时,Codex 可能把上下文以 JSON 形式传给脚本。

小白不用一开始会写脚本。 先知道:脚本能根据输入判断要不要拦。

输出:用“退出码”给 Codex 下指令

脚本成功或失败,通常通过退出码告诉 Codex。

可以理解为:

  • 0:通过。
  • 非 0:有问题。

具体规则以当前环境说明为准。

进阶:用 stdout 返回 JSON,做更细的控制

这是进阶内容。 新手先不写复杂 JSON。 先做最小提醒或检查。

07 两个能直接抄走的真实例子

例子一:改完文件自动格式化(PostToolUse)

适合成熟项目。 比如改完代码后自动格式化。

但教程网站文章不一定需要这个。

例子二:拦掉危险命令(PreToolUse + 脚本)

更适合安全场景。 比如命令里出现 rmdeleteresetforce 时提醒或拦截。

08 动手:5 分钟配一个钩子并亲眼看它触发

练习建议:

  1. 先做提醒型 Hook。
  2. 不要执行危险命令。
  3. 只在一个很小范围触发。
  4. 触发后输出清楚提示。

提示词:

text
请帮我设计一个最小 Hook 练习。
目标是理解触发流程。
要求只做提醒,不修改文件,不删除内容。

09 钩子不触发 / 报错了,怎么查

排查顺序:

  1. Hook 是否被信任。
  2. matcher 是否匹配。
  3. 脚本路径是否正确。
  4. 脚本是否有执行权限。
  5. 输出和退出码是否符合要求。

不要一出错就重写。 先定位是哪一层没通。

10 小结

Rules 是闸门,Hooks 是扳机。

小白使用顺序:

  1. 先把规则写进 AGENTS.md。
  2. 再用 Rules 管危险命令。
  3. 最后才考虑 Hooks 自动检查。

不要为了高级而高级。 能用文字规则解决的,先别写 Hook。