2026-04-18 16:39:04 +00:00
|
|
|
#!/bin/bash
|
2026-04-20 15:14:51 +00:00
|
|
|
# SessionStart hook — 레포 memory/org/ → 중앙 $HOME/.claude/burningtimes-memory/ 단방향 sync
|
2026-04-18 16:39:04 +00:00
|
|
|
# git pull 직후 원격 반영분을 중앙에 최신화. unflushed 중앙 변경은 대피 백업.
|
|
|
|
|
# 2026-04-19 신설 — C34-3 동기화 4계층 (레포 SOT 원칙)
|
|
|
|
|
|
|
|
|
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
|
|
|
[ -z "$REPO_ROOT" ] && exit 0
|
|
|
|
|
|
|
|
|
|
REPO_MEM="$REPO_ROOT/memory/org"
|
2026-04-20 15:14:51 +00:00
|
|
|
CENTRAL_MEM="$HOME/.claude/burningtimes-memory"
|
2026-04-18 16:39:04 +00:00
|
|
|
MARKER_NAME=".memory-junction-marker"
|
2026-04-20 15:14:51 +00:00
|
|
|
LOCK_FILE="$HOME/.claude/.burningtimes_memory_sync.lock"
|
2026-04-18 16:39:04 +00:00
|
|
|
|
|
|
|
|
[ ! -d "$REPO_MEM" ] && exit 0
|
|
|
|
|
|
|
|
|
|
# 0. Lock (race condition 방지, 5초 타임아웃)
|
|
|
|
|
ATTEMPT=0
|
|
|
|
|
while [ -f "$LOCK_FILE" ] && [ "$ATTEMPT" -lt 5 ]; do
|
|
|
|
|
sleep 1
|
|
|
|
|
ATTEMPT=$((ATTEMPT + 1))
|
|
|
|
|
done
|
|
|
|
|
echo "$$" > "$LOCK_FILE" 2>/dev/null
|
|
|
|
|
trap 'rm -f "$LOCK_FILE"' EXIT
|
|
|
|
|
|
|
|
|
|
# 1. 중앙 저장소 보장
|
|
|
|
|
mkdir -p "$CENTRAL_MEM" 2>/dev/null
|
2026-04-20 15:14:51 +00:00
|
|
|
[ ! -f "$CENTRAL_MEM/$MARKER_NAME" ] && echo "burningtimes-memory central (C34-16, 2026-04-19)" > "$CENTRAL_MEM/$MARKER_NAME"
|
2026-04-18 16:39:04 +00:00
|
|
|
|
|
|
|
|
# 2. unflushed 중앙 변경 탐지 (중앙 mtime > 레포 mtime + HEAD 미반영 의심)
|
|
|
|
|
CONFLICT_COUNT=0
|
|
|
|
|
for cf in "$CENTRAL_MEM"/*.md "$CENTRAL_MEM"/*.json; do
|
|
|
|
|
[ -f "$cf" ] || continue
|
|
|
|
|
basename=$(basename "$cf")
|
|
|
|
|
[ "$basename" = "$MARKER_NAME" ] && continue
|
|
|
|
|
rf="$REPO_MEM/$basename"
|
|
|
|
|
|
|
|
|
|
if [ -f "$rf" ]; then
|
|
|
|
|
# 양쪽 존재: mtime 비교 (중앙이 더 새로우면 unflushed 후보)
|
|
|
|
|
if [ "$cf" -nt "$rf" ]; then
|
|
|
|
|
# 내용 비교로 확정 (mtime만 다르고 내용 같으면 touch)
|
|
|
|
|
if ! diff -q "$cf" "$rf" >/dev/null 2>&1; then
|
|
|
|
|
CONFLICT_COUNT=$((CONFLICT_COUNT + 1))
|
|
|
|
|
fi
|
|
|
|
|
fi
|
|
|
|
|
else
|
|
|
|
|
# 중앙에만 있고 레포에 없음 — unflushed 신규 파일
|
|
|
|
|
CONFLICT_COUNT=$((CONFLICT_COUNT + 1))
|
|
|
|
|
fi
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
# 3. 충돌 있으면 중앙 대피 후 진행
|
|
|
|
|
if [ "$CONFLICT_COUNT" -gt 0 ]; then
|
|
|
|
|
STAMP=$(date +%Y%m%d%H%M%S)
|
|
|
|
|
CONFLICT_DIR="$CENTRAL_MEM.conflict-$STAMP"
|
|
|
|
|
cp -r "$CENTRAL_MEM" "$CONFLICT_DIR" 2>/dev/null
|
|
|
|
|
echo "⚠️ [Memory Sync] unflushed 중앙 변경 $CONFLICT_COUNT 건 감지 — 대피: $CONFLICT_DIR" >&2
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# 4. 레포 → 중앙 복사 (marker·conflict 제외, 삭제 동기화 안 함 — 안전망)
|
|
|
|
|
for f in "$REPO_MEM"/*.md "$REPO_MEM"/*.json; do
|
|
|
|
|
[ -f "$f" ] || continue
|
|
|
|
|
basename=$(basename "$f")
|
|
|
|
|
cp "$f" "$CENTRAL_MEM/$basename" 2>/dev/null
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
exit 0
|