Багодельня
Справочник Claude Code

Хуки

Хуки (hooks) в Claude Code — автоматика на события жизненного цикла: автоформат после правки, запрет на опасные команды, инъекция контекста.

Хук — это действие, которое срабатывает автоматически на событие жизненного цикла агента. Не «попроси агента», а «всегда, когда происходит X, выполняй Y». Логику исполняет сам Claude Code, а не модель, — поэтому хук срабатывает детерминированно, каждый раз.

Описываются в settings.json под ключом hooks.

События

Хук цепляется к моменту в жизни сессии. Самые ходовые:

СобытиеКогда срабатывает
SessionStartстарт сессии
UserPromptSubmitты отправил сообщение
PreToolUseперед вызовом инструмента
PostToolUseпосле вызова инструмента
Stopагент закончил ответ

Зачем

Хуки превращают «надо не забыть» в «происходит само»:

  • Автоформат. PostToolUse на правку файла → прогнать Prettier. Код всегда отформатирован.
  • Защита. PreToolUse → заблокировать опасную команду (rm -rf, git push --force) до выполнения.
  • Инъекция контекста. UserPromptSubmit → подмешать напоминание («отвечай по-русски», «не забудь про линтер»).

Многое из того, что кажется «встроенным поведением» агента, — на самом деле хуки. Например, авто-напоминания про правила или блокировки команд часто настроены именно так.

Как выглядит хук

Хук живёт в settings.json под ключом hooks. Структура: событие → matcher (на какой инструмент) → команда. Вот автоформат — после каждой правки файла прогнать по нему eslint --fix:

.claude/settings.json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs npx eslint --fix"
          }
        ]
      }
    ]
  }
}

Как работает: после Edit/Write Claude Code отдаёт хуку JSON события на stdin; jq достаёт путь изменённого файла и передаёт в eslint --fix.

Хук может не только запускать команду, но и блокировать действие — для этого на PreToolUse команда возвращает ненулевой код выхода:

.claude/settings.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.command' | grep -qE 'rm -rf|git push --force' && { echo 'Опасная команда заблокирована' >&2; exit 2; } || exit 0"
          }
        ]
      }
    ]
  }
}

Код выхода 2 на PreToolUse отменяет вызов инструмента — агент опасную команду не выполнит.

Хук vs CLAUDE.md

Важная разница: CLAUDE.md — это просьба («старайся форматировать код»), которую модель может и проигнорировать. Хук — это гарантия («код будет отформатирован»), потому что его исполняет харнесс, а не модель. Нужна надёжность — это хук.

Полный список событий, форматы и примеры — в документации по хукам.

Проверь себя

  1. 1. Что такое хук?

  2. 2. Нужно гарантированно блокировать опасные команды до выполнения. Какое событие?

  3. 3. Чем хук надёжнее правила в CLAUDE.md?

On this page