Як змусити Claude Code казати «няв-няв» 🐈 (hook edition)

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Як фронтенд-розробниця в Sombra, я майже весь день живу в терміналі та IDE. І як Єлена чекала, поки Деймон перестане творити якусь діч, так і я сиділа й дивилася на термінал Claude Code.

Дивилася, чекала, потім знову дивилася — і знову чекала.

У якийсь момент я подумала:

Та ну його в біса.

Я відкрила внутрішній термінал свого мозку й виконала команду:

> /research "how to stop staring at Claude Code"

Thinking... Searching...

Found 1 solution.

🐈 Cats

План був ідеальний.

Мені потрібно було вирішити дві задачі:

  • 🐈‍⬛ повідомляти, коли Claude завершив роботу;
  • 🐈 повідомляти, коли йому потрібен мій дозвіл і він терпляче чекає.

І бонусом — зробити робочий процес трохи менш стресовим.

Так народилися котячі звукові хуки.

Як це працює

Дві hook-події в ~/.claude/settings.json запускають shell-скрипти.

ПодіяСкриптКоли спрацьовує
Stopplay-success.shClaude завершив відповідь
PermissionRequestplay-permission.shClaude очікує вашого дозволу

Обидва запускаються з "async": true, тому звук відтворюється у фоновому режимі й не затримує відповідь Claude або появу запиту на дозвіл.

Структура файлів

~/.claude/
  settings.json
  hooks/
    _play.sh              <- спільний helper
    play-success.sh
    play-permission.sh
    sounds/
      success.mp3
      permission.mp3

Крок 1. Додаємо котячі голоси

Покладіть .mp3 файли у:

~/.claude/hooks/sounds/

Якщо якогось файлу немає — нічого страшного. Хук просто мовчки пропустить його без жодних помилок.

💡 Порада. Я використовую два різні нявкання:

  • 😸 радісне муркотливе — коли Claude успішно завершив роботу;
  • 😿 трохи схвильоване — коли він чекає на мій дозвіл.

Через кілька годин мозок уже автоматично розрізняє ці два звуки.

Крок 2. Створюємо спільний helper _play.sh

#!/usr/bin/env bash
SOUNDS_DIR="$HOME/.claude/hooks/sounds"

play_sound() {
  local name="$1"
  local file="$SOUNDS_DIR/${name}.mp3"
  [ -f "$file" ] || return 0

  if command -v afplay &>/dev/null; then
    # macOS
    afplay "$file" &>/dev/null &
  elif command -v powershell.exe &>/dev/null; then
    # Windows (Git Bash) — convert /c/Users/... to C:/Users/...
    local win_path
    win_path=$(echo "$file" | sed 's|^/\([a-zA-Z]\)/|\1:/|')
    win_path="${win_path^}"
    powershell.exe -NoProfile -NonInteractive -c "
      Add-Type -AssemblyName PresentationCore
      \$m = New-Object System.Windows.Media.MediaPlayer
      \$m.Open([uri]'file:///$win_path')
      \$m.Play()
      Start-Sleep -Milliseconds 500
      while (\$m.NaturalDuration -eq [System.Windows.Duration]::Automatic) {
        Start-Sleep -Milliseconds 100
      }
      Start-Sleep -Milliseconds \$m.NaturalDuration.TimeSpan.TotalMilliseconds
      \$m.Stop()
    " &>/dev/null &
  fi
}

Він відповідає лише за одну річ — знайти потрібний .mp3 і відтворити його незалежно від того, працюєте ви на macOS чи Windows.

Крок 3. Створюємо два хуки

play-success.sh

#!/usr/bin/env bash
source "$HOME/.claude/hooks/_play.sh"
play_sound "success"

play-permission.sh

#!/usr/bin/env bash
source "$HOME/.claude/hooks/_play.sh"
play_sound "permission"

Тепер кожен хук складається буквально з двох рядків.

