BurningTimesAi/scripts/unity_project_sync.sh

88 lines
2.7 KiB
Bash
Raw Normal View History

feat(#57 후속): 옵션 A Unity 프로젝트 SessionStart 자동 pull 구축 PD님 2026-04-20 승인 "옵션 A로 진행" 수용. PC별 클론 경로 상이 수용 + C30 이행 자동화 + C30 예외 명시 불요로 전환. [자진 고지 양축] - 개발팀장 축: #57 "C30 점검 불가" 자진 고지는 FilGoodBandits 상위만 확인한 오류. 실제 DeckBuilding/.git 실존 (NerdNavis/DeckBuilding.git) - PM 축: Agent 응답 환경 판정 주장을 재실측 없이 수용 (C27 변형 위반) - feedback_git_scope_shortcut.md 양축 재발 방지 기록 [집행 7종] - scripts/unity_project_sync.sh 신설 (Lock + stale cleanup + trap 제거 + C34-12 Degraded) - .claude/settings.json SessionStart hook 편입 - scripts/verify_setup.ps1 2.8 섹션 (UNITY 경로·git·sync 4축 검증) - SKILL.md C30-1 운용 세칙 정비 (수동 점검 → SessionStart hook 자동 이행, 외연 유지) - paths.local.json.template (기존 UNITY_PROJECT_ROOT 재활용) - feedback_git_scope_shortcut.md 신설 (양축) - MEMORY.md 인덱스 [pm-auditor 감사 정정] - Critical 2·Major 3·Minor 2·Improvement 2 전수 수용 - C34-15 5문항 체크 결과 대화로그 기재 - Lock cleanup 로직 포함 - feedback 양축 기록 [Unity MCP 편집 표준 워크플로우 v1 0단계 추가 — 개발팀장 후속 Task] 본 commit 후 별도 Task 위임 (Agent 경계 보호) [C30 예외 명시 자연 종결] PD 결정 3 (C30 예외 보류) → 자동 pull 구축으로 불요 전환 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 09:09:18 +00:00
#!/bin/bash
# Unity 프로젝트 SessionStart 자동 pull (2026-04-20 PD 옵션 A 승인)
#
# 역할: paths.local.json의 UNITY_PROJECT_ROOT 경로를 읽어 git pull --ff-only 수행
# 근거: C30 git 동기화 점검 의무 · 외부 저장소 Unity 프로젝트 자동 이행
# C34-12 Degraded 운영: 경로 미설정·레포 아님·pull 실패 시 경고만, 작업 차단 금지
set +e # Degraded 운영 — 실패 시 exit 0 보장
# Lock 파일 (race 방지)
LOCK_FILE="$HOME/.claude/.nerdnavis_unity_sync.lock"
LOCK_STALE_SECONDS=300 # 5분 이상 lock = stale
# Stale lock cleanup (trap 이전)
if [ -f "$LOCK_FILE" ]; then
LOCK_MTIME=$(stat -c %Y "$LOCK_FILE" 2>/dev/null || stat -f %m "$LOCK_FILE" 2>/dev/null)
NOW=$(date +%s)
if [ -n "$LOCK_MTIME" ] && [ $((NOW - LOCK_MTIME)) -gt $LOCK_STALE_SECONDS ]; then
rm -f "$LOCK_FILE" 2>/dev/null
echo " [Unity sync] stale lock 제거 ($((NOW - LOCK_MTIME))s)"
else
echo " [Unity sync] 이미 진행 중 (lock 존재) — 스킵"
exit 0
fi
fi
# Lock 획득 + 종료 시 자동 제거 (trap)
touch "$LOCK_FILE"
trap 'rm -f "$LOCK_FILE" 2>/dev/null' EXIT
# paths.local.json 존재 확인
PATHS_FILE="paths.local.json"
if [ ! -f "$PATHS_FILE" ]; then
echo "⚠️ [Unity sync] paths.local.json 부재 — template 복사 후 UNITY_PROJECT_ROOT 설정 필요"
exit 0
fi
# UNITY_PROJECT_ROOT 추출 (jq 없으면 grep 대체)
if command -v jq >/dev/null 2>&1; then
UNITY_ROOT=$(jq -r '.UNITY_PROJECT_ROOT // empty' "$PATHS_FILE" 2>/dev/null)
else
UNITY_ROOT=$(grep -oP '"UNITY_PROJECT_ROOT"\s*:\s*"\K[^"]+' "$PATHS_FILE" 2>/dev/null)
fi
if [ -z "$UNITY_ROOT" ] || [ "$UNITY_ROOT" = "null" ]; then
echo "⚠️ [Unity sync] UNITY_PROJECT_ROOT 미설정"
exit 0
fi
# 경로 실체 확인
if [ ! -d "$UNITY_ROOT" ]; then
echo "⚠️ [Unity sync] 경로 부재: $UNITY_ROOT"
exit 0
fi
# git 레포 확인
if [ ! -d "$UNITY_ROOT/.git" ]; then
echo "⚠️ [Unity sync] git 레포 아님: $UNITY_ROOT (C30 수동 점검 대상 외)"
exit 0
fi
# fetch + pull --ff-only
cd "$UNITY_ROOT" || { echo "⚠️ [Unity sync] cd 실패"; exit 0; }
FETCH_OUT=$(git fetch origin 2>&1)
FETCH_EXIT=$?
if [ $FETCH_EXIT -ne 0 ]; then
echo "⚠️ [Unity sync] fetch 실패 (network·인증 확인 필요)"
echo "$FETCH_OUT" | head -3
exit 0
fi
BEHIND=$(git rev-list --count HEAD..@{u} 2>/dev/null || echo "0")
if [ "$BEHIND" -gt 0 ]; then
PULL_OUT=$(git pull --ff-only 2>&1)
PULL_EXIT=$?
if [ $PULL_EXIT -eq 0 ]; then
echo "✅ [Unity sync] $BEHIND 커밋 pull 완료 — $UNITY_ROOT"
else
echo "⚠️ [Unity sync] pull 실패 (충돌·manual merge 필요): $UNITY_ROOT"
echo "$PULL_OUT" | head -3
fi
else
echo "✅ [Unity sync] 최신 상태 — $UNITY_ROOT"
fi
exit 0