Claude Codeに仕事が終わったら通知して欲しい

https://blog.utgw.net/entry/2026/03/25/155551 みたいなことを手でやってた。
ここにあるように、TaskCompleted hookでやると毎回通知されるとうっとうしいか? という気がした。
settings.json
Copied!
{
"$schema": "https://json.schemastore.org/claude-code-settings.json",
"hooks": {
"TaskCompleted": [
{
"hooks": [
{
"type": "command",
"command": "~/local/bin/tell-task-completed.sh",
"timeout": 60
}
]
}
]
}
}

claude本人と話していたら、以下のようにしたらいい感じになった。
settings.json
Copied!
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "~/bin/claude-delayed-notify.sh &",
"timeout": 1
}
]
}
],
"UserPromptSubmit": [
{
"hooks": [
{
"type": "command",
"command": "~/bin/claude-cancel-notify.sh",
"timeout": 1
}
]
}
]

claude-delayed-notify.sh
Copied!
#!/bin/bash
PIDFILE="$HOME/.claude-notify.pid"

# 既存の待機プロセスをキャンセル
if [ -f "$PIDFILE" ]; then
OLD_PID=$(cat "$PIDFILE")
kill "$OLD_PID" 2>/dev/null
rm "$PIDFILE"
fi

# 自分のPIDを記録してバックグラウンドで待機
echo $$ > "$PIDFILE"
sleep 10

# まだPIDファイルが残っていれば通知(キャンセルされなかった)
if [ -f "$PIDFILE" ] && [ "$(cat "$PIDFILE")" = "$$" ]; then
osascript -e 'display notification "入力待ちだ" with title "Claude Code"'
rm "$PIDFILE"
fi
claude-cancel-notify.sh
Copied!
#!/bin/bash
PIDFILE="$HOME/.claude-notify.pid"

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

10秒待機して、それでも放置されてたら通知されるようにしたら、今のところいい感じ。