Claude 代码现在支持 Hook 了。
Claude Code now supports Hooks

原始链接: https://docs.anthropic.com/en/docs/claude-code/hooks

Claude 代码钩子允许你通过在特定生命周期事件(例如工具使用前后、通知和停止)执行 shell 命令来自定义其行为。这些钩子提供确定性控制,确保诸如格式化、日志记录或安全检查等操作始终执行。 钩子在 JSON 设置文件(用户、项目、本地)中配置,并通过匹配器组织,这些匹配器使用字符串或正则表达式来定位特定的工具或事件。钩子通过标准输入接收 JSON 数据,并通过退出代码和标准输出/标准错误进行状态通信。退出代码 0 表示成功,而退出代码 2 表示带有 Claude 反馈的阻塞错误。通过返回 JSON 可以实现更复杂的控制,从而能够决定工具的批准、阻止或继续。 安全至关重要。钩子以你的用户权限执行,因此验证输入、引用变量、防止路径遍历以及避免敏感文件至关重要。Anthropic 对钩子的使用概不负责;部署前必须进行彻底的测试和理解。

Anthropic的Claude Code现在支持Hooks功能,这一特性因其在“上下文工程”和AI代理性能的运行时验证方面的潜力而引发了广泛关注,尤其是在企业合规和监督方面。这一实现源于一个GitHub问题提交。一位用户表达了希望Cursor也能拥有相同功能的愿望,并提到了目前使用规则的变通方法。另一位用户则希望fork项目以获得更大的控制权。有人开玩笑地担心会出现意外后果,例如每次更改都会自动将代码部署到生产环境中。另一位评论者则表达了对当前AI发展现状的普遍不满。总的来说,讨论反映了人们对新功能的兴奋之情,以及对AI工具控制和潜在风险的持续担忧。
相关文章

原文

Claude Code hooks are user-defined shell commands that execute at various points in Claude Code’s lifecycle. Hooks provide deterministic control over Claude Code’s behavior, ensuring certain actions always happen rather than relying on the LLM to choose to run them.

Example use cases include:

  • Notifications: Customize how you get notified when Claude Code is awaiting your input or permission to run something.
  • Automatic formatting: Run prettier on .ts files, gofmt on .go files, etc. after every file edit.
  • Logging: Track and count all executed commands for compliance or debugging.
  • Feedback: Provide automated feedback when Claude Code produces code that does not follow your codebase conventions.
  • Custom permissions: Block modifications to production files or sensitive directories.

By encoding these rules as hooks rather than prompting instructions, you turn suggestions into app-level code that executes every time it is expected to run.

Hooks execute shell commands with your full user permissions without confirmation. You are responsible for ensuring your hooks are safe and secure. Anthropic is not liable for any data loss or system damage resulting from hook usage. Review Security Considerations.

Quickstart

In this quickstart, you’ll add a hook that logs the shell commands that Claude Code runs.

Quickstart Prerequisite: Install jq for JSON processing in the command line.

Step 1: Open hooks configuration

Run the /hooks slash command and select the PreToolUse hook event.

PreToolUse hooks run before tool calls and can block them while providing Claude feedback on what to do differently.

Step 2: Add a matcher

Select + Add new matcher… to run your hook only on Bash tool calls.

Type Bash for the matcher.

Step 3: Add the hook

Select + Add new hook… and enter this command:

Step 4: Save your configuration

For storage location, select User settings since you’re logging to your home directory. This hook will then apply to all projects, not just your current project.

Then press Esc until you return to the REPL. Your hook is now registered!

Step 5: Verify your hook

Run /hooks again or check ~/.claude/settings.json to see your configuration:

Configuration

Claude Code hooks are configured in your settings files:

  • ~/.claude/settings.json - User settings
  • .claude/settings.json - Project settings
  • .claude/settings.local.json - Local project settings (not committed)
  • Enterprise managed policy settings

Structure

Hooks are organized by matchers, where each matcher can have multiple hooks:

  • matcher: Pattern to match tool names (only applicable for PreToolUse and PostToolUse)
    • Simple strings match exactly: Write matches only the Write tool
    • Supports regex: Edit|Write or Notebook.*
    • If omitted or empty string, hooks run for all matching events
  • hooks: Array of commands to execute when the pattern matches
    • type: Currently only "command" is supported
    • command: The bash command to execute

Hook Events

PreToolUse

Runs after Claude creates tool parameters and before processing the tool call.

Common matchers:

  • Task - Agent tasks
  • Bash - Shell commands
  • Glob - File pattern matching
  • Grep - Content search
  • Read - File reading
  • Edit, MultiEdit - File editing
  • Write - File writing
  • WebFetch, WebSearch - Web operations

PostToolUse

Runs immediately after a tool completes successfully.

Recognizes the same matcher values as PreToolUse.

Notification

Runs when Claude Code sends notifications.

Stop

Runs when Claude Code has finished responding.

Hook Input

Hooks receive JSON data via stdin containing session information and event-specific data:

PreToolUse Input

The exact schema for tool_input depends on the tool.

PostToolUse Input

The exact schema for tool_input and tool_response depends on the tool.

