Часть II · Контекст и конфигурация · Глава 05
05

Хуки: события сессии

Хуки — это твой код, который харнесс запускает в точках жизненного цикла. В отличие от инструкций в промпте, хук нельзя проигнорировать: он выполняется, даже если модель «не хочет». Это и делает поведение детерминированным.

~14 минут источник: .claude/hooks/HOOKS-README · settings · tips Claude Code v2.1.179
§1 · Что это

Детерминизм, который промпту недоступен

Из Главы 00 мы помним: промпт советует, а хук исполняет. Хук — это команда (или запрос к модели, или HTTP-вызов), которую харнесс запускает на конкретном событии: перед вызовом инструмента, после него, при старте сессии, перед компактом. Некоторые события хук может заблокировать. Всего событий тридцать, но в работе живёт горстка.

§2 · События

Какие стоит знать

Высокочастотные события (из 30) · matcher фильтрует, что триггерит
СобытиеКогдаБлокирует?
PreToolUseперед вызовом инструмента (matcher по tool_name)да
PostToolUseпосле успешного вызованет
UserPromptSubmitкогда ты отправил промпт, до обработкида
Stopкогда Claude закончил отвечатьда
SessionStartстарт/возобновление (matcher по source)нет
PreCompactперед компактом контекстада
SubagentStopкогда субагент завершилсяда

Matcher сужает срабатывание: "matcher": "Bash" ловит только bash, "matcher": "Write|Edit" — правки файлов, mcp__memory__.* — инструменты MCP-сервера. Хуки без поддержки matcher (Stop, UserPromptSubmit) срабатывают всегда.

§3 · Типы обработчиков

Четыре способа отреагировать

Типы хуков
ТипЧто делаетКогда брать
commandзапускает шелл-команду, общается через exit-коды и stdoutДетерминированные правила: формат, линт, звук.
promptодин заход к модели, возвращает yes/no решениеНужна оценка, а не жёсткое правило.
agentспавнит субагента с Read/Grep/Glob для проверкиПроверка требует заглянуть в файлы/тесты.
httpPOST JSON на URL, получает JSONИнтеграция с внешним сервисом/вебхуком.

Полезные опции на любом хуке: async: true (не блокировать выполнение — для звуков и логов), once: true (раз за сессию), timeout, statusMessage (текст в спиннере) и if (условие в синтаксисе разрешений, чтобы не плодить процессы).

§4 · Примеры

Три, которые ставят сразу

Автоформат после правок (Boris)

.claude/settings.jsonPostToolUse
"PostToolUse": [{
  "matcher": "Write|Edit",
  "hooks": [{ "type": "command", "command": "bun run format || true" }]
}]
Claude обычно пишет аккуратный код; хук закрывает последние 10%, чтобы не словить ошибку формата в CI. Цитата Бориса: это и есть смысл PostToolUse.

Защитные блокировки по требованию (Thariq)

Скилл может включать хуки, которые живут только пока он активен. Так делают опасные-но-иногда-нужные правила: /careful блокирует rm -rf, DROP TABLE, force-push через PreToolUse на Bash; /freeze запрещает любые правки вне нужной папки. Включил скилл — правило действует; вышел — снято.

Блокировка: как правильно

Старые поля decision/reason в PreToolUse устарели. Сейчас: hookSpecificOutput.permissionDecision со значениями allow / deny / ask. Любой хук может вернуть {"continue": false}, чтобы остановить Claude совсем.

§5 · Управление

Где живут и как гасить

Шпаргалка главы

Пять тезисов на вынос

  1. Хук исполняется, промпт советует. Это детерминизм на уровне харнесса, недоступный формулировке.
  2. 30 событий, знать ~7: PreToolUse (блок), PostToolUse, UserPromptSubmit, Stop, SessionStart, PreCompact, SubagentStop. Matcher сужает.
  3. Четыре типа: command (правила), prompt (оценка), agent (проверка по файлам), http (интеграция).
  4. Опции: async для побочек, once, if для условий, statusMessage для спиннера.
  5. Блокировка через permissionDecision; /hooks для управления, disableAllHooks для аварийного выключения.