本文へスキップ
claudemods

Claude Code の完了通知:トーストとチャイムでお知らせ

Claude の長いターンが終わると「Done in 2m 14s」のトーストと短いチャイムでお知らせ。デスクトップ通知にも対応します。

権限

  • コマンドを実行お使いのマシン上でシェルのプログラムを実行できます($.process.run / spawn)。具体的に何を実行するかはソースで確認してください。
  • UI を変更Claude Code の画面に描画します。バンド、ペイン、ステータス表示、トーストなど(ui.render / $.ui.*)。
  • 音を再生音声の再生やテキストの読み上げができます($.audio.*)。
検証バージョン
v2.1.291
最終検証日
必要バージョン
Claude Code ≥ 2.1.287
表示先
トースト

Claude Code 内でインストール:

/plugin install cm-done-toast --marketplace rotbit/claudemods-marketplace
すべてのインストール方法 ↓

このModでできること

完了トーストは、長いターンが終わったときに Claude Code の完了通知を届ける Mod です。時間のかかったターンが終わると、Done in 2m 14s というトーストが表示され、2 音の短いチャイムが鳴ります。ターンがエラーで終わった場合は、代わりに Stopped on an error after 2m 14s と表示されます。短いターン、中断されたターン、サブエージェントのターンでは何も鳴らないので、この音は「戻ってきてください、回答の準備ができました」という合図になります。

長いタスクの間に別のウィンドウで作業しているなら、システム通知のオプションをオンにしてください。同じメッセージが macOS の通知センターや、Linux の notify-send のポップアップとしても表示されます。Claude Code 2.1.287 以降が必要です。

デモ

録画では、しきい値より長くかかるタスクを Claude に送っています。ターンが完了すると、そのターンにかかった時間を示すトーストが画面下部に表示されます。

インストール

インストールブロックにある方法のいずれかを選んでください。macOS ではそのままで音が鳴ります。システム通知はオプトインです。

$ install cm-done-toast

Claude Code 2.1.287 以上が必要

  1. 1.Claude Code 内で1行

    /plugin install cm-done-toast --marketplace rotbit/claudemods-marketplace

    実行中のセッション(v2.1.275 以降)に貼り付けます。最初に Claude Code がマーケットプレイスの追加を確認します。

  2. 2.シェルから

    claude plugin marketplace add rotbit/claudemods-marketplace
    claude plugin install cm-done-toast@claudemods

    その後、すでに開いているセッションでは /reload-plugins を実行してください。

  3. 3.インストールせずに試す

    git clone https://github.com/rotbit/claudemods-marketplace
    claude --plugin-dir ./claudemods-marketplace/cm-done-toast

    その1セッションだけ Mod を読み込みます。設定には何も追加されません。

仕組み

この Mod のフックは 1 つだけです。hooks/register.ts から抜粋します。

on('turn.complete', async ($, e, next) => {
  const result = await next(e)
  if (!shouldNotify(e, minSeconds)) return result

  const text = toastText(e, includeAnswerPreview)
  $.ui.toast(text)

  if (sound) {
    $.audio.play({ asset: 'sounds/done.wav' }).catch(() => undefined)
  }

  if (systemNotification) {
    platform ??= $.process
      .run(['uname', '-s'], { timeoutMs: 5000 })
      .then(ran => (ran.exitCode === 0 ? parseUname(ran.stdout) : undefined))
      .catch(() => undefined)
    platform
      .then(found =>
        found === undefined ? undefined : $.process.run(notificationArgv(found, 'Claude Code', text), { timeoutMs: 10000 }),
      )
      .catch(() => undefined)
  }

  return result
})

turn.complete は Claude がターンを終えたときに発火します。フックはまず next(e) を await するので、ターンの結果を遅らせることはありません。hooks/format.ts の shouldNotify は、サブエージェントのターン(agentId を持つもの)、中断されたターン、minSeconds より短いターンに対して false を返します。toastText は所要時間を 45s、2m 14s、1h 3m のような形式に整えます。

チャイムは Mod に同梱された sounds/done.wav で、$.audio.play で再生されます。Mod の API にはプラットフォームを示すフィールドも通知用の呼び出しもないため、システム通知がオンのとき、この Mod は一度だけ uname -s を実行して結果をキャッシュします。そのうえで、macOS では osascript -e 'display notification …' を、Linux では notify-send を実行します。引数はシェルを介さず argv 配列として渡されるので、Claude の回答に含まれる引用符によってコマンドが壊されることはありません。音と通知は投げっぱなしで実行され、エラーは握りつぶされます。

カスタマイズ