Notification Input

Stop Input

stop_hook_active is true when Claude Code is already continuing as a result of a stop hook. Check this value or process the transcript to prevent Claude Code from running indefinitely.

Hook Output

There are two ways for hooks to return output back to Claude Code. The output communicates whether to block and any feedback that should be shown to Claude and the user.

Simple: Exit Code

Hooks communicate status through exit codes, stdout, and stderr:

  • Exit code 0: Success. stdout is shown to the user in transcript mode (CTRL-R).
  • Exit code 2: Blocking error. stderr is fed back to Claude to process automatically. See per-hook-event behavior below.
  • Other exit codes: Non-blocking error. stderr is shown to the user and execution continues.

Exit Code 2 Behavior

Hook EventBehavior
PreToolUseBlocks the tool call, shows error to Claude
PostToolUseShows error to Claude (tool already ran)
NotificationN/A, shows stderr to user only
StopBlocks stoppage, shows error to Claude

Advanced: JSON Output

Hooks can return structured JSON in stdout for more sophisticated control:

Common JSON Fields

All hook types can include these optional fields:

If continue is false, Claude stops processing after the hooks run.

  • For PreToolUse, this is different from "decision": "block", which only blocks a specific tool call and provides automatic feedback to Claude.
  • For PostToolUse, this is different from "decision": "block", which provides automated feedback to Claude.
  • For Stop, this takes precedence over any "decision": "block" output.
  • In all cases, "continue" = false takes precedence over any "decision": "block" output.

stopReason accompanies continue with a reason shown to the user, not shown to Claude.

PreToolUse Decision Control

PreToolUse hooks can control whether a tool call proceeds.

  • “approve” bypasses the permission system. reason is shown to the user but not to Claude.
  • “block” prevents the tool call from executing. reason is shown to Claude.
  • undefined leads to the existing permission flow. reason is ignored.

PostToolUse Decision Control

PostToolUse hooks can control whether a tool call proceeds.

  • “block” automatically prompts Claude with reason.
  • undefined does nothing. reason is ignored.

Stop Decision Control

Stop hooks can control whether Claude must continue.

  • “block” prevents Claude from stopping. You must populate reason for Claude to know how to proceed.
  • undefined allows Claude to stop. reason is ignored.

JSON Output Example: Bash Command Editing

Stop Decision Control

Stop hooks can control tool execution:

Claude Code hooks work seamlessly with Model Context Protocol (MCP) tools. When MCP servers provide tools, they appear with a special naming pattern that you can match in your hooks.

MCP Tool Naming

MCP tools follow the pattern mcp__<server>__<tool>, for example:

  • mcp__memory__create_entities - Memory server’s create entities tool
  • mcp__filesystem__read_file - Filesystem server’s read file tool
  • mcp__github__search_repositories - GitHub server’s search tool

Configuring Hooks for MCP Tools

You can target specific MCP tools or entire MCP servers:

Examples

Code Formatting

Automatically format code after file modifications:

Notification

Customize the notification that is sent when Claude Code requests permission or when the prompt input has become idle.

Security Considerations

Disclaimer

USE AT YOUR OWN RISK: Claude Code hooks execute arbitrary shell commands on your system automatically. By using hooks, you acknowledge that:

  • You are solely responsible for the commands you configure
  • Hooks can modify, delete, or access any files your user account can access
  • Malicious or poorly written hooks can cause data loss or system damage
  • Anthropic provides no warranty and assumes no liability for any damages resulting from hook usage
  • You should thoroughly test hooks in a safe environment before production use

Always review and understand any hook commands before adding them to your configuration.

Security Best Practices

Here are some key practices for writing more secure hooks:

  1. Validate and sanitize inputs - Never trust input data blindly
  2. Always quote shell variables - Use "$VAR" not $VAR
  3. Block path traversal - Check for .. in file paths
  4. Use absolute paths - Specify full paths for scripts
  5. Skip sensitive files - Avoid .env, .git/, keys, etc.

Configuration Safety

Direct edits to hooks in settings files don’t take effect immediately. Claude Code:

  1. Captures a snapshot of hooks at startup
  2. Uses this snapshot throughout the session
  3. Warns if hooks are modified externally
  4. Requires review in /hooks menu for changes to apply

This prevents malicious hook modifications from affecting your current session.

Hook Execution Details

  • Timeout: 60-second execution limit
  • Parallelization: All matching hooks run in parallel
  • Environment: Runs in current directory with Claude Code’s environment
  • Input: JSON via stdin
  • Output:
    • PreToolUse/PostToolUse/Stop: Progress shown in transcript (Ctrl-R)
    • Notification: Logged to debug only (--debug)

Debugging

To troubleshoot hooks:

  1. Check if /hooks menu displays your configuration
  2. Verify that your settings files are valid JSON
  3. Test commands manually
  4. Check exit codes
  5. Review stdout and stderr format expectations
  6. Ensure proper quote escaping

Progress messages appear in transcript mode (Ctrl-R) showing:

  • Which hook is running
  • Command being executed
  • Success/failure status
  • Output or error messages
联系我们 contact @ memedata.com