即使你在 CLAUDE.md 中写下“编辑后一定要运行格式化工具”,AI 也会有忘记的时候。毕竟指令终究只是请求。
必须发生的事情,应该做成机制,而不是停留在请求上。在 Claude Code 中,这个机制就是 Hook。
Hook 是用户定义的 Shell 命令。它会在 Claude Code 运行期间的特定时机自动执行,无论模型选择什么,都能确定性地生效。
如果说直到Claude Code 第 10 期为止的命令需要手动触发,那么 Hook 就是会自动触发的机制。
5 分钟创建第一个 Hook
Hook 写在 settings.json 的hooks块中。下面看一个 Claude 等待输入时显示 macOS 通知的示例。
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"需要输入\" with title \"Claude Code\"'"
}
]
}
]
}
}
保存后输入/hooks,即可看到已注册的 Hook 列表。这个界面是只读的,因此可以直接修改 settings.json,或让 Claude 代为修改。
可以在哪些时机触发
以官方 Hooks 指南为准,常用事件如下。
SessionStart:会话开始或恢复时UserPromptSubmit:发送提示后、Claude 处理前PreToolUse:工具调用前。可以阻止调用PostToolUse:工具调用成功后Stop:Claude 的回合结束时Notification:Claude 等待输入时
使用 matcher 缩小目标范围。写成"matcher": "Edit|Write"后,只有使用文件编辑工具时才会运行 Hook。
三个典型用法
编辑后自动格式化。在 PostToolUse 上设置Edit|Write matcher 并运行 prettier。无论 AI 修改哪个文件,都会强制格式化。
阻止受保护文件。PreToolUse Hook 会检查指定路径,以退出码 2 结束时阻止该编辑。不能使用任意失败码,必须是 2。不同于 CLAUDE.md 中的指令,即使模型忘记,也无法绕过。
完成时通知。就像前面的 Notification 示例一样,你无需一直盯着终端。
需要判断时,使用 prompt Hook
有些条件很难通过 Shell 脚本判断,例如“请求的工作是否全部完成?”
这时使用type: "prompt" Hook。写下判断标准来替代 Shell 命令后,默认的 Haiku 模型会用 yes/no 进行判断。
在 Stop 事件上设置 prompt Hook,就会变成“没完成就继续工作”。实际上,第 6 期介绍的 /goal就是基于这一结构的会话级包装器。
Hook 会原样执行 Shell
能力越强,风险也越高。因为这种结构会以你的权限自动执行任意 Shell 命令。
项目 settings.json 中的 Hook 会要求确认你是否信任该仓库。打开他人的仓库时,不要轻率地跳过这项确认。
在 Hook 命令中,要用引号包住变量,并继续遵守未经验证不得执行外部输入这一基本原则。
总结
Hook 是一种机制,把“必须发生的事情”从模型的记忆中移出,交给系统处理。
先从强制格式化、阻止受保护文件和完成通知开始。需要判断的条件,可以扩展为 prompt Hook。
下一期将介绍/loop,即按固定间隔重复运行提示。如果 Hook 是事件自动化,那么/loop就是时间自动化。
来源与确认标准
- Claude Code 官方文档 — Automate actions with hooks(Anthropic,确认于 2026-08-14)
- Claude Code 官方文档 — Hooks reference(Anthropic,确认于 2026-08-14)

![[Claude Code #11] Hooks:别靠请求,用机制实现自动化 封面图](/assets/images/posts/76a987e0-498d-44b4-88a8-e737861f7f2a/claude-code-hooks-automation.jpg)