69 lines
2.9 KiB
Bash
69 lines
2.9 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
# SessionStart hook — .live/ 디렉토리를 $HOME/.claude/nerdnavis-live/로 junction 보장
|
||
|
|
# worktree 격리를 제거하여 모든 세션이 동일한 실제 .live/ 디렉토리를 공유한다.
|
||
|
|
# 2026-04-18 신설 — C34 헌법급 Live 증분 동기화 체계의 근원 해결 장치
|
||
|
|
# 관련 규칙: C34 · C16-1 PC 독립 셋업 · 헌법 제1원칙 ⑤ 세션·PC 연속성
|
||
|
|
|
||
|
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
||
|
|
[ -z "$REPO_ROOT" ] && exit 0
|
||
|
|
|
||
|
|
CENTRAL_LIVE="$HOME/.claude/nerdnavis-live"
|
||
|
|
LOCAL_LIVE="$REPO_ROOT/.live"
|
||
|
|
MARKER_NAME=".junction-marker"
|
||
|
|
|
||
|
|
# 1. 중앙 저장소 + marker 보장
|
||
|
|
mkdir -p "$CENTRAL_LIVE" 2>/dev/null
|
||
|
|
if [ ! -f "$CENTRAL_LIVE/$MARKER_NAME" ]; then
|
||
|
|
echo "nerdnavis-live central junction target (C34, 2026-04-18)" > "$CENTRAL_LIVE/$MARKER_NAME" 2>/dev/null
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 2. 이미 올바르게 junction 연결되어 있으면 조기 종료 (sentinel 경유 판정)
|
||
|
|
if [ -f "$LOCAL_LIVE/$MARKER_NAME" ]; then
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 3. 로컬 .live/ 가 실체 디렉토리인 경우 → 백업 후 junction 전환 (C6-1 원본 보호)
|
||
|
|
if [ -d "$LOCAL_LIVE" ] && [ ! -L "$LOCAL_LIVE" ]; then
|
||
|
|
BAK="$LOCAL_LIVE.bak-$(date +%Y%m%d%H%M%S)"
|
||
|
|
# 기존 파일 중앙으로 복사 (기존 중앙 파일 덮어쓰기 안 함)
|
||
|
|
for f in "$LOCAL_LIVE"/*.md "$LOCAL_LIVE"/*.json; do
|
||
|
|
[ -f "$f" ] || continue
|
||
|
|
BASENAME=$(basename "$f")
|
||
|
|
[ ! -f "$CENTRAL_LIVE/$BASENAME" ] && cp "$f" "$CENTRAL_LIVE/$BASENAME" 2>/dev/null
|
||
|
|
done
|
||
|
|
mv "$LOCAL_LIVE" "$BAK" 2>/dev/null || { echo "⚠️ [Live Junction] 기존 .live/ 백업 실패 — Degraded 모드" >&2; exit 0; }
|
||
|
|
echo "📦 [Live Junction] 기존 .live/ 백업: $BAK"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# 4. Junction 생성 (OS별·3회 재시도)
|
||
|
|
ATTEMPT=0
|
||
|
|
MAX_ATTEMPTS=3
|
||
|
|
while [ "$ATTEMPT" -lt "$MAX_ATTEMPTS" ]; do
|
||
|
|
ATTEMPT=$((ATTEMPT + 1))
|
||
|
|
|
||
|
|
if command -v powershell >/dev/null 2>&1; then
|
||
|
|
# Windows — PowerShell New-Item Junction (git-bash의 cmd //c mklink 대비 신뢰성 우위, 2026-04-18 실증)
|
||
|
|
CENTRAL_WIN=$(cygpath -w "$CENTRAL_LIVE" 2>/dev/null || echo "$CENTRAL_LIVE")
|
||
|
|
LOCAL_WIN=$(cygpath -w "$LOCAL_LIVE" 2>/dev/null || echo "$LOCAL_LIVE")
|
||
|
|
powershell -NoProfile -ExecutionPolicy Bypass -Command "New-Item -ItemType Junction -Path '$LOCAL_WIN' -Target '$CENTRAL_WIN' -Force | Out-Null" >/dev/null 2>&1
|
||
|
|
else
|
||
|
|
# Unix — symlink
|
||
|
|
ln -s "$CENTRAL_LIVE" "$LOCAL_LIVE" 2>/dev/null
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [ -f "$LOCAL_LIVE/$MARKER_NAME" ]; then
|
||
|
|
[ "$ATTEMPT" -eq 1 ] && echo "✅ [Live Junction] $LOCAL_LIVE → $CENTRAL_LIVE"
|
||
|
|
[ "$ATTEMPT" -gt 1 ] && echo "✅ [Live Junction] 연결 성공 (재시도 $ATTEMPT회)"
|
||
|
|
exit 0
|
||
|
|
fi
|
||
|
|
|
||
|
|
sleep 1
|
||
|
|
done
|
||
|
|
|
||
|
|
# 5. 실패 — Degraded 모드 (작업 차단 안 함, C34 기본 원칙)
|
||
|
|
mkdir -p "$LOCAL_LIVE" 2>/dev/null
|
||
|
|
echo "⚠️ [Live Junction] 생성 실패 — Degraded 모드 (로컬 .live/ 사용). worktree 간 동기화 불가" >&2
|
||
|
|
echo "⚠️ [Live Junction] 해결: 관리자 권한으로 setup 스크립트 재실행 또는 수동 mklink/ln -s 필요" >&2
|
||
|
|
|
||
|
|
exit 0
|