Хуки в Claude Code: 32 события и три, которые реально нужны

Влад Лямин3 мин чтенияClaude Codeхукиавтоматизациянастройка
Хуки в Claude Code: 32 события и три, которые реально нужны

В документации Claude Code перечислено 32 события, к которым можно привязать свою команду. У меня задействовано два.

Причина, по которой на них вообще стоит смотреть, простая. Инструкцию в тексте модель может потерять, а хук выполняется всегда.

Дальше — три рабочие настройки с конфигами и одна ошибка, из-за которой хуки начинают мешать.

Хук — это обычная команда в нужный момент

Магии тут нет. Ты указываешь событие и shell-команду, Claude Code запускает её сам.

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

Я этот список закрывал дважды, прежде чем разобраться.

Первый: подгрузить контекст на старте

Событие SessionStart. Срабатывает при запуске сессии, вывод команды попадает агенту в контекст.

У меня туда повешена одна строка:

{
  "hooks": {
    "SessionStart": [
      {
        "matcher": "",
        "hooks": [
          { "type": "command", "command": "code-review-graph status", "timeout": 10 }
        ]
      }
    ]
  }
}

Команда печатает состояние графа кода по проекту: сколько узлов, связей, файлов, когда обновлялся. Агент видит это до первого моего сообщения и не начинает сессию с вопроса «а что тут вообще есть».

Сюда же хорошо ложится всё, что ты диктуешь руками каждый раз: текущая ветка, статус тестов, список запущенных сервисов, дежурный урл стенда.

Второй: обновить состояние после правки

Событие PostToolUse с фильтром по инструменту. Срабатывает после того, как агент что-то сделал.

{
  "matcher": "Edit|Write|Bash",
  "hooks": [
    { "type": "command", "command": "code-review-graph update --skip-flows", "timeout": 30 }
  ]
}

Фильтр Edit|Write|Bash — это регулярное выражение по названию инструмента. После каждой правки файла граф проекта переиндексируется, и следующий поиск идёт по свежим данным, а не по вчерашним.

Тот же паттерн закрывает вещи попроще: прогнать форматтер после записи файла или пересобрать типы после правки схемы. Всё то, что забываешь сделать и вспоминаешь через полчаса, когда что-то не собирается.

Третий: не выпускать агента с недоделанной работой

Событие Stop. Срабатывает в момент, когда агент считает задачу законченной, и умеет вернуть его обратно в работу.

Это самый полезный из трёх и самый недооценённый. Проверкой может быть что угодно: прогон тестов, проверка на заглушки в коде, отсутствие эмодзи в тексте, наличие цифр в статье. Если проверка не прошла, агент не заканчивает сессию словом «готово», а идёт доделывать.

Смысл в том, что критерий приёмки перестаёт зависеть от твоей внимательности в конкретный вечер. Ты формулируешь его один раз, дальше он применяется без тебя.

Проверка на эмодзи в черновиках выглядит так:

{
  "matcher": "",
  "hooks": [
    { "type": "command", "command": "grep -rlP '[\\x{1F300}-\\x{1FAFF}]' drafts/ && exit 2 || exit 0" }
  ]
}

Код возврата 2 отправляет агента доделывать, ноль отпускает. У меня этот гейт пока не стоит, и каждый раз, когда эмодзи проскакивает в черновик, я про него вспоминаю.

Ошибка, из-за которой хуки мешают

Хук выполняется на каждое совпадение, без исключений. Ровно за это его и ставят.

Поэтому тяжёлая команда на частом событии превращает работу в ожидание. Полная пересборка проекта на PostToolUse занимает столько же, сколько сама правка, а срабатывает она после каждой.

Правило простое: на частых событиях висят только быстрые команды, а таймаут ставится явно. В примерах выше стоят десять и тридцать секунд соответственно.

Второе: хуки бывают трёх областей — общие для всех проектов, проектные и локальные. Держи в общих только то, что осмысленно в любом репозитории. Команда сборки конкретного проекта в глобальном конфиге сломает работу везде, кроме одного места.

С чего начать

Не с изучения всех тридцати двух событий. Возьми одно действие, которое ты повторяешь руками после агента, и повесь его на PostToolUse. Проверь на одной задаче, засеки, не стало ли ощутимо медленнее.

Когда это приживётся, добавляй гейт на Stop. Остальные тридцать событий подождут: у меня из них не задействовано ни одного, и работать это не мешает.

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

Гайд

Claude как рабочий инструмент

128 страниц: контекст, база знаний, каскады моделей и хуки. Два трека — для тех, кто не открывал терминал, и для тех, кому нужен готовый код

Забрать гайд →