以下のオプションは /config で変更できます。自分の好きな音を使いたい場合は、Mod フォルダー内の sounds/done.wav を置き換えるか、フック内の asset のパスを変更してください。トーストの文言は hooks/format.ts の toastText から来ており、通知のタイトル 'Claude Code' は notificationArgv の 2 番目の引数です。

設定型デフォルト説明
minSecondsnumber30Minimum turn length (seconds). Only turns at least this long raise the toast, sound and notification.
soundbooleantruePlay a sound. Play a short chime when the turn finishes (macOS only: Claude Code plays clips with afplay).
systemNotificationbooleanfalseSystem notification. Also raise a desktop notification via osascript (macOS) or notify-send (Linux).
includeAnswerPreviewbooleanfalseInclude answer preview. Add the first 80 characters of Claude's answer to the toast and notification.

Claude Code の /config で変更できます。Mod はホットリロードされます。

権限と安全性

UI を変更 はトーストのためのものです。音を再生 はチャイムのためのものです。コマンドを実行 が表示されるのはコード内に $.process.run があるためですが、これが使われるのは systemNotification をオンにしたときだけです。その場合、uname -s を一度実行し、続いて固定の引数で osascript または notify-send を実行します。デフォルト設定では、プロセスは一切起動されません。

この Mod はツール呼び出しへの介入、プロンプトの読み取り、ファイル操作、ネットワークの利用を行いません。無効にするには /plugin disable cm-done-toast を実行します。すべての Mod をオフにしてセッションを始めるには claude --safe-mode を使います。

コマンドを実行
お使いのマシン上でシェルのプログラムを実行できます($.process.run / spawn)。具体的に何を実行するかはソースで確認してください。
UI を変更
Claude Code の画面に描画します。バンド、ペイン、ステータス表示、トーストなど(ui.render / $.ui.*)。
音を再生
音声の再生やテキストの読み上げができます($.audio.*)。

互換性とトラブルシューティング

macOS のターミナル上で Claude Code 2.1.291 にてテスト済みです。ターンが終わっても何も起きない場合は、次を確認してください。

  • claude --version が 2.1.287 以降であること、そして /plugin でこの Mod が有効になっていること。
  • シェルからインストールした後は /reload-plugins を実行すること。
  • ターンが minSeconds より短かった可能性があります。
  • macOS 以外で音が鳴らないのは想定どおりの動作です。
  • macOS でシステム通知がまったく表示されない場合は、システム設定でターミナルアプリの通知を許可してください。
  • Linux でシステム通知を使うには、libnotify(notify-send)をインストールしてください。

よくある質問

短い応答の後に通知が来なかったのはなぜですか?
minSeconds(デフォルトは 30)より短いターンでは通知しません。すべてのターンで通知を受け取りたい場合は、minSeconds を 0 に設定してください。
Linux や Windows で音が鳴らないのはなぜですか?
Claude Code は afplay を使って音声クリップを再生しますが、afplay は macOS にしか存在しません。トーストはどのプラットフォームでも表示されます。
macOS の通知センターに通知を出すにはどうすればよいですか?
/config で systemNotification をオンにしてください。すると、この Mod は macOS では osascript を、Linux では notify-send を実行します。macOS では、ターミナルに通知の送信を許可するかどうかを一度だけ尋ねられることがあります。
サブエージェントでも通知されますか?
いいえ。agentId を持つターンはスキップされ、中断されたターンも同様です。そのため、通知は 1 回の応答につき 1 回だけです。
通知に Claude の回答を含めることはできますか?
includeAnswerPreview をオンにすると、回答の最初の 80 文字が追加されます。この場合、回答の文章がシステムの通知履歴に残るため、デフォルトではオフになっています。
Claude Code で動作中の コンテキストメーター

コンテキストメーター

コンテキストウィンドウの使用率、5 時間・7 日間のプラン使用量、セッションのコストをステータスラインに表示し、上限が近づくと警告します。

  • ステータス
  • トースト
  • UI を変更

v2.1.291 で検証済み

Claude Code で動作中の ツール呼び出しカウンター

ツール呼び出しカウンター

Claude のツール呼び出しをターンごと・セッションごとに数え、スピナーの横に件数を表示。/tally で内訳も確認できます。

  • スピナー
  • トランスクリプト
  • ステータス
  • ツール呼び出しを傍受
  • UI を変更
  • コマンド・ツールを追加

v2.1.291 で検証済み

Claude Code で動作中の プロンプト上の Git ブランチ表示

プロンプト上の Git ブランチ表示

Git のブランチ、変更ファイル数、ahead/behind の状態を Claude Code のプロンプトの上に 1 行で表示します。

  • プロンプト上部
  • コマンドを実行
  • ツール呼び出しを傍受
  • UI を変更

v2.1.291 で検証済み

同じカテゴリの Mod: トーストと通知、タイマー、ToDo、スタンドアップ。