Когда уведомления Claude Code перестают работать, причина почти всегда одна из четырёх: hook не загружен, hook запускается, но завершается с ошибкой, нужное событие срабатывает не тогда, когда Вы ожидаете, или операционная система скрывает оповещение. Выполните /hooks в Claude Code, чтобы увидеть, что загружено, запустите сессию с claude --debug, чтобы увидеть, что на самом деле сделал каждый hook, а затем проверьте настройки уведомлений на компьютере или телефоне. Если Вы используете Claude Code Notifier, команды ccn doctor и ccn test покрывают большую часть этих проверок.
Чек-лист ниже идёт от самой частой причины к самой редкой. Он подходит для Mac, Windows и Linux.
011. Убедитесь, что Claude Code загрузил hook
Введите /hooks в prompt Claude Code. Это просмотр (только для чтения) всех hooks, загруженных Claude Code, с указанием источника каждого: пользовательские настройки, настройки проекта, локальные настройки, плагин или текущая сессия. Выберите hook, чтобы увидеть точную команду и файл, в котором он определён.
Если Вашего hook нет в списке:
- Невалидный JSON. Файлы настроек — это строгий JSON. Висячая запятая или комментарий
//ломают файл, и при следующем запуске Claude Code сообщит о Settings Error. Выполнитеclaude doctor, чтобы увидеть записи, которые Claude Code отклонил. - Файл не в том месте. Личные hooks размещаются в
~/.claude/settings.json(в Windows —%USERPROFILE%\.claude\settings.json). Hooks проекта — в.claude/settings.jsonвнутри проекта. Выполните/statusи посмотрите строкуSetting sources, чтобы узнать, какие файлы загружены. - Неверное имя события. Имена событий чувствительны к регистру:
Notification,Stop,PermissionRequest. Неизвестное имя события отображается как Settings Warning и пропускается. - Hooks отключены.
"disableAllHooks": trueв любом файле настроек отключает все hooks. Если/hooksпоказываетOnly hooks from managed settings run here, Ваша организация включилаallowManagedHooksOnly, и Ваши собственные hooks запускаться не будут. - Изменение не подхватилось. Обычно Claude Code перезагружает настройки сам. Если hook не появился через несколько секунд, перезапустите сессию.
022. Подтвердите доверие к рабочей папке
В интерактивной сессии Claude Code не запускает hooks из любых файлов настроек, включая Ваш ~/.claude/settings.json, пока Вы не подтвердите диалог доверия к папке (workspace trust). Если Вы закрыли этот диалог или находитесь в папке, где ещё ни разу не открывали Claude Code, hooks там работать не будут. Запустите claude в этой папке и подтвердите диалог.
033. Убедитесь, что событие срабатывает тогда, когда Вы ожидаете
Многие «сломанные» уведомления на деле объясняются таймингом. Из справочника по hooks от Anthropic:
Notification с permission_promptЗапрос разрешения ожидает около шести секунд, а Вы ничего не вводили. Каждое нажатие клавиши сбрасывает таймер.Notification с idle_promptПримерно через 60 секунд после того, как Claude закончил, если Вы ничего не вводили и не работает ни один фоновый агент.StopКаждый раз, когда Claude заканчивает ответ. Не срабатывает при прерывании. При ошибках API вместо него срабатывает StopFailure.PermissionRequestВ момент, когда Claude Code собирается запросить у Вас разрешение.Поэтому если Вы тестируете hook Notification, продолжая печатать в terminal, он может так и не сработать. Переключитесь на другое окно и подождите. Чтобы получать оповещение сразу по окончании хода, используйте Stop; подробнее — в руководстве по Stop hook.
Проверьте также режим разрешений. Последние версии Claude Code запускают интерактивные сессии в auto mode, где классификатор одобряет большинство действий без запроса. Нет запроса — нет и уведомления permission_prompt, и hook PermissionRequest не срабатывает. Чтобы протестировать оповещения о разрешениях, нажимайте Shift+Tab, пока в строке состояния не появится manual mode, затем попросите Claude сделать что-то, требующее одобрения. Подробности — в статье о режимах разрешений.
Matchers тоже чувствительны к регистру. Matcher bash для PermissionRequest не совпадёт с инструментом Bash.
044. Запустите команду hook вручную
Скопируйте команду из /hooks и запустите её в terminal с тестовыми входными данными:
echo '{"hook_event_name":"Stop","cwd":"/tmp","last_assistant_message":"done"}' | ./my-hook.sh
echo $?
Типичные ошибки:
command not found: укажите абсолютный путь к скрипту или${CLAUDE_PROJECT_DIR}для скриптов в проекте.- Скрипт вообще ничего не делает: сделайте его исполняемым с помощью
chmod +x ./my-hook.sh. jq: command not found: установитеjqили разбирайте JSON с помощью Python или Node.js.
055. Изучите debug-лог
Запустите Claude Code командой claude --debug. В terminal ничего дополнительного не выводится — лог пишется в ~/.claude/debug/<session-id>.txt. Чтобы задать путь самостоятельно, используйте claude --debug-file /tmp/claude.log и выполните tail -f /tmp/claude.log в другом terminal. Если сессия уже запущена, /debug включит логирование и покажет, где находится лог.
Ищите строки, начинающиеся с Hooks:. В каждой указаны событие, команда, результат (finished with status 0, timed out, failed to start) и время выполнения. Для подробностей о сопоставлении задайте CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose.
Две проблемы видны только здесь:
- Профиль shell что-то выводит. Если
~/.bashrcили~/.zshrcвыполняетecho, а shell его подгружает, этот текст оказывается перед JSON-выводом Вашего hook, и Claude Code воспринимает вывод как обычный текст. Ищите в логеHook output does not start with {. Оберните вывод профиля вif [[ $- == *i* ]]; then ... fi, чтобы он выполнялся только в интерактивных shell. - Нет terminal для вывода. На Mac и Linux command hooks запускаются без управляющего terminal. Hook, который пытается подать звуковой сигнал или записать escape-коды в
/dev/tty, молча завершается неудачей. Используйте вместо этого команду уведомлений рабочего стола или собственную настройку Claude CodepreferredNotifChannel, описанную в руководстве по terminal bell.
066. Проверьте операционную систему
Если в debug-логе указано, что hook завершился со статусом 0, а уведомления Вы так и не увидели, значит, его скрыла операционная система. Проверьте, что приложению, которое показывает уведомление, разрешено это делать и что режим «Фокусирование» (Mac), «Не беспокоить» (Windows) или переключатель «Не беспокоить» в Вашем рабочем окружении Linux выключен. В Linux также должен быть запущен демон уведомлений.
Команды для конкретных платформ приведены в руководствах для macOS, Windows и Linux.
07Если Вы используете Claude Code Notifier
Claude Code Notifier — независимый инструмент (не от Anthropic), который устанавливает небольшую программу ccn в качестве hooks Claude Code. Всё сказанное выше по-прежнему актуально, ведь ccn — такой же hook, как и любой другой. Начните с его собственных проверок:
ccn doctorпроверяет hooks, учётные данные, подключение к серверу и определение присутствия. Сначала исправьте всё, о чём он сообщит.ccn testотправляет тестовое уведомление. Если оно пришло, проблема в событии или настройке, а не в самой цепочке доставки.ccn devicesвыводит список телефонов, сопряжённых с этим компьютером. Если список пуст, выполните сопряжение заново с помощьюccn pair; подробнее — в руководстве по сопряжению.ccn config showвыводит действующие настройки. Убедитесь, чтоnotify_on_done,notify_on_permissionиnotify_on_questionвключены, аquiet_hoursне охватывает текущее время. Настройки, изменённые на телефоне, попадают на компьютер послеccn sync.
Некоторые особенности поведения выглядят как сбои, но задуманы так специально:
- Вы за клавиатурой. Если Вы что-то вводили в последние 30 секунд, ничего не ждёт ответа с телефона и terminal задаёт вопрос как обычно. Если включён
quiet_when_present(по умолчанию), телефон ничего не получает, пока Вы в terminal, где запущен Claude, а если Вы активны в другом приложении — получает информационную карточку. - Дублирующиеся или пропавшие уведомления на Mac. Не запускайте старое приложение для строки меню Mac и
ccnна одном и том же Mac. - Долгий перерыв. Если телефон или компьютер не используется 60 дней, сервер удаляет его сопряжение, и его нужно выполнить заново.
На самом телефоне проверьте, что приложению разрешено показывать уведомления и что их не глушит режим «Фокусирование» (iPhone) или «Не беспокоить» (Android). На Android оптимизация батареи может задерживать уведомления некоторых приложений; если они приходят с опозданием, снимите для приложения ограничения в настройках батареи. Если Вы редактировали settings.json вручную, ccn doctor покажет, на месте ли его hooks. ccn upgrade обновляет программу до последней версии.
08FAQ
Почему мой Notification hook срабатывает только иногда?
Типы permission_prompt и idle_prompt срабатывают, когда кажется, что Вас нет на месте. permission_prompt ждёт около шести секунд без ввода, а idle_prompt — около 60 секунд после того, как Claude закончит. Если Вы печатаете, они откладываются. Для мгновенного сигнала используйте PermissionRequest или Stop.
Где находится debug-лог Claude Code?
Запустите claude --debug, и лог будет записан в ~/.claude/debug/<session-id>.txt. Чтобы выбрать другое место, используйте claude --debug-file <path>, а в уже запущенной сессии — /debug.
ccn test работает, а настоящие уведомления не приходят. Почему?
Цепочка доставки в порядке, так что дело в настройках и времени. Проверьте в ccn config show параметры notify_on_* и quiet_hours, помните, что при включённом quiet_when_present ничего не отправляется, пока Вы в terminal, и проверьте режим разрешений в Claude Code.