Claude Codeの「待ち時間」「放置時間」問題
基本の通知設定がまだの方へ
通知リマインダの仕組み
使用するイベント
動作の流れ
実装
notify-idle.sh(音声通知+リマインダ起動)
既存のリマインダがあればkill
即時通知(バックグラウンドで実行し、hookをブロックしない)
リマインダループ(120秒ごと)
cancel-idle.sh(リマインダ停止)
実行権限の付与
settings.jsonの設定
実装のポイント
パイプの切り離しが必須
PIDファイルによるプロセス管理
リマインド間隔の調整
Agent Teams対応:チームメンバー名も読み上げる
チーム関連のHooksイベント
notify-idle.shの拡張
stdinからJSONを読み取り、teammate_nameを抽出
teammate_nameがあればメッセージに含める
既存のリマインダがあればkill
即時通知
リマインダループ
settings.jsonへの追加
読み上げの例
コピペで導入:Claude Code用セットアッププロンプト
stdinからJSONを読み取り、teammate_nameを抽出(agent teams対応)
まとめ
https://s3.ap-northeast-1.amazonaws.com/hanzochang.com/_v2/1770701250089_eaz028bl2ee.png

[並列作業] ClaudeCodeに声でリマインダさせて、待ち時間放置時間をゼロに!

Claude Codeが完了や質問待ちになったら音声で喋って教えてくれる。さらに放置が続けば繰り返しリマインド、応答したら自動停止。Hooksとsayコマンドで実装する通知リマインダをプロンプト付きで解説。

公開日2026.02.10

更新日2026.02.10

AI

Claude Codeの「待ち時間」「放置時間」問題

Claude Codeを複数ターミナルで並列に動かす運用は生産性が高い反面、ある問題が起こります。

フロントの修正、APIのリファクタ、テストの追加──3つのセッションを同時に走らせていると、あるセッションが完了したことに気づかず数分〜十数分放置してしまう。通知音を設定していても、別の作業に集中していると1回の音は聞き逃しがちです。

この「待ち時間」「放置時間」の積み重ねが、並列作業の生産性を大きく下げています。

この記事では、Claude CodeのHooks機能とsayコマンドを使ってClaude Codeに喋らせて状況を教えてもらい、放置が続けば繰り返しリマインドし、応答したら自動で止まる仕組みを実装します。

⚡ 今すぐ設定したい方へ

Claude Codeにコピペするだけで設定が完了するプロンプトを用意しました。 → セットアッププロンプトへジャンプ

基本の通知設定がまだの方へ

この記事はアイドルリマインダに特化した内容です。Claude Codeの基本的な通知音設定(効果音+プロジェクト名読み上げ)がまだの方は、先にこちらの記事を参考にしてください。

Claude Codeの進捗を「音+案件名」で通知する

通知リマインダの仕組み

3つのHooksイベントを組み合わせて、Claude Codeに喋らせます。

使用するイベント

イベント発火タイミング役割
Stop
タスク完了時
音声通知+リマインダ起動
Notification
質問・確認待ち時
音声通知+リマインダ起動
PreToolUse
ユーザー応答後、ツール実行前
リマインダ停止

動作の流れ

[タスク完了] → 音声通知(効果音+「my-app 完了」と喋る)
              2分経過 → リマインド(Ping音+「my-app まだ待っています」)
              2分経過 → リマインド
              ...繰り返し...
          [ユーザーが応答] → PreToolUse発火 → リマインダ停止

PreToolUseがポイントです。Claude Codeがツールを使う直前に発火するイベントなので、「ユーザーが戻ってきてClaude Codeが再び動き出した」タイミングを検知できます。

実装

2つのシェルスクリプトを作成し、settings.jsonで接続します。

notify-idle.sh(音声通知+リマインダ起動)

~/.claude/scripts/notify-idle.sh として保存します。

#!/bin/bash
SOUND="${1:-Hero}"
MESSAGE="${2:-完了}"
PROJECT="$(basename "$PWD")"
PIDFILE="/tmp/claude-idle-$(echo "$PWD" | md5).pid"

# 既存のリマインダがあればkill
if [ -f "$PIDFILE" ]; then
  kill "$(cat "$PIDFILE")" 2>/dev/null
  rm -f "$PIDFILE"
fi

# 即時通知(バックグラウンドで実行し、hookをブロックしない)
(
  afplay "/System/Library/Sounds/${SOUND}.aiff"
  say "${PROJECT} ${MESSAGE}"
) > /dev/null 2>&1 &

