Ctrl K
ComunidadGuías…

scripts/claude-code-hook.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/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