Codex 规则与钩子
权限设置 解决「范围」与「要不要问」,而本章的两件工具更细:
- 规则(Rules):对某一条具体命令决定 allow / prompt / forbidden
- 钩子(Hooks):在 Agent 生命周期的关键时刻插入你的脚本
一、规则(Rules)
解决什么问题
沙箱与审批是「粗粒度」的。规则让你对沙箱外要执行的命令做精确判定,例如「gh pr view 允许但需确认,gh pr merge 直接禁止」。
格式:Starlark prefix_rule()
规则写在 rules/ 目录下的 .rules 文件中(如 ~/.codex/rules/default.rules),用 Python 风格的 Starlark:
优先级: forbidden > prompt > allow。
复合命令的处理
Codex 会智能拆分 &&、||、;、| 连接的「纯词」命令并逐段匹配,对每段套用最严格的规则;若命令包含重定向、变量替换、子命令替换等,则作为单一调用整体判定,避免「夹带」危险操作。
来源与企业强制
- 用户层:当你在审批时选择「总是允许」,Codex 会在
~/.codex/rules/default.rules自动生成对应规则 - 团队/企业:管理员可通过
requirements.toml下发强制规则 - 校验:
codex execpolicy check测试某命令会命中哪条规则
二、钩子(Hooks)
解决什么问题
钩子让你在 Agent 循环的确定性时刻注入脚本——做安全策略、日志审计、上下文注入、提交前校验等,而不依赖模型「自觉」。
生命周期事件
配置格式
钩子写在 hooks.json,或 config.toml 的内联 [hooks] 表:
脚本的输入与输出
钩子脚本通过 stdin 收到 JSON(含 session_id、cwd、tool_name、tool_input 等),并通过 stdout 输出 JSON 控制是否继续:
典型用途
- 安全策略:
PreToolUse拦截危险命令、检测泄露的密钥 - 审计/分析:
SessionStart/Stop把会话数据送到外部系统 - 持久记忆:
UserPromptSubmit自动总结交互 - 质量校验:
PostToolUse在继续前强制代码规范 - 上下文注入:
SessionStart加载团队约定为开发者上下文
信任模型
- 托管钩子(来自
requirements.toml)无需信任审查即生效 - 用户钩子需通过
/hooks命令显式信任后才会执行
规则 vs 钩子 vs AGENTS.md
三者叠加:AGENTS.md 让它想做对,Rules/Hooks 让它不能做错。
下一步
- 权限设置:规则之上的沙箱与审批
- 安全与企业管理:用
requirements.toml强制下发 - 自动化与 CI/CD:在无人值守场景里用钩子兜底