Крок 4. Підключаємо все до Claude

Додаємо хуки у ~/.claude/settings.json:

{
  "hooks": {
    "Stop": [
      {
        "matcher": ".*",
        "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/play-success.sh", "async": true }]
      }
    ],
    "PermissionRequest": [
      {
        "matcher": ".*",
        "hooks": [{ "type": "command", "command": "bash ~/.claude/hooks/play-permission.sh", "async": true }]
      }
    ]
  }
}

І все.

Перевіряємо

Спочатку перевірте скрипти окремо:

bash ~/.claude/hooks/play-success.sh
bash ~/.claude/hooks/play-permission.sh 

Після цього достатньо виконати будь-який запит у Claude.

Закінчив відповідь?

😸 Няв.

Попросив дозвіл?

😿 Няв.

Результат

Тепер я можу спокійно перемикатися між вкладками, поки Claude виконує команди. Мені більше не потрібно кожні десять секунд заглядати в термінал і перевіряти, чи він уже закінчив, чи просто мовчки чекає дозволу.

Кіт сам усе скаже.

І, на відміну від Єлени, мені більше не доводиться чекати цілими сезонами 💁‍♀️🐈

👍ПодобаєтьсяСподобалось19
До обраногоВ обраному7
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Хороший практичний приклад із hooks! Варто ще додати, що через ці ж механізми можна будувати повноцінні системи моніторингу та аудиту дій агента — логувати кожен tool call із таймстемпом і результатом. Це особливо актуально, коли намагаєшся зрозуміти реальну автономність агента перед тим, як пускати його в production. До речі, є непогане дослідження про те, як взагалі вимірювати цю автономність перед довіреним запуском у бізнес-процеси: — може бути корисним доповненням до теми.

Геніально! Скільки вже продаж? Антропік вже викупив? О! Мерщій до патентного бюро!
І взагалі — трушні кодери GUI не використовують.

ухти! і наскільки підняли собі самооцінку цим коментарем?

Цим коментарем я просто накидав вам корисних словосполучень. Як не дивно, але получилося дуже схожим на пароплав сарказму від злого ображеного на життя невдахи.
Може не виспався... Взагалі я просто хотів підтримати, надати орігінальний зворотній зв’язок.

Я помилився. Дуже сильно. Що б я зараз не написав, все одно виглядатиме не гарно. Треба було спочатку всі коменти у топіку прочитати. Піду просплюся.

Прикольна ідея з котячими мяу.
Бо коли багато працюєш в форматі планування чи діалогу, або коли кілька агентів паралельно, то довгі шаблонні тексти можуть набридати.
Для себе зробив, щоб він присилав push-notification, який видно поверх всіх вікон.

Але якщо хтось поділиться як реалізувати гарний не дуже шаблонний TTS — теж би потестив.

я користуюсь для цього плагіном peon-ping, він голосом peon ork з warcraft 3 все озвучує. є й купа інших голосових паків

Знайшов там прикольний україномовний пак зі Stalker

я з нього і починала, але коли дійшло до вибору озвучки зрозуміла, що толком мені жодна не подобаєтсья, а погоджуватись на менше я не звикла 😁 тому і вирішила розробити щось під себе

ооо, ще ідея — саунд пак з цитатами Бората:
Типу спавнить сабагента — «пашьол, пашьол, жіві свая жізнь»
Коли він завершує якісь степи ресьочру чи обробки — «нраіццца», «ай хараша»
Коли закинув задач на 5+ пунктів то «царь ва дварца царь ва дварца хаді туда дєлай ета»
Коли віддає результати ресьорчів то щоб казав щось типу «доктор Ямак утверждает что...»

ахахахаха це би дійсно могло додати родзинки в процес розробки 😁, до речі, а може ти чув за плагін Mytets, який змушує Claude Code спілкуватися в стилі творів Подерев’янського?

