🔊

Claude Codeの利用料金に応じて通知音を変化させてコーディングを楽しくする

に公開2

普段Claude CodeのHooks機能を使って、タスク完了時に通知を受け取るようにしています。
今回は少し遊び心を加えてClaude Codeの利用料金に応じて通知音を変える仕組みを作ってみたので、その内容を紹介しようと思います!

通知の仕組み

仕組みは非常にシンプルで、通知用のシェルスクリプトを作成し、タスク完了時にそのスクリプトを実行するだけです。
Claude CodeのHooks機能で、タスク完了時や確認要求時などにコマンドやシェルスクリプトを実行できるので、作成したシェルスクリプトを実行するように設定することで実現しました。

https://docs.anthropic.com/ja/docs/claude-code/hooks-guide

ディレクトリ構成

通知用のスクリプト、音声ファイル、Claude Codeの設定ファイルの3つを用意しました。

.claude/
├── hooks
│   └── notify.sh
├── sounds
│   ├── high.wav
│   ├── low.wav
│   └── medium.wav
└── settings.json

Hooksの設定

タスク完了時(Stop)と確認要求時(Notification)にスクリプトを実行するように、settings.jsonにHooksの設定を定義してます。

settings.json
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/notify.sh"
          }
        ]
      }
    ],
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/notify.sh"
          }
        ]
      }
    ]
  }
}

通知用のスクリプト

スクリプトでは下記の流れで処理を行っています。

  1. 現在のClaude Codeの利用料金を取得
  2. 料金に応じて再生する音声ファイルを選択
  3. 選択した音声ファイルの再生とMacの通知を表示

利用料金はccusageというツールを使って取得しています。
ccusageはClaude Codeの様々な利用状況を取得できるツールで、その中に従量課金だった場合の利用金額が含まれています。
オプション指定でJSON形式で出力できるので、今日の利用状況をJSON形式で取得し、jqコマンドで金額部分を抽出しています。

閾値や音声ファイルは好みで変更できます。

https://github.com/ryoppippi/ccusage

notify.sh
#!/bin/zsh

# 料金の閾値
HIGH_THRESHOLD=20.0
MEDIUM_THRESHOLD=5.0

# 音声ファイルのパス
SOUND_DIR="$HOME/.claude/sounds"
SOUND_LOW="low.wav"
SOUND_MEDIUM="medium.wav"
SOUND_HIGH="high.wav"

# ccusageで今日の利用料金を取得
cost=$(npx ccusage@latest --since $(date +%Y%m%d) --json | jq -r ".totals.totalCost // 0")

# 料金に応じて音声ファイルを選択
if (( $(echo "$cost >= $HIGH_THRESHOLD" | bc -l) )); then
    sound="$SOUND_DIR/$SOUND_HIGH"
elif (( $(echo "$cost >= $MEDIUM_THRESHOLD" | bc -l) )); then
    sound="$SOUND_DIR/$SOUND_MEDIUM"
else
    sound="$SOUND_DIR/$SOUND_LOW"
fi

# 音声再生と通知表示を実行
afplay "$sound" 2>/dev/null &
osascript -e "display notification \"Claude Codeのタスクが完了しました\" with title \"Claude Code\"" 2>/dev/null &

音声について

今回は音声にポケモンの勝利音を使用することにしました。
Pokémon Game Sound Libraryというサイトで、ポケモンゲームの効果音をダウンロードすることができます。

各勝利音の序盤1~2秒程度の部分を切り出して、3つの音声ファイルを作成しました。
low->highになるに従って、勝利音も徐々に豪華になるようにピックアップしてます!

下記のURLから音声を聞けるので、興味がある方は聞いてみてください。

https://soundlibrary.pokemon.co.jp/temochi/4199-2615-8449-2419?version=logo&word1=0&word2=0&list=rg-8_rg-16_rg-29&number=4199-2615-8449-2419&lang=ja

まとめ

Claude Codeの利用料金に応じて通知音を変える仕組みを作ってみました。
普段のコーディングがより楽しくなったので、皆さんもぜひ試してみてください!

株式会社ドクターズプライム

Discussion

nnnwannnwa

なんか可愛い取り組みですね!笑 すごく良いと思います、参考になります!