Справочник по хукам
Эта страница предоставляет справочную документацию по реализации хуков в Claude Code.
Для руководства по быстрому старту с примерами см. Начало работы с хуками Claude Code.
Конфигурация
Хуки Claude Code настраиваются в ваших файлах настроек:
~/.claude/settings.json
- Пользовательские настройки.claude/settings.json
- Настройки проекта.claude/settings.local.json
- Локальные настройки проекта (не коммитятся)- Настройки корпоративной управляемой политики
Структура
Хуки организованы по сопоставителям, где каждый сопоставитель может иметь несколько хуков:
- matcher: Шаблон для сопоставления имен инструментов, чувствительный к регистру (применимо только для
PreToolUse
иPostToolUse
)- Простые строки сопоставляются точно:
Write
сопоставляется только с инструментом Write - Поддерживает regex:
Edit|Write
илиNotebook.*
- Используйте
*
для сопоставления всех инструментов. Вы также можете использовать пустую строку (""
) или оставитьmatcher
пустым.
- Простые строки сопоставляются точно:
- hooks: Массив команд для выполнения при совпадении шаблона
type
: В настоящее время поддерживается только"command"
command
: Bash-команда для выполнения (может использовать переменную окружения$CLAUDE_PROJECT_DIR
)timeout
: (Необязательно) Как долго команда должна выполняться, в секундах, перед отменой этой конкретной команды.
Для событий типа UserPromptSubmit
, Notification
, Stop
и SubagentStop
,
которые не используют сопоставители, вы можете опустить поле matcher:
Скрипты хуков для конкретного проекта
Вы можете использовать переменную окружения CLAUDE_PROJECT_DIR
(доступна только когда
Claude Code запускает команду хука) для ссылки на скрипты, хранящиеся в вашем проекте,
обеспечивая их работу независимо от текущего каталога Claude:
События хуков
PreToolUse
Выполняется после того, как Claude создает параметры инструмента и перед обработкой вызова инструмента.
Общие сопоставители:
Task
- Задачи субагентов (см. документацию по субагентам)Bash
- Команды оболочкиGlob
- Сопоставление шаблонов файловGrep
- Поиск содержимогоRead
- Чтение файловEdit
,MultiEdit
- Редактирование файловWrite
- Запись файловWebFetch
,WebSearch
- Веб-операции
PostToolUse
Выполняется сразу после успешного завершения инструмента.
Распознает те же значения сопоставителей, что и PreToolUse.
Notification
Выполняется, когда Claude Code отправляет уведомления. Уведомления отправляются, когда:
- Claude нужно ваше разрешение на использование инструмента. Пример: “Claude нужно ваше разрешение на использование Bash”
- Ввод подсказки бездействует не менее 60 секунд. “Claude ждет вашего ввода”
UserPromptSubmit
Выполняется, когда пользователь отправляет подсказку, до того, как Claude ее обработает. Это позволяет вам добавить дополнительный контекст на основе подсказки/разговора, проверить подсказки или заблокировать определенные типы подсказок.
Stop
Выполняется, когда основной агент Claude Code завершил ответ. Не выполняется, если остановка произошла из-за прерывания пользователем.
SubagentStop
Выполняется, когда субагент Claude Code (вызов инструмента Task) завершил ответ.
PreCompact
Выполняется перед тем, как Claude Code собирается выполнить операцию сжатия.
Сопоставители:
manual
- Вызывается из/compact
auto
- Вызывается из автосжатия (из-за полного контекстного окна)
SessionStart
Выполняется, когда Claude Code начинает новую сессию или возобновляет существующую сессию (что в настоящее время действительно начинает новую сессию под капотом). Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе.
Сопоставители:
startup
- Вызывается при запускеresume
- Вызывается из--resume
,--continue
или/resume
clear
- Вызывается из/clear
compact
- Вызывается из автоматического или ручного сжатия.
SessionEnd
Выполняется, когда сессия Claude Code заканчивается. Полезно для задач очистки, логирования статистики сессии или сохранения состояния сессии.
Поле reason
во входных данных хука будет одним из:
clear
- Сессия очищена командой /clearlogout
- Пользователь вышел из системыprompt_input_exit
- Пользователь вышел, пока был виден ввод подсказкиother
- Другие причины выхода
Входные данные хука
Хуки получают JSON-данные через stdin, содержащие информацию о сессии и данные, специфичные для события:
Входные данные PreToolUse
Точная схема для tool_input
зависит от инструмента.
Входные данные PostToolUse
Точная схема для tool_input
и tool_response
зависит от инструмента.
Входные данные Notification
Входные данные UserPromptSubmit
Входные данные Stop и SubagentStop
stop_hook_active
равно true, когда Claude Code уже продолжает работу в результате
хука остановки. Проверьте это значение или обработайте транскрипт, чтобы предотвратить бесконечную работу Claude Code.
Входные данные PreCompact
Для manual
, custom_instructions
берется из того, что пользователь передает в
/compact
. Для auto
, custom_instructions
пуст.
Входные данные SessionStart
Входные данные SessionEnd
Выходные данные хука
Есть два способа для хуков возвращать выходные данные обратно в Claude Code. Выходные данные сообщают, следует ли блокировать, и любую обратную связь, которая должна быть показана Claude и пользователю.
Простой: Код выхода
Хуки сообщают статус через коды выхода, stdout и stderr:
- Код выхода 0: Успех.
stdout
показывается пользователю в режиме транскрипта (CTRL-R), за исключениемUserPromptSubmit
иSessionStart
, где stdout добавляется в контекст. - Код выхода 2: Блокирующая ошибка.
stderr
передается обратно Claude для автоматической обработки. См. поведение для каждого события хука ниже. - Другие коды выхода: Неблокирующая ошибка.
stderr
показывается пользователю и выполнение продолжается.
Напоминание: Claude Code не видит stdout, если код выхода равен 0, за исключением
хука UserPromptSubmit
, где stdout вводится как контекст.
Поведение кода выхода 2
Событие хука | Поведение |
---|---|
PreToolUse | Блокирует вызов инструмента, показывает stderr Claude |
PostToolUse | Показывает stderr Claude (инструмент уже выполнился) |
Notification | Н/Д, показывает stderr только пользователю |
UserPromptSubmit | Блокирует обработку подсказки, стирает подсказку, показывает stderr только пользователю |
Stop | Блокирует остановку, показывает stderr Claude |
SubagentStop | Блокирует остановку, показывает stderr субагенту Claude |
PreCompact | Н/Д, показывает stderr только пользователю |
SessionStart | Н/Д, показывает stderr только пользователю |
SessionEnd | Н/Д, показывает stderr только пользователю |
Продвинутый: JSON-выход
Хуки могут возвращать структурированный JSON в stdout
для более сложного контроля:
Общие JSON-поля
Все типы хуков могут включать эти необязательные поля:
Если continue
равно false, Claude прекращает обработку после выполнения хуков.
- Для
PreToolUse
, это отличается от"permissionDecision": "deny"
, которое только блокирует конкретный вызов инструмента и предоставляет автоматическую обратную связь Claude. - Для
PostToolUse
, это отличается от"decision": "block"
, которое предоставляет автоматизированную обратную связь Claude. - Для
UserPromptSubmit
, это предотвращает обработку подсказки. - Для
Stop
иSubagentStop
, это имеет приоритет над любым выходом"decision": "block"
. - Во всех случаях,
"continue" = false
имеет приоритет над любым выходом"decision": "block"
.
stopReason
сопровождает continue
с причиной, показываемой пользователю, не показываемой
Claude.
Контроль решений PreToolUse
Хуки PreToolUse
могут контролировать, выполняется ли вызов инструмента.
"allow"
обходит систему разрешений.permissionDecisionReason
показывается пользователю, но не Claude."deny"
предотвращает выполнение вызова инструмента.permissionDecisionReason
показывается Claude."ask"
просит пользователя подтвердить вызов инструмента в UI.permissionDecisionReason
показывается пользователю, но не Claude.
Поля decision
и reason
устарели для хуков PreToolUse.
Используйте hookSpecificOutput.permissionDecision
и
hookSpecificOutput.permissionDecisionReason
вместо них. Устаревшие поля
"approve"
и "block"
соответствуют "allow"
и "deny"
соответственно.
Контроль решений PostToolUse
Хуки PostToolUse
могут предоставлять обратную связь Claude после выполнения инструмента.
"block"
автоматически запрашивает Claude сreason
.undefined
ничего не делает.reason
игнорируется."hookSpecificOutput.additionalContext"
добавляет контекст для рассмотрения Claude.
Контроль решений UserPromptSubmit
Хуки UserPromptSubmit
могут контролировать, обрабатывается ли подсказка пользователя.
"block"
предотвращает обработку подсказки. Отправленная подсказка стирается из контекста."reason"
показывается пользователю, но не добавляется в контекст.undefined
позволяет подсказке продолжаться нормально."reason"
игнорируется."hookSpecificOutput.additionalContext"
добавляет строку в контекст, если не заблокировано.
Контроль решений Stop
/SubagentStop
Хуки Stop
и SubagentStop
могут контролировать, должен ли Claude продолжать.
"block"
предотвращает остановку Claude. Вы должны заполнитьreason
, чтобы Claude знал, как продолжить.undefined
позволяет Claude остановиться.reason
игнорируется.
Контроль решений SessionStart
Хуки SessionStart
позволяют вам загружать контекст в начале сессии.
"hookSpecificOutput.additionalContext"
добавляет строку в контекст.- Значения
additionalContext
нескольких хуков объединяются.
Контроль решений SessionEnd
Хуки SessionEnd
выполняются при завершении сессии. Они не могут блокировать завершение сессии,
но могут выполнять задачи очистки.
Пример кода выхода: Валидация Bash-команд
Пример JSON-выхода: UserPromptSubmit для добавления контекста и валидации
Для хуков UserPromptSubmit
вы можете внедрить контекст любым из методов:
- Код вы хода 0 с stdout: Claude видит контекст (особый случай для
UserPromptSubmit
) - JSON-выход: Предоставляет больше контроля над поведением
Пример JSON-выхода: PreToolUse с одобрением
Работа с инструментами MCP
Хуки Claude Code работают бесшовно с инструментами Model Context Protocol (MCP). Когда MCP-серверы предоставляют инструменты, они появляются со специальным шаблоном именования, который вы можете сопоставить в ваших хуках.
Именование инструментов MCP
Инструменты MCP следуют шаблону mcp__<server>__<tool>
, например:
mcp__memory__create_entities
- Инструмент создания сущностей сервера памятиmcp__filesystem__read_file
- Инструмент чтения файлов файловой системыmcp__github__search_repositories
- Инструмент поиска сервера GitHub
Настройка хуков для инструментов MCP
Вы можете нацеливаться на конкретные инструменты MCP или целые MCP-серверы:
Примеры
Для практических примеров, включая форматирование кода, уведомления и защиту файлов, см. Больше примеров в руководстве по началу работы.
Соображения безопасности
Отказ от ответственности
ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК: Хуки Claude Code выполняют произвольные команды оболочки в вашей системе автоматически. Используя хуки, вы признаете, что:
- Вы несете единоличную ответственность за команды, которые вы настраиваете
- Хуки могут изменять, удалять или получать доступ к любым файлам, к которым может получить доступ ваша учетная запись пользователя
- Вредоносные или плохо написанные хуки могут вызвать потерю данных или повреждение системы
- Anthropic не предоставляет никаких гарантий и не несет ответственности за любой ущерб, возникший в результате использования хуков
- Вы должны тщательно тестировать хуки в безопасной среде перед использованием в продакшене
Всегда просматривайте и понимайте любые команды хуков перед добавлением их в вашу конфигурацию.
Лучшие практики безопасности
Вот некоторые ключевые практики для написания более безопасных хуков:
- Валидируйте и очищайте входные данные - Никогда не доверяйте входным данным слепо
- Всегда заключайте переменные оболочки в кавычки - Используйте
"$VAR"
, а не$VAR
- Блокируйте обход пути - Проверяйте на
..
в путях файлов - Используйте абсолютные пути - Указывайте полные пути для скриптов (используйте
$CLAUDE_PROJECT_DIR
для пути проекта) - Пропускайте чувствительные файлы - Избегайте
.env
,.git/
, ключей и т.д.
Безопасность конфигурации
Прямые изменения хуков в файлах настроек не вступают в силу немедленно. Claude Code:
- Захватывает снимок хуков при запуске
- Использует этот снимок на протяжении всей сессии
- Предупреждает, если хуки изменяются извне
- Требует просмотра в меню
/hooks
для применения изменений
Это предотвращает влияние вредоносных изменений хуков на вашу текущую сессию.
Детали выполнения хуков
- Тайм-аут: Лимит выполнения 60 секунд по умолчанию, настраивается для каждой команды.
- Тайм-аут для отдельной команды не влияет на другие команды.
- Параллелизация: Все совпадающие хуки выполняются параллельно
- Дедупликация: Несколько идентичных команд хуков автоматически дедуплицируются
- Окружение: Выполняется в текущем каталоге с окружением Claude Code
- Переменная окружения
CLAUDE_PROJECT_DIR
доступна и содержит абсолютный путь к корневому каталогу проекта (где был запущен Claude Code)
- Переменная окружения
- Входные данные: JSON через stdin
- Выходные данные:
- PreToolUse/PostToolUse/Stop/SubagentStop: Прогресс показывается в транскрипте (Ctrl-R)
- Notification/SessionEnd: Логируется только в отладке (
--debug
) - UserPromptSubmit/SessionStart: stdout добавляется как контекст для Claude
Отладка
Основное устранение неполадок
Если ваши хуки не работают:
- Проверьте конфигурацию - Запустите
/hooks
, чтобы увидеть, зарегистрирован ли ваш хук - Проверьте синтаксис - Убедитесь, что ваши JSON-настройки действительны
- Тестируйте команды - Сначала запустите команды хуков вручную
- Проверьте разрешения - Убедитесь, что скрипты исполняемы
- Просмотрите логи - Используйте
claude --debug
, чтобы увидеть детали выполнения хуков
Общие проблемы:
- Кавычки не экранированы - Используйте
\"
внутри JSON-строк - Неправильный сопоставитель - Проверьте, что имена инструментов совпадают точно (чувствительно к регистру)
- Команда не найдена - Используйте полные пути для скриптов
Продвинутая отладка
Для сложных проблем с хуками:
- Инспектируйте выполнение хуков - Используйте
claude --debug
, чтобы увидеть подробное выполнение хуков - Валидируйте JSON-схемы - Тестируйте входные/выходные данные хуков с внешними инструментами
- Проверьте переменные окружения - Убедитесь, что окружение Claude Code правильное
- Тестируйте крайние случаи - Попробуйте хуки с необычными путями файлов или входными данными
- Мониторьте системные ресурсы - Проверьте на истощение ресурсов во время выполнения хуков
- Используйте структурированное логирование - Реализуйте логирование в ваших скриптах хуков
Пример отладочного вывода
Используйте claude --debug
, чтобы увидеть детали выполнения хуков:
Сообщения о прогрессе появляются в режиме транскрипта (Ctrl-R), показывая:
- Какой хук выполняется
- Выполняемая команда
- Статус успеха/неудачи
- Выходные данные или сообщения об ошибках