Claude Codeの通知に"自分の指示内容"を含められるプラグインを作った

こんにちは、Claude Codeにハマっているmorimorikochanです

Claude Codeを複数セッション並行で走らせていると、通知が来ても「どのセッションの通知?」となりがち。 そこで、通知の本文にユーザーの最後の指示内容を表示できるプラグインを作ってみた。

何が嬉しいのか

Claude Codeにはhooksという仕組みがあり、特定のイベント発生時にシェルスクリプトを実行できる。 osascriptでmacOS通知を出す方法は既に世の中に出回ってるが、通知の中身が「Claude Codeが確認待ちです」だけだと、複数セッションを並行で回しているときにどのセッションの通知かわからない。

このプラグインでは、通知本文に 自分が最後に送った指示内容(先頭100文字) を表示する。 例えば「カートページのバリデーション追加して」という指示を出していたなら、通知にそのまま表示される。これでどの作業に対する通知なのか一目でわかる。

/img/2026-03-08/image.png

通知に自分の指示内容が表示される

仕組み

Claude Codeはセッションの会話ログを ~/.claude/projects/ 配下にjsonlファイルとして保存している。 hookにはセッションIDが渡されるので、そこからログファイルを特定し、tail -r | grep -m1 で最後のユーザーメッセージを取得している。

6MB超のログファイルでも約25msで取得できるので、通知の遅延は体感できないレベルだ。

また、スキル(/frontend-design 等)を実行した場合、直近のメッセージはスキルのプロンプトが展開されており、そこからスキル名の判断が困難だったので、 [meta] {さらにその前のユーザー入力} として表示するようにしている。

導入方法

GitHubにpublishしたので、Claude Code上で以下のコマンドを実行するだけで導入できる。 前提として jq が必要なので、未インストールなら brew install jq しておくこと。

# マーケットプレイスとしてリポジトリを追加
claude plugin marketplace add diggymo/cc-plugin

# プラグインをインストール
claude plugin install notify

Notification と Stop の違い

このプラグインは2つのイベントに対応している。

  • Notification: Claude Codeがユーザーの確認を必要としているとき(権限の確認、入力待ちなど)に発火する。通知サブタイトルに permission_promptidle_prompt などの種別が表示される。
  • Stop: Claude Codeが応答を完了したときに発火する。長い処理を待っているときに「終わったよ」と教えてくれる。

それぞれ通知音も分けていて(NotificationはGlass、StopはSubmarine)、音だけでもどちらのイベントか判別できるようにしている。 通知音は環境変数で変更可能だ。.claude/settings.jsonenv に追記すればいい。

{
  "env": {
    "CLAUDE_CODE_SOUND_NOTIFICATION": "Glass",
    "CLAUDE_CODE_SOUND_STOP": "Submarine"
  }
}

利用可能なサウンド: Basso Blow Bottle Frog Funk Glass Hero Morse Ping Pop Purr Sosumi Submarine Tink

プラグインの構成

リポジトリ自体がマーケットプレイスとして機能する構造になっている。

cc-plugin/
├── .claude-plugin/
│   └── marketplace.json   # マーケットプレイス定義
├── README.md
└── plugins/
    └── notify/
        ├── .claude-plugin/
        │   └── plugin.json   # プラグインメタデータ
        └── hooks/
            ├── hooks.json    # hookイベントの定義
            └── notify.sh     # 通知ロジック本体

hookの定義はシンプルで、Notification/Stopの両方から同じスクリプトを呼び出している。

{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "bash ${CLAUDE_PLUGIN_ROOT}/hooks/notify.sh",
            "async": true
          }
        ]
      }
    ]
  }
}

async: true にしているので、通知処理がClaude Codeの応答をブロックすることはない。

リポジトリ: https://github.com/diggymo/cc-plugin

まとめ

  • 他にも色々自前で作ってるプラグインがあるから移行したい

See also