第4章 Hooks 与自动化

让 Claude 在关键时刻自动执行操作——你的 AI 工作流自动化引擎

4.1 什么是 Hooks?

Hooks 是一种事件驱动的自动化机制。你可以在特定事件发生时(比如「工具调用前」、「Claude 停止后」),自动触发一段脚本。

类比:像 Git Hooks(pre-commitpost-push),但 Hook 的对象是 Claude Code 的行为,而不是 Git 操作。

4.2 可用的 Hook 事件

事件触发时机典型用途
PreToolUse 工具调用之前 权限检查、操作确认、阻止危险命令
PostToolUse 工具调用之后 日志记录、结果验证、自动备份
Notification Claude 需要通知用户 桌面通知、Slack 消息
Stop Claude 完成响应 自动运行测试、自动格式化代码
PrePrompt 用户输入发送前 注入上下文、预处理用户输入

4.3 配置你的第一个 Hook

Hook 配置在 ~/.claude/settings.jsonhooks 字段中:

{
  "hooks": {
    "Stop": [
      {
        "command": "notify-send 'Claude 已完成' '回复已生成完毕'",
        "matcher": ""
      }
    ]
  }
}

这个配置的意思是:每次 Claude 完成回复后,发送一条系统桌面通知。

格式说明:command 是要执行的 shell 命令,matcher 是可选的过滤条件(可以用正则匹配工具名等)。

4.4 实践:自动运行测试

练习 1:Claude 修改代码后自动跑测试

这是最实用的 Hook 之一。当 Claude 使用 Edit/Write 工具修改文件后,自动运行相关测试:

{
  "hooks": {
    "PostToolUse": [
      {
        "command": "npm test 2>&1 | tail -5",
        "matcher": "Edit|Write",
        "description": "编辑代码后自动运行测试"
      }
    ]
  }
}

每次 Claude 编辑或写入文件后,自动执行 npm test 并显示最后 5 行结果。

4.5 实践:阻止危险命令

练习 2:防止误删重要文件

{
  "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 命令"
      }
    ]
  }
}

4.6 Hook 的环境变量

Hook 运行时可以访问这些环境变量来获取上下文:

变量名内容
CLAUDE_TOOL_NAME当前调用的工具名称(Bash、Edit、Write等)
CLAUDE_TOOL_INPUT工具调用的完整输入参数(JSON)
CLAUDE_EVENT触发 Hook 的事件类型

4.7 Hooks vs 技能——选哪个?

Hooks技能
自动触发(事件驱动)手动调用(斜杠命令)
运行 shell 脚本加载提示词模板
适合自动化、检查、通知适合工作流、审查、配置
对 Claude 透明(它不知道 Hook 在跑)Claude 全程参与

4.8 /loop 技能:定时任务

/loop 是一个特殊的内置技能,让你可以定时重复执行某个任务:

# 每 5 分钟检查一次部署状态
/loop 5m "检查我的最新部署是否完成"

# 每 30 分钟运行一次代码审查
/loop 30m /review

# 每天上午 9 点检查待处理的 PR
/loop 1d "查看我有哪些待处理的 PR review"

练习 3:定时监控 CI 状态

/loop 10m "检查 GitHub Action 的最新运行状态,如果失败就告诉我原因"

Claude 每 10 分钟自动帮你检查一次 CI,失败了会主动通知。

4.9 综合示例:代码审查自动流水线

下面是一个完整的自动化流程配置思路:

# 工作流程:
# 1. Claude 写完代码
# 2. [Stop Hook] 自动运行 linter 和 formatter
# 3. [PostToolUse Hook] 代码改动后自动运行单元测试
# 4. [Notification Hook] 测试失败时发送桌面通知
# 5. [/loop] 每 30 分钟检查一次 CI/CD 状态
注意:Hooks 是在你的机器上本地执行的 shell 命令。不要在 Hooks 中执行不可信的内容,也要注意 Hook 脚本本身的安全性。

4.10 常见问题

Q: Hook 运行慢会影响 Claude 的响应速度吗?

会的。Hooks 是同步执行的,Hook 不执行完,Claude 不会继续。所以 Hook 脚本应该尽量轻量快速。

Q: 能共享 Hooks 配置到团队吗?

可以。项目级的 Hook 配置放在 .claude/settings.json(可提交到 Git)。个人偏好放在 ~/.claude/settings.local.json

Q: Hook 可以调用 Claude Code 本身吗?

可以但不推荐。这容易造成循环调用。如果需要复杂的自动化逻辑,用 MCP 或其他独立工具更合适。