2026-04-18 16:39:04 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
# post-commit hook — 중앙 $HOME/.claude/nerdnavis-memory/ → 레포 memory/org/ 단방향 sync
|
|
|
|
|
# Claude user memory에 Write된 내용을 commit 포함시키기 위해 commit 직후 레포로 반영.
|
|
|
|
|
# 2026-04-19 신설 — C34-3 동기화 4계층 (commit 최신본 보장)
|
|
|
|
|
|
|
|
|
|
REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
|
|
|
|
|
[ -z "$REPO_ROOT" ] && exit 0
|
|
|
|
|
|
|
|
|
|
REPO_MEM="$REPO_ROOT/memory/org"
|
|
|
|
|
CENTRAL_MEM="$HOME/.claude/nerdnavis-memory"
|
|
|
|
|
MARKER_NAME=".memory-junction-marker"
|
|
|
|
|
LOCK_FILE="$HOME/.claude/.nerdnavis_memory_sync.lock"
|
|
|
|
|
|
|
|
|
|
[ ! -d "$CENTRAL_MEM" ] && exit 0
|
|
|
|
|
[ ! -d "$REPO_MEM" ] && exit 0
|
|
|
|
|
|
|
|
|
|
# Lock (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
|
|
|
|
|
|
2026-04-19 12:37:28 +00:00
|
|
|
# 중앙 → 레포 복사 (2026-04-19 D안 개선: mtime 비교로 레포 최신본 보호)
|
2026-04-18 16:39:04 +00:00
|
|
|
# 삭제 동기화 안 함 (파일 소실 리스크 회피, 안전망)
|
2026-04-19 12:37:28 +00:00
|
|
|
# 레포가 중앙보다 최신이면 덮어쓰기 스킵 — C34-16 Write 경로 혼용 시
|
|
|
|
|
# post-commit sync가 최신 Edit을 덮어쓰던 구조적 결함 차단
|
|
|
|
|
# 근거: memory/org/feedback_memory_sync_overwrite.md (2026-04-19 실증)
|
2026-04-18 16:39:04 +00:00
|
|
|
CHANGED=0
|
2026-04-19 12:37:28 +00:00
|
|
|
SKIPPED_PROTECT=0
|
2026-04-18 16:39:04 +00:00
|
|
|
for f in "$CENTRAL_MEM"/*.md "$CENTRAL_MEM"/*.json; do
|
|
|
|
|
[ -f "$f" ] || continue
|
|
|
|
|
basename=$(basename "$f")
|
|
|
|
|
[ "$basename" = "$MARKER_NAME" ] && continue
|
|
|
|
|
dst="$REPO_MEM/$basename"
|
|
|
|
|
|
2026-04-19 12:37:28 +00:00
|
|
|
# 내용 동일 시 스킵 (정상 상태)
|
|
|
|
|
if [ -f "$dst" ] && diff -q "$f" "$dst" >/dev/null 2>&1; then
|
|
|
|
|
continue
|
2026-04-18 16:39:04 +00:00
|
|
|
fi
|
2026-04-19 12:37:28 +00:00
|
|
|
|
|
|
|
|
# 레포가 중앙보다 최신 → 덮어쓰기 차단 (D안 보호)
|
|
|
|
|
if [ -f "$dst" ] && [ "$dst" -nt "$f" ]; then
|
|
|
|
|
echo "⚠️ [Memory Sync] 레포본이 중앙보다 최신 — 중앙→레포 덮어쓰기 스킵: $basename" >&2
|
|
|
|
|
echo " C34-16 Write 경로 혼용 시그널 가능성 — 수동 sync_memory_repo_to_central.sh로 중앙 최신화 권장" >&2
|
|
|
|
|
SKIPPED_PROTECT=$((SKIPPED_PROTECT + 1))
|
|
|
|
|
continue
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# 중앙이 더 최신 또는 레포 부재 → 정상 복사
|
|
|
|
|
cp "$f" "$dst" 2>/dev/null
|
|
|
|
|
CHANGED=$((CHANGED + 1))
|
2026-04-18 16:39:04 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
|
|
if [ "$CHANGED" -gt 0 ]; then
|
|
|
|
|
echo "🧠 [Memory Sync] 중앙 → 레포 $CHANGED 건 반영 (다음 commit에 포함 예정이면 재commit 필요)"
|
|
|
|
|
fi
|
|
|
|
|
|
2026-04-19 12:37:28 +00:00
|
|
|
if [ "$SKIPPED_PROTECT" -gt 0 ]; then
|
|
|
|
|
echo "⚠️ [Memory Sync] 레포 최신본 보호로 $SKIPPED_PROTECT 건 덮어쓰기 방지 (C34 memory sync 구조 결함 재발 차단)" >&2
|
|
|
|
|
fi
|
|
|
|
|
|
2026-04-18 16:39:04 +00:00
|
|
|
exit 0
|