Last active
July 3, 2025 00:40
-
-
Save yheihei/219ce2d73773d6fa4ff8687d796f6897 to your computer and use it in GitHub Desktop.
(Mac)ClaudeCodeのHooksで停止したときに通知出す
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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