Хуки (hooks) в Claude Code
Хуки в Claude Code - это команды оболочки, которые запускаются автоматически в заданных точках работы: перед вызовом инструмента, после него, на старте и на остановке. В отличие от инструкций в промпте, хук исполняется всегда и умеет заблокировать действие, а не попросить его не делать
Что означают хуки в Claude Code
Официальный список событий насчитывает 31 точку. Самые ходовые: SessionStart, UserPromptSubmit, PreToolUse, PostToolUse, Stop, SessionEnd. Есть и узкие: SubagentStop, PreCompact, FileChanged, WorktreeCreate
Ключевая механика - код выхода. Выход с кодом 2 означает блокирующую ошибку: Claude Code игнорирует то, что хук напечатал в stdout, а текст из stderr отдаёт модели как сообщение об ошибке. На событии PreToolUse это отменяет вызов инструмента, на UserPromptSubmit отклоняет сам промпт, на Stop не даёт закончить ход
Отсюда разница с обычной инструкцией. Строка в файле памяти - контекст, модель может её не выполнить. Хук - внешняя программа, которая ничего не просит
Как настроить хук
Хуки описываются в тех же файлах настроек, что и остальное поведение Claude Code
- Личные настройки на все проекты:
~/.claude/settings.json - Проектные и локальные:
.claude/settings.json .claude/settings.local.json - Блок в файле настроек:
{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [{ "type": "command", "command": "~/.claude/hooks/my-guard.sh" }] } ] } } - Проверить, что скрипт исполняемый:
chmod +x ~/.claude/hooks/my-guard.sh
Грабли из практики. Если применить правку скрипта копированием через cp, бит исполнения слетает, и хук молча перестаёт срабатывать: он возвращает код 126, а гейт при этом выглядит живым. После любой замены файла хук нужно снова пометить исполняемым
Полное описание событий, формата JSON и кодов выхода - в разделе Hooks reference
Когда нужны хуки, а когда нет
Не нужны для вкуса и смысла: тон текста, выбор формулировки, оценку качества автоматически не проверить, там работает инструкция в файле памяти
Нужны там, где ошибка проверяется машинно и уже случалась. В моей рабочей системе на этом принципе стоит 87 скриптов-хуков в папке ~/.claude/hooks/, разведённых по 6 событиям в settings.json: часть запрещает опасные команды, часть не даёт закончить ход без прогона проверок
Правило отбора простое: проверяется регулярным выражением или кодом возврата и нарушалось хотя бы раз - поднимаем до хука. Всё остальное остаётся текстом
Всё, что не проверяется кодом, так и остаётся текстом в CLAUDE.md, и это большая часть правил. Вопрос в том, кто эти текстовые правила потом перечитывает и обновляет: если делать это одному, система хуков быстро зарастает и перестаёт отражать реальную работу. На ИИ-Лагере ставим не только сами хуки, а привычку регулярно сверять правило с практикой, пока оно не превратилось в мёртвый файл
Кнопка ведёт в мой закрытый канал. Жмёшь «Подать заявку», впускаю сразу, бот пишет в личку и отдаёт путёвку. Бесплатно
Частые вопросы
Что означает выход с кодом 2 в хуке?
Блокирующую ошибку. Claude Code игнорирует stdout хука и передаёт модели текст из stderr как сообщение об ошибке. На PreToolUse вызов инструмента отменяется, на UserPromptSubmit отклоняется промпт, на Stop ход не завершается и разговор продолжается
В каких файлах живут хуки?
В любом из файлов настроек: ~/.claude/settings.json для всех проектов, .claude/settings.json для одного проекта, .claude/settings.local.json для одного проекта без коммита в репозиторий. Плюс управляемые настройки организации, файл hooks.json внутри плагина и шапка скилла или субагента
Чем хук лучше строки в CLAUDE.md?
Тем, что не зависит от решения модели. Файл памяти попадает в контекст и влияет на поведение, но выполнение не гарантировано. Хук - это команда оболочки на фиксированном событии, она отрабатывает независимо от того, что модель решила в этот момент
Связанные гайды
Больше материалов по теме - в разделе Claude Code: доступ, установка, оплата