Logo Vincent
返回文章列表

Claude Code /hooks:让 AI 按你的规矩办事

Claude
Claude Code /hooks:让 AI 按你的规矩办事

什么是 /hooks

用 Claude Code 的时候,你有没有想过:

  • 每次 Claude Code 要跑 git push 前,能不能自动跑一遍 lint?
  • 每次会话结束时,能不能自动把摘要发到 Slack?
  • 每次 Claude Code 想删文件,能不能先让另一个 AI 审查一下?

/hooks 就是干这个的。 它是 Claude Code 的事件钩子系统——在特定事件发生时,自动执行你预设的逻辑。

如果说 /permissions 控制的是”能不能做”,那 /hooks 控制的是”做之前和做之后还要干什么”。

核心概念

事件(Event)

Hook 系统围绕”事件”运作。Claude Code 在运行过程中会触发各种事件,你可以在这些事件上挂载钩子。

常用事件一览:

事件触发时机匹配维度
PreToolUse工具执行前工具名(如 Bash、Edit)
PostToolUse工具执行后工具名
PostToolUseFailure工具执行失败后工具名
UserPromptSubmit用户提交消息时
Notification通知事件通知类型
SessionStart会话开始来源(startup/resume/clear/compact)
SessionEnd会话结束结束原因
StopClaude 停止响应
SubagentStart子 Agent 启动Agent 类型
SubagentStop子 Agent 停止Agent 类型
PreCompact上下文压缩前
PostCompact上下文压缩后
PermissionRequest权限弹窗时工具名
PermissionDenied权限被拒绝工具名
ConfigChange配置变更配置来源
FileChanged文件变化文件名
CwdChanged工作目录变化
InstructionsLoaded指令文件加载加载原因
ElicitationMCP 服务器提问服务器名
ElicitationResultMCP 提问结果服务器名
Setup初始化触发类型(init/maintenance)
WorktreeCreateWorktree 创建
WorktreeRemoveWorktree 删除
TaskCreated任务创建
TaskCompleted任务完成
TeammateIdleTeammate 空闲

总共 27 个事件,覆盖了 Claude Code 运行的几乎每个关键节点。

匹配器(Matcher)

每个事件下可以挂多个钩子,用 matcher 来决定什么时候触发。

比如 PreToolUse 事件,你可以给不同的工具配不同的钩子:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{ "type": "command", "command": "echo 'about to run bash'" }]
      },
      {
        "matcher": "Edit|Write",
        "hooks": [{ "type": "command", "command": "echo 'about to modify file'" }]
      }
    ]
  }
}

匹配规则支持三种写法:

写法示例含义
精确匹配"Bash"只匹配 Bash 工具
管道分隔"Bash|Write|Edit"匹配其中任意一个
正则表达式"Bash|mcp__.*"匹配 Bash 或任意 MCP 工具

留空或写 "*" 表示匹配该事件的所有情况。

四种钩子类型

1. command —— Shell 命令

最基础也最常用的类型,直接执行一段 Shell 命令:

{
  "type": "command",
  "command": "npm run lint",
  "timeout": 30000
}

钩子通过 stdin 接收 JSON 格式的上下文信息(工具名、工具输入、会话 ID 等),通过 stdout 返回结果,通过 退出码 控制行为:

退出码含义
0成功,stdout 内容会加入对话上下文
2阻断,stderr 内容会告知 Claude,操作被拦截
其他非阻断错误,stderr 作为警告显示

2. prompt —— 单轮 AI 判断

让一个轻量 AI 模型做单轮判断,适合需要”智能审查”的场景:

{
  "type": "prompt",
  "prompt": "检查这个命令是否可能删除重要文件,如果有风险返回 {\"decision\": \"block\", \"reason\": \"可能删除重要文件\"}",
  "timeout": 30000
}

默认使用小快模型(通常是 Haiku),也可以通过 model 字段指定其他模型。

