EMZETT.
Войти

Claude Code Hooks

Коротко: Команды оболочки (или промпты/агенты), которые Claude Code автоматически выполняет в определённые моменты рабочего процесса — например, перед запуском инструмента, после того как Claude закончил отвечать, или когда сеанс начинается или заканчивается.

Подробнее: Хуки настраиваются в settings.json по событиям (например, Stop, PreToolUse, SessionEnd) и, при желании, с «матчером» (например, только для определённых инструментов). Важно: Stop срабатывает после каждого хода ответа, а не один раз в конце всего разговора — для «один раз за сеанс» предназначен SessionEnd.

Наш контекст: В качестве теста мы сделали хук Stop, который после каждого ответа выгружал полную стенограмму JSONL 1:1 в заметку Obsidian — но затем отказались от него, потому что вы хотели структурированные заметки по содержанию, а не сырой текст. Теперь я пишу глоссарные статьи вроде этой вживую по ходу разговора.

Подробности

Конфигурация и матчеры

Хуки настраиваются по событиям в settings.json (или в settings.local.json для локальных, не попадающих в коммит переопределений). Типичное определение выглядит так:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [{ "type": "command", "command": "echo 'Bash is being run' >> log.txt" }]
      }
    ]
  }
}

matcher отфильтровывает, для каких инструментов/событий хук вообще срабатывает — без матчера он выполняется при каждом событии этой категории. На одно событие можно зарегистрировать несколько хуков; они затем выполняются друг за другом.

Доступные типы событий

Помимо PreToolUse/PostToolUse (до и после каждого выполнения инструмента) и Stop (после каждого хода ответа), есть, среди прочего, SessionStart/SessionEnd (один раз в начале/конце сеанса), UserPromptSubmit (когда пользователь отправляет сообщение, до его обработки Claude) и PreCompact (перед сжатием контекста). Каждый тип события получает через stdin разные структурированные данные (например, для PreToolUse — имя инструмента и его входные параметры в виде JSON) — скрипт хука может прочитать эти данные и на их основе решить, реагировать ли и как.

Блокировка вызовов инструментов

Хук PreToolUse может даже заблокировать выполнение инструмента (ответив определённым кодом завершения или определённым выводом), что можно использовать, например, для собственных правил безопасности — скажем, чтобы полностью запретить определённые команды Bash независимо от собственного суждения Claude. Это важное отличие от простых инструкций в CLAUDE.md: хук — это жёсткое правило, обеспечиваемое самой обвязкой (harness), которое нельзя обойти хитрой формулировкой промпта, тогда как текстовые инструкции в принципе всегда лишь рекомендации по поведению, которым следует модель.

Команды оболочки и промпты/агенты

Помимо простых команд оболочки хуки могут запускать и более сложные промпты или специальных агентов, а не только однострочные скрипты. Это позволяет, например, сделать хук Stop, который после каждого ответа автоматически направляет агента-ревьюера на последние изменённые файлы, или хук SessionEnd, создающий сводку сеанса — значительно мощнее простого скрипта оболочки, но и с соответственно более высоким расходом ресурсов, так как добавляется ещё один вызов LLM.

Важные различия между похожими по звучанию событиями

Stop срабатывает после каждого хода ответа, а не один раз в конце всего разговора — легко упускаемая ловушка, если на самом деле нужно «один раз за сеанс». Для этой цели предназначен SessionEnd; он действительно срабатывает только когда заканчивается весь сеанс. Кто путает их, рискует получить либо хук, который излишне часто выполняется на каждом ходе ответа, либо такой, который не реагирует в настоящем конце, как задумано.

См. также: JSONL