Appearance
24 · 规则与钩子(Rules & Hooks):给 Codex 装上“卡点”和“扳机”
前面讲了权限、安全、配置。 这一篇更进一步:能不能让 Codex 在关键时刻自动停一下、自动检查一下?
Rules 和 Hooks 就是干这个的。
先用规则,后用钩子
小白不要一上来写 Hook。
推荐顺序:
- 当前对话里先说清规则。
- 稳定后写进
AGENTS.md。 - 还经常忘,再考虑 Rules。
- 需要自动卡点时,最后才考虑 Hooks。
能用文字规则解决的,先别自动化。
先把规则写成人话
不要一上来写复杂配置。 先把规则写成普通话:
- 删除文件前必须说明影响范围。
- 安装依赖前必须说明为什么需要。
- 部署前必须先构建通过。
- 涉及密钥时不能展示原文。
如果这些规则经常被忘,再考虑放进规则系统。 如果你只是偶尔提醒一次,写在对话或 AGENTS.md 就够了。
01 先分清:规则管“闸门”,钩子管“扳机”
先记住区别:
- Rules:规定某类命令能不能执行。
- Hooks:在某个时机触发一段脚本或检查。
类比:
- Rules 像门卫,判断能不能过。
- Hooks 像开关,到了某个时机自动扣一下。
小白先学 Rules,再学 Hooks。
02 规则(Rules):给单条命令立规矩
Rules 适合拦危险命令。
比如:
- 删除大量文件。
- 强制覆盖。
- 执行未知脚本。
- 访问不该访问的目录。
规则文件长什么样、放哪
规则通常会写在专门配置文件里。 不要凭空猜位置。
先问:
text
请告诉我 Codex Rules 通常放在哪里。
当前项目是否已有规则文件?
只查看和解释,不要修改。一个救命的安全设计:复合命令会被拆开判
危险命令有时会藏在一串命令里。 好的规则系统应该能把复合命令拆开判断。
所以不要只看整句表面意思。 要问:
text
这条命令里是否包含删除、覆盖、强制、重置等危险动作?
请拆开逐段解释。改完规则,先用 execpolicy check 验一把
如果环境支持检查命令,改完规则要先验证。
提示词:
text
请告诉我如何检查 Rules 是否生效。
如果需要命令,先解释命令作用,再给最小命令。03 钩子(Hooks):有哪些“时机”能挂
Hooks 关注的是时机。
常见思路:
- 工具调用前。
- 工具调用后。
- 任务完成前。
- 修改文件后。
- 执行命令前。
不同环境支持的时机可能不一样。 以当前官方说明为准。
04 钩子配在哪、matcher 怎么把它收窄
钩子放在哪几个文件
Hooks 可能放在配置文件里。 小白不要直接手写。
先让 Codex 解释:
text
请告诉我当前环境支持哪些 Hook 配置位置。
只解释,不要创建或修改。钩子配置长什么样
一个 Hook 通常至少要说明:
- 什么时机触发。
- 匹配什么动作。
- 执行什么命令。
- 失败时怎么处理。
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 + 脚本)
更适合安全场景。 比如命令里出现 rm、delete、reset、force 时提醒或拦截。
08 动手:5 分钟配一个钩子并亲眼看它触发
练习建议:
- 先做提醒型 Hook。
- 不要执行危险命令。
- 只在一个很小范围触发。
- 触发后输出清楚提示。
提示词:
text
请帮我设计一个最小 Hook 练习。
目标是理解触发流程。
要求只做提醒,不修改文件,不删除内容。09 钩子不触发 / 报错了,怎么查
排查顺序:
- Hook 是否被信任。
- matcher 是否匹配。
- 脚本路径是否正确。
- 脚本是否有执行权限。
- 输出和退出码是否符合要求。
不要一出错就重写。 先定位是哪一层没通。
10 小结
Rules 是闸门,Hooks 是扳机。
小白使用顺序:
- 先把规则写进 AGENTS.md。
- 再用 Rules 管危险命令。
- 最后才考虑 Hooks 自动检查。
不要为了高级而高级。 能用文字规则解决的,先别写 Hook。