Файл дня

Хук для Claude Code, который звуком говорит, чей следующий ход

Слава Сажин 29.09.2026 2 мин чтения

Stop-хук для Claude Code заканчивает ответ коротким тоном: звонким, когда работа сделана, и ниже, когда нужны ваше решение или действие.

Сегодня в «Файле дня» хук для Claude Code для тех, кто даёт Claude задачу и уходит в другое окно. Дальше вы либо заглядываете каждые несколько минут, не закончил ли он, либо Claude полчаса ждёт «да», о котором спросил в последней строке. Хук заканчивает ответ коротким тоном, и по тону понятно, что из двух: работа сделана или Claude нужны вы.

Как он работает

Перед последним сообщением Claude пишет одно слово в файл-сигнал своей сессии, /tmp/claude_signal_<номер сессии>. done значит, что работа закрыта и от вас ничего не нужно: звонкий тон. need значит, что ход за вами: решение, доступ, действие руками или взгляд на результат: тон ниже. Когда ответ закончен, Stop-хук читает слово, играет тон и стирает файл. Нет файла или файл пуст - тишина. Непонятное слово считается need: лишний зов обойдётся дешевле пропущенного.

Тон, а не голос, потому что голос слышат и соседи, а тон несёт ровно один смысл. Claude хук никогда не останавливает: звук - его единственное действие.

Что поменять под себя

Часы тишины: с 20 до 9 по часам компьютера хук молчит, а инструкция ниже ставит ваши, например с 22 до 8. Звуки делаются из системных звуков macOS Glass и Purr и играются через afplay. Если компьютер не Mac, инструкция просит Claude заменить afplay на проигрыватель вашей системы.

Как поставить

Один файл кладётся в ~/.claude/hooks/ и подключается в ~/.claude/settings.json как хук Stop. Дальше по инструкции ниже Claude делает два звука, проверяет, что есть jq, записывает в ~/.claude/CLAUDE.md правило последним действием писать слово и разрешает без подтверждения две вещи: запись в файл-сигнал и команду echo $CLAUDE_CODE_SESSION_ID, которой Claude узнаёт номер сессии. Без второго разрешения Claude Code в конце каждого ответа ждёт вашего подтверждения этой команды, потому что в ней есть $. Потом перезапустите Claude Code. Проверка: попросите Claude записать need, и после ответа прозвучит низкий тон, потом то же с done и звонкий.

Файлы

zvukovoy-signal.sh 3 КБ Скачать
#!/bin/bash
# Stop-хук: короткий звук в конце ответа Claude говорит, чей следующий шаг.
# Голос слышат соседи и он раздражает, а тон несёт ровно один смысл.
#
# Сигнал не звучит по таймеру. Звучит только если Claude перед последним
# сообщением положил слово в файл-сигнал /tmp/claude_signal_<session_id>:
#   done - работа закрыта, от вас ничего не нужно (звонкий тон);
#   need - дальше нужны вы: решение, доступ, действие руками, взгляд (тон ниже).
# Нет файла или файл пуст - хук молчит.
# Непонятное слово считается need: лишний зов вы переживёте,
# а пропущенный оставит вас ждать у молчащего окна.
# Никогда не блокирует (exit 0): звук - единственное действие.

INPUT=$(cat)
SID=$(echo "$INPUT" | jq -r '.session_id // "default"' 2>/dev/null)
[ -z "$SID" ] && SID="default"

SOUND_DIR="$HOME/.claude/sounds"

# Часы тишины: с TIHO_S до TIHO_DO по времени компьютера звука нет.
TIHO_S=20
TIHO_DO=9

# 10# - десятичный разбор, иначе 08 и 09 читаются как неверное восьмеричное.
h=$((10#$(date +%H)))
# Тишина через полночь (с 22 до 8) и внутри суток (с 1 до 6) считаются по-разному.
if [ "$TIHO_S" -gt "$TIHO_DO" ]; then
    { [ "$h" -ge "$TIHO_S" ] || [ "$h" -lt "$TIHO_DO" ]; } && exit 0
else
    { [ "$h" -ge "$TIHO_S" ] && [ "$h" -lt "$TIHO_DO" ]; } && exit 0
fi

# Файл-сигнал со словом. Нет слова - молчим.
SIGNAL_FILE="/tmp/claude_signal_${SID}"
[ -f "$SIGNAL_FILE" ] || exit 0

# Слово: первое слово первой непустой строки, не длиннее 32 байт, строчными.
# Знак возврата каретки убираем, иначе слово из файла Windows не совпадёт.
# Пустой файл - не сигнал: стираем и молчим.
MARK=$(head -c 32 "$SIGNAL_FILE" | tr -d '\000\r' | tr -s ' \t\n' '\n' | grep -m 1 . | tr '[:upper:]' '[:lower:]')
if [ -z "$MARK" ]; then
    rm -f "$SIGNAL_FILE"
    exit 0
fi

case "$MARK" in
    done) FILE="$SOUND_DIR/done.wav" ;;
    *)    FILE="$SOUND_DIR/need.wav" ;;
esac

# Звука нет - слово не стираем: сигнал сыграет, как только звуки вернутся на место.
[ -f "$FILE" ] || exit 0
rm -f "$SIGNAL_FILE"

nohup afplay "$FILE" >/dev/null 2>&1 &
exit 0
kak-postavit.md 3 КБ Скачать
# Как поставить звуковой сигнал

1. Попросите Claude: «Положи скачанный файл zvukovoy-signal.sh в папку ~/.claude/hooks/ и сделай его исполняемым».
2. Попросите Claude: «Сделай в папке ~/.claude/sounds два коротких звука: done.wav из системного звука Glass и need.wav из системного звука Purr».
3. Попросите Claude: «Подключи ~/.claude/hooks/zvukovoy-signal.sh в ~/.claude/settings.json как хук Stop».
4. Попросите Claude: «Запиши в ~/.claude/CLAUDE.md правило: когда сдаёшь работу, последним действием перед ответом узнай номер сессии командой echo $CLAUDE_CODE_SESSION_ID и запиши инструментом записи файлов одно слово в файл /tmp/claude_signal_<номер сессии>: done, если от меня ничего не нужно, или need, если нужны моё решение, доступ или действие».
5. Попросите Claude: «Разреши в ~/.claude/settings.json без подтверждения запись в файлы /tmp/claude_signal_* и /private/tmp/claude_signal_* и команду echo $CLAUDE_CODE_SESSION_ID правилами Edit(//tmp/claude_signal_*), Edit(//private/tmp/claude_signal_*) и Bash(echo $CLAUDE_CODE_SESSION_ID)».
6. Попросите Claude: «Проверь, что на компьютере есть jq, а если нет, поставь его».
7. Попросите Claude: «В файле ~/.claude/hooks/zvukovoy-signal.sh поставь мои часы тишины: с 22 до 8».
8. Если компьютер не Mac, попросите Claude: «В файле ~/.claude/hooks/zvukovoy-signal.sh замени afplay на проигрыватель звука моей системы».
9. Перезапустите Claude Code.

Проверка вне часов тишины:

1. Попросите Claude: «Запиши слово need в файл сигнала этой сессии и ответь одной строкой».
2. После ответа звучит низкий тон.
3. Попросите Claude то же самое со словом done.
4. После ответа звучит звонкий тон.

Статья стоила вашего времени?

Все мастер-классы по одной подписке

Записи мастер-классов и файлы к ним, новые выходят каждую неделю. €10 в месяц.

Все мастер-классы

Связаться с командой Combobulating