複数の Claude Code を同時に動かしていると、「どのセッションが動いていて、どれが自分の返事を待っているのか」が分からなくなります。ターミナルのタブを順番に覗くのは地味につらいです。
Claude Code の hooks を使うと、出力を解析しなくても「作業中」「許可・質問待ち」「ターン終了」を確実に検知できます。この記事では、その仕組みを最小構成で作る方法を紹介します。
方針: hook で目印ファイルを作る
画面出力(BEL など)から状態を推測すると、コマンドのログで誤検知します。そこで、Claude Code が発火する hook から空の目印ファイルを作り、それを監視する形にします。
セッションを起動するときに、環境変数 ATTN に目印ファイルのパスを渡します。
export ATTN=/tmp/attn/session-1
claude --settings "$(cat attn-settings.json)"
--settings で渡す設定は、そのセッションにだけ効きます。ユーザーの settings.json は変更しません。
使う hook
| 状態 | hook | 作る目印 |
|---|---|---|
| 作業中 |
UserPromptSubmit, PreToolUse
|
.busy |
| 許可・質問待ち |
PermissionRequest, Notification
|
.ask |
| 質問に回答した |
PostToolUse(AskUserQuestion) |
.answered |
| ターン終了 | Stop |
.turn |
設定ファイル
{
"hooks": {
"Stop": [{ "hooks": [{ "type": "command", "command": "[ -z \"$ATTN\" ] || true > \"$ATTN.turn\"" }] }],
"PermissionRequest": [{ "hooks": [{ "type": "command", "command": "[ -z \"$ATTN\" ] || true > \"$ATTN.ask\"" }] }],
"Notification": [{
"matcher": "permission_prompt|elicitation_dialog|elicitation_url_dialog|agent_needs_input",
"hooks": [{ "type": "command", "command": "[ -z \"$ATTN\" ] || true > \"$ATTN.ask\"" }]
}],
"PostToolUse": [{ "matcher": "AskUserQuestion", "hooks": [{ "type": "command", "command": "[ -z \"$ATTN\" ] || true > \"$ATTN.answered\"" }] }],
"UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "[ -z \"$ATTN\" ] || true > \"$ATTN.busy\"" }] }],
"PreToolUse": [{ "hooks": [{ "type": "command", "command": "[ -z \"$ATTN\" ] || true > \"$ATTN.busy\"" }] }]
}
}
[ -z "$ATTN" ] || を付けておくと、ATTN が無い普通の起動では何もしません。
目印を状態に変換する
目印は作られた順番で解釈します。
-
.busy→ 作業中 -
.ask→ 回答待ち(作業中の表示は消さない) -
.answered→ 回答待ちを消して作業中に戻す -
.turn→ 作業中を消す
同じ時刻に複数の目印があるときは、.busy を先に処理すると、同時に起きたターン終了が残ります。
注意点
-
Notificationは許可・質問の通知だけに絞ります。idle_promptはターン終了の約 60 秒後に来るだけなので、回答待ちとは別物です。 - Claude Code は許可・質問の通知を数秒遅らせて出します。その間に答えれば通知は出ないので、許可のダイアログ表示の瞬間を拾える
PermissionRequestも併用しています。 - 目印ファイルは、他のユーザーから見えない専用ディレクトリに置いてください。
画面に出す
目印ファイルの変化を数秒おきに(または fs.watch で)見て、セッション一覧に「作業中は点滅、回答待ちは別の色」で出すだけです。複数のプロジェクトで何本も動かしていても、止まっているセッションを放置せずに済みます。
おわりに
私はこの仕組みを、複数案件のエージェントセッションをまとめて見る個人開発のデスクトップアプリ PMDesk に組み込んでいます(筆者が開発しています)。
hooks の仕様は Claude Code のバージョンで変わる可能性があるので、利用時は公式ドキュメントで確認してください。