# リマインダループ(120秒ごと)
(
  while true; do
    sleep 120
    afplay /System/Library/Sounds/Ping.aiff
    say "${PROJECT} まだ待っています"
  done
) > /dev/null 2>&1 &

echo $! > "$PIDFILE"

cancel-idle.sh(リマインダ停止)

~/.claude/scripts/cancel-idle.sh として保存します。

#!/bin/bash
PIDFILE="/tmp/claude-idle-$(echo "$PWD" | md5).pid"

if [ -f "$PIDFILE" ]; then
  kill "$(cat "$PIDFILE")" 2>/dev/null
  rm -f "$PIDFILE"
fi

実行権限の付与

chmod +x ~/.claude/scripts/notify-idle.sh ~/.claude/scripts/cancel-idle.sh

settings.jsonの設定

~/.claude/settings.jsonhooksに以下を追加します。

{
  "hooks": {
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/notify-idle.sh Hero 完了"
          }
        ]
      }
    ],
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/notify-idle.sh Glass 質問があります"
          }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/cancel-idle.sh"
          }
        ]
      }
    ]
  }
}

実装のポイント

パイプの切り離しが必須

> /dev/null 2>&1 & でバックグラウンドプロセスのstdout/stderrを切り離しています。これを省略すると、バックグラウンドプロセスが親のパイプを握り続け、Claude Codeのhookシステムが完了を待ち続けてフリーズします。

PIDファイルによるプロセス管理

PIDファイル名に$(echo "$PWD" | md5)を使うことで、プロジェクトごとに独立したリマインダを管理できます。プロジェクトAの完了通知がプロジェクトBのリマインダを停止してしまう、といった問題が起きません。

リマインド間隔の調整

sleep 120(120秒=2分)がデフォルトのリマインド間隔です。頻繁すぎると感じたら値を大きく、もっと早く気づきたい場合は小さくしてください。

Agent Teams対応:チームメンバー名も読み上げる

Claude Codeのagent teams機能で複数のteammateを協調させている場合、「どのメンバーが完了したか」も知りたくなります。

Hooksはstdinにイベント情報のJSONを受け取ります。チーム関連のイベントにはteammate_nameが含まれるため、これを読み取ってメッセージに含めることができます。

チーム関連のHooksイベント

イベント発火タイミング含まれる情報
TeammateIdle
teammateがアイドル状態になった時
teammate_name, team_name
TaskCompleted
teammateがタスクを完了した時
teammate_name, team_name, task_subject

notify-idle.shの拡張

stdinのJSONからteammate_nameを抽出する処理を追加します。

#!/bin/bash
SOUND="${1:-Hero}"
MESSAGE="${2:-完了}"
PROJECT="$(basename "$PWD")"
PIDFILE="/tmp/claude-idle-$(echo "$PWD" | md5).pid"

# stdinからJSONを読み取り、teammate_nameを抽出
INPUT=$(cat 2>/dev/null || echo "{}")
TEAMMATE=$(echo "$INPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('teammate_name',''))" 2>/dev/null)

# teammate_nameがあればメッセージに含める
if [ -n "$TEAMMATE" ]; then
  SAY_MESSAGE="${PROJECT} ${TEAMMATE} ${MESSAGE}"
  REMIND_MESSAGE="${PROJECT} ${TEAMMATE} まだ待っています"
else
  SAY_MESSAGE="${PROJECT} ${MESSAGE}"
  REMIND_MESSAGE="${PROJECT} まだ待っています"
fi

# 既存のリマインダがあればkill
if [ -f "$PIDFILE" ]; then
  kill "$(cat "$PIDFILE")" 2>/dev/null
  rm -f "$PIDFILE"
fi

# 即時通知
(
  afplay "/System/Library/Sounds/${SOUND}.aiff"
  say "${SAY_MESSAGE}"
) > /dev/null 2>&1 &

# リマインダループ
(
  while true; do
    sleep 120
    afplay /System/Library/Sounds/Ping.aiff
    say "${REMIND_MESSAGE}"
  done
) > /dev/null 2>&1 &

echo $! > "$PIDFILE"

settings.jsonへの追加

既存のhooksにTeammateIdleTaskCompletedを追加します。

{
  "hooks": {
    "TeammateIdle": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/notify-idle.sh Ping アイドル状態です"
          }
        ]
      }
    ],
    "TaskCompleted": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/scripts/notify-idle.sh Hero タスク完了"
          }
        ]
      }
    ]
  }
}

読み上げの例

イベント通常agent teams利用時
Stop
「my-app 完了」
「my-app 完了」
TeammateIdle
-
「my-app researcher アイドル状態です」
TaskCompleted
-
「my-app implementer タスク完了」
リマインド
「my-app まだ待っています」
「my-app researcher まだ待っています」

agent teamsを使っていない場合はteammate_nameが空になるため、今まで通りプロジェクト名だけが読み上げられます。既存の設定と完全に互換です。

コピペで導入:Claude Code用セットアッププロンプト

以下のプロンプトをClaude Codeにそのまま貼り付ければ、スクリプトの作成からsettings.jsonの設定まで自動で行ってくれます。

Claude Codeの通知リマインダをセットアップして。以下の通りに実装してほしい。

■ 1. ~/.claude/scripts/notify-idle.sh を作成(実行権限付き)

#!/bin/bash
SOUND="${1:-Hero}"
MESSAGE="${2:-完了}"
PROJECT="$(basename "$PWD")"
PIDFILE="/tmp/claude-idle-$(echo "$PWD" | md5).pid"

# stdinからJSONを読み取り、teammate_nameを抽出(agent teams対応)
INPUT=$(cat 2>/dev/null || echo "{}")
TEAMMATE=$(echo "$INPUT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('teammate_name',''))" 2>/dev/null)

if [ -n "$TEAMMATE" ]; then
  SAY_MESSAGE="${PROJECT} ${TEAMMATE} ${MESSAGE}"
  REMIND_MESSAGE="${PROJECT} ${TEAMMATE} まだ待っています"
else
  SAY_MESSAGE="${PROJECT} ${MESSAGE}"
  REMIND_MESSAGE="${PROJECT} まだ待っています"
fi

if [ -f "$PIDFILE" ]; then
  kill "$(cat "$PIDFILE")" 2>/dev/null
  rm -f "$PIDFILE"
fi

(
  afplay "/System/Library/Sounds/${SOUND}.aiff"
  say "${SAY_MESSAGE}"
) > /dev/null 2>&1 &

(
  while true; do
    sleep 120
    afplay /System/Library/Sounds/Ping.aiff
    say "${REMIND_MESSAGE}"
  done
) > /dev/null 2>&1 &

echo $! > "$PIDFILE"

■ 2. ~/.claude/scripts/cancel-idle.sh を作成(実行権限付き)

#!/bin/bash
PIDFILE="/tmp/claude-idle-$(echo "$PWD" | md5).pid"

if [ -f "$PIDFILE" ]; then
  kill "$(cat "$PIDFILE")" 2>/dev/null
  rm -f "$PIDFILE"
fi

■ 3. ~/.claude/settings.json のhooksに以下を設定

- Stop: ~/.claude/scripts/notify-idle.sh Hero 完了
- Notification(matcher空文字): ~/.claude/scripts/notify-idle.sh Glass 質問があります
- PreToolUse(matcher空文字): ~/.claude/scripts/cancel-idle.sh
- TeammateIdle: ~/.claude/scripts/notify-idle.sh Ping アイドル状態です
- TaskCompleted: ~/.claude/scripts/notify-idle.sh Hero タスク完了

既存のsettings.jsonの設定はそのまま残してhooksだけ追加・更新して。

まとめ

Claude Codeの「待ち時間」「放置時間」は、Hooksとsayコマンドの組み合わせで解消できます。

  • Stop / Notification で音声通知とリマインダループを起動
  • PreToolUse でユーザー応答を検知してリマインダを自動停止
  • PIDファイルでプロジェクトごとに独立管理
  • > /dev/null 2>&1 & でhookのブロックを回避

Claude Codeに喋らせることで、セッションを3つ、4つと増やしても画面を見ずに状況を把握できます。

参考リンク

picture
hanzochang - 半澤勇大
慶應義塾大学卒業後、Webプランナーとして勤務。 ナショナルクライアントのキャンペーンサイトの企画・演出を担当。 その後開発会社に創業メンバーとして参加。 Fintech案件や大手企業のDXプロジェクトに関わり、その後個人事業主として独立し、 2023年にWeb3に特化した開発会社として法人化しました。 現在はWeb3アプリ開発を中心にAI開発フローの整備を行っています。
また、趣味で2017年ごろより匿名アカウントでCryptoの調査等を行い、 ブロックチェーンメディアやSNSでビットコイン論文等の図解等を発信していました。
X (Twitter)

お問い合わせはこちらから

内容によっては返信ができない場合や、お時間をいただく場合がございます。あらかじめご了承ください。