scripts/claude-code-hook.sh
Rama main · réplica de lectura del repositorio original.
#!/bin/sh
# any-console への Claude Code hooks 送信スクリプト。
#
# 自動インストール: `./any-console hooks-setup` が ~/.claude/settings.json に
# このスクリプトを登録する(既存のhooks設定は壊さずマージする)。
#
# 手動で登録する場合は ~/.claude/settings.json の hooks に、イベント名を
# 引数にして登録する:
#
# {
# "hooks": {
# "PreToolUse": [{"hooks": [{"type": "command", "command": "/path/to/any-console/scripts/claude-code-hook.sh PreToolUse"}]}],
# "PostToolUse": [{"hooks": [{"type": "command", "command": "/path/to/any-console/scripts/claude-code-hook.sh PostToolUse"}]}],
# "UserPromptSubmit": [{"hooks": [{"type": "command", "command": "/path/to/any-console/scripts/claude-code-hook.sh UserPromptSubmit"}]}],
# "PreCompact": [{"hooks": [{"type": "command", "command": "/path/to/any-console/scripts/claude-code-hook.sh PreCompact"}]}],
# "Notification": [{"hooks": [{"type": "command", "command": "/path/to/any-console/scripts/claude-code-hook.sh Notification"}]}],
# "Stop": [{"hooks": [{"type": "command", "command": "/path/to/any-console/scripts/claude-code-hook.sh Stop"}]}],
# "SessionEnd": [{"hooks": [{"type": "command", "command": "/path/to/any-console/scripts/claude-code-hook.sh SessionEnd"}]}]
# }
# }
#
# any-console が生成した tmux セッション内でのみ動作する(接続情報の環境変数が
# 無ければ何もしない)。失敗しても Claude Code の動作を妨げないよう常に 0 で終了する。
event="$1"
if [ -z "$ANY_CONSOLE_HOOK_URL" ] || [ -z "$ANY_CONSOLE_HOOK_TOKEN" ] ||
[ -z "$ANY_CONSOLE_SESSION" ] || [ -z "$event" ]; then
exit 0
fi
# Notificationイベントはstdinで渡されるJSON(Claude Code側のhookペイロード)に
# 通知本文(message)を含む。許可確認("needs your permission")か、単なる
# アイドルリマインダー("waiting for your input")かをサーバ側で区別するために
# 拾って送る。jqには依存せず、フラットな文字列フィールドを前提にした簡易な
# sed抽出で十分(Claude CodeのmessageはネストしたJSONを含まず、値にエスケープ
# された引用符も通常含まない)。BSD sed(macOS標準)は基本正規表現で `\|` を
# サポートしないため、`[^"]*` によるシンプルな非貪欲マッチにする。
stdin_json=$(cat 2>/dev/null)
detail=$(printf '%s' "$stdin_json" | sed -n 's/.*"message"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -n1)
# detail はサーバ側で #[serde(default)] のため、空でも常に含めてよい。
body="{\"session\":\"$ANY_CONSOLE_SESSION\",\"event\":\"$event\",\"detail\":\"$detail\"}"
(
curl -s -m 3 -X POST "$ANY_CONSOLE_HOOK_URL" \
-H "X-Hook-Token: $ANY_CONSOLE_HOOK_TOKEN" \
-H "Content-Type: application/json" \
-d "$body" \
>/dev/null 2>&1
) &
exit 0