Идея отличная! Жаль я с клодом на инглише общаюсь (ну типа если кому-то надо описать проблему, найденную клодом, то мне проще скопипастить уже готовый подробный текст, недели перефразировать). Так бы, наверное, поставил ))

Да, идея норм, я тоже дошёл до аналогичной. Только к котам я равнодушен, поэтому у меня он просто через TTS говорит, что именно сделал. Ну и «Claude needs your permissions» в случае запроса.
Только будет, по-моему, та же грабля, что и у меня в предыдущей версии, при запуске субагентов: когда он их запускает, то оркестратор вываливается в idle, таким образом, будет лишний мяв. Надо считать кол-во агентов и, если их больше 0 — то не мявкать.

Ещё насчёт пермишенов, можно сделать прикольное решение: в дефолтном пермишен файле разрешить вообще всё, но добавить хук на delete (+ Bash rm *, + git rm *), чтоб не закилял проект случайно. В таком случае кол-во ненужных мявов будет значительно уменьшено ))

дякую за ідеї апгрейду мого кошеня 😸 ідеї з TTS та subagents просто топ, а hook для небезпечних подій змахує на щось типу котячого фаєрволу 🐈 забираю в скарбничку для наступної версії 📝✨

Если хочется похулиганить, ещё 1 идея в копилку, правда, надо подумать, как реализовать, я не силён в обработке звука :)
Как сделать «Claude needs your input» мявом — в общем-то, несложно: это статическая фраза, её можно прогнать через какую-нить нейронку (многие умеют фришные использования, например, 101soundboards.com) и найти такую, которая сумеет конвернтнуть с мявом, конвертнуть и скачать в mp3.
Сделать так, чтоб он мявом произносил summary — уже сложнее.
Напрашивается какая-нить нейронка, которая вызывается по API — но это требует аккаунта и денег. Можно попытаться сделать искажениями звука — но тут надо уже смотреть :)

мені здається, ми щойно випадково придумали продукт 😸 summary-мяв-перекладач тягне на окремий плагін і, можливо, навіть монетизацію 🐈

А TTS якийсь шаблонний чи з контекстом того, що йому треба?
Чим реалізований?

p.s. «хук на delete» та інші заборонені команди мають бути завжди при старті проекту

TTS абсолютно стандартный. Движок уже есть в винде и доступен из powershell.
Т.е., на вход — фраза, на выходе — звук.
Есть 3 дефолтных голоса (2М, 1Ж). Можно ещё играться со скоростью, тембром и другими параметрами — но возможности довольно ограничены. Паваротти из них не сделать, я пытался :)

хук на delete" та інші заборонені команди мають бути завжди при старті проекту

Именно так. У меня впилены в глобальный конфиг клода.

а фраза на вхід може бути в залежності від контексту, чи просто на кожен хук своя захардкоджена? типу «треба дозвіл» чи «я завершив».

Любая. Ты просто на вход подаёшь текст — движок его произносит.
У меня есть 2 типа:
1. Хардкод «Claude needs your input» — когда ему надо нажать что-то или ответить на вопрос
2. Фраза, когда он заканчивает — короткий summary типа «сделал вот это»

Имплементировано так:
1. Есть ps1 файл, который на вход берёт текст и прогоняет через TTS с указанными настройками.
2. Каждый хук просто вызывает этот ps1 с тем, что ему надо

мені треба гачі-версія цього

а ще щоб воно робило цей мемний звук ffuuuuck коли стикається з помилками або реквестить доступ

пфф, легко 😸 просто заміни мої плейсхолдери зі звуками на свої, а для помилок можна використати PostToolUseFailure hook

Лично мне проще с Claude Desktop, там нотификации присутствуют.

Claude Desktop має нотифікації. IDE-плагіни теж мають нотифікації. Але вибір звуків, як на мене, досить бідненький. А котячих немає взагалі 🐈

Підписатись на коментарі