nekolas note
2.1 KB Raw
#!/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