BurningTimesAi/scripts/sync_signal.sh

91 lines
3.1 KiB
Bash
Raw Permalink Normal View History

#!/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
feat(BT·신설): 조직 신설 Phase 1 — git 저장소 교체 + 중앙 저장소 A안 분리 PD님 2026-04-21 직접 지시 5개 중 1·2·4 이행. ## 집행 내역 1. git remote: NerdNavisAi.git → BurningTimesAi.git 교체 (BT main + 본 worktree) - E:/NerdNavisAi 레포 원격은 원상 유지 (실측 확인) 2. 중앙 저장소 A안 분리: ~/.claude/burningtimes-{live,memory,audit}/ - nerdnavis-* 중앙 저장소에서 cp -r 복사 (원본 미변경) - .junction-marker 내용 BT로 갱신 3. 본 worktree .live junction 재연결 → burningtimes-live 4. audit junction 3종 신설: .burningtimes_{auditor_calls,warning_ignored,bypass_log} 5. scripts·setup 28파일 하드코딩 일괄 치환 (nerdnavis/NerdNavis/너드나비스/NERDNAVIS → burningtimes/BurningTimes/BURNINGTIMES) 6. paths.local.json.template BT 전용 재작성 (Unity·Framework 경로 __TBD__ placeholder) 7. .gitignore: .live.bak_*/ 패턴 추가 ## 보류 항목 (PD 재논의 예정) - 3. memory/org/ 내용 초기화 (PD 지시) - 5. Unity 프로젝트 경로 (PD 신규 경로 제공 전까지) - SKILL.md·CLAUDE.md 조직명 전환 및 P17·P29 처리 - 프로젝트/수상한잡화점/ 등 수상한잡화점 관련 일괄 정리 - 코어코드/NerdNavis.Framework/ → BT-프레임워크 이름 전환 - 공유/조직공지/ 너드나비스 맥락 공지 처리 - .claude/agents/*.md frontmatter skills 참조명 ## 감사 pm-auditor 사전 감사 통과 (Critical 0건, Major 2건 commit 전 정정 완료). 매니페스트: bt-org-split-phase1 (C35-9 PreToolUse 차단 해제). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 15:14:51 +00:00
BUS_DIR="$HOME/.claude/.burningtimes_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