Skip to content

Instantly share code, notes, and snippets.

@kazuph
Last active July 2, 2025 12:32
Show Gist options
  • Save kazuph/b2bfd76a006f469429755e9b8437ca9f to your computer and use it in GitHub Desktop.
Save kazuph/b2bfd76a006f469429755e9b8437ca9f to your computer and use it in GitHub Desktop.
Claude Code Termux Notification Hooks - Termux環境でClaude Codeの作業進捗を通知するシステム

Claude Code Termux Notification Hooks

Termux環境でClaude Codeのタスク完了を通知するシンプルなHooksシステムです。

機能

  • タスク完了通知: Claude Codeの応答完了時に最後のメッセージを通知
  • tmux対応: tmuxのウィンドウ・ペイン番号を表示

セットアップ

1. 設定ファイルの作成

~/.claude/settings.jsonを作成:

{
  "hooks": {
    "Stop": [
      {
        "matcher": ".*",
        "hooks": [
          {
            "type": "command",
            "command": "/data/data/com.termux/files/home/.claude/stop-hook.sh"
          }
        ]
      }
    ]
  }
}

2. 通知スクリプトの作成

~/.claude/stop-hook.shを作成:

#!/data/data/com.termux/files/usr/bin/bash

# Stop hook script for Claude Code
# Sends notification when Claude Code finishes responding

# Read hook data from stdin
HOOK_DATA=$(cat)

# Extract transcript path from the hook data
TRANSCRIPT_PATH=$(echo "$HOOK_DATA" | jq -r '.transcript_path // ""')

# Debug log
LOG_FILE="$HOME/.claude/hooks.log"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Stop hook triggered" >> "$LOG_FILE"
echo "Transcript path: $TRANSCRIPT_PATH" >> "$LOG_FILE"

# Get Claude's last message from transcript
CLAUDE_LAST_MESSAGE=""
if [[ -f "$TRANSCRIPT_PATH" ]]; then
    # Get the last line of the transcript (most recent entry)
    LAST_LINE=$(tail -1 "$TRANSCRIPT_PATH")
    
    # Extract Claude's message content
    CLAUDE_LAST_MESSAGE=$(echo "$LAST_LINE" | jq -r '
        if .message and .message.content and (.message.content | length) > 0 then
            .message.content[0].text // ""
        else
            ""
        end
    ' 2>/dev/null)
    
    # Log what we found
    echo "Last message found: ${CLAUDE_LAST_MESSAGE:0:50}..." >> "$LOG_FILE"
fi

# Clean up the message for notification
if [[ -n "$CLAUDE_LAST_MESSAGE" ]]; then
    # Remove newlines and normalize whitespace
    CLEAN_MESSAGE=$(echo "$CLAUDE_LAST_MESSAGE" | tr '\n' ' ' | sed 's/  */ /g' | sed 's/^ *//;s/ *$//')
    
    # Truncate to reasonable length for notification
    if [[ ${#CLEAN_MESSAGE} -gt 200 ]]; then
        NOTIFICATION_MESSAGE="${CLEAN_MESSAGE:0:197}..."
    else
        NOTIFICATION_MESSAGE="$CLEAN_MESSAGE"
    fi
else
    NOTIFICATION_MESSAGE="タスクが完了しました"
fi

# Get tmux info if available
TMUX_INFO=""
if [[ -n "$TMUX" ]]; then
    WINDOW_INDEX=$(tmux display-message -p '#{window_index}' 2>/dev/null || echo "?")
    PANE_INDEX=$(tmux display-message -p '#{pane_index}' 2>/dev/null || echo "?")
    TMUX_INFO=" [$WINDOW_INDEX-$PANE_INDEX]"
fi

# Send completion notification
termux-notification \
    -t "Claude Code${TMUX_INFO}" \
    -c "$NOTIFICATION_MESSAGE" \
    --id 9999 \
    --icon done \
    --sound \
    --vibrate 100

echo "Notification sent: $NOTIFICATION_MESSAGE" >> "$LOG_FILE"

3. 実行権限の付与

chmod +x ~/.claude/stop-hook.sh

4. ログディレクトリとファイルの準備

mkdir -p ~/.claude/hooks
touch ~/.claude/hooks.log
chmod 666 ~/.claude/hooks.log

5. Claude Codeの再起動

設定を反映させるため、Claude Codeを再起動してください。

使用方法

設定後は、Claude Codeが応答を完了するたびに自動的に通知が送信されます。通知にはClaudeの最後のメッセージが表示されるので、タスクの完了と結果を簡単に確認できます。

デバッグ

ログファイルで動作を確認できます:

# ログの確認
tail -f ~/.claude/hooks.log

# 手動テスト
echo '{"transcript_path":"~/.claude/projects/YOUR_PROJECT/YOUR_SESSION.jsonl"}' | ~/.claude/stop-hook.sh

必要な環境

  • Termux
  • termux-api(pkg install termux-api
  • jq(pkg install jq
  • Claude Code

カスタマイズ

通知アイコンの変更

--iconパラメータで使用可能なアイコン:

  • terminal, edit, search, done, error, info, warning など

詳細はMaterial Design Iconsを参照。

注意事項

  • トランスクリプトファイルは~/.claude/projects/に保存されます
  • tmuxを使用している場合は、ウィンドウとペイン番号が通知タイトルに表示されます

ライセンス

MIT License

作者

@kazuph

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment