在 Claude Code (CLI) 中,Hooks(钩子) 是一个非常强大的机制,允许在 Agent 运行生命周期的特定关键点自动执行自定义逻辑。本文总结的分类表格以及详细的使用示例。
介绍
Claude Code 的 Hooks 由两个核心维度组成:处理程序类型 (Handler Types)(即 Hook 的运行方式)和 生命周期事件 (Lifecycle Events)(即什么时候触发 Hook)。所有 Hooks 都在 ~/.claude/settings.json(全局)或项目下的 .claude/settings.json 中配置。
Hook 处理程序类型 (Handler Types)
这决定了 Hook 被触发后,将以什么方式来执行你的逻辑。
类型 (type) |
描述 | 适用场景与特性 |
|---|---|---|
command |
执行一段 Shell 命令或脚本。 | 最常用。接收标准输入(JSON 格式),通过退出码(Exit 0 允许,Exit 2 阻断)控制流程。 |
prompt |
触发一次单轮大模型 (LLM) Prompt 评估。 | 适合需要模糊判断的轻量级检查。例如:“检查这段命令是否安全”。 |
agent |
唤起一个有工具使用权限的子 Agent (Subagent) 进行多轮任务。 | 适合复杂的深度验证。例如:“验证新写的代码是否都被测试覆盖,若没有则不许停止”。 |
http |
将事件数据的 JSON 通过 POST 请求发送给外部 Webhook。 | 适合将事件流式传输到外部监控平台或触发外部 CI/CD 管道。 |
mcp_tool |
直接调用已连接的 MCP (Model Context Protocol) 服务器中的工具。 | 适合与外部系统(如 Jira、Slack 或本地特殊工具)进行确定性交互。 |
核心生命周期事件 (Lifecycle Events)
有将近 30 种事件,以下是最常用的 6 个核心事件:
| 事件名称 (Event) | 触发时机 | 是否可阻断 Agent? | 典型使用场景 |
|---|---|---|---|
PreToolUse |
Claude 决定调用某个工具(如编辑文件、执行命令)之前。 | ✅ 可阻断 (Exit 2) | 安全审查:阻止读取 .env 敏感文件,或拦截危险的 rm -rf 命令。 |
PostToolUse |
工具成功调用执行之后。 | ❌ 不可阻断 (已执行) | 自动化:在 Claude 写入文件后立即执行 Prettier/gofmt 格式化、Lint 检查。 |
PermissionRequest |
Claude 请求用户授权(如执行 Bash 之前)时。 | ✅ 可阻断 / 自动放行 | 权限控制:针对特定只读命令自动放行,减少开发过程中的手动点击打断。 |
Stop |
Claude 认为任务已完成,准备停止会话前。 | ✅ 可阻断 (Exit 2) | 质量门禁:检查单元测试是否全部通过,若没通过则拒绝停止并要求它修复。 |
SessionStart |
会话刚启动或恢复时。 | ❌ 仅注入上下文 | 上下文注入:自动读取最新的项目开发规范、当前 Git 状态并喂给 Claude。 |
Notification |
Claude 需要用户输入或发出通知时。 | ❌ 仅用于通知 | 系统集成:给你的电脑发系统弹窗,或发送 Slack 消息通知你“它卡住了”。 |
使用示例
可以通过在项目根目录下创建/修改 .claude/settings.json 来配置 Hooks。Claude Code 具有一套强大的 matcher 机制,用于精确匹配触发 Hook 的工具名称(如 Bash, Write, Edit 等)。
示例 1:代码自动化(修改后自动格式化)
使用 command 类型和 PostToolUse 事件。每次 Claude 编辑(Edit)或写入(Write)文件后,静默执行代码格式化,不需要人工干预。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "FILE_PATH=$(jq -r '.tool_input.file_path'); if [[ \"$FILE_PATH\" == *.ts || \"$FILE_PATH\" == *.js ]]; then npx prettier --write \"$FILE_PATH\"; fi"
}
]
}
]
}
}注释:Claude 会将 JSON 事件数据传递给 Hook 的 stdin,这里用 jq 解析出了被修改的文件路径并对其执行 prettier。
示例 2:安全防护(拦截危险或敏感操作)
使用 command 类型和 PreToolUse 事件。如果在工具使用之前退出码为 2(Exit 2),Claude Code 会直接阻断操作并将 stderr 作为错误告诉 AI。
{
"hooks": {
"PreToolUse": [
{
"matcher": "Read|Edit|Write",
"hooks": [
{
"type": "command",
"command": "FILE=$(jq -r '.tool_input.file_path'); if [[ \"$FILE\" == *\".env\"* ]]; then echo '禁止读取或修改环境变量敏感文件!'; exit 2; else exit 0; fi"
}
]
}
]
}
}注释:当 AI 尝试读取或修改 .env 时,脚本会执行 exit 2。AI 会收到阻断信息,从而彻底保护了你的 Secret 环境。
示例 3:通过 Webhook 发送通知
使用 http 类型和 Notification 事件。如果你离开座位让 Claude 自动处理长任务,当它卡住需要你的确认时,发请求到你配置的后端/Webhook。
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "http",
"url": "https://your-webhook-endpoint.com/claude-notify"
}
]
}
]
}
}示例 4:大模型质量门禁(Agent类型)
使用 agent 类型和 Stop 事件。当 AI 认为自己写完代码准备“交差”时,启动一个挂载了验证工具的子代理检查它。
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "agent",
"prompt": "请使用 Bash 工具运行 `npm test`,如果发现任何测试失败,请阻止停止(block),并要求主 Agent 修复失败的测试用例。"
}
]
}
]
}
}- 注释:这是 Claude Code 最独特的功能之一,能利用大模型的自省能力防止 AI “半途而废”。如果子代理发现测试没过,主 Agent 将被迫继续干活。*
最近更新
最新评论