Справочник по хукам
Эта страница предоставляет справочную документацию по реализации хуков в 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
- Вызван из авто-сжатия (из-за полного окна контекста)
Ввод хука
Хуки получают 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
пустые.
Вывод хука
Есть два способа для хуков возвращать вывод обратно в Claude Code. Вывод сообщает, следует ли блокировать и какую обратную связь следует показать Claude и пользователю.
Простой: Код выхода
Хуки сообщают статус через коды выхода, stdout и stderr:
- Код выхода 0: Успех.
stdout
показывается пользователю в режиме транскрипта (CTRL-R), за исключениемUserPromptSubmit
, где 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 только пользователю |
Продвинутый: 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. (Устаревшее значение"approve"
+reason
имеет то же поведение.)"deny"
предотвращает выполнение вызова инструмента.permissionDecisionReason
показывается Claude. (Значение"block"
+reason
имеет то же поведение.)"ask"
просит пользователя подтвердить вызов инструмента в UI.permissionDecisionReason
показывается пользователю, но не Claude.
Контроль решений PostToolUse
Хуки PostToolUse
могут контролировать, продолжается ли вызов инструмента.
"block"
автоматически подсказывает Claude сreason
.undefined
ничего не делает.reason
игнорируется.
Контроль решений UserPromptSubmit
Хуки UserPromptSubmit
могут контролировать, обрабатывается ли пользовательская подсказка.
"block"
предотвращает обработку подсказки. Отправленная подсказка стирается из контекста."reason"
показывается пользователю, но не добавляется в контекст.undefined
позволяет подсказке продолжиться нормально."reason"
игнорируется."hookSpecificOutput.additionalContext"
добавляет строку в контекст, если не заблокировано.
Контроль решений Stop
/SubagentStop
Хуки Stop
и SubagentStop
могут контролировать, должен ли Claude продолжить.
"block"
предотвращает остановку Claude. Вы должны заполнитьreason
, чтобы Claude знал, как продолжить.undefined
позволяет Claude остановиться.reason
игнорируется.
Пример кода выхода: Валидация 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
доступна и содержит абсолютный путь к корневому каталогу проекта
- Переменная окружения
- Ввод: JSON через stdin
- Вывод:
- PreToolUse/PostToolUse/Stop: Прогресс показывается в транскрипте (Ctrl-R)
- Notification: Логируется только в отладке (
--debug
)
Отладка
Базовое устранение неполадок
Если ваши хуки не работают:
- Проверьте конфигурацию - Запустите
/hooks
, чтобы увидеть, зарегистрирован ли ваш хук - Проверьте синтаксис - Убедитесь, что ваши JSON-настройки валидны
- Протестируйте команды - Сначала запустите команды хуков вручную
- Проверьте разрешения - Убедитесь, что скрипты исполняемы
- Просмотрите логи - Используйте
claude --debug
, чтобы увидеть детали выполнения хуков
Общие проблемы:
- Кавычки не экранированы - Используйте
\"
внутри JSON-строк - Неправильный матчер - Проверьте, что имена инструментов совпадают точно (чувствительно к регистру)
- Команда не найдена - Используйте полные пути для скриптов
Продвинутая отладка
Для сложных проблем с хуками:
- Инспектируйте выполнение хуков - Используйте
claude --debug
, чтобы увидеть детальное выполнение хуков - Валидируйте JSON-схемы - Тестируйте ввод/вывод хуков с внешними инструментами
- Проверьте переменные окружения - Убедитесь, что окружение Claude Code корректно
- Тестируйте крайние случаи - Попробуйте хуки с необычными путями файлов или вводом
- Мониторьте системные ресурсы - Проверьте на истощение ресурсов во время выполнения хуков
- Используйте структурированное логирование - Реализуйте логирование в ваших скриптах хуков
Пример отладочного вывода
Используйте claude --debug
, чтобы увидеть детали выполнения хуков:
Сообщения о прогрессе появляются в режиме транскрипта (Ctrl-R), показывая:
- Какой хук выполняется
- Выполняемая команда
- Статус успеха/неудачи
- Вывод или сообщения об ошибках