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 文件中。

感兴趣可以看看官网文档 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"
}
]
}
]
}
}

场景二:等待输入时提醒
一般都会同时运行好几个 Claude,这种并行工作的模式下,很容易漏掉某个 Claude 在等你输入。
这时候可以用 Notification Hook。当 Claude 进入等待输入状态时,触发提醒。

先写一个脚本 ~/.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)的通知权限,如果通知不显示,可以改用 弹窗方式绕过权限问题。

还可以进一步优化,比如我想知道是哪个窗口/项目在等待我输入,脚本就可以改成
#!/bin/bash
#Claude Code 空闲通知脚本
DIR_NAME=$(basename "$PWD")
osascript -e "display dialog \"Claude Code 正在等待您的输入
项目: $DIR_NAME\" with title \"Claude Code\" buttons {\"好的\"} default button 1"

场景三:代码自动格式化
这是 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 也不会因为格式问题挂掉。

场景四:完成后自动跑测试
如果想让 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 核心就是配置脚本,然后触发自动执行。
推荐配置一下这几个,完成通知(不用盯着屏幕等)、等待输入提醒(并行工作不漏消息)、自动格式化(代码规范不用操心)。
💡 AI 工具的爆发,让普通人也能快速做出产品。
但如何做?如何变现?如何真正走向海外市场?
👇 想了解更多 AI 编程 & 出海实战信息,扫码添加好友了解更多
🔗 更多教程请访问 ipengtao.com
文章评论