文章心得

Claude Code Hooks 完整指南:让自动化渗透到每个环节

详解 Claude Code Hooks 机制,涵盖任务通知、等待提醒、代码自动格式化、自动测试等实用场景。

Claude Code 的 Hooks 机制,可以重视一下,也是解放双手,提高效率的利器。研究下来发现,能做的事情比想象的多。

什么是 Hooks#

Hooks 是在 Claude Code 执行特定操作的时候自动触发的脚本。你可以理解为"钩子"或者触发器,在某个事件发生的时候,自动挂载一段你定义的逻辑。

比如 Claude 每次写完文件,你可以挂一个 Hook 跑格式化;Claude 完成一轮对话,你可以挂一个 Hook 发通知告诉你。

这种的好处一个是方便,配置一次就能自动执行,二个是用好了可以省掉部分人工操作的麻烦。

Hook 类型#

Claude Code 支持多种 Hook 类型,在不同的时机触发,比如:

PreToolUse:工具执行之前触发。可以用来验证参数、做权限检查、修改工具输入。

PostToolUse:工具执行成功之后触发。可以用来格式化代码、验证输出、做后置处理。

Stop:Claude 完成一轮响应时触发。可以用来发通知、跑测试、做收尾工作。

Notification:特定通知事件触发,比如等待用户输入时。

SubagentStop:子代理完成时触发。

SessionEnd:会话结束时触发。

这些 Hook 配置在 .claude/settings.json 文件中。

image-20260104215747757

感兴趣可以看看官网文档 https://code.claude.com/docs/en/terminal-config#iterm-2-system-notifications

场景一:任务完成时发送系统通知#

这是我最早配置的 Hook。用 Claude Code 的时候经常会让它跑一些耗时的任务,比如重构一个大文件、开发一个核心功能。

这时候我会切到别的窗口做其他事,不可能一直盯着看它完成没有。

配置一个 Stop Hook,当它完成的时候自动发个系统通知,这样就不用盯着看他有没有处理完成。

先写一个通知脚本 ~/.claude/complete-notification.sh

#!/bin/bash
osascript -e 'display notification "Claude 已完成任务" with title "Claude Code"'

然后在 ~/.claude/settings.json 中配置:

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "/Users/你的用户名/.claude/complete-notification.sh"
          }
        ]
      }
    ]
  }
}

image-20260104225041474

场景二:等待输入时提醒#

一般都会同时运行好几个 Claude,这种并行工作的模式下,很容易漏掉某个 Claude 在等你输入。

这时候可以用 Notification Hook。当 Claude 进入等待输入状态时,触发提醒。

img

先写一个脚本 ~/.claude/idle-notification.sh,让 Claude 写就行。

#!/bin/bash
# Claude Code 空闲通知脚本

osascript -e 'display notification "Claude Code 正在等待您的输入" with title "Claude Code" sound name "Glass"'

脚本有声音提示,就算不看屏幕也能注意到。

PS:需要开启运行 Claude Code 的应用(如终端、Warp)的通知权限,如果通知不显示,可以改用弹窗方式绕过权限问题。

image-20260104221305413

还可以进一步优化,比如我想知道是哪个窗口/项目在等待我输入,脚本就可以改成

#!/bin/bash

#Claude Code 空闲通知脚本

DIR_NAME=$(basename "$PWD")
osascript -e "display dialog \"Claude Code 正在等待您的输入

项目: $DIR_NAME\" with title \"Claude Code\" buttons {\"好的\"} default button 1"

image-20260104222224052

img

场景三:代码自动格式化#

这是 Boris 重点提到的场景。Claude 生成的代码大部分时候格式没问题,但偶尔会有缩进、空格之类的小毛病。如果你的项目有严格的格式检查,这些小问题会导致 CI 失败。

用 PostToolUse Hook 可以解决这个问题:每次 Claude 写入或编辑文件后,自动跑一次格式化。

先写一个格式化脚本 ~/.claude/format-code.sh,脚本具体内容就不贴了,AI都可以直接给出。

然后配置:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "/Users/你的用户名/.claude/format-code.sh \"$CLAUDE_FILE\"",
            "timeout": 15000
          }
        ]
      }
    ]
  }
}

matcher 设置为 Write|Edit|MultiEdit,表示只在这三种文件操作工具执行后触发。$CLAUDE_FILE 是 Claude Code 提供的环境变量,代表被操作的文件路径。

这样 Claude 每次写完代码,格式化自动执行,你不用管,CI 也不会因为格式问题挂掉。

image-20260104223532464

场景四:完成后自动跑测试#

如果想让 Claude 完成任务后自动验证,可以在 Stop Hook 里加上测试命令:

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "cd /你的项目路径 && npm run test 2>&1 || true"
          },
          {
            "type": "command",
            "command": "/Users/你的用户名/.claude/complete-notification.sh"
          }
        ]
      }
    ]
  }
}

这样 Claude 完成后会先跑测试,然后发通知。如果测试失败,你看通知的时候就知道有问题需要处理。

不过这个方案有个问题:每次 Claude 响应都会跑测试,有时候你只是问个问题,没必要跑测试。所以我个人更倾向于用 Subagent 来做验证,可以控制什么时候触发。这个在后面的文章里会详细说。

配置的位置#

Hook 配置可以放在两个地方:

用户级配置~/.claude/settings.json,对所有项目生效。适合放通用的配置,比如通知脚本。

项目级配置:项目根目录下的 .claude/settings.json,只对当前项目生效。适合放项目特定的配置,比如特殊的格式化规则。

如果两个地方都有配置,项目级的会覆盖用户级的。

项目级配置可以提交到 Git,这样团队成员都能用。

小结#

Hooks 核心就是配置脚本,然后触发自动执行。

推荐配置一下这几个,完成通知(不用盯着屏幕等)、等待输入提醒(并行工作不漏消息)、自动格式化(代码规范不用操心)。