用途:在 Claude Code 生命周期的特定节点自动运行 shell 命令、LLM 提示或子代理,提供确定性控制,确保某些操作总是发生,而不依赖 LLM 自主选择。适用于强制执行项目规则、自动化重复任务、集成现有工具。
主要能力:三种钩子处理器。命令钩子(type: "command")运行 shell 命令,从 stdin 接收 JSON,通过退出码与 stdout 通信;提示钩子(type: "prompt")向 Claude 模型发送单轮是/否评估;代理钩子(type: "agent")生成可使用 Read、Grep、Glob 等工具的子代理进行多轮验证。共 14 个钩子事件,包括 SessionStart、UserPromptSubmit、PreToolUse、PermissionRequest、PostToolUse、PostToolUseFailure、Notification、SubagentStart、SubagentStop、Stop、TeammateIdle、TaskCompleted、PreCompact、SessionEnd,其中部分事件可阻止操作。
使用方式:在 JSON 设置文件或 skill/agent YAML frontmatter 中定义,分三个层级——选择钩子事件、添加匹配器组(正则过滤)、定义一个或多个钩子处理器。配置位置包括 ~/.claude/settings.json、.claude/settings.json、.claude/settings.local.json、托管策略设置、插件 hooks/hooks.json 及组件 frontmatter。命令钩子通过 exit 0(成功)、exit 2(阻止性错误,stderr 反馈)、其他码(非阻止错误)通信,exit 0 时可输出 JSON 进行结构化控制。命令钩子支持 "async": true 后台执行(不能阻止或返回决策)。示例可用 PreToolUse 匹配 Bash 阻止 rm -rf。
限制与注意:钩子以完整用户权限执行;需验证和清理输入,始终引用 shell 变量("$VAR"),阻止路径穿越(检查 ..),脚本用绝对路径("$CLAUDE_PROJECT_DIR"),避免处理 .env、.git/、密钥等敏感文件。静态上下文注入应改用 CLAUDE.md;一次性指令直接用提示;复杂多步判断考虑 skills 或子代理。调试可用 claude --debug、Ctrl+O 或 /hooks 菜单。