Конфигурация
Hooks Claude Code настраиваются в ваших файлах настроек:~/.claude/settings.json- Пользовательские настройки.claude/settings.json- Настройки проекта.claude/settings.local.json- Локальные настройки проекта (не коммитятся)- Управляемые настройки политики
Администраторы предприятия могут использовать
allowManagedHooksOnly для блокировки пользовательских, проектных и плагинных hooks. См. Конфигурация hooks.Структура
Hooks организованы по матчерам, где каждый матчер может иметь несколько hooks:- matcher: Шаблон для сопоставления имён инструментов, чувствителен к регистру (применяется только для
PreToolUse,PermissionRequestи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, 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 в Skills, Agents и Slash Commands
В дополнение к файлам настроек и плагинам, hooks могут быть определены непосредственно в Skills, subagents и slash commands используя frontmatter. Эти hooks ограничены жизненным циклом компонента и работают только когда этот компонент активен. Поддерживаемые события:PreToolUse, PostToolUse и Stop
Пример в Skill:
once: Установите значениеtrueдля выполнения hook только один раз за сеанс. После первого успешного выполнения hook удаляется. Примечание: Эта опция в настоящее время поддерживается только для skills и slash commands, а не для agents.
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как заполнитель для входных данных hook JSON - Если
$ARGUMENTSотсутствует, входной JSON добавляется к подсказке
- Используйте
timeout: (Опционально) Timeout в секундах (по умолчанию: 30 секунд)
Схема ответа
LLM должен ответить JSON, содержащим:ok:trueразрешает действие,falseпредотвращает егоreason: Требуется когдаokэтоfalse. Объяснение, показанное Claude
Поддерживаемые события hook
Hooks на основе подсказок работают с любым событием hook, но наиболее полезны для:- Stop: Интеллектуально решить, должен ли Claude продолжать работу
- SubagentStop: Оценить, завершил ли subagent свою задачу
- UserPromptSubmit: Валидировать пользовательские подсказки с помощью LLM
- PreToolUse: Принимать контекстно-зависимые решения по разрешениям
- PermissionRequest: Интеллектуально разрешать или отрицать диалоги разрешений
Пример: Интеллектуальный 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- Веб-операции
PermissionRequest
Запускается когда пользователю показывается диалог разрешения. Используйте управление решениями PermissionRequest для разрешения или отрицания от имени пользователя. Распознает те же значения матчеров, что и PreToolUse.PostToolUse
Запускается сразу после успешного завершения инструмента. Распознает те же значения матчеров, что и PreToolUse.Notification
Запускается когда Claude Code отправляет уведомления. Поддерживает матчеры для фильтрации по типу уведомления. Общие матчеры:permission_prompt- Запросы разрешения от Claude Codeidle_prompt- Когда Claude ждет ввода пользователя (после 60+ секунд простоя)auth_success- Уведомления об успешной аутентификацииelicitation_dialog- Когда Claude Code нуждается в вводе для выявления инструмента MCP
UserPromptSubmit
Запускается когда пользователь отправляет подсказку, перед обработкой Claude. Это позволяет вам добавить дополнительный контекст на основе подсказки/разговора, валидировать подсказки или блокировать определенные типы подсказок.Stop
Запускается когда основной agent Claude Code завершил ответ. Не запускается если остановка произошла из-за прерывания пользователем.SubagentStop
Запускается когда Claude Code subagent (вызов инструмента Task) завершил ответ.PreCompact
Запускается перед тем, как Claude Code собирается выполнить операцию compact. Матчеры:manual- Вызвано из/compactauto- Вызвано из auto-compact (из-за полного контекстного окна)
SessionStart
Запускается когда Claude Code запускает новый сеанс или возобновляет существующий сеанс (который в настоящее время запускает новый сеанс под капотом). Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения вашей кодовой базы, установка зависимостей или настройка переменных окружения. Матчеры:startup- Вызвано из startupresume- Вызвано из--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показывается пользователю в режиме verbose (ctrl+o), за исключениемUserPromptSubmitиSessionStart, где stdout добавляется в контекст. JSON выход вstdoutанализируется для структурированного управления (см. Продвинутый: JSON выход). - Код выхода 2: Блокирующая ошибка. Используется только
stderrкак сообщение об ошибке и передается обратно Claude. Формат[command]: {stderr}. JSON вstdoutне обрабатывается для кода выхода 2. См. поведение для каждого события hook ниже. - Другие коды выхода: Неблокирующая ошибка.
stderrпоказывается пользователю в режиме verbose (ctrl+o) с форматомFailed with non-blocking status code: {stderr}. Еслиstderrпуста, показываетNo stderr output. Выполнение продолжается.
Поведение кода выхода 2
| Событие Hook | Поведение |
|---|---|
PreToolUse | Блокирует вызов инструмента, показывает stderr Claude |
PermissionRequest | Отрицает разрешение, показывает stderr Claude |
PostToolUse | Показывает stderr Claude (инструмент уже запущен) |
Notification | N/A, показывает stderr только пользователю |
UserPromptSubmit | Блокирует обработку подсказки, стирает подсказку, показывает stderr только пользователю |
Stop | Блокирует остановку, показывает stderr Claude |
SubagentStop | Блокирует остановку, показывает stderr Claude subagent |
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изменяет параметры входных данных инструмента перед выполнением инструмента- Комбинируйте с
"permissionDecision": "allow"для изменения входных данных и автоматического одобрения вызова инструмента - Комбинируйте с
"permissionDecision": "ask"для изменения входных данных и показа их пользователю для подтверждения
Поля
decision и reason устарели для hooks PreToolUse.
Используйте hookSpecificOutput.permissionDecision и
hookSpecificOutput.permissionDecisionReason вместо этого. Устаревшие поля
"approve" и "block" соответствуют "allow" и "deny" соответственно.Управление решениями PermissionRequest
Hooks PermissionRequest могут разрешать или отрицать запросы разрешения, показанные пользователю.
- Для
"behavior": "allow"вы также можете опционально передать"updatedInput", который изменяет параметры входных данных инструмента перед выполнением инструмента. - Для
"behavior": "deny"вы также можете опционально передать строку"message", которая говорит модели, почему разрешение было отрицано, и булево значение"interrupt", которое остановит Claude.
Управление решениями PostToolUse
Hooks PostToolUse могут предоставлять обратную связь Claude после выполнения инструмента.
"block"автоматически подсказывает Claude сreason.undefinedничего не делает.reasonигнорируется."hookSpecificOutput.additionalContext"добавляет контекст для Claude для рассмотрения.
Управление решениями UserPromptSubmit
Hooks UserPromptSubmit могут управлять тем, обрабатывается ли пользовательская подсказка и добавлять контекст.
Добавление контекста (код выхода 0):
Существует два способа добавить контекст к разговору:
- Простой текст stdout (проще): Любой не-JSON текст, написанный в stdout, добавляется как контекст. Это самый простой способ внедрить информацию.
-
JSON с
additionalContext(структурированный): Используйте формат JSON ниже для большего контроля. ПолеadditionalContextдобавляется как контекст.
additionalContext добавляется более дискретно.
Блокирование подсказок:
"decision": "block"предотвращает обработку подсказки. Отправленная подсказка стирается из контекста."reason"показывается пользователю, но не добавляется в контекст."decision": undefined(или опущено) позволяет подсказке продолжаться нормально.
Формат JSON не требуется для простых случаев использования. Для добавления контекста, вы можете напечатать простой текст в stdout с кодом выхода 0. Используйте JSON когда вам нужно
блокировать подсказки или вы хотите более структурированный контроль.
Управление решениями 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, вы можете внедрить контекст используя любой метод:- Простой текст stdout с кодом выхода 0: Самый простой подход, печатает текст
- JSON выход с кодом выхода 0: Используйте
"decision": "block"для отклонения подсказок, илиadditionalContextдля структурированного внедрения контекста
stderr для сообщения об ошибке. Для блокирования используя
JSON (с пользовательской причиной), используйте "decision": "block" с кодом выхода 0.Пример JSON выхода: PreToolUse с одобрением
Работа с MCP инструментами
Claude Code hooks работают беспрепятственно с инструментами 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 в безопасной среде перед использованием в production
Лучшие практики безопасности
Вот некоторые ключевые практики для написания более безопасных hooks:- Валидируйте и санитизируйте входные данные - Никогда не доверяйте входным данным вслепую
- Всегда цитируйте переменные shell - Используйте
"$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/PermissionRequest/PostToolUse/Stop/SubagentStop: Прогресс показывается в режиме verbose (ctrl+o)
- 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 запускается
- Выполняемая команда
- Статус успеха/неудачи
- Выходные данные или сообщения об ошибках