Anthropic Academy Courses My Profile Sign Out

Хуки

Хуки позволяют запускать команды в определённых точках жизненного цикла Claude Code. Ключевое отличие хуков от всего остального, что рассматривается в этом курсе, заключается в том, что хуки детерминированы — они всегда выполняются.

Зачем использовать хуки

Вы можете указать Claude в вашем CLAUDE.md запускать Prettier после каждого редактирования файла. В большинстве случаев это будет работать. Но иногда — нет. Хук гарантирует, что это произойдёт каждый раз, без исключений.

Типичные варианты использования:

  • Автоматическое форматирование после редактирования файлов
  • Логирование всех выполненных команд для соответствия требованиям
  • Блокировка опасных операций, таких как изменение файлов в продакшене
  • Отправка уведомлений себе, когда Claude завершает задачу

Как они работают

Хуки настраиваются в вашем settings.json. Вы выбираете событие, при необходимости задаёте матчер для инструментов, к которым оно применяется, и предоставляете команду для запуска. Доступные события:

  • PreToolUse — запускается перед вызовом инструмента
  • PostToolUse — запускается после завершения вызова инструмента
  • UserPromptSubmit — запускается при отправке вами запроса, до обработки его Claude
  • Stop — запускается, когда Claude завершает ответ
  • Notification — запускается, когда Claude отправляет уведомление

Вы настраиваете их через команду /hooks внутри Claude Code или напрямую редактируя settings.json.

Практический пример

Самый распространённый хук: автоматическое форматирование после редактирования. Настройте хук PostToolUse с матчером "Edit|MultiEdit|Write", чтобы он срабатывал каждый раз, когда Claude изменяет файл. Команда проверяет расширение файла и запускает соответствующий форматировщик — Prettier для TypeScript, gofmt для Go или любой другой, используемый в вашем проекте.

Блокировка с помощью PreToolUse

Хуки PreToolUse могут блокировать вызовы инструментов до их выполнения. Ваш хук получает имя инструмента и входные данные в формате JSON через stdin. Код завершения определяет поведение:

  • Код завершения 0 — продолжить нормально.
  • Код завершения 2 — заблокировать действие. Сообщение об ошибке в stderr передаётся обратно в Claude как обратная связь, чтобы он знал, почему был заблокирован, и мог скорректировать действия.
  • Любой другой код завершения — ненавязчивая ошибка, которая отображается вам, но ничего не останавливает.

Именно так обеспечиваются жёсткие правила. Блокировка записи в каталог продакшен-конфигурации. Блокировка команд bash, содержащих rm -rf. Блокировка коммитов в main. Всё, что нужно вашей команде гарантировать, а не просто предлагать.

Обмен хуками с командой

Хуки, настроенные в .claude/settings.json, являются проектными и могут быть зафиксированы в репозитории. Это означает, что вся ваша команда автоматически получит те же хуки. Используйте переменную окружения CLAUDE_PROJECT_DIR в своих командах, чтобы ссылаться на скрипты, хранящиеся в проекте, — они будут работать независимо от текущего рабочего каталога Claude.

Итоги

Хуки дают вам детерминированный контроль над поведением Claude Code. Используйте PostToolUse для автоматического форматирования и логирования. Используйте PreToolUse для блокировки опасных операций. Настраивайте их с помощью /hooks или в settings.json. И фиксируйте их в репозитории, чтобы их получили и ваши коллеги.

Если что-то должно происходить каждый раз без исключений, не прописывайте это в запросе. Используйте хук.

Hooks let you run commands at specific points in Claude Code's lifecycle. The key difference between hooks and everything else covered in this course is that hooks are deterministic — they always run.

Why Use Hooks

You can tell Claude in your CLAUDE.md to run Prettier after every file edit. Most of the time it will. But sometimes it won't. A hook makes it happen every single time, no exceptions.

Common use cases include:

  • Auto-formatting after file edits
  • Logging all executed commands for compliance
  • Blocking dangerous operations like modifying production files
  • Sending yourself notifications when Claude finishes a task

How They Work

Hooks are configured in your settings.json. You pick an event, optionally set a matcher for which tools it applies to, and provide a command to run. The available events are:

  • PreToolUse — runs before a tool call
  • PostToolUse — runs after a tool call completes
  • UserPromptSubmit — runs when you submit a prompt, before Claude processes it
  • Stop — runs when Claude finishes responding
  • Notification — runs when Claude sends a notification

You configure them through the /hooks command inside Claude Code, or by editing settings.json directly.

The settings.json file inside the .claude directory with hooks configuration

A Practical Example

The most common hook: auto-formatting after edits. Set a PostToolUse hook with a matcher of "Edit|MultiEdit|Write" so it fires whenever Claude modifies a file. The command checks the file extension and runs the appropriate formatter — Prettier for TypeScript, gofmt for Go, whatever your project uses.

Blocking with PreToolUse

PreToolUse hooks can block tool calls before they execute. Your hook receives the tool name and input as JSON on stdin. The exit code determines the behavior:

  • Exit code 0 — proceed normally.
  • Exit code 2 — block the action. The stderr message gets fed back to Claude as feedback so it knows why it was blocked and can adjust.
  • Any other exit code — a non-blocking error that gets shown to you but doesn't stop anything.

This is how you enforce hard rules. Block writes to a production config directory. Block bash commands that contain rm -rf. Block commits to main. Whatever your team needs to be guaranteed, not suggested.

A settings.json file showing PreToolUse and PostToolUse hooks with matchers and commands

Sharing Hooks with Your Team

Hooks configured in .claude/settings.json are project-level and can be checked into your repo. This means your entire team gets the same hooks automatically. Use the CLAUDE_PROJECT_DIR environment variable in your commands to reference scripts stored in your project, so they work regardless of Claude's current working directory.

Recap

Hooks give you deterministic control over Claude Code's behavior. Use PostToolUse for auto-formatting and logging. Use PreToolUse to block dangerous operations. Configure them with /hooks or in settings.json. And check them into your repo so your team gets them too.

If something needs to happen every time without fail, don't put it in a prompt. Put it in a hook.