Глубокое погружение

Claude Code Hooks: автоматизируйте и защитите работу с ИИ

Hooks — это детерминированный слой Claude Code: команды, которые форматируют код после каждой правки, пишут логи и блокируют опасные операции до их выполнения. Вся настройка — шаг за шагом, со скриншотами.

Claude Code hooks block in project settings.json wiring the PreToolUse event to a Bash matcher that runs block-dangerous-commands.sh from the .claude directory
Блок hooks в .claude/settings.json проекта: событие, матчер и команда, которую нужно выполнить.

Иллюстрированный разбор из 12 шагов — примерно 4 минут чтения. Каждый шаг ссылается на точный момент исходного видео.

TL;DR

Hooks — это команды, которые Claude Code автоматически выполняет в заданные точки своего жизненного цикла. В отличие от инструкций в CLAUDE.md, которым модель следует лишь в большинстве случаев, hooks детерминированы: если совпали событие и матчер, команда выполнится всегда. Hook состоит из события (например, PostToolUse), необязательного матчера (например, Edit|Write) и команды. Храните hooks в .claude/settings.json, чтобы делиться ими с командой, обращайтесь к скриптам через $CLAUDE_PROJECT_DIR, чтобы пути не зависели от рабочей директории, а выход с кодом 2 из PreToolUse-хука блокирует вызов инструмента и возвращает Claude причину.

Исходное видео

Страница следует официальному видео Claude о hooks и пошагово воспроизводит его настройку. Каждый скриншот ссылается на точный момент, где он появляется.

Скриншоты — кадры из видео с указанием автора; текст написан нами. Шаги сверены с видео в сентябре 2026 года.

Как устроен hook

Один JSON-блок: событие, матчер и команда, которая выполнится всегда.

  1. 1

    Начнём с проблемы: инструкции в промпте ненадёжны

    Можно попросить Claude в CLAUDE.md запускать eslint после каждой правки — и в большинстве случаев он это сделает. Но «большинство случаев» — это именно та проблема, когда пропущенный запуск ломает файл. Hooks созданы для всего, что должно происходить каждый раз.

    CLAUDE.md file open in VS Code showing a new IMPORTANT section that asks Claude to run eslint after every tool call, the prompt-based alternative to hooks
    Правило из CLAUDE.md, которое модель может тихо пропустить.Смотреть с 0:30
  2. 2

    Анатомия hook: событие, матчер, команда

    Hooks живут в блоке hooks файла settings.json. Выбираете событие (здесь PreToolUse), необязательный матчер, сужающий набор инструментов (здесь Bash), и команду для выполнения. Каждый подходящий вызов запускает hook без исключений.

    Claude Code hooks configuration in .claude/settings.json mapping the PreToolUse event with a Bash matcher to the block-dangerous-commands.sh script
    PreToolUse + матчер Bash + block-dangerous-commands.sh.Смотреть с 0:14
  3. 3

    Один файл — две автоматизации

    Готовую настройку читают сверху вниз: после вызова инструмента правки auto-format.sh приводит код в порядок, после каждого вызова Bash log-commands.sh дописывает команду в журнал. Оба — обычные скрипты проекта, лежащие в .claude/hooks.

    VS Code view of a finished hooks setup where PostToolUse edits trigger auto-format.sh and every Bash command is logged by log-commands.sh
    Два PostToolUse-хука — форматирование и лог — рядом.Смотреть с 0:36

Автоматизируйте рутину

