#!/bin/bash # sync_signal.sh — 로컬 IPC 시그널 기반 실시간 동기화 # # 설계 (2026-04-17 PD님 직접 제안): # polling 방식(throttle fetch)은 네트워크 부하 유발 + 근본 해결 아님. # 대신 "공유할 사항 발생 시 플래그 데이터 갱신 → 수신 측이 플래그만 체크" # 구조로 전환. 플래그 변경 감지 시에만 pull 수행하므로 네트워크 비용 최소화. # # 사용: # bash sync_signal.sh update # push 성공 시 호출: 플래그 파일 갱신 # bash sync_signal.sh check # UserPromptSubmit hook: 플래그 변경 시 pull BUS_DIR="$HOME/.claude/.nerdnavis_bus" mkdir -p "$BUS_DIR" 2>/dev/null GIT_DIR=$(git rev-parse --git-dir 2>/dev/null) [ -z "$GIT_DIR" ] && exit 0 REPO_HASH=$(echo "$GIT_DIR" | sha1sum 2>/dev/null | cut -d' ' -f1) SIGNAL_FILE="$BUS_DIR/signal_$REPO_HASH" SESSION_LAST_FILE="$BUS_DIR/last_seen_$REPO_HASH.$$" MODE="${1:-check}" # ============================================================ # update 모드: push 성공 후 호출. 로컬 HEAD + timestamp를 시그널에 기록 # ============================================================ if [ "$MODE" = "update" ]; then HEAD=$(git rev-parse HEAD 2>/dev/null) if [ -n "$HEAD" ]; then echo "$HEAD $(date +%s)" > "$SIGNAL_FILE" fi exit 0 fi # ============================================================ # check 모드: 플래그 파일 변경 감지 시에만 pull (네트워크 비용 최소화) # ============================================================ [ -f "$SIGNAL_FILE" ] || exit 0 CURRENT=$(cat "$SIGNAL_FILE" 2>/dev/null) LAST=$(cat "$SESSION_LAST_FILE" 2>/dev/null) # 플래그가 자기 세션이 마지막 본 것과 같으면 — 네트워크 호출 없이 종료 if [ "$CURRENT" = "$LAST" ]; then exit 0 fi # 플래그 변경 감지 → fetch + merge 수행 CURRENT_HEAD=$(echo "$CURRENT" | awk '{print $1}') LOCAL_HEAD=$(git rev-parse HEAD 2>/dev/null) # 이미 로컬이 최신이면 (스스로 push한 세션) — 플래그만 동기화 if [ "$CURRENT_HEAD" = "$LOCAL_HEAD" ]; then echo "$CURRENT" > "$SESSION_LAST_FILE" exit 0 fi git fetch origin 2>/dev/null CHANGES=$(git log --oneline HEAD..origin/main 2>/dev/null | head -5) if [ -n "$CHANGES" ]; then echo "📡 [signal-sync] 플래그 변경 감지 — 원격 변경 자동 반영:" echo "$CHANGES" # 로컬 미커밋 안전 stash STASHED=0 if ! git diff --quiet 2>/dev/null || ! git diff --cached --quiet 2>/dev/null; then if git stash push -u -m "signal-sync-$(date +%s)" > /dev/null 2>&1; then STASHED=1 fi fi if git merge origin/main --no-edit --ff-only 2>/dev/null; then echo "✅ 실시간 동기화 완료 (fast-forward)" elif git merge origin/main --no-edit 2>/dev/null; then echo "✅ 실시간 동기화 완료 (merge commit)" else echo "⚠️ 자동 merge 실패 — 수동 해결 필요 (git merge origin/main)" git merge --abort 2>/dev/null fi if [ "$STASHED" -eq 1 ]; then git stash pop > /dev/null 2>&1 || echo "⚠️ stash pop 실패 — git stash list 확인 필요" fi fi echo "$CURRENT" > "$SESSION_LAST_FILE" exit 0