Termux環境でClaude Codeのタスク完了を通知するシンプルなHooksシステムです。
- タスク完了通知: Claude Codeの応答完了時に最後のメッセージを通知
- tmux対応: tmuxのウィンドウ・ペイン番号を表示
~/.claude/settings.json
を作成:
{
"hooks": {
"Stop": [
{
"matcher": ".*",
"hooks": [
{
"type": "command",
"command": "/data/data/com.termux/files/home/.claude/stop-hook.sh"
}
]
}
]
}
}
~/.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"
chmod +x ~/.claude/stop-hook.sh
mkdir -p ~/.claude/hooks
touch ~/.claude/hooks.log
chmod 666 ~/.claude/hooks.log
設定を反映させるため、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