
[並列作業] ClaudeCodeに声でリマインダさせて、待ち時間放置時間をゼロに!
Claude Codeが完了や質問待ちになったら音声で喋って教えてくれる。さらに放置が続けば繰り返しリマインド、応答したら自動停止。Hooksとsayコマンドで実装する通知リマインダをプロンプト付きで解説。
公開日2026.02.10
更新日2026.02.10
Claude Codeの「待ち時間」「放置時間」問題
Claude Codeを複数ターミナルで並列に動かす運用は生産性が高い反面、ある問題が起こります。
フロントの修正、APIのリファクタ、テストの追加──3つのセッションを同時に走らせていると、あるセッションが完了したことに気づかず数分〜十数分放置してしまう。通知音を設定していても、別の作業に集中していると1回の音は聞き逃しがちです。
この「待ち時間」「放置時間」の積み重ねが、並列作業の生産性を大きく下げています。
この記事では、Claude CodeのHooks機能とsayコマンドを使って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.shsettings.jsonの設定
~/.claude/settings.jsonのhooksに以下を追加します。
{
"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にTeammateIdleとTaskCompletedを追加します。
{
"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つと増やしても画面を見ずに状況を把握できます。