3. agent —— 多轮 AI Agent

当单轮判断不够时,用 Agent 类型——它会启动一个子 Agent,可以多轮对话、调用工具:

{
  "type": "agent",
  "prompt": "审查这段代码的安全性,如果发现问题请详细说明",
  "timeout": 60000
}

Agent 最多执行 50 轮对话,默认超时 60 秒。

4. http —— HTTP 请求

向外部服务发送 POST 请求,适合集成 CI/CD、通知系统、审计日志等:

{
  "type": "http",
  "url": "https://your-webhook.example.com/hook",
  "headers": {
    "Authorization": "Bearer $API_TOKEN"
  },
  "allowedEnvVars": ["API_TOKEN"],
  "timeout": 600000
}

HTTP 钩子有 SSRF 防护,请求体是 JSON 格式的 Hook 输入。Headers 支持环境变量插值,但必须在 allowedEnvVars 中显式声明。

怎么用 /hooks

在 Claude Code 交互模式下输入:

/hooks

会弹出一个 只读 的浏览面板,按事件分类展示当前生效的所有钩子。你可以:

  • 逐层浏览:事件 → 匹配器 → 具体钩子
  • 查看每个钩子的详细配置(类型、命令、超时等)
  • 看到钩子来自哪个配置源(User / Project / Local / Plugin / Session)

注意:/hooks 命令本身是只读的。要添加或修改钩子,需要编辑 settings.json

在 settings.json 中配置 Hooks

基本结构

{
  "hooks": {
    "事件名": [
      {
        "matcher": "匹配模式(可选)",
        "hooks": [
          {
            "type": "command | prompt | agent | http",
            "command": "...",
            "timeout": 30000
          }
        ]
      }
    ]
  }
}

配置源和优先级

钩子可以配置在不同层级,所有层级的钩子都会执行(不是覆盖,是累加):

来源文件路径
User~/.claude/settings.json
Project<项目>/.claude/settings.json
Local<项目>/.claude/settings.local.json
Plugin~/.claude/plugins/*/hooks/hooks.json
Managed企业托管策略

这跟权限规则不一样——权限规则是”后面覆盖前面”,但钩子是全部合并执行

if 条件过滤

所有钩子类型都支持 if 字段,用权限规则语法做更精细的过滤:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo 'dangerous command detected'",
            "if": "Bash(rm -rf:*)"
          }
        ]
      }
    ]
  }
}

这个钩子只在 Bash 工具要执行 rm -rf 开头的命令时才触发。if 的语法和 /permissions 中的规则格式一样。

实战示例

示例一:执行命令前自动 lint

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo '{\"decision\": \"approve\"}'"
          }
        ]
      }
    ]
  }
}

示例二:文件变更时自动通知

{
  "hooks": {
    "FileChanged": [
      {
        "matcher": ".env|.envrc",
        "hooks": [
          {
            "type": "command",
            "command": "echo '⚠️ 敏感配置文件被修改' | tee /dev/stderr && exit 2"
          }
        ]
      }
    ]
  }
}

.env.envrc 文件被修改时,自动发出警告。退出码 2 会阻断后续操作。

示例三:用 AI 审查危险命令

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "prompt",
            "prompt": "分析 stdin 中的命令,如果它可能造成不可逆的数据丢失(如 rm -rf、DROP TABLE),返回 {\"decision\": \"block\", \"reason\": \"...\"},否则返回 {\"decision\": \"approve\"}"
          }
        ]
      }
    ]
  }
}

示例四:会话结束时发送摘要

{
  "hooks": {
    "SessionEnd": [
      {
        "hooks": [
          {
            "type": "http",
            "url": "https://hooks.slack.com/services/xxx/yyy/zzz",
            "timeout": 10000
          }
        ]
      }
    ]
  }
}

示例五:只跑一次的初始化钩子

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "echo 'Session initialized at $(date)'",
            "once": true
          }
        ]
      }
    ]
  }
}

once: true 表示这个钩子在每个会话中只执行一次。

Hook 输入和输出

输入(stdin)

每个钩子通过 stdin 收到一个 JSON 对象,包含通用字段和事件特有字段:

通用字段:

{
  "session_id": "abc123",
  "transcript_path": "/path/to/transcript.jsonl",
  "cwd": "/your/project",
  "permission_mode": "default"
}

事件特有字段:

事件额外字段
PreToolUsetool_name, tool_input
PostToolUsetool_name, tool_input, tool_output
UserPromptSubmituser_prompt
Notificationnotification_type, message
SessionStartsource
SessionEndreason
FileChangedfile_path, event

输出(stdout JSON)

钩子可以输出结构化 JSON 控制 Claude Code 的行为:

{
  "continue": true,
  "decision": "approve",
  "reason": "命令看起来是安全的",
  "suppressOutput": false,
  "systemMessage": "注意:这个命令已经被自动审查"
}

核心字段:

字段类型说明
continueboolean是否继续执行
decisionstring"approve""block"
reasonstring人类可读的原因说明
suppressOutputboolean是否隐藏钩子输出
systemMessagestring注入到对话中的系统消息

PreToolUse 特有输出:

{
  "hookSpecificOutput": {
    "permissionDecision": "allow",
    "updatedInput": { "command": "npm test -- --coverage" },
    "additionalContext": "已自动添加 coverage 参数"
  }
}

通过 updatedInput,你可以在工具执行前修改它的输入——这是 Hook 系统最强大的能力之一。

异步钩子

有些钩子不需要阻塞主流程。比如发通知、写日志,你不想让 Claude Code 等它完成。

两种方式启用异步:

方式一:配置声明

{
  "type": "command",
  "command": "curl -X POST https://example.com/log",
  "async": true,
  "asyncRewake": true
}

async: true 让钩子在后台执行。asyncRewake: true 表示钩子完成后唤醒 Agent 处理结果。

方式二:运行时声明

钩子在 stdout 的第一行输出 {"async": true},即可转为异步模式。适合需要根据条件决定是否异步的场景。

权限决策优先级

当多个 PreToolUse 钩子同时对一个操作做出判断时,优先级如下:

deny > ask > allow

也就是说,只要有一个钩子说 deny,操作就会被拒绝。

重要: Hook 的 allow 决策 不会 绕过 settings.json 中的 deny/ask 权限规则。换句话说,你不能通过 Hook 来”解锁”被权限系统禁止的操作。

企业管控

企业管理员可以通过托管策略控制 Hook 系统:

策略效果
allowManagedHooksOnly: true只执行托管钩子,忽略用户和项目配置的钩子
disableAllHooks: true禁用所有钩子(包括托管钩子)

非托管设置中的 disableAllHooks 只能禁用非托管钩子——管理员的钩子永远不会被普通用户禁用。

实用技巧

技巧一:用 command 钩子做轻量检查

Shell 命令钩子启动快、开销小,适合做格式检查、文件存在性验证等轻量操作。退出码 2 是你的”紧急制动”——任何时候你都可以用它阻止一个操作。

技巧二:用 if 缩小触发范围

不要让每个 Bash 命令都触发钩子,用 if 字段精准过滤:

{
  "type": "command",
  "command": "run-safety-check.sh",
  "if": "Bash(docker:*)"
}

只在 Docker 命令时才触发安全检查,避免不必要的开销。

技巧三:用 updatedInput 做命令增强

PreToolUse 钩子可以修改工具输入。比如,自动给所有 npm install 加上 --save-exact

{
  "type": "command",
  "command": "read input && echo '{\"hookSpecificOutput\": {\"updatedInput\": {\"command\": \"'$(echo $input | jq -r .tool_input.command)' --save-exact\"}}}'"
}

技巧四:善用 once 避免重复

对于只需要跑一次的初始化逻辑(比如环境检查、依赖安装),加上 once: true 避免每次触发都重复执行。

技巧五:timeout 不要设太长

默认超时:command 无限制、prompt 30 秒、agent 60 秒、http 10 分钟。建议根据实际需求设一个合理的 timeout,防止钩子卡住拖慢整个会话。

写在最后

Hook 系统是 Claude Code 中最灵活的扩展机制。

/permissions 回答的是”能不能做”的问题,而 /hooks 回答的是”做的时候还能顺便干什么”。用好 Hook,你可以把 Claude Code 打造成一个高度自动化、符合团队规范的开发工作流。

不过也别过度设计——先从一两个简单的 command 钩子开始,比如”git push 前跑 lint”或”会话结束时发通知”。等你熟悉了 Hook 的输入输出机制,再逐步加入更复杂的 prompt 和 agent 钩子。

简单开始,按需增长。

相关推荐

AI-first 创业公司,为什么只需要一种编程语言?

技术架构越简单 = AI Coding 效率越高。从 Java 的"防人"设计到 TypeScript 全栈通吃,聊聊 AI 时代创业公司的编程语言选择。

cc-ping:一行命令 Ping 所有 Claude Code 配置

用多个 Claude Code API Key 或中继?cc-ping 帮你管理配置、一键切换,还能并行 Ping 所有节点比速度。

震惊!程序员用这个工具,4分钟干完95分钟的活!效率暴涨24倍

躺床上发3条消息,4分钟搞定3个项目。传统方式需要95分钟,这就是冷兵器和热兵器的差距。

CCBot - 研发提效 24 倍

通过 IM 机器人控制 Claude Code,3 个项目 4 分钟全部搞定。传统编程需要 95 分钟,效率提升 24 倍。

Claude Code /add-dir:被低估的 Monorepo 神器

Claude Code 默认只能看到当前目录。/add-dir 打破这个限制——分享我每天跨 5 个仓库使用的经验。

Claude Code 省 Token 小技巧:感叹号的妙用

一个简单却容易被忽略的技巧——用感叹号直接执行命令,省 token、提速度、更可控。

我做了个机器人,让团队在飞书里用 Claude Code

CCBot 让你的团队在飞书群聊里直接用 Claude Code——不需要终端、不需要 SSH。开源、自部署、五分钟搞定。

Claude Code /btw 命令详解:不打扰主线的快问快答

详细介绍 Claude Code 的 /btw 命令——它是什么、怎么用、什么时候该用,以及它和子代理、/compact 的区别。

Claude Code /compact:释放上下文,不丢进度

任务做到一半上下文满了?/compact 帮你压缩对话继续干活——和 /clear、/rewind 的区别一次讲清。

Claude Code /config:一文搞懂所有可调设置

用 Claude Code 却从没打开过 /config?这篇带你逐项拆解——从权限模式到自动压缩,从主题切换到通知配置,帮你打造最顺手的 AI 编程环境。

Claude Code /context:你的上下文都被什么吃了?

对话到一半 Claude Code 说上下文不够了?/context 用一张可视化网格告诉你:上下文被什么占了、占了多少、怎么优化。

Claude Code /diff:这次对话改了什么,一目了然

Claude Code 帮你改了一堆文件,但你不确定到底改了什么?/diff 用交互式界面展示所有改动——既有 git 视角的全量 diff,也有按对话轮次拆分的逐步 diff。

Claude Code /fast:同样的 Opus,两倍速——值不值?

/fast 不会降级模型,还是 Opus,只是更快。什么时候该开、什么时候该关,以及实际体验差异。

Claude Code 引用外部知识的最佳实践:GitHub MCP + Context7

用 GitHub MCP 和 Context7 MCP 两个工具组合,解决 Claude Code 知识过时导致的代码错误问题。

Claude Code /init:10 秒自动生成 CLAUDE.md

别再手写 CLAUDE.md 了。看看 /init 自动生成的效果、怎么自定义输出,以及一个让 Claude Code 效率翻倍的小技巧。

Claude Code MCP:让 AI 连接 GitHub、数据库等一切工具

MCP 把 Claude Code 从代码阅读器升级为全栈 Agent。哪些 MCP 服务器值得装、配置怎么写,实测分享。

Claude Code /memory 详解:让 AI 真正记住你的项目

详细介绍 Claude Code 的 /memory 命令和记忆系统——CLAUDE.md 手动指令、Auto Memory 自动记忆、模块化规则,让 Claude 跨会话记住项目规范和个人偏好。

Claude Code /model:Opus、Sonnet、Haiku 怎么选?

不是每个任务都需要 Opus。怎么切换模型、哪个场景用哪个、怎么省 token 又不掉质量。

Claude Code /permissions:谁能干什么,你说了算

每次 Claude Code 要跑命令都弹窗问你?嫌烦又不敢全放开?/permissions 帮你精细控制每个工具的权限——该放的放,该拦的拦。

Claude Code /plan 详解:先想清楚再动手

详细介绍 Claude Code 的 /plan 命令和 Plan Mode——只读规划模式,让 Claude 先分析代码、制定方案,确认后再动手,避免复杂任务翻车。

Claude Code + Playwright MCP:AI 终于能"看见"页面了

一个 Modal 溢出的 bug,Claude Code 反复修了 5 次都没搞定。直到接入 Playwright MCP 让它真正看到页面,一次定位,一次修复。

Claude Code /resume 命令详解:别让对话白聊

详细介绍 Claude Code 的 /resume 命令——恢复历史对话、管理会话、实用技巧,让你的每一轮对话都不浪费。

Claude Code /review:让 AI 帮你做 Code Review

提了 PR 没人看?想在合并前多一道把关?/review 让 Claude Code 像一个资深开发者一样审查你的代码——还有 /ultrareview 和 /security-review 两个进阶选择。

Claude Code Skills 详解:打造你的专属命令库

详细介绍 Claude Code 的 Skills 功能——创建自定义斜杠命令、复用提示词模板、共享团队最佳实践,让 AI 编程更高效更一致。

Claude Code /stats:看看 AI 到底帮你写了多少代码

好奇 Claude Code 到底写了多少行代码?/stats 给你完整数据——token、编辑次数、工具调用,教你怎么看。

Claude Code /status 命令详解:一眼看清会话全貌

详细介绍 Claude Code 的 /status 命令——它是什么、怎么用、能看到哪些信息,以及它在日常工作流中的实际价值。

Claude Code /tasks 命令详解:后台任务尽在掌控

详细介绍 Claude Code 的 /tasks 命令——查看后台任务、管理并行 Agent、掌控长时间运行的进程,让多任务开发井井有条。

Claude Code /usage 命令详解:你的额度还剩多少

详细介绍 Claude Code 的 /usage 命令——查看用量、了解限额、避免突然被限速,让你对自己的额度心中有数。

Claude Code /vim:在 AI 编程助手里用 Vim 键位

习惯了 Vim 的操作方式?/vim 让你在 Claude Code 的输入框里用 hjkl 移动、dd 删行、ciw 替换单词——不用改变肌肉记忆。

Claude Code 使用指南:从安装到实战,一篇就够(2026)

用了半年 Claude Code 的经验总结——5 分钟安装配置、最常用的命令、CLAUDE.md 编写技巧,以及没人告诉你的实战心得。

Claude 全家桶:从聊天到写代码到自动办公,一文讲清楚

一篇文章带你了解 Anthropic 的 Claude 全家桶——Claude.ai、Claude Code、Claude Cowork,以及 Opus、Sonnet、Haiku 三大模型家族。

Claude Code /agents 详解:自定义 AI 子代理,各司其职

详细介绍 Claude Code 的 /agents 命令——查看、管理和创建自定义 Agent,让不同任务由专门的 AI 角色来执行,从代码探索到架构规划各司其职。

Claude Code /doctor 详解:一键诊断你的开发环境

详细介绍 Claude Code 的 /doctor 命令——自动检测安装状态、API 连接、MCP 配置、上下文用量等问题,帮你快速定位和修复环境故障。

Claude Code /effort 详解:控制 AI 思考的深度

详细介绍 Claude Code 的 /effort 命令——调节 Claude 的推理努力程度,在速度和质量之间找到最佳平衡点,让每一次对话都恰到好处。

Claude Code /cost 详解:你的 AI 编程到底花了多少钱

详细介绍 Claude Code 的 /cost 命令——实时查看会话 API 成本,了解各模型定价和 Token 消耗明细,让每一分钱都花得明明白白。

Claude Code /export 详解:把 AI 对话带走

详细介绍 Claude Code 的 /export 命令——将对话导出为文件或复制到剪贴板,方便分享、存档和复盘,让每一次有价值的对话都不浪费。

Claude Code /rewind 详解:AI 改错了?一键回退

详细介绍 Claude Code 的 /rewind 命令——将代码和对话回退到任意历史节点,支持只回退代码、只回退对话、或两者同时回退,是你和 AI 协作时的后悔药。

Claude Code /plugin 详解:给你的 AI 编程助手装插件

详细介绍 Claude Code 的 /plugin 命令——管理插件的安装、启用、禁用和更新,通过插件扩展 Claude Code 的命令、技能、Agent 和 Hook,打造你专属的 AI 编程工具链。

Claude Code /theme 详解:给你的终端换个好看的皮肤

详细介绍 Claude Code 的 /theme 命令——6 种预设主题 + 自动模式,支持深色/浅色、色盲友好、ANSI 兼容,60+ 色值覆盖终端全部 UI 元素。

Claude Code /insights 详解:用 AI 分析你自己用 AI 的方式

详细介绍 Claude Code 的 /insights 命令——五阶段数据分析流水线、七大洞察章节、多维度会话统计,用 Claude Opus 生成专属 HTML 使用报告。

Claude Code /rename 详解:给你的会话取个有意义的名字

详细介绍 Claude Code 的 /rename 命令——手动命名、AI 自动生成(Haiku 模型)、启动参数命名、Plan 模式自动命名,以及双标题系统与 Bridge 同步机制。

Claude Code settings.json 详解(一):配置文件在哪里、谁说了算

全面介绍 Claude Code 的配置文件体系——五个配置来源的路径、优先级规则、数组合并与单值覆盖的区别、企业管理设置的多种下发方式。

Claude Code settings.json 详解(二):permissions 权限系统全解析

深入解析 Claude Code 的 permissions 配置——allow/deny/ask 三类规则、通配符语法、MCP 工具权限、defaultMode 各模式含义,以及 additionalDirectories 的作用。

Claude Code settings.json 详解(三):hooks 钩子全解析

深入解析 Claude Code 的 hooks 配置——四种钩子类型、核心事件(PreToolUse/PostToolUse/Stop/Notification)、stdin/stdout 协议、exit code 语义,以及实用配置示例。

Claude Code settings.json 详解(四):env、模型、认证与其他实用字段

全面介绍 Claude Code settings.json 中的 env 环境变量注入、模型配置、身份认证辅助、Git 提交署名、会话清理、语言与界面、思考深度、自动更新、记忆系统等实用字段。

Claude Code Agent Loop:拆解 AI 编程助手的心脏

Claude Code 是怎么一步步理解你的需求、调用工具、自我修复的?从源码角度拆解 Agent Loop 的核心架构——流式响应、并行工具执行、自动压缩、错误恢复,一次讲透。

© 2026 vincentqiao.com . 保留所有权利。