Claude Code Hooks
Hooks 会围绕 Claude Code 生命周期事件运行命令、处理器或提示词。它们可以把团队规则变成可重复检查,而不是依赖记忆。
- 最近核验
- 适用版本
- 适用于 Claude Code 2.1.x。本机使用 2.1.198 检查 CLI 拼写;当前官方文档可能包含更新的 2.1.x 行为。
- 核验方式
- 2026-07-19 对照官方文档、CLI reference 和 changelog。对照官方 reference 核验 hook schema 和退出码语义;可独立测试 blocker script,本次未写入用户 settings。
可复现实践
用项目 Hook 阻止危险数据库命令
先独立构建和测试确定性的 PreToolUse guard,再在 Claude Code 会话中依赖它。
准备
- 可信测试仓库、jq 和 POSIX shell。
- 仅在团队接受该策略时提交 .claude/hooks。
- 测试环境不含生产数据库凭据。
执行步骤
创建 blocker script
把这段完整脚本保存为 .claude/hooks/block-drop-table.sh。它从 hook JSON 读取 Bash command,保守匹配危险模式,并在 stderr 解释拒绝原因。
步骤 1 #!/bin/sh COMMAND=$(jq -r '.tool_input.command // ""') if echo "$COMMAND" | grep -Eiq 'drop[[:space:]]+table'; then echo 'Blocked: DROP TABLE is not allowed' >&2 exit 2 fi exit 0在 Claude Code 外测试脚本
危险 fixture 必须返回 2,无害 fixture 必须返回 0。
步骤 2 chmod +x .claude/hooks/block-drop-table.sh printf '%s' '{"tool_input":{"command":"drop table demo"}}' | .claude/hooks/block-drop-table.sh; test $? -eq 2 printf '%s' '{"tool_input":{"command":"git status"}}' | .claude/hooks/block-drop-table.sh注册 PreToolUse Bash matcher
JSON 审查后才加入 project settings;hook command 指向 $CLAUDE_PROJECT_DIR/.claude/hooks/block-drop-table.sh。
在临时会话覆盖两个路径
请求无害 git status,再请求包含 DROP TABLE 的非执行命令字符串,确认后者在工具执行前被拒绝。
预期结果
独立 fixtures 分别返回 0 和 2,会话显示拒绝原因且匹配的 Bash call 未执行。
验证
- 用 jq -e . .claude/settings.json 校验设置。
- 每次改脚本都直接测试 allow 和 deny fixture。
- hook 未触发时才开启 hooks debug category。
失败处理
Hook 从未触发
检查 event、Bash matcher、执行位、settings scope 和 JSON parsing。
所有命令都被阻止
把脱敏 fixture 输入脚本并收窄模式,明确 fail-safe 行为。
清理或回退
- 先删除 hook entry,确认设置仍可解析后再删脚本。
- 高风险动作仍保留普通 permission deny;Hook 不应成为唯一安全边界。
边界与不适用场景
- Hook 以用户权限执行,应像生产自动化一样审查。
- exit 2 可阻止 PreToolUse,但部分其他事件不可阻止,事件语义不能互换。
生命周期自动化
质量门禁
Hook 可在相关动作后运行 lint、格式化、静态检查或自定义校验。轻量检查适合高频执行,较重检查应放在明确验证阶段。
团队约定
Hooks 可约束生成文件、审查说明、通知规则等仓库特定要求。失败信息应足够清楚,让代理和开发者知道应该修哪里。
失败处理
有用的 Hook 会用聚焦的信息失败,并给出恢复路径。避免输出噪声很大的宽泛脚本,否则会掩盖真正阻塞的动作。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [{ "type": "command", "command": "pnpm lint --fix" }]
}
]
}
}常见 Hook 事件
Hooks 可在会话生命周期、工具调用和停止事件前后运行。把事件类型和你要执行的检查对应起来。
SessionStart
加载环境检查、发送团队通知,或打印仓库特定提醒。
阅读指南PreToolUse / PostToolUse
在文件编辑、shell 命令和其他工具调用前后做校验或格式化。
阅读指南Stop
在会话结束前运行最终 lint、测试或总结步骤。
阅读指南UserPromptSubmit
在 Claude 处理新用户消息前注入 guardrails 或必需上下文。
阅读指南