Форматирование после каждой правки и лог каждой команды — без напоминаний.

  1. 4

    Добавьте матчер для правок файлов

    Чтобы форматировать после правок, добавьте PostToolUse-запись с матчером на инструменты Edit, MultiEdit и Write. Ниже уже готов логирующий hook для Bash.

    Typing a new PostToolUse hook matcher for Edit tools in Claude Code settings.json while a completed async Bash logging hook sits below it
    Ввод матчера Edit; под ним логгер Bash.Смотреть с 1:30
  2. 5

    Направьте команду на скрипт проекта

    Поле command выполняет любую shell-команду. Автодополнение VS Code подставляет путь к .claude/hooks по мере ввода — намёк, что скрипты hooks лучше держать в отдельной папке.

    Folder autocomplete dropdown appearing in VS Code while entering the .claude/hooks path for a PostToolUse matcher covering Edit MultiEdit and Write
    Автодополнение вводит путь к .claude/hooks.Смотреть с 1:38
  3. 6

    Задайте таймаут, чтобы hook не завис сессию

    Готовая запись направляет Edit, MultiEdit и Write на .claude/hooks/auto-format.sh с таймаутом 20 секунд. Скрипт смотрит расширение файла и запускает prettier, go fmt, ruff или другой форматтер проекта.

    Completed PostToolUse hook entry in settings.json pointing Edit MultiEdit and Write tools at .claude/hooks/auto-format.sh with a 20 second timeout
    auto-format.sh обрабатывает каждую правку с таймаутом 20 с.Смотреть с 1:39
  4. 7

    Смотрите на работающий Stop-hook вживую

    Hooks срабатывают и на событиях жизненного цикла вне вызовов инструментов. Здесь строка статуса терминала показывает Stop-hook, выполняющийся перед концом сессии, с таймером и счётчиком токенов. Событие Notification срабатывает так же, когда Claude ждёт вашего ввода.

    Claude Code terminal status line reading running stop hook with a 37 second timer and 433 tokens, showing a Stop hook executing before the session ends
    Строка статуса с надписью «running stop hook» и таймером.Смотреть с 0:08

Блокируйте опасные операции

PreToolUse-хуки отклоняют деструктивные команды до их исполнения.

  1. 8

    PreToolUse-hook с правом вето на опасные команды

    Скрипт блокировки читает вход инструмента как JSON через jq, ищет в команде деструктивные rm-паттерны и force push, пишет причину в stderr и завершается с кодом 2. Claude видит причину и может скорректироваться вместо исполнения.

    Bash script for a Claude Code PreToolUse hook that parses the tool command with jq and exits with code 2 to block destructive rm commands and force pushes
    Код выхода 2 блокирует вызов; stderr становится обратной связью для Claude.Смотреть с 1:54
  2. 9

    Отказ через структурированное JSON-решение

    Когда нужна более жёсткая гарантия, hook может ответить hookSpecificOutput — JSON-полезной нагрузкой, отклоняющей вызов PreToolUse. Этот hook блокирует DROP TABLE и предлагает миграцию — продакшен остаётся нетронутым.

    Claude Code blocking script that answers DROP TABLE statements with a jq-built hookSpecificOutput JSON decision denying the PreToolUse tool call
    Решение об отказе, собранное jq, направляет Claude к миграции.Смотреть с 2:16

Делитесь hooks с командой

Проектные настройки и меню /hooks держат всех на одних и тех же предохранителях.

  1. 10

    Храните hooks в проекте, а не на машине

    Hooks в .claude/settings.json действуют на уровне проекта: закоммитьте файл, и вся команда получит те же предохранители в следующей сессии. Скрипты лежат рядом, в .claude/hooks.

    VS Code explorer with the .claude folder expanded revealing a hooks directory and a modified settings.json ready to be committed for the whole team
    Папка .claude с hooks и settings.json, готовая к коммиту.Смотреть с 2:30
  2. 11

    Используйте $CLAUDE_PROJECT_DIR в каждом пути

    Рабочая директория Claude может смениться посреди сессии, и относительные пути сломаются. Переменная $CLAUDE_PROJECT_DIR всегда указывает на корень проекта, поэтому пути до скриптов hooks остаются рабочими, из какой бы директории Claude ни запускался.

    Claude Code settings.json command field highlighting the $CLAUDE_PROJECT_DIR variable so hook scripts resolve relative to the project root
    Переменная project-dir закрепляет путь команды.Смотреть с 2:38
  3. 12

    Проверяйте hooks через меню /hooks

    Команда /hooks в Claude Code показывает список всех настроенных hooks, их события и условия срабатывания. Меню доступно только для чтения — чтобы добавить или изменить hooks, редактируйте settings.json или попросите Claude.

    Claude Code slash hooks menu listing five configured hooks across PreToolUse PostToolUse Notification and UserPromptSubmit with their firing conditions
    Меню /hooks показывает пять настроенных hooks.Смотреть с 2:54

Частые вопросы