#!/usr/bin/env bash
# cc-ide: Zed IDE ブリッジ(cc-ide-server)の死活監視フック。
# 参照: contracts/zed-ide-bridge.md
#
# SessionStart(startup|resume|clear) で呼ばれ、以下を行う:
# 1. ~/.claude/ide/*.lock のうち pid が死んでいる stale lock を削除
# (/ide の候補に亡霊が並ぶのを防ぐ)
# 2. Zed が稼働中なのに生きた cc-ide-server が 1 つも無ければ、
# systemMessage でユーザーに LS 再起動を促す
#
# 注意: フックから cc-ide-server を直接起動はしない。サーバは Zed が
# LSP 子プロセスとして起動しないと編集コンテキスト(選択/カーソル)を
# 受け取れず、「/ide に出るが中身が空」という誤解を生む状態になるため。
# 失敗してもセッションを妨げない: 常に exit 0。
set -u
# stdin(JSON) は使わないが読み捨てる(パイプ詰まり防止)。
cat >/dev/null 2>&1 || true
ide_dir="$HOME/.claude/ide"
# --- 1. stale lock 掃除 & 生存確認 ---
live=0
if [ -d "$ide_dir" ]; then
for f in "$ide_dir"/*.lock; do
[ -f "$f" ] || continue
pid=""
command -v jq >/dev/null 2>&1 && pid=$(jq -r '.pid // empty' "$f" 2>/dev/null)
# kill -0 だけだと PID が別プロセスに再利用された場合に stale を見逃すため、
# プロセス名が cc-ide-server であることまで確認する。
if [ -n "$pid" ] && ps -p "$pid" -o comm= 2>/dev/null | grep -q 'cc-ide-server'; then
live=1
else
# pid 不明 or 死亡 or 別プロセスに再利用 → stale。掃除する。
rm -f "$f" 2>/dev/null
fi
done
fi
[ "$live" -eq 1 ] && exit 0
# --- 2. Zed 稼働中なのにサーバ無し → 警告 ---
if pgrep -f 'Zed\.app/Contents/MacOS/zed' >/dev/null 2>&1; then
printf '%s\n' '{"systemMessage":"cc-ide: Zed は起動中ですが cc-ide-server が動いていません。/ide で接続するには、Zed のコマンドパレットで editor: restart language server を実行するか、Zed を再起動して対象ファイル(Markdown/Rust/TS 等)を開いてください。"}'
fi
exit 0