Hooks 系统
通过 Hooks 自定义 Claude Code 的行为 — 自动格式化、安全拦截、通知推送等
Hooks 系统¶
Hooks 允许你在 Claude Code 的关键生命周期节点插入自定义逻辑,例如自动格式化代码、拦截危险命令、发送通知等。
核心概念¶
每个 Hook 由三部分组成:
-
事件:触发时机(如
PreToolUse— 工具执行前) -
匹配器:可选的工具名过滤(如只匹配
Bash或Write) -
处理器:Shell 命令、提示词或子代理
常用事件¶
| 事件 | 触发时机 | 可否阻断 | 典型用例 |
|---|---|---|---|
PreToolUse |
工具执行前 | 是(exit code 2) | 安全拦截、文件保护 |
PostToolUse |
工具执行后 | 否 | 自动 lint/格式化 |
Notification |
Claude 发送通知时 | 否 | Slack/飞书告警 |
UserPromptSubmit |
用户提交提示时 | 是 | 上下文增强 |
Stop |
Claude 完成响应时 | 否 | 质检、摘要 |
SessionStart |
会话启动时 | 否 | 环境初始化 |
配置方式¶
在 .claude/settings.json(项目级)或 ~/.claude/settings.json(用户级)中添加:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "prettier --write $FILEPATH"
}
]
}
]
}
}
实用示例¶
1. 文件保存后自动格式化¶
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "npx prettier --write $FILEPATH"
}
]
}
]
}
}
2. 拦截危险的 Shell 命令¶
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "echo $TOOL_INPUT | grep -qE 'rm -rf|sudo|git push --force' && exit 2 || exit 0"
}
]
}
]
}
}
exit 2会阻断工具执行,exit 0允许继续。
3. 保护敏感文件不被读取¶
{
"hooks": {
"PreToolUse": [
{
"matcher": "Read",
"hooks": [
{
"type": "command",
"command": "echo $TOOL_INPUT | grep -qE '\\.env|credentials|secret' && exit 2 || exit 0"
}
]
}
]
}
}
4. 任务完成后发送通知¶
{
"hooks": {
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"$NOTIFICATION_MESSAGE\" with title \"Claude Code\"'"
}
]
}
]
}
}
输入/输出机制¶
-
Hook 脚本通过 stdin 接收 JSON 数据(含
session_id、tool_name、tool_input) -
环境变量:
$FILEPATH、$TOOL_INPUT、$NOTIFICATION_MESSAGE等 -
PreToolUse 的 exit code:
0= 允许,2= 阻断
调试技巧¶
-
按
Ctrl+O开启 verbose 模式,查看 hook 的 stdout/stderr 输出 -
测试 hook 脚本前,先在终端中手动运行确认逻辑正确
注意事项¶
-
Hook 脚本的执行时间不应过长,否则会阻塞 Claude Code 的交互
-
项目级 hooks 优先于用户级 hooks
-
企业版可通过
managed-settings.json强制全组织的安全 hooks