Hook出现背景 #
如果你有 Web 开发经验,你一定熟悉中间件(Middleware)的概念。
请求 → 中间件1 → 中间件2 → 中间件3 → 处理函数
↓ 认证、日志、限流中间件在请求到达最终处理函数之前插入检查和处理,实现横切关注点(Cross-cutting Concerns)。这些逻辑不属于任何一个业务功能,但又必须贯穿所有请求——认证要每个接口都检查,日志要每个操作都记录,限流要每个入口都控制。
Claude Code 的 Hooks 机制与此异曲同工,但它针对的不是 HTTP 请求,而是 AI Agent 的工具调用。
用户请求 → Claude 决策 → [PreToolUse Hook] → 工具执行 → [PostToolUse Hook] → 响应
↓ 权限检查、拦截 ↓格式化、验证、日志Hooks 是 AI 助手的中间件——拦截、监控、增强每一次交互。这个类比不仅是形象上的相似。Web 中间件解决的核心问题是“业务代码不应该操心安全和日志”,Hooks 解决的核心问题也一样——Claude 不应该操心格式化和权限检查,它只管写好代码就行。安全防线、质量守卫、审计日志,全部由 Hooks 在“幕后”自动完成。
Hook事件 #
截至 2026 年 3 月,根据 Anthropic 官方文档,Claude Code 支持 17 种 Hook 事件,覆盖了从会话启动到结束的完整生命周期:
整个事件体系分为三大阵营:
- 控制点,能阻止的事件(PreToolUse、UserPromptSubmit、Stop、SubagentStop):你可以通过它们改变 Claude 的执行路径——拦截危险操作、拒绝不合理的输入、强制 Claude 继续修复。它们是 Hooks 系统的肌肉。
- 接管点,替代默认行为的事件(PermissionRequest):它不是简单地阻止,而是接管了原本由用户手动处理的权限弹窗——你的脚本可以自动批准或拒绝权限请求,替代人类的决策。它是 Hooks 系统的自动驾驶。
- 观察点,不能阻止的事件(SessionStart、PostToolUse、PostToolUseFailure、Notification、SubagentStart、PreCompact、SessionEnd):你只能在这些时刻做记录、做反馈、做后处理,但不能改变已经发生的事情。它们是 Hooks 系统的眼睛。
如何编写Hook #
Hook放在哪里 #
跟Skill与Claude.md的套路一样,放在不同的位置会
- 用户级(~/.claude/settings.json):个人习惯。比如你喜欢的日志格式、桌面通知方式。这些配置只影响你自己,不需要和团队同步。
- 项目级(.claude/settings.json):团队约定。比如代码格式化规则、敏感文件保护列表。这些配置应该提交到 git,让团队所有成员共享。
- 本地覆盖(.claude/settings.local.json):当你需要在本地临时覆盖团队配置时使用,比如调试时关闭某个 Hook。
- 子代理 frontmatter:子代理专属的 Hook。比如 db-reader 的 SQL 注入检查——这个检查只和数据库操作相关,不应该影响其他场景。