让 Claude 在关键时刻自动执行操作——你的 AI 工作流自动化引擎
Hooks 是一种事件驱动的自动化机制。你可以在特定事件发生时(比如「工具调用前」、「Claude 停止后」),自动触发一段脚本。
类比:像 Git Hooks(pre-commit、post-push),但 Hook 的对象是 Claude Code 的行为,而不是 Git 操作。
| 事件 | 触发时机 | 典型用途 |
|---|---|---|
PreToolUse |
工具调用之前 | 权限检查、操作确认、阻止危险命令 |
PostToolUse |
工具调用之后 | 日志记录、结果验证、自动备份 |
Notification |
Claude 需要通知用户时 | 桌面通知、Slack 消息 |
Stop |
Claude 完成响应后 | 自动运行测试、自动格式化代码 |
PrePrompt |
用户输入发送前 | 注入上下文、预处理用户输入 |
Hook 配置在 ~/.claude/settings.json 的 hooks 字段中:
{
"hooks": {
"Stop": [
{
"command": "notify-send 'Claude 已完成' '回复已生成完毕'",
"matcher": ""
}
]
}
}
这个配置的意思是:每次 Claude 完成回复后,发送一条系统桌面通知。
command 是要执行的 shell 命令,matcher 是可选的过滤条件(可以用正则匹配工具名等)。
这是最实用的 Hook 之一。当 Claude 使用 Edit/Write 工具修改文件后,自动运行相关测试:
{
"hooks": {
"PostToolUse": [
{
"command": "npm test 2>&1 | tail -5",
"matcher": "Edit|Write",
"description": "编辑代码后自动运行测试"
}
]
}
}
每次 Claude 编辑或写入文件后,自动执行 npm test 并显示最后 5 行结果。
{
"hooks": {
"PreToolUse": [
{
"command": "echo '⚠️ 即将执行: $CLAUDE_TOOL_NAME'",
"matcher": "Bash",
"description": "Bash 命令执行前提醒"
}
]
}
}
更高级的用法——检查命令内容,拦截危险操作:
{
"hooks": {
"PreToolUse": [
{
"command": "if echo \"$CLAUDE_TOOL_INPUT\" | grep -q 'rm -rf'; then echo 'BLOCKED: 不允许执行 rm -rf'; exit 1; fi",
"matcher": "Bash",
"description": "阻止 rm -rf 命令"
}
]
}
}
Hook 运行时可以访问这些环境变量来获取上下文:
| 变量名 | 内容 |
|---|---|
CLAUDE_TOOL_NAME | 当前调用的工具名称(Bash、Edit、Write等) |
CLAUDE_TOOL_INPUT | 工具调用的完整输入参数(JSON) |
CLAUDE_EVENT | 触发 Hook 的事件类型 |
| Hooks | 技能 |
|---|---|
| 自动触发(事件驱动) | 手动调用(斜杠命令) |
| 运行 shell 脚本 | 加载提示词模板 |
| 适合自动化、检查、通知 | 适合工作流、审查、配置 |
| 对 Claude 透明(它不知道 Hook 在跑) | Claude 全程参与 |
/loop 是一个特殊的内置技能,让你可以定时重复执行某个任务:
# 每 5 分钟检查一次部署状态
/loop 5m "检查我的最新部署是否完成"
# 每 30 分钟运行一次代码审查
/loop 30m /review
# 每天上午 9 点检查待处理的 PR
/loop 1d "查看我有哪些待处理的 PR review"
/loop 10m "检查 GitHub Action 的最新运行状态,如果失败就告诉我原因"
Claude 每 10 分钟自动帮你检查一次 CI,失败了会主动通知。
下面是一个完整的自动化流程配置思路:
# 工作流程:
# 1. Claude 写完代码
# 2. [Stop Hook] 自动运行 linter 和 formatter
# 3. [PostToolUse Hook] 代码改动后自动运行单元测试
# 4. [Notification Hook] 测试失败时发送桌面通知
# 5. [/loop] 每 30 分钟检查一次 CI/CD 状态
会的。Hooks 是同步执行的,Hook 不执行完,Claude 不会继续。所以 Hook 脚本应该尽量轻量快速。
可以。项目级的 Hook 配置放在 .claude/settings.json(可提交到 Git)。个人偏好放在 ~/.claude/settings.local.json。
可以但不推荐。这容易造成循环调用。如果需要复杂的自动化逻辑,用 MCP 或其他独立工具更合适。