1. Що таке Hooks у Claude Code та навіщо вони потрібні
Працюючи з AI-асистентом у терміналі, розробники часто змушені повторювати ті самі рутинні команди: "тепер запусти ESLint", "відформатуй код через Prettier", "перевір типи перед комітом". Навіть якщо прописати ці правила в системних інструкціях CLAUDE.md, мовна модель може час від часу забувати їх виконати або пропускати через економію токенів.
Hooks (хуки) у Claude Code розв'язують цю проблему радикально: це детерміновані тригери, які автоматично викликають системні команди або скрипти в точні моменти життєвого циклу роботи асистента.
Логіка хуків проста:
Якщо Claude виконав подію X → операційна система гарантовано запускає дію Y.
Порівняння підходів до автоматизації
| Характеристика | Ручні промпти | Інструкції в CLAUDE.md | Нативні Hooks |
|---|---|---|---|
| Надійність виконання | Низька (залежить від пам'яті людини) | Середня (ймовірнісна поведінка LLM) | 100% (детерміноване перехоплення подій) |
| Витрата токенів | Висока (щоразу витрачаються токени запиту) | Середня (правило завантажується в кожен контекст) | Нульова (виконується локально в shell) |
| Швидкість реакції | Повільна (ручний ввід команд) | Потребує додаткового раунду генерації | Миттєва (нативний виклик процесу) |
| Можливість блокування | Відсутня | Відсутня | Є (ненульовий exit code зупиняє дію) |
Хуки Claude Code конфігуруються у форматі JSON у файлі .claude/settings.json на рівні окремого репозиторію або глобально в ~/.claude/settings.json.
2. Життєвий цикл подій: PreToolUse, PostToolUse, Notification, Stop
У Claude Code передбачено чотири фундаментальні точки перехоплення (події), до яких можна прив'язувати автоматизовані команди.
Основні точки спрацьовування
PreToolUse(Перед використанням інструмента): спрацьовує до того, як агент виконає дію. Якщо команда хука повертає помилку (exit code відмінний від 0), виконання дії блокується. Це ідеальне місце для захисних перевірок перед комітами чи пушами.PostToolUse(Після використання інструмента): спрацьовує одразу після успішного виконання інструмента. Найпопулярніший тригер для автоматичного форматування коду (Prettier) або лінтингу зміненого файлу (ESLint).Notification(Сповіщення): активується, коли асистентові потрібно надіслати важливе системне повідомлення або запитати додаткову авторизацію.Stop(Завершення відповіді): спрацьовує в момент, коли Claude Code повністю закінчив генерацію відповіді та очікує на наступне повідомлення користувача. Використовується для відтворення звукових сигналів та десктопних нотифікацій.
Точки спрацьовування Hooks у життєвому циклі3. Структура конфігурації у settings.json та синтаксис Matcher
Конфігурація хуків зберігається у файлі .claude/settings.json. Якщо цього файлу ще немає в корені вашого проєкту, створіть його.
Базовий синтаксис конфігурації
Як працює поле Matcher:
Поле matcher визначає, на який саме інструмент агента має реагувати конкретний хук:
"Edit"— перехоплює модифікацію вже існуючих файлів."Write"— спрацьовує при створенні нового файлу або повному перезаписі."Bash"— реагує на запуск будь-яких консольних команд."Bash(git commit*)"— точковий шаблон, що фільтрує виклики Bash, які починаються з командиgit commit."*"— універсальний селектор (wildcard), який спрацьовує на будь-який інструмент агента.
Шаблони matcher чутливі до регістру. Використовуйте стандартні назви інструментів Claude Code: Edit, Write, Bash, Glob, Grep.
4. Автоматичний лінтинг та форматування (ESLint + Prettier)
Найбільш практичний щоденний сценарій — делегування форматування та первинної перевірки стилю утилітам Prettier та ESLint. Завдяки цьому код завжди зберігається у репозиторії в ідеальному стані.
Налаштування PostToolUse для ESLint та Prettier
Розбір прапорців безпеки у команді
"$CLAUDE_FILE_PATH"— динамічна змінна середовища, в яку Claude автоматично підставляє повний шлях до файлу, щойно зміненого агентом.2>/dev/null— приглушує зайвий службовий вивід помилок потоку stderr, щоб не перевантажувати термінал.|| true— критично важлива конструкція bash. Вона гарантує, що навіть якщо лінтер знайде невиправні помилки і поверне код1, сам хук завершиться з кодом0і не зупинить подальшу роботу агента.
5. Захисні бар'єри перед git commit (TypeCheck + Тести)
Якщо для форматування ми використовували м'які хуки з || true, то для фіксації змін у системі контролю версій потрібен суворий контроль якості (Quality Gate).
За допомогою PreToolUse можна заблокувати створення коміту, якщо в проєкті є помилки компіляції TypeScript або падають модульні тести.
Налаштування блокуючого Pre-commit хука
Що відбувається при виявленні помилок
- Claude формулює команду
git commit -m "...". - Перед її виконанням система активує
PreToolUse. - Запускаються команди валідації:
npm run typecheckтаnpm run lint. - Якщо виявлено помилку: процес повертає ненульовий код завершення (exit code 1).
- Claude Code перехоплює вивід помилки компілятора безпосередньо у своєму контексті.
- Замість зламаного коміту асистент аналізує текст помилки, автоматично виправляє типи у коді та робить повторну чисту спробу коміту.
Зверніть увагу: у блокуючих перевірках PreToolUse ніколи не використовуйте || true, інакше перевірка завжди вважатиметься успішною, і захисний бар'єр перестане діяти.
6. Аудіо- та десктопні сповіщення при завершенні задач (Stop Hook)
Складні рефакторинги або виконання повного набору тестів можуть тривати від 2 до 10 хвилин. Замість того, щоб невідривно дивитися в термінал, налаштуйте сповіщення через подію Stop.
Сповіщення спрацьовує тільки тоді, коли агент повністю завершує генерацію фінальної відповіді, а не між проміжними викликами інструментів.
7. Передача контексту через змінні оточення
Щоб скрипти автоматизації були гнучкими та адаптивними, Claude Code автоматично експортує метадані поточної операції у системні змінні оточення (Environment Variables).
Змінні середовища Claude Code для хуківДовідник системних змінних Claude Code
| Змінна оточення | Тип значення | Опис та приклад вмісту |
|---|---|---|
$CLAUDE_FILE_PATH | Абсолютний шлях | Шлях до конкретного файлу, який зараз створюється чи редагується (/Users/dev/project/src/index.ts) |
$CLAUDE_TOOL_NAME | Текстовий ідентифікатор | Назва інструмента, який ініціював подію (Edit, Write, Bash) |
$CLAUDE_PROJECT_DIR | Абсолютний шлях | Коренева директорія проєкту, де запущено поточну сесію Claude Code |
Приклад контекстного Bash-скрипту для хука
Створимо скрипт .claude/hooks/smart-validator.sh:
Тепер у .claude/settings.json достатньо вказати виклик цього скрипту:
8. Патерн «CI-in-a-Loop»: безперервний зворотний зв'язок
У традиційній розробці без хуків виникає патерн розриву: агент вносить зміни до десятка файлів, після чого запускається збірка проєкту, яка видає лавину з 40 помилок типів. Агенту складно розібратися, яка саме зміна призвела до поломки.
CI-in-a-Loop (Короткий цикл зворотного зв'язку) перевертає цей процес:
Конфігурація циклічного TypeScript-аудиту
Чому обов'язково використовувати head -n 20
Якщо вивід компілятора повертає сотні рядків логів, вони потрапляють у контекст моделі та можуть переповнити ліміт токенів. Обмеження через head -n 20 показує перші найкритичніші помилки, даючи моделі точний орієнтир для негайного виправлення без перевантаження сесії.
9. Headless-автоматизація: режим -p, Cron та Git Hooks
Хуки можна об'єднувати з автономним (headless) режимом Claude Code — прапорцем -p (print/prompt). Це дозволяє автоматизувати виконання завдань повністю без участі людини.
Автономний скрипт нічного аудиту (nightly-audit.sh)
Налаштування розкладу виконання через Cron
Відкрийте планувальник завдань (crontab -e) та налаштуйте виконання щоночі о 03:00:
Запуск перевірки у нативному Git Hook (.git/hooks/post-merge)
Щоб після кожного отримання оновлень з git pull автоматично запускався аналіз сумісності:
Не забудьте надати скрипту права на виконання: chmod +x .git/hooks/post-merge.
10. Найкращі інженерні практики та правила безпеки Hooks
Неправильно налаштовані хуки можуть зациклити виконання або заблокувати роботу термінала. Дотримуйтеся чотирьох фундаментальних правил інженерної гігієни.
Чотири правила безпечного проєктування хуків
-
Екстремальна швидкодія: Хуки з подією
PostToolUseзапускаються після кожної модифікації файлу. Якщо хук виконується довше 1-2 секунд, інтерактивна робота з Claude стане повільною та дискомфортною. Запускайте важкі E2E-тести лише вPreToolUseперед комітом, але не після кожногоEdit. -
Обов'язкове логування виводу: Завжди перенаправляйте вивід діагностичних скриптів у тимчасовий лог-файл:
bash"command": "bash .claude/hooks/check.sh >> /tmp/claude-hooks.log 2>&1 || true"Якщо хук перестане спрацьовувати, ви зможете миттєво відкрити
/tmp/claude-hooks.logі знайти причину. -
Ізольоване тестування в чистому терміналі: Перед тим як додати будь-яку команду до
settings.json, виконайте її власноруч у звичайному shell. Якщо команда видає помилку в консолі, вона гарантовано зламає сесію Claude Code. -
Запобігання нескінченній рекурсії: Ніколи не налаштовуйте команду в
PostToolUse, яка сама змінює файли проєкту без прапорців ігнорування (наприклад, сторонній скрипт, який викликає повторнийEdit), інакше агент потрапить у вічний цикл викликів.
Не запускайте через хуки команди, які очікують інтерактивного вводу від користувача (наприклад, підтвердження read -p чи sudo з запитом пароля). Це призведе до зависання термінального процесу.
11. Практичний воркшоп, шпаргалка та підсумковий чек-лист
Для швидкого старту у власному проєкті використовуйте готову зведену шпаргалку та перевірений production-конфіг.
Шпаргалка з вибору типу Hook для автоматизаціїГотовий файл конфігурації .claude/settings.json
Скопіюйте цей еталонний конфіг у папку .claude вашого проєкту:
Швидка самоперевірка
1. Чим PreToolUse принципово відрізняється від PostToolUse?
Відповідь:
PreToolUseзапускається до виконання дії інструмента і здатний заблокувати її при ненульовому exit code.PostToolUseзапускається після успішного завершення операції та використовується для форматування або лінтингу.
2. Навіщо в хуках форматування додають || true?
Відповідь: Щоб помилки лінтера чи форматера не повертали аварійний статус і не зупиняли процес генерації відповіді агента.
3. Яка змінна оточення містить шлях до файлу, який щойно редагувався?
Відповідь: Змінна
$CLAUDE_FILE_PATH.
Підсумковий чек-лист впровадження Hooks
- Створено директорію
.claude/та файлsettings.jsonу корені проєкту. - Налаштовано автоматичне форматування змінених файлів через
PostToolUse+Prettier. - Додано захисний бар'єр
PreToolUseнаBash(git commit*)з перевіркоюtypecheck. - Підключено звукове або екранне сповіщення на подію
Stop. - Усі команди хуків перевірено вручну в терміналі перед збереженням у конфігурацію.
- Перевірено відсутність інтерактивних команд, які очікують вводу пароля або
[y/N].