Skip to content

Instantly share code, notes, and snippets.

@yheihei
Last active July 3, 2025 00:40
Show Gist options
  • Select an option

  • Save yheihei/219ce2d73773d6fa4ff8687d796f6897 to your computer and use it in GitHub Desktop.

Select an option

Save yheihei/219ce2d73773d6fa4ff8687d796f6897 to your computer and use it in GitHub Desktop.
(Mac)ClaudeCodeのHooksで停止したときに通知出す
#!/bin/bash
# 一時ファイルに保存
TEMP_FILE="/tmp/claude-hook-temp-$$-$(date +%s%N).json"
cat > "$TEMP_FILE"
# バックグラウンドで実際の処理を実行
(
# セッションIDを取得
SESSION_ID=$(jq -r '.session_id' < "$TEMP_FILE")
DEBUG_FILE="/tmp/claude-hook-debug-${SESSION_ID}.json"
LOCK_FILE="/tmp/claude-hook-lock-${SESSION_ID}.pid"
# セッション固有のデバッグファイルに移動
mv "$TEMP_FILE" "$DEBUG_FILE"
# 既存のプロセスがあれば終了させる
if [ -f "$LOCK_FILE" ]; then
OLD_PID=$(cat "$LOCK_FILE" 2>/dev/null)
if [ ! -z "$OLD_PID" ]; then
kill $OLD_PID 2>/dev/null
fi
fi
# 現在のプロセスIDを記録
echo $$ > "$LOCK_FILE"
# クリーンアップ処理を設定
cleanup() {
if [ -f "$LOCK_FILE" ] && [ "$(cat $LOCK_FILE 2>/dev/null)" = "$$" ]; then
rm -f "$LOCK_FILE"
fi
rm -f "$DEBUG_FILE"
}
trap cleanup EXIT
# ログファイルから最新のアシスタントメッセージを確認
TRANSCRIPT_PATH=$(jq -r '.transcript_path' < "$DEBUG_FILE")
if [ -f "$TRANSCRIPT_PATH" ]; then
# 最後のアシスタントメッセージを確認(message.content[0].type == "text"のみ)
LAST_MESSAGE=$(tail -50 "$TRANSCRIPT_PATH" | grep '"role":"assistant"' | while read -r line; do
# message.content[0].type が "text" かチェック
if echo "$line" | jq -e '.message.content[0].type == "text"' >/dev/null 2>&1; then
echo "$line"
fi
done | tail -1)
# 通知条件に合致しない場合は即座に終了
if [ -z "$LAST_MESSAGE" ]; then
exit 0
fi
# 通知条件に合致した場合のみ待機
sleep 15
# まだ自分のプロセスIDが記録されているか確認
if [ ! -f "$LOCK_FILE" ] || [ "$(cat $LOCK_FILE 2>/dev/null)" != "$$" ]; then
# 他のプロセスに置き換えられた場合は終了
exit 0
fi
# 再度最新のアシスタントメッセージを確認
LAST_MESSAGE=$(tail -50 "$TRANSCRIPT_PATH" | grep '"role":"assistant"' | while read -r line; do
# message.content[0].type が "text" かチェック
if echo "$line" | jq -e '.message.content[0].type == "text"' >/dev/null 2>&1; then
echo "$line"
fi
done | tail -1)
if [ ! -z "$LAST_MESSAGE" ]; then
# アシスタントのメッセージが見つかったら通知
osascript -e 'display notification "応答完了しました" with title "Claude Code" subtitle "タスク完了"'
say "できたぜぇ!?"
fi
fi
) &
# 即座にhookを終了(Claude Codeはブロックされない)
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment