词元之母TOK.MOM - 平台充值汇率 1:1 即 1 人民币充值到账 1 美元,支持一个 Key 调用近 600+ 海内外模型,限时特价模型低至 1 折,欢迎上岸!
课程信息 预计学时:4-6小时 难度等级:⭐⭐ 入门级(有Claude Code基础即可) 更新日期:2026年4月 适用版本:Claude Code v2.1.133(验证于 2026-05-08) 前置要求:已完成Claude Code安装和基础使用
根据你的情况选择学习路径:这是一篇3000+行的长教程,不用全看!根据你的目标选择路径。
✅ 术语表(5分钟) - 快速了解Hook核心概念
✅ 第一部分1.1-1.2:Hooks简介(5分钟) - 理解Hook是什么
✅ 第二部分:5分钟快速开始(15分钟) - 配置第一个Hook
✅ 第三部分3.1:PreToolUse基础(5分钟) - 最常用的Hook类型🔧 第五部分:故障排查 - 按错误类型查找解决方案
🔧 第六部分:FAQ - 20个常见问题解答Ctrl + F 搜索你的错误信息关键词| 想学什么 | 看哪几节 | 预计时间 |
|---|---|---|
| Git自动化 | 第四部分4.1节 | 45分钟 |
| 代码格式化 | 第四部分4.2节 | 30分钟 |
| 文件保护 | 第三部分3.1节 | 20分钟 |
| 提示词优化 | 第三部分3.3节 | 30分钟 |
| 安全最佳实践 | 第一部分1.4节 + 第五部分 | 40分钟 |
| 术语 | 英文全称 | 通俗解释 | 生活类比 |
|---|---|---|---|
| Hook | - | 在特定事件发生时自动执行的脚本 | 汽车传感器(检测到碰撞自动弹安全气囊) |
| PreToolUse | Pre Tool Use | 工具调用前触发的Hook | 机场安检门(登机前检查) |
| PostToolUse | Post Tool Use | 工具调用后触发的Hook | 快递签收后的自动通知 |
| UserPromptSubmit | User Prompt Submit | 用户输入提交时触发的Hook | 邮件发送前的拼写检查 |
| Notification | - | 通知事件触发的Hook | 手机APP推送通知 |
| SessionStart | Session Start | 会话开始时触发的Hook | 开机自动启动程序 |
| SessionEnd | Session End | 会话结束时触发的Hook | 关机前自动保存 |
| Stop | - | AI停止响应时触发的Hook | 紧急刹车后的状态保存 |
| WorktreeCreate 🆕 | Worktree Create | 工作树创建时触发的Hook | 新开一个平行工作台时的初始化 |
| WorktreeRemove 🆕 | Worktree Remove | 工作树删除时触发的Hook | 关闭平行工作台时的清理 |
| Matcher | - | 匹配规则,决定Hook对哪些工具生效 | 筛选器(只检查特定行李) |
| Decision | - | PreToolUse Hook的返回决策 | 安检结果(放行/拦截/询问) |
| stdin | Standard Input | 标准输入,Hook接收数据的方式 | 传送带送入检查口 |
| stdout | Standard Output | 标准输出,Hook返回结果的方式 | 检查结果显示屏 |
| stderr | Standard Error | 标准错误输出,仅用于调试日志(不会显示在Claude Code界面) | 后台监控日志(用户看不到) |
| timeout | - | 超时时间,Hook最长运行时间 | 限时检查(超时自动放行) |
| JSON | JavaScript Object Notation | 一种通用的数据格式,用花括号{}组织数据,settings.json配置文件就是JSON格式 | 标准化的表格模板 |
~(波浪号) | Home Directory | 用户的"家目录",macOS是/Users/用户名,Linux是/home/用户名,Windows对应C:\Users\用户名 | 你电脑上"我的文档"的上级目录 |
一句话理解:Hooks是Claude Code的"自动化传感器",在特定事件发生时自动执行你的脚本,实现100%可靠的自动化。
问题:AI有时会"忘记"你的要求
你:每次写代码后帮我运行格式化
Claude:好的!(这次记住了)
...10分钟后...
Claude:代码写好了!
你:等等,你忘了格式化!
Claude:抱歉,我忘了...解决方案:不依赖AI记忆,配置Hook后自动执行
配置PostToolUse Hook → 监听Write工具 → 自动运行格式化脚本
Claude:代码写好了!
[Hook自动触发:运行 prettier --write xxx.js]
结果:代码已自动格式化,100%不会忘记生活类比: 没有Hooks:靠人记住每次开车前检查轮胎(经常忘) 有Hooks后:汽车传感器自动检测胎压,异常自动报警(100%可靠)
| 对比维度 | 提示词方式 | Hooks方式 |
|---|---|---|
| 可靠性 | 不确定(AI可能忘记) | 100%执行(确定性) |
| 一致性 | 每次可能不同 | 每次完全相同 |
| 自动化 | 需要AI主动执行 | 事件触发自动执行 |
| 团队协作 | 每人都要提醒AI | 配置一次,全员生效 |
| 适用场景 | 灵活建议 | 强制规则 |
场景:禁止Claude修改production目录下的文件
Hook触发:Claude尝试Write(file_path="production/config.js")
Hook检查:路径包含"production/"
Hook决策:deny(拒绝)
结果:Claude收到错误提示,文件未被修改场景:每次保存代码后自动格式化
Hook触发:Claude成功执行Write(file_path="src/app.js")
Hook执行:运行 prettier --write src/app.js
结果:代码自动格式化,无需手动操作场景:自动在写作任务后追加写作规范
用户输入:"帮我写一篇关于AI的文章"
Hook检测:包含"写"和"文章"关键词
Hook追加:"\n\n## 写作规范\n1. 风格:接地气\n2. 字数:1500字"
Claude收到:原始输入 + 写作规范场景:提交前自动检查代码质量
Hook触发:Claude执行Bash(command="git commit -m xxx")
Hook执行:运行lint检查、测试、敏感信息扫描
Hook决策:全部通过 → allow;有问题 → deny
结果:低质量代码无法提交场景:启动Claude Code时自动加载项目配置
Hook触发:Claude Code启动
Hook执行:检查Python依赖是否安装
结果:缺少依赖时自动提示安装命令场景:Claude需要用户确认时发送桌面通知
Hook触发:Claude发送通知请求用户确认
Hook执行:调用系统通知API
结果:用户收到桌面弹窗,不会错过重要确认用户输入
↓
[UserPromptSubmit Hook] ← 可以修改/增强提示词
↓
Claude处理提示词
↓
决定调用工具(如Write)
↓
[PreToolUse Hook] ← 可以允许/拒绝/询问
↓
执行工具(如Write)
↓
[PostToolUse Hook] ← 可以执行后处理
↓
返回结果给用户| Hook类型 | 触发时机 | 典型用途 | 可否阻止后续操作 |
|---|---|---|---|
| UserPromptSubmit | 用户输入提交后 | 提示词优化、敏感词过滤 | ✅ 是 |
| PreToolUse | 工具调用前 | 权限校验、参数验证 | ✅ 是 |
| PostToolUse / PostToolUseFailure | 工具调用成功后 / 失败后 | 格式修复、自动测试、失败告警 | ❌ 否 |
| Notification | 通知发送时 | 日志记录、桌面通知 | ❌ 否 |
| SessionStart | 会话开始时 | 环境初始化 | ❌ 否 |
| SessionEnd | 会话结束时 | 清理临时文件 | ❌ 否 |
| Stop / StopFailure | AI 正常停止 / 异常停止时 | 保存状态、错误告警 | ❌ 否 |
| TaskCreated / TaskCompleted | 子任务创建 / 完成时 | 子代理日志、任务收集 | ❌ 否 |
| PermissionDenied | 权限被拒绝时 | 审计、自动补救提示 | ❌ 否 |
| PreCompact / PostCompact | 上下文压缩前 / 后 | 保存关键上下文、记录 token 变化 | ❌ 否 |
| CwdChanged / FileChanged | 工作目录切换 / 文件变化时 | 同步环境、触发检查 | ❌ 否 |
| Elicitation | MCP 请求额外交互输入时 | 记录交互日志、输入校验 | ❌ 否 |
💡 记忆方式:先记三大高频入口 UserPromptSubmit、PreToolUse、PostToolUse,再按“失败 / 任务 / 文件 / 压缩 / 交互”五个补充事件族扩展。
⚠️ 严重警告:Hooks可以执行任意Shell命令,这意味着配置不当可能导致: 文件被删除或修改 敏感信息泄露 系统被恶意脚本攻击
| 风险 | 防护措施 |
|---|---|
| 恶意脚本 | 只运行你信任的脚本,不要从不明来源复制配置 |
| 权限过大 | 脚本只请求必要的权限,避免使用sudo |
| 敏感信息 | 不要在脚本中硬编码密码/Token |
| 无限循环 | 设置合理的timeout,避免脚本卡死 |
| 团队配置 | 代码审查.claude/settings.json变更 |
□ 脚本来源可信吗?(自己写的/官方示例/信任的开源)
□ 脚本权限最小化了吗?(不需要sudo就不用)
□ 敏感信息用环境变量了吗?(不硬编码)
□ 设置了合理的timeout吗?(防止卡死)
□ 团队成员都知道这个Hook吗?(透明度)本节目的:用最快速度配置第一个Hook,让你立即看到效果! ⏱️ 预计时间:5-10分钟
.claude/hooks/ 目录# 进入你的项目目录
cd C:\你的项目路径
# 创建hooks目录
New-Item -ItemType Directory -Path ".claude\hooks" -Force.claude/hooks/post-write-hello.py:💡 你有两种选择: 选择A:在Claude Code对话框里说人话(推荐新手) 帮我创建.claude/hooks/post-write-hello.py文件,内容是一个PostToolUse Hook脚本,在Write工具执行后打印提示信息(换行用 Shift + Enter,最后按Enter发送)Claude Code会自动帮你创建正确格式的文件! 选择B:在终端里用命令行(熟悉命令行的用户)
见下方PowerShell/Bash代码
@'
#!/usr/bin/env python3
"""
最简单的PostToolUse Hook示例
每次Write工具执行后记录日志
"""
import sys
import json
from pathlib import Path
from datetime import datetime
# 从stdin读取工具执行信息
try:
input_data = json.loads(sys.stdin.read())
except:
sys.exit(0)
# 获取工具名称和文件路径
tool_name = input_data.get('tool_name', '')
tool_input = input_data.get('tool_input', {})
file_path = tool_input.get('file_path', '')
# 只处理Write工具
if tool_name == 'Write':
# PostToolUse Hook执行后处理任务
# 注意:PostToolUse Hook无法向用户输出信息
# Claude Code只会显示"Hook执行成功"
# 如果需要调试,可以写入日志文件
log_file = Path.home() / '.claude' / 'hooks' / 'post-write.log'
log_file.parent.mkdir(parents=True, exist_ok=True)
with open(log_file, 'a', encoding='utf-8') as f:
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
f.write(f"[{timestamp}] ✅ 文件已保存: {file_path}\n")
sys.exit(0)
'@ | Out-File -FilePath ".claude\hooks\post-write-hello.py" -Encoding utf8.claude/settings.json:💡 你有两种选择: 选择A:在Claude Code对话框里说人话(推荐新手) 帮我创建.claude/settings.json配置文件,配置PostToolUse Hook监听Write工具并运行post-write-hello.py脚本(换行用 Shift + Enter,最后按Enter发送)Claude Code会自动帮你创建正确格式的配置文件! 选择B:在终端里用命令行(熟悉命令行的用户)
见下方PowerShell/Bash代码
@'
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/post-write-hello.py",
"timeout": 10
}
]
}
]
}
}
'@ | Out-File -FilePath ".claude\settings.json" -Encoding utf8💡 配置说明: "PostToolUse":Hook类型,工具执行后触发"matcher": "Write":只匹配Write工具"command":要执行的脚本命令"timeout": 10:超时10秒
你:帮我创建一个test.txt文件,内容是"Hello Hooks!"Claude:我来帮你创建test.txt文件。
[Write工具执行]
✅ Hook执行成功
文件已创建成功!💡 重要说明: PostToolUse Hook执行后,Claude Code只会显示"Hook执行成功" Hook的日志已写入 ~/.claude/hooks/post-write.log文件你可以查看日志文件确认Hook确实执行了:
✅ 关键确认:看到 Hook触发成功!说明Hook配置正确并成功执行!
.claude/hooks/ 目录存在.claude/hooks/post-write-hello.py 文件存在且内容正确.claude/settings.json 文件存在且JSON格式正确chmod +x)本节目的:掌握所有Hook类型的用法 ⏱️ 预计时间:1.5-2小时
一句话理解:PreToolUse就像"安检门",在工具执行前检查是否允许通过。
{
"tool_name": "Write",
"tool_input": {
"file_path": "C:/project/src/app.js",
"content": "console.log('Hello World');"
}
}| 字段 | 类型 | 说明 |
|---|---|---|
tool_name | string | 工具名称(Write, Edit, Bash, Read等) |
tool_input | object | 工具的输入参数 |
新旧API并存:v2.1.49+ 推荐使用新版 hookSpecificOutput.permissionDecision字段,旧版decision字段仍然支持但已废弃。
hookSpecificOutput.permissionDecision 字段:{
"hookSpecificOutput": {
"permissionDecision": "deny"
},
"message": "禁止修改production目录下的文件"
}decision 字段:{
"decision": "deny",
"message": "禁止修改production目录下的文件"
}hookSpecificOutput.permissionDecision) :| 决策值 | 说明 | 工具是否执行 |
|---|---|---|
"allow" | 允许执行,绕过权限系统 | ✅ 是 |
"deny" | 拒绝执行,原因会反馈给Claude | ❌ 否 |
"ask" | 暂停,询问用户决定 | 🤔 等待用户决定 |
| 无输出 | 默认允许 | ✅ 是 |
decision,已废弃):| 旧版值 | 等同于新版 | 说明 |
|---|---|---|
"approve" | "allow" | 允许执行 |
"block" | "deny" | 拒绝执行 |
PostToolUse 和 UserPromptSubmit 的决策值:这两个Hook类型使用 "block"来阻止/提供反馈,无输出则默认允许。
production/目录下的文件.claude/hooks/pre-protect-production.py:.claude/settings.json:{
"hooks": {
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/pre-protect-production.py",
"timeout": 5
}
]
}
]
}
}production/config.json时:Claude:我来修改production/config.json...
❌ 禁止修改受保护的路径!
路径: C:/project/production/config.json
原因: 包含受保护目录 'production/'
请先切换到dev环境或手动操作。.claude/hooks/pre-block-dangerous-cmd.py:{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/pre-block-dangerous-cmd.py",
"timeout": 5
}
]
}
]
}
}一句话理解:PostToolUse就像"快递签收通知",在工具成功执行后自动触发后续操作。
{
"tool_name": "Write",
"tool_input": {
"file_path": "C:/project/src/app.js",
"content": "console.log('Hello');"
},
"tool_output": {
"success": true,
"message": "File written successfully"
}
}| 字段 | 类型 | 说明 |
|---|---|---|
tool_name | string | 工具名称 |
tool_input | object | 工具的输入参数 |
tool_output | object | 工具的输出结果 |
⚠️ 重要:PostToolUse Hook的输出机制 v2.1.133 前:PostToolUse Hook 无法向用户输出信息,只能做后处理(格式化、备份、日志)。 v2.1.133 起:PostToolUse Hook 可以通过 hookSpecificOutput.updatedToolOutput替换工具的实际输出内容,适用于所有工具类型。✅ 可以做:执行后处理任务(格式化、备份、测试、写日志文件) ✅ v2.1.133+ 可以做:通过 hookSpecificOutput.updatedToolOutput替换工具输出❌ 常见误区: print(..., file=sys.stderr)不会显示在界面,只在终端可见如果需要向用户注入额外上下文信息,也可以使用 UserPromptSubmit Hook 的 additionalContext机制。
hookSpecificOutput.updatedToolOutput 替换工具输出.claude/hooks/post-auto-format.py:{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/post-auto-format.py",
"timeout": 30
}
]
}
]
}
}Claude:我来创建app.js文件...
[Write工具执行成功]
[AutoFormat] app.js: ✅ 格式化成功.claude/hooks/post-auto-backup.py:一句话理解:UserPromptSubmit就像"邮件发送前的自动补充",可以在用户输入发送给Claude之前自动增强或过滤。
⚠️ 重要:UserPromptSubmit的输入是JSON格式,不是纯文本!
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../session.jsonl",
"cwd": "/your/project/path",
"permission_mode": "default",
"hook_event_name": "UserPromptSubmit",
"prompt": "请帮我写一篇关于AI的文章"
}| 字段 | 类型 | 说明 |
|---|---|---|
session_id | string | 当前会话ID |
prompt | string | 用户输入的原始提示词 |
cwd | string | Claude Code的工作目录 |
permission_mode | string | 权限模式(default/plan/bypassPermissions等) |
hook_event_name | string | 事件类型标识 |
## 写作要求
- 字数:1500字
- 风格:老金式接地气风格
- 包含实战案例{
"continue": true,
"suppressOutput": false
}.claude/hooks/user-prompt-enhance.py:💡 注意: 输入是JSON,必须用 json.loads()解析用户原始输入在 prompt字段中通过stdout输出JSON格式的 additionalContext字段来注入上下文stderr仅用于调试,不会显示在Claude Code界面
{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/user-prompt-enhance.py",
"timeout": 5
}
]
}
]
}
}帮我写一篇关于Claude Code的介绍文章帮我写一篇关于Claude Code的介绍文章
---
## 写作规范提醒(自动追加)
1. **风格**:接地气、说人话,避免AI腔
2. **结构**:开头金句 -> 核心要点 -> 实战案例 -> 总结升华
3. **字数**:1500-2000字
4. **检查**:完成后运行 /pre-check 进行质量检查
---一句话理解:Notification Hook就像"消息推送处理器",在Claude发送通知时触发。
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../session.jsonl",
"cwd": "/your/project/path",
"hook_event_name": "Notification",
"message": "Claude is waiting for your input"
}| 字段 | 类型 | 说明 |
|---|---|---|
session_id | string | 当前会话ID |
transcript_path | string | 会话记录文件路径 |
cwd | string | 工作目录 |
hook_event_name | string | 事件类型标识(固定为"Notification") |
message | string | 通知消息内容(Notification特有字段) |
⚠️ 注意:根据官方实现,Notification Hook没有 title字段,只有message字段。
.claude/hooks/notification-desktop.py:一句话理解:SessionStart就像"开机自启动程序",在Claude Code启动时自动执行初始化任务。
.claude/hooks/session-start-check.py:{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/session-start-check.py",
"timeout": 10
}
]
}
]
}
}.claude/hooks/session-end-cleanup.sh:{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../session.jsonl",
"cwd": "/your/project/path",
"hook_event_name": "Stop"
}⚠️ 注意:Stop Hook没有 reason字段,只有标准字段。
{"continue": false}强制停止.claude/hooks/stop-save-state.py:v2.1.49+ 新增:这两个Hook类型配合 Claude Code 内置的 Git Worktree 功能使用,用于 Git Worktree(工作树)的生命周期管理。
💡 生活类比:Git Worktree 就像在同一个项目里开了多个"平行工作台"。你可以在工作台A修bug,同时在工作台B开发新功能,互不干扰。Claude Code 使用 Worktree 来实现并行任务隔离。
{
"hooks": {
"WorktreeCreate": [
{
"command": "echo \"新工作树已创建: $(date)\" >> ~/.claude/worktree.log",
"timeout": 10000
}
]
}
}{
"worktree_path": "/path/to/worktree",
"branch": "feature/new-feature"
}{
"hooks": {
"WorktreeRemove": [
{
"command": "echo \"工作树已删除: $(date)\" >> ~/.claude/worktree.log",
"timeout": 10000
}
]
}
}{
"hooks": {
"WorktreeCreate": [
{
"command": ".claude/hooks/worktree-init.sh",
"timeout": 30000
}
],
"WorktreeRemove": [
{
"command": ".claude/hooks/worktree-cleanup.sh",
"timeout": 15000
}
]
}
}⚠️ 注意:WorktreeCreate 和 WorktreeRemove 都是不可阻止的Hook,它们只用于执行附加操作,不能阻止工作树的创建或删除。
--worktree 启动参数的关系🔥 重要:2026年2月(v2.1.49),Claude Code 正式内置了 Git Worktree 支持,这是一个核心功能级别的更新,不仅仅是 Hook。
--worktree(-w)启动参数:你的项目仓库(主工作目录)
├── .git/ # 共享的 Git 历史
├── .claude/worktrees/ # 工作树存放目录(加到 .gitignore)
│ ├── worktree-abc123/ # Agent A 的独立工作目录
│ └── worktree-def456/ # Agent B 的独立工作目录
├── src/ # 主工作目录的文件
└── ...| 场景 | 说明 |
|---|---|
| 并行开发 | 终端1: claude -w 开发新功能 / 终端2: claude -w 修复 bug |
| 代码审查 | 主工作目录继续开发,工作树中运行审查 Agent |
| 实验性修改 | 在工作树中试验方案,不影响主目录 |
claude -w 即可,Hook 是可选的增强(如自动安装依赖)v2.1.49+ 新增: 这两个Hook类型用于监控和管理子代理(Subagent/Agent)的生命周期。
{
"hooks": {
"SubagentStart": [
{
"command": "echo \"子代理已启动: $(date)\" >> ~/.claude/subagent.log",
"timeout": 5000
}
]
}
}v2.1.49+ 新增:在权限请求时触发,可用于实现自动审批策略。
{
"hooks": {
"PermissionRequest": [
{
"command": "python .claude/hooks/permission-policy.py",
"timeout": 5000
}
]
}
}v2.1.49+ 新增:在 Claude Code 执行上下文压缩(Compact)前触发。
v2.1.49+ 新增:在 Claude Code 配置发生变更时触发。
v2.1.49+ 新增:在多代理协作场景中,当队友代理进入空闲状态时触发。
v2.1+ 新增:以下Hook类型进一步扩展了Claude Code的事件覆盖范围,让你能捕捉到更多关键时刻。 🎯 生活类比:如果之前的Hook是"门窗报警器",这些新Hook就是"烟雾报警器、水浸传感器、燃气检测器"——覆盖了之前监控不到的异常场景。
⚡ 与Stop的区别: Stop是正常结束(用户主动退出、任务完成),就像下班正常关灯锁门;StopFailure是异常中断,就像突然停电——你需要知道发生了什么并采取措施。
{
"hooks": {
"StopFailure": [
{
"command": "python .claude/hooks/alert-on-failure.py",
"timeout": 10000
}
]
}
}📝 输入数据:StopFailure的stdin JSON中包含 error字段,携带具体的错误类型和消息,可用于区分限流、认证失败等不同场景。
/compact 命令或上下文自动压缩完成后触发🎯 生活类比:就像搬家后清点物品——压缩完成后,你想知道"丢掉了多少东西、还剩多少空间"。
{
"hooks": {
"PostCompact": [
{
"command": "echo \"[$(date)] 上下文已压缩\" >> ~/.claude/compact.log",
"timeout": 5000
}
]
}
}⚠️ 注意:PostCompact 是不可阻止的Hook,压缩已经完成,你只能执行后续操作。与 PreCompact(压缩前)配合使用效果更佳。
🎯 生活类比:就像新员工入职时检查培训手册是否齐全——确保AI读到了正确且完整的指令。
{
"hooks": {
"InstructionsLoaded": [
{
"command": "python .claude/hooks/verify-instructions.py",
"timeout": 5000
}
]
}
}📝 输入数据:stdin JSON中包含已加载指令文件的路径列表,可用于检查关键指令文件是否缺失。
v2.1+ 新增:这两个Hook配合MCP Elicitation功能使用,让你能监控和管理MCP服务器与用户之间的交互输入。 🎯 生活类比: Elicitation就像客服系统弹出问卷调查——MCP服务器需要向用户询问信息;ElicitationResult就像用户填完问卷提交——你可以记录和验证填写的内容。
{
"hooks": {
"Elicitation": [
{
"command": "echo \"MCP请求输入: $(date)\" >> ~/.claude/elicitation.log",
"timeout": 5000
}
],
"ElicitationResult": [
{
"command": "python .claude/hooks/validate-elicitation.py",
"timeout": 5000
}
]
}
}v2.1+ 新增:除了传统的Shell命令Hook,现在可以直接将Hook事件POST到远程URL,无需编写本地脚本。 🎯 生活类比:之前的Hook像是"自家装的门铃"——得自己接线、自己写响铃逻辑;HTTP Hook像是"接入物业监控中心"——事件发生时自动通知远程服务,你只管接收处理。
{
"hooks": {
"PostToolUse": [
{
"type": "http",
"url": "https://your-webhook.example.com/hook",
"timeout": 5000
}
]
}
}| 特性 | Shell Hook | HTTP Hook 🆕 |
|---|---|---|
| 执行方式 | 运行本地脚本/命令 | POST JSON到远程URL |
| 需要本地脚本 | ✅ 是 | ❌ 否 |
| 跨平台一致性 | ❌ 需处理OS差异 | ✅ 任何平台行为一致 |
| 适合场景 | 本地文件操作、代码检查 | 远程通知、日志收集、CI/CD |
| 网络依赖 | ❌ 无 | ✅ 需要网络连接 |
| 配置复杂度 | 中(需写脚本) | 低(只需URL) |
⚠️ 安全提示:HTTP Hook会将Hook数据发送到外部服务,确保目标URL可信且使用HTTPS。避免在Hook数据中包含敏感信息(API密钥、密码等)。
本节目的:学习真实项目中的Hook应用 ⏱️ 预计时间:1-1.5小时
git commit前自动运行代码检查,包括:.claude/hooks/git-pre-commit-checker.py:{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/git-pre-commit-checker.py",
"timeout": 120
}
]
}
]
}
}.claude/hooks/post-article-quality.py:.claude/settings.json:{
"hooks": {
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/user-prompt-enhance.py",
"timeout": 5
}
]
}
],
"PreToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/pre-protect-production.py",
"timeout": 5
}
]
},
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/pre-block-dangerous-cmd.py",
"timeout": 5
},
{
"type": "command",
"command": "python .claude/hooks/git-pre-commit-checker.py",
"timeout": 120
}
]
}
],
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/post-auto-format.py",
"timeout": 30
},
{
"type": "command",
"command": "python .claude/hooks/post-article-quality.py",
"timeout": 10
}
]
},
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/post-auto-backup.py",
"timeout": 10
}
]
}
],
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/session-start-check.py",
"timeout": 10
}
]
}
],
"Notification": [
{
"hooks": [
{
"type": "command",
"command": "python .claude/hooks/notification-desktop.py",
"timeout": 5
}
]
}
]
}
}本节目的:快速解决Hook配置和执行问题 ⏱️ 预计时间:按需查阅
// 错误:matcher拼写错误
"matcher": "write" // X 应该是大 写W
// 正确
"matcher": "Write" // V{
"type": "command",
"command": "python .claude/hooks/slow-hook.py",
"timeout": 120 // 增加到120秒
}@echo off
chcp 65001 >nul
REM 脚本内容...// 先只保留一个Hook测试
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write",
"hooks": [
{
"type": "command",
"command": "echo 'Hook triggered!' >&2"
}
]
}
]
}
}| 对比 | Hook | CLAUDE.md |
|---|---|---|
| 执行方式 | 自动执行Shell命令 | Claude解读后决定是否遵循 |
| 可靠性 | 100%执行 | 不确定(AI可能忘记) |
| 用途 | 强制规则、自动化 | 提供上下文、建议 |
{
"matcher": "Write",
"hooks": [
{"type": "command", "command": "python hook1.py"},
{"type": "command", "command": "python hook2.py"}
]
}hookSpecificOutput.permissionDecision 字段:| 值 | 效果 |
|---|---|
"allow" | 允许执行,绕过权限系统 |
"deny" | 拒绝执行,原因会反馈给Claude |
"ask" | 暂停,询问用户决定 |
| 无输出 | 默认允许 |
decision 字段:| 旧版值 | 等同于新版 |
|---|---|
"approve" | "allow" |
"block" | "deny" |
"block" 来阻止/提供反馈,无输出则默认允许。.claude/settings.json"Write" - 精确匹配"Write|Edit" - 匹配Write或Edit".*" - 匹配所有工具(慎用)CLAUDE_PROJECT_DIR - 项目根目录的绝对路径(Claude Code启动目录)⚠️ 注意: session_id不是环境变量,而是通过stdin的JSON输入传递!
additionalContext字段.claude/ 目录加入Git版本控制:| Hook类型 | 触发时机 | 输入格式 | 输出格式 | 可阻止 | 重要 |
|---|---|---|---|---|---|
| UserPromptSubmit | 用户输入后 | JSON | 文本(注入上下文) | V | |
| PreToolUse | 工具调用前 | JSON | JSON决策 | V | ⭐ |
| PostToolUse | 工具调用后 | JSON | 无 | X | ⭐ |
| Notification | 通知发送时 | JSON | 无 | X | |
| SessionStart | 会话开始 | 无 | 无 | X | |
| SessionEnd | 会话结束 | 无 | 无 | X | |
| Stop | AI停止 | JSON | 无 | X | |
| SubagentStart 🆕 | 子代理启动 | JSON | 无 | X | |
| SubagentStop 🆕 | 子代理停止 | JSON | 无 | X | |
| PermissionRequest 🆕 | 权限请求 | JSON | JSON决策 | V | |
| PreCompact 🆕 | 上下文压缩前 | JSON | 无 | X | |
| ConfigChange 🆕 | 配置变更 | JSON | 无 | X | |
| TeammateIdle 🆕 | 队友空闲 | JSON | 无 | X | |
| WorktreeCreate | 工作树创建 | JSON | 无 | X | |
| WorktreeRemove | 工作树删除 | JSON | 无 | X | |
| StopFailure 🆕 | API异常停止 | JSON | 无 | X | |
| PostCompact 🆕 | 上下文压缩后 | JSON | 无 | X | |
| InstructionsLoaded 🆕 | 指令文件加载 | JSON | 无 | X | |
| Elicitation 🆕 | MCP请求输入 | JSON | 无 | X | |
| ElicitationResult 🆕 | MCP输入完成 | JSON | 无 | X |