Для краткого руководства с примерами см. Начало работы с Claude Code hooks.
Конфигурация
Hooks Claude Code настраиваются в ваших файлах настроек:~/.claude/settings.json- Пользовательские настройки.claude/settings.json- Настройки проекта.claude/settings.local.json- Локальные настройки проекта (не коммитятся)- Параметры политики, управляемые предприятием
Структура
Hooks организованы по матчерам, где каждый матчер может иметь несколько hooks:- matcher: Шаблон для сопоставления имён инструментов, чувствителен к регистру (применяется только для
PreToolUseиPostToolUse)- Простые строки совпадают точно:
Writeсовпадает только с инструментом Write - Поддерживает regex:
Edit|WriteилиNotebook.* - Используйте
*для сопоставления всех инструментов. Вы также можете использовать пустую строку ("") или оставитьmatcherпустым.
- Простые строки совпадают точно:
- hooks: Массив hooks для выполнения при совпадении шаблона
type: Тип выполнения hook -"command"для bash команд или"prompt"для оценки на основе LLMcommand: (Дляtype: "command") Bash команда для выполнения (может использовать переменную окружения$CLAUDE_PROJECT_DIR)prompt: (Дляtype: "prompt") Промпт для отправки LLM для оценкиtimeout: (Опционально) Как долго hook должен работать в секундах перед отменой этого конкретного hook
UserPromptSubmit, Notification, Stop и SubagentStop
которые не используют матчеры, вы можете опустить поле matcher:
Скрипты Hook для конкретного проекта
Вы можете использовать переменную окруженияCLAUDE_PROJECT_DIR (доступна только когда
Claude Code запускает команду hook) для ссылки на скрипты, хранящиеся в вашем проекте,
обеспечивая их работу независимо от текущей директории Claude:
Hooks плагинов
Плагины могут предоставлять hooks, которые беспрепятственно интегрируются с вашими пользовательскими и проектными hooks. Hooks плагинов автоматически объединяются с вашей конфигурацией при включении плагинов. Как работают hooks плагинов:- Hooks плагинов определены в файле
hooks/hooks.jsonплагина или в файле, указанном пользовательским путём к полюhooks. - Когда плагин включен, его hooks объединяются с пользовательскими и проектными hooks
- Несколько hooks из разных источников могут реагировать на одно и то же событие
- Hooks плагинов используют переменную окружения
${CLAUDE_PLUGIN_ROOT}для ссылки на файлы плагина
Hooks плагинов используют тот же формат, что и обычные hooks с опциональным полем
description для объяснения назначения hook.Hooks плагинов работают вместе с вашими пользовательскими hooks. Если несколько hooks совпадают с событием, они все выполняются параллельно.
${CLAUDE_PLUGIN_ROOT}: Абсолютный путь к директории плагина${CLAUDE_PROJECT_DIR}: Корневая директория проекта (то же самое, что и для проектных hooks)- Все стандартные переменные окружения доступны
Hooks на основе промптов
В дополнение к bash command hooks (type: "command"), Claude Code поддерживает hooks на основе промптов (type: "prompt"), которые используют LLM для оценки того, разрешить или заблокировать действие. Hooks на основе промптов в настоящее время поддерживаются только для Stop и SubagentStop hooks, где они позволяют принимать интеллектуальные, контекстно-зависимые решения.
Как работают hooks на основе промптов
Вместо выполнения bash команды, hooks на основе промптов:- Отправляют входные данные hook и ваш промпт быстрому LLM (Haiku)
- LLM отвечает структурированным JSON с решением
- Claude Code автоматически обрабатывает решение
Конфигурация
type: Должно быть"prompt"prompt: Текст промпта для отправки LLM- Используйте
$ARGUMENTSкак заполнитель для входного JSON hook - Если
$ARGUMENTSотсутствует, входной JSON добавляется к промпту
- Используйте
timeout: (Опционально) Timeout в секундах (по умолчанию: 30 секунд)
Схема ответа
LLM должен ответить JSON, содержащим:decision:"approve"разрешает действие,"block"предотвращает егоreason: Объяснение, показываемое Claude при решении"block"continue: (Опционально) Еслиfalse, полностью останавливает выполнение ClaudestopReason: (Опционально) Сообщение, показываемое приcontinueравном falsesystemMessage: (Опционально) Дополнительное сообщение, показываемое пользователю
Поддерживаемые события hook
Hooks на основе промптов работают с любым событием hook, но наиболее полезны для:- Stop: Интеллектуально решить, должен ли Claude продолжать работу
- SubagentStop: Оценить, завершил ли subagent свою задачу
- UserPromptSubmit: Валидировать пользовательские промпты с помощью LLM
- PreToolUse: Принимать контекстно-зависимые решения о разрешениях
Пример: Интеллектуальный Stop hook
Пример: SubagentStop с пользовательской логикой
Сравнение с bash command hooks
| Функция | Bash Command Hooks | Hooks на основе промптов |
|---|---|---|
| Выполнение | Запускает bash скрипт | Запрашивает LLM |
| Логика решения | Вы реализуете в коде | LLM оценивает контекст |
| Сложность настройки | Требует файл скрипта | Просто настройте промпт |
| Осведомлённость о контексте | Ограничена логикой скрипта | Понимание естественного языка |
| Производительность | Быстро (локальное выполнение) | Медленнее (вызов API) |
| Случай использования | Детерминированные правила | Контекстно-зависимые решения |
Лучшие практики
- Будьте конкретны в промптах: Ясно укажите, что вы хотите, чтобы LLM оценил
- Включите критерии решения: Перечислите факторы, которые LLM должен рассмотреть
- Тестируйте ваши промпты: Проверьте, что LLM принимает правильные решения для ваших случаев использования
- Установите подходящие timeouts: По умолчанию 30 секунд, отрегулируйте при необходимости
- Используйте для сложных решений: Bash hooks лучше для простых, детерминированных правил
События Hook
PreToolUse
Запускается после того, как Claude создаёт параметры инструмента и перед обработкой вызова инструмента. Общие матчеры:Task- Задачи subagent (см. документацию subagents)Bash- Команды оболочкиGlob- Сопоставление шаблонов файловGrep- Поиск содержимогоRead- Чтение файловEdit- Редактирование файловWrite- Запись файловWebFetch,WebSearch- Веб-операции
PostToolUse
Запускается сразу после успешного завершения инструмента. Распознаёт те же значения матчеров, что и PreToolUse.Notification
Запускается, когда Claude Code отправляет уведомления. Уведомления отправляются, когда:- Claude нуждается в вашем разрешении для использования инструмента. Пример: “Claude needs your permission to use Bash”
- Входной промпт был неактивен в течение как минимум 60 секунд. “Claude is waiting for your input”
UserPromptSubmit
Запускается, когда пользователь отправляет промпт, перед обработкой Claude. Это позволяет вам добавить дополнительный контекст на основе промпта/разговора, валидировать промпты или заблокировать определённые типы промптов.Stop
Запускается, когда основной агент Claude Code завершил ответ. Не запускается, если остановка произошла из-за прерывания пользователем.SubagentStop
Запускается, когда subagent Claude Code (вызов инструмента Task) завершил ответ.PreCompact
Запускается перед тем, как Claude Code собирается выполнить операцию компактирования. Матчеры:manual- Вызвано из/compactauto- Вызвано из auto-compact (из-за полного окна контекста)
SessionStart
Запускается, когда Claude Code запускает новую сессию или возобновляет существующую сессию (которая в настоящее время запускает новую сессию под капотом). Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе, установка зависимостей или настройка переменных окружения. Матчеры:startup- Вызвано при запускеresume- Вызвано из--resume,--continueили/resumeclear- Вызвано из/clearcompact- Вызвано из auto или manual compact.
Сохранение переменных окружения
SessionStart hooks имеют доступ к переменной окруженияCLAUDE_ENV_FILE, которая предоставляет путь к файлу, где вы можете сохранить переменные окружения для последующих bash команд.
Пример: Установка отдельных переменных окружения
nvm use), захватите и сохраните все изменения, сравнив окружение:
CLAUDE_ENV_FILE доступна только для SessionStart hooks. Другие типы hooks не имеют доступа к этой переменной.SessionEnd
Запускается, когда сессия Claude Code заканчивается. Полезно для задач очистки, логирования статистики сессии или сохранения состояния сессии. Полеreason во входных данных hook будет одним из:
clear- Сессия очищена командой /clearlogout- Пользователь вышелprompt_input_exit- Пользователь вышел, пока был виден входной промптother- Другие причины выхода
Входные данные Hook
Hooks получают JSON данные через stdin, содержащие информацию о сессии и данные, специфичные для события:Входные данные PreToolUse
Точная схема дляtool_input зависит от инструмента.
Входные данные PostToolUse
Точная схема дляtool_input и tool_response зависит от инструмента.
Входные данные Notification
Входные данные UserPromptSubmit
Входные данные Stop и SubagentStop
stop_hook_active имеет значение true, когда Claude Code уже продолжает работу в результате
stop hook. Проверьте это значение или обработайте транскрипт, чтобы предотвратить Claude Code
от бесконечного выполнения.
Входные данные PreCompact
Дляmanual, custom_instructions поступает из того, что пользователь передаёт в
/compact. Для auto, custom_instructions пуста.
Входные данные SessionStart
Входные данные SessionEnd
Выходные данные Hook
Есть два способа для hooks возвращать выходные данные обратно в Claude Code. Выходные данные сообщают, нужно ли блокировать и любую обратную связь, которая должна быть показана Claude и пользователю.Простой: Код выхода
Hooks сообщают статус через коды выхода, stdout и stderr:- Код выхода 0: Успех.
stdoutпоказывается пользователю в режиме транскрипта (CTRL-R), за исключениемUserPromptSubmitиSessionStart, где stdout добавляется в контекст. - Код выхода 2: Ошибка блокирования.
stderrпередаётся Claude для автоматической обработки. См. поведение для каждого события hook ниже. - Другие коды выхода: Ошибка без блокирования.
stderrпоказывается пользователю и выполнение продолжается.
Напоминание: Claude Code не видит stdout, если код выхода равен 0, за исключением
hook
UserPromptSubmit, где stdout внедряется как контекст.Поведение кода выхода 2
| Событие Hook | Поведение |
|---|---|
PreToolUse | Блокирует вызов инструмента, показывает stderr Claude |
PostToolUse | Показывает stderr Claude (инструмент уже запущен) |
Notification | N/A, показывает stderr только пользователю |
UserPromptSubmit | Блокирует обработку промпта, стирает промпт, показывает stderr только пользователю |
Stop | Блокирует остановку, показывает stderr Claude |
SubagentStop | Блокирует остановку, показывает stderr subagent Claude |
PreCompact | N/A, показывает stderr только пользователю |
SessionStart | N/A, показывает stderr только пользователю |
SessionEnd | N/A, показывает stderr только пользователю |
Продвинутый: JSON выходные данные
Hooks могут возвращать структурированный JSON вstdout для более сложного управления:
Общие поля JSON
Все типы hooks могут включать эти опциональные поля:continue равен false, Claude останавливает обработку после выполнения hooks.
- Для
PreToolUse, это отличается от"permissionDecision": "deny", который только блокирует конкретный вызов инструмента и предоставляет автоматическую обратную связь Claude. - Для
PostToolUse, это отличается от"decision": "block", который предоставляет автоматическую обратную связь Claude. - Для
UserPromptSubmit, это предотвращает обработку промпта. - Для
StopиSubagentStop, это имеет приоритет над любым выходом"decision": "block". - Во всех случаях
"continue" = falseимеет приоритет над любым выходом"decision": "block".
stopReason сопровождает continue с причиной, показываемой пользователю, не показываемой
Claude.
Управление решением PreToolUse
Hooks PreToolUse могут управлять тем, продолжится ли вызов инструмента.
"allow"обходит систему разрешений.permissionDecisionReasonпоказывается пользователю, но не Claude."deny"предотвращает выполнение вызова инструмента.permissionDecisionReasonпоказывается Claude."ask"просит пользователя подтвердить вызов инструмента в UI.permissionDecisionReasonпоказывается пользователю, но не Claude.
updatedInput:
updatedInputпозволяет вам изменять параметры входных данных инструмента перед выполнением инструмента. Это объектRecord<string, unknown>, содержащий поля, которые вы хотите изменить или добавить.- Это наиболее полезно с
"permissionDecision": "allow"для изменения и одобрения вызовов инструментов.
Поля
decision и reason устарели для hooks PreToolUse.
Используйте hookSpecificOutput.permissionDecision и
hookSpecificOutput.permissionDecisionReason вместо этого. Устаревшие поля
"approve" и "block" соответствуют "allow" и "deny" соответственно.Управление решением PostToolUse
Hooks PostToolUse могут предоставлять обратную связь Claude после выполнения инструмента.
"block"автоматически запрашивает Claude сreason.undefinedничего не делает.reasonигнорируется."hookSpecificOutput.additionalContext"добавляет контекст для Claude для рассмотрения.
Управление решением UserPromptSubmit
Hooks UserPromptSubmit могут управлять тем, обрабатывается ли пользовательский промпт.
"block"предотвращает обработку промпта. Отправленный промпт стирается из контекста."reason"показывается пользователю, но не добавляется в контекст.undefinedпозволяет промпту продолжаться нормально."reason"игнорируется."hookSpecificOutput.additionalContext"добавляет строку в контекст, если не заблокирована.
Управление решением Stop/SubagentStop
Hooks Stop и SubagentStop могут управлять тем, должен ли Claude продолжить.
"block"предотвращает остановку Claude. Вы должны заполнитьreason, чтобы Claude знал, как действовать дальше.undefinedпозволяет Claude остановиться.reasonигнорируется.
Управление решением SessionStart
Hooks SessionStart позволяют вам загружать контекст в начале сессии.
"hookSpecificOutput.additionalContext"добавляет строку в контекст.- Значения
additionalContextиз нескольких hooks объединяются.
Управление решением SessionEnd
Hooks SessionEnd запускаются, когда сессия заканчивается. Они не могут блокировать завершение сессии
но могут выполнять задачи очистки.
Пример кода выхода: Валидация Bash команды
Пример JSON выходных данных: UserPromptSubmit для добавления контекста и валидации
Для hooks
UserPromptSubmit, вы можете внедрить контекст, используя любой метод:- Код выхода 0 с stdout: Claude видит контекст (специальный случай для
UserPromptSubmit) - JSON выходные данные: Предоставляет больше контроля над поведением
Пример JSON выходных данных: PreToolUse с одобрением
Работа с MCP инструментами
Hooks Claude Code работают беспрепятственно с инструментами Model Context Protocol (MCP). Когда MCP серверы предоставляют инструменты, они появляются со специальным шаблоном имён, который вы можете сопоставить в ваших hooks.Именование MCP инструментов
MCP инструменты следуют шаблонуmcp__<server>__<tool>, например:
mcp__memory__create_entities- Инструмент create entities сервера Memorymcp__filesystem__read_file- Инструмент read file сервера Filesystemmcp__github__search_repositories- Инструмент search сервера GitHub
Конфигурирование Hooks для MCP инструментов
Вы можете нацеливаться на конкретные MCP инструменты или целые MCP серверы:Примеры
Для практических примеров, включая форматирование кода, уведомления и защиту файлов, см. Больше примеров в руководстве по началу работы.
Соображения безопасности
Отказ от ответственности
ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК: Hooks Claude Code выполняют произвольные shell команды на вашей системе автоматически. Используя hooks, вы признаёте, что:- Вы несёте исключительную ответственность за команды, которые вы настраиваете
- Hooks могут изменять, удалять или получать доступ к любым файлам, к которым может получить доступ ваша учётная запись пользователя
- Вредоносные или плохо написанные hooks могут вызвать потерю данных или повреждение системы
- Anthropic не предоставляет гарантию и не несёт ответственность за любые убытки в результате использования hooks
- Вы должны тщательно тестировать hooks в безопасной среде перед использованием в производстве
Лучшие практики безопасности
Вот некоторые ключевые практики для написания более безопасных hooks:- Валидируйте и санитизируйте входные данные - Никогда не доверяйте входным данным вслепую
- Всегда заключайте переменные оболочки в кавычки - Используйте
"$VAR"а не$VAR - Блокируйте обход пути - Проверьте наличие
..в путях файлов - Используйте абсолютные пути - Укажите полные пути для скриптов (используйте “$CLAUDE_PROJECT_DIR” для пути проекта)
- Пропускайте чувствительные файлы - Избегайте
.env,.git/, ключей и т.д.
Безопасность конфигурации
Прямые редактирования hooks в файлах настроек не вступают в силу немедленно. Claude Code:- Захватывает снимок hooks при запуске
- Использует этот снимок на протяжении всей сессии
- Предупреждает, если hooks изменены извне
- Требует проверки в меню
/hooksдля применения изменений
Детали выполнения Hook
- Timeout: Лимит выполнения 60 секунд по умолчанию, настраивается для каждой команды.
- Timeout для отдельной команды не влияет на другие команды.
- Параллелизация: Все совпадающие hooks запускаются параллельно
- Дедупликация: Несколько идентичных команд hook автоматически дедублируются
- Окружение: Запускается в текущей директории с окружением Claude Code
- Переменная окружения
CLAUDE_PROJECT_DIRдоступна и содержит абсолютный путь к корневой директории проекта (где был запущен Claude Code) - Переменная окружения
CLAUDE_CODE_REMOTEуказывает, запущен ли hook в удалённом (веб) окружении ("true") или локальном CLI окружении (не установлена или пуста). Используйте это для запуска различной логики в зависимости от контекста выполнения.
- Переменная окружения
- Входные данные: JSON через stdin
- Выходные данные:
- PreToolUse/PostToolUse/Stop/SubagentStop: Прогресс показан в транскрипте (Ctrl-R)
- Notification/SessionEnd: Логируется только в debug (
--debug) - UserPromptSubmit/SessionStart: stdout добавлен как контекст для Claude
Отладка
Базовое устранение неполадок
Если ваши hooks не работают:- Проверьте конфигурацию - Запустите
/hooksчтобы увидеть, зарегистрирован ли ваш hook - Проверьте синтаксис - Убедитесь, что ваш JSON в настройках действителен
- Тестируйте команды - Сначала запустите команды hook вручную
- Проверьте разрешения - Убедитесь, что скрипты исполняемы
- Проверьте логи - Используйте
claude --debugчтобы увидеть детали выполнения hook
- Кавычки не экранированы - Используйте
\"внутри JSON строк - Неправильный матчер - Проверьте, что имена инструментов совпадают точно (чувствительны к регистру)
- Команда не найдена - Используйте полные пути для скриптов
Продвинутая отладка
Для сложных проблем с hooks:- Проверьте выполнение hook - Используйте
claude --debugчтобы увидеть детальное выполнение hook - Валидируйте JSON схемы - Тестируйте входные/выходные данные hook с внешними инструментами
- Проверьте переменные окружения - Проверьте, что окружение Claude Code правильно
- Тестируйте граничные случаи - Попробуйте hooks с необычными путями файлов или входными данными
- Мониторьте ресурсы системы - Проверьте на истощение ресурсов во время выполнения hook
- Используйте структурированное логирование - Реализуйте логирование в ваших скриптах hook
Пример выходных данных отладки
Используйтеclaude --debug чтобы увидеть детали выполнения hook:
- Какой hook запущен
- Выполняемая команда
- Статус успеха/неудачи
- Выходные данные или сообщения об ошибках