diff --git a/paths.local.json.template b/paths.local.json.template index 5145297..c01ab6f 100644 --- a/paths.local.json.template +++ b/paths.local.json.template @@ -4,6 +4,7 @@ "BURNINGTIMES_ROOT": "E:/BurningTimes", "UNITY_PROJECT_ROOT": "__SET_PER_PC__", + "UNITY_GIT_REMOTE": "__SET_PER_PC_OR_SHARED__", "FRAMEWORK_PKG_ROOT": "__SET_PER_PC__", "TABLE_EXPORT_ROOT": "${UNITY_PROJECT_ROOT}/Assets/ResWork/Table/Export", @@ -14,7 +15,8 @@ "DISCORD_WEBHOOK": "__SET_PER_PC_OR_SHARED__", "_per_pc_hint": { - "UNITY_PROJECT_ROOT": "PC별 Unity 프로젝트 클론 경로. 예) E:/NerdNavis/EerieVillage", + "UNITY_PROJECT_ROOT": "PC별 Unity 프로젝트 클론 경로. 예) E:/NerdNavis/EerieVillage/EerieVillage", + "UNITY_GIT_REMOTE": "Unity 프로젝트 Gitea 레포 URL. 2026-04-23 BT5-Dev C안으로 도입. 예) https://burning.i234.me/NerdNavis_AiDev/EerieVillage.git — scripts/unity_auto_sync.sh 가 사용", "FRAMEWORK_PKG_ROOT": "BT.Framework 패키지 로컬 경로 (분리 레포)", "DISCORD_WEBHOOK": "BT 조직 Discord 알림 웹훅 URL — 공유 시크릿. 외부 공개 금지 (.gitignore 필수)" } diff --git a/scripts/unity_auto_sync.sh b/scripts/unity_auto_sync.sh new file mode 100644 index 0000000..cb50c14 --- /dev/null +++ b/scripts/unity_auto_sync.sh @@ -0,0 +1,159 @@ +#!/bin/bash +# unity_auto_sync.sh — Unity 프로젝트 git 자동 sync (BT5-Dev C안, 2026-04-23 PD 승인) +# Unity Editor GitAutoSync.cs(Process.Start) → 본 스크립트 호출 → 실제 git 작업 +# +# 용법: unity_auto_sync.sh {init|pull|push|status} +# +# 경로 규약 (C34-11): +# UNITY_PROJECT_ROOT = paths.local.json 에서 읽음 (PC별 실값) +# UNITY_GIT_REMOTE = paths.local.json 에서 읽음 (Gitea 레포) +# BT 본 레포 루트는 git rev-parse 또는 BURNINGTIMES_ROOT 환경변수 + +set -u + +ACTION="${1:-status}" + +# BT 본 레포 루트 결정 +REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) +if [ -z "$REPO_ROOT" ]; then + REPO_ROOT="${BURNINGTIMES_ROOT:-E:/BurningTimes}" +fi +if [ ! -d "$REPO_ROOT" ]; then + echo "❌ BT 본 레포 찾지 못함 (시도: $REPO_ROOT)" >&2 + exit 2 +fi + +# paths.local.json 로드 +PATHS_FILE="$REPO_ROOT/paths.local.json" +if [ ! -f "$PATHS_FILE" ]; then + echo "❌ paths.local.json 부재 — template 복사 후 값 입력 필요" >&2 + exit 3 +fi + +# JSON 파싱 (jq 있으면 활용, 없으면 grep) +read_json() { + local key="$1" + if command -v jq >/dev/null 2>&1; then + jq -r ".${key} // empty" "$PATHS_FILE" 2>/dev/null + else + grep -o "\"${key}\"[[:space:]]*:[[:space:]]*\"[^\"]*\"" "$PATHS_FILE" 2>/dev/null \ + | sed 's/.*"\([^"]*\)"$/\1/' + fi +} + +UNITY_ROOT=$(read_json "UNITY_PROJECT_ROOT") +UNITY_REMOTE=$(read_json "UNITY_GIT_REMOTE") + +if [ -z "$UNITY_ROOT" ] || [ "$UNITY_ROOT" = "__SET_PER_PC__" ]; then + echo "❌ UNITY_PROJECT_ROOT 미설정 — paths.local.json 편집 필요" >&2 + exit 4 +fi + +if [ ! -d "$UNITY_ROOT" ]; then + echo "❌ Unity 프로젝트 경로 부재: $UNITY_ROOT" >&2 + exit 5 +fi + +# 로그 디렉토리 (BT C34-17 audit 중앙 저장소 연계) +LOG_DIR="$HOME/.claude/burningtimes-audit/unity_sync" +mkdir -p "$LOG_DIR" +LOG_FILE="$LOG_DIR/$(date +%Y-%m-%d).log" + +log() { + echo "[$(date +'%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE" +} + +cd "$UNITY_ROOT" || { echo "❌ cd 실패: $UNITY_ROOT" >&2; exit 6; } + +# git 레포 미초기화 판정 +if [ ! -d ".git" ]; then + if [ "$ACTION" = "init" ]; then + log "▶️ git init — Unity 프로젝트 레포 초기화" + git init -b main 2>&1 | tee -a "$LOG_FILE" + # Unity 표준 .gitignore·.gitattributes는 스크립트 외부에서 사전 배치 (Claude Code 직접 작성) + if [ -n "$UNITY_REMOTE" ] && [ "$UNITY_REMOTE" != "__SET_PER_PC__" ]; then + git remote add origin "$UNITY_REMOTE" 2>&1 | tee -a "$LOG_FILE" + log "✅ init + remote 설정 완료 (origin: $UNITY_REMOTE)" + else + log "⚠️ UNITY_GIT_REMOTE 미설정 — Gitea 레포 생성 후 수동 add 필요" + fi + log "📌 다음 단계: git add -A && git commit && push" + exit 0 + else + echo "❌ Unity 프로젝트 git 레포 아님. 'init' 먼저 수행" >&2 + exit 7 + fi +fi + +case "$ACTION" in + pull) + log "▶️ pull" + if git fetch origin 2>&1 | tee -a "$LOG_FILE" \ + && git merge --ff-only origin/main 2>&1 | tee -a "$LOG_FILE"; then + log "✅ pull 완료" + exit 0 + else + log "❌ pull 실패 (충돌/네트워크/레포 미생성 가능) — 수동 개입 필요" + exit 8 + fi + ;; + push) + log "▶️ push — add + commit + push" + git add -A 2>&1 | tee -a "$LOG_FILE" + + if git diff --cached --quiet; then + log "ℹ️ 스테이징 변경 없음" + # 선행 commit 있으면 push + if git log origin/main..HEAD --oneline 2>/dev/null | grep -q .; then + log "▶️ 로컬 선행 commit push 시도" + if git push origin main 2>&1 | tee -a "$LOG_FILE"; then + log "✅ 선행 commit push 완료" + exit 0 + fi + fi + log "ℹ️ push 대상 없음 — 정상 종료" + exit 0 + fi + + # 현재 scene 추정 (Unity EditorBuildSettings 기반) + SCENE="unknown" + if [ -f "ProjectSettings/EditorBuildSettings.asset" ]; then + SCENE=$(grep -m1 "path:" "ProjectSettings/EditorBuildSettings.asset" 2>/dev/null \ + | sed 's|.*path: ||;s|\.unity.*||;s|.*/||' || echo "unknown") + fi + N_FILES=$(git diff --cached --name-only | wc -l | tr -d ' ') + MSG="auto: $(date +'%Y-%m-%d %H:%M') · scene: ${SCENE:-unknown} · ${N_FILES} files" + + git commit -m "$MSG" 2>&1 | tee -a "$LOG_FILE" + + if git push origin main 2>&1 | tee -a "$LOG_FILE"; then + log "✅ push 완료: $MSG" + exit 0 + else + log "❌ push 실패 — 로컬 commit 유지, 네트워크/원격 확인 필요" + exit 9 + fi + ;; + status) + log "▶️ status" + git status --short 2>&1 | tee -a "$LOG_FILE" + echo "--- 최근 3개 commit ---" | tee -a "$LOG_FILE" + git log -3 --oneline 2>&1 | tee -a "$LOG_FILE" + exit 0 + ;; + *) + cat <&2 +Usage: unity_auto_sync.sh {init|pull|push|status} + +Actions: + init — git 레포 초기화 + remote 설정 (.gitignore/.gitattributes는 사전 배치) + pull — fetch + ff-only merge (충돌 시 중단) + push — add + commit(자동 메시지) + push + status — 작업 트리 상태 + 최근 3개 commit + +Prerequisite: + paths.local.json 의 UNITY_PROJECT_ROOT · UNITY_GIT_REMOTE 설정 필수 +EOF + exit 1 + ;; +esac diff --git a/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md b/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md index 8b55ca4..e96e690 100644 --- a/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md +++ b/공유/PD_지시_트래킹/개발팀_PD_지시_로그.md @@ -33,7 +33,8 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**. | # | 일시 | 지시 요지 | 처리 상태 | 산출물 경로 | 중단 사유 | 사후 조치 | |---|------|----------|----------|-----------|----------|----------| -(활성 지시 없음 — BT4 완료 아카이브 이동. Phase 3 EerieVillage 착수 시 PD님 지시 수령 후 신규 항목 등록) +| BT5-Dev | 2026-04-23 | **EerieVillage Phase 3 파일럿 (개발)** — ①Unity 프로젝트 git 초기화 + C안 자동 sync(Unity Editor GitAutoSync + BT 본 레포 unity_auto_sync.sh) **PD 승인 채택** ②Unity 2D 플랫포머 템플릿 캐릭터 → Player 시리즈 5종 스프라이트 세트 교체, 이동·공격(마우스 좌클릭) — Claude Desktop Unity MCP ③템플릿 구조·소스코드 선행 분석 → 게임 제작 준비 | **진행중** | [1단계 완료] `E:/NerdNavis/EerieVillage/EerieVillage/.git` 초기화·초기 commit 완료(모든 Assets + GitAutoSync.cs + .gitignore) · `scripts/unity_auto_sync.sh` 신규 · `paths.local.json.template` `UNITY_GIT_REMOTE` 추가 / [2·3단계 대기] Claude Desktop Unity MCP + 개발팀 Agent 분석 Task | — | PD 수동: Gitea `NerdNavis_AiDev/EerieVillage` 레포 생성 + `paths.local.json`에 UNITY_GIT_REMOTE 추가 → `Tools/Git/Push Now` 최초 push → Claude Desktop Unity MCP 캐릭터 교체 → 개발팀장 Agent 템플릿 분석 Task (Claude Code 가능) | +| BT5-Plan | 2026-04-23 | **EerieVillage Phase 3 파일럿 (기획)** — PD 9개 코어 룰 기반 초기 기획: 캐주얼 로그라이크 2D 횡스크롤 플랫포머 · 마을/전투 구분 · 보스 스테이지 · 레벨업 스킬 카드 3픽 · 기본 라이프 1 (사망 시 레벨·스킬 초기화) · 아이템 파츠별 1개 (교체식) · 특성 영구 시스템. 스킬 카드·아이템 상세는 "추후 기획" 표기. narrative·system·content·level·balance·ux 서브에이전트 동원은 기획팀장 재량 | **진행중** | 예상: `프로젝트/EerieVillage/기획/01_게임_컨셉.md`·`02_코어_루프.md`·`03_진행_시스템_초안.md`·`04_전투_기본_스펙.md`·`05_스테이지_구조_초안.md` + 팀원 동원분 | — | 기획팀장 Agent background 호출 → 산출물 수령 시 종합 보고 | --- diff --git a/공유/조직공지/2026-04-23_BT5_Unity_자동sync_PD_수동집행_안내.md b/공유/조직공지/2026-04-23_BT5_Unity_자동sync_PD_수동집행_안내.md new file mode 100644 index 0000000..aae1b55 --- /dev/null +++ b/공유/조직공지/2026-04-23_BT5_Unity_자동sync_PD_수동집행_안내.md @@ -0,0 +1,128 @@ +# [PD 수동 집행 안내] BT5-Dev Unity 자동 sync C안 — 최초 1회 셋업 + +> **발행일**: 2026-04-23 +> **대상**: PD님 본 PC (DESKTOP-RD7PUKN) 및 향후 다른 PC +> **선행**: PM 집행 완료분 (Unity git init·GitAutoSync.cs·unity_auto_sync.sh·template 갱신) +> **소요**: 약 10~15분 (Gitea UI + 로컬 설정) + +--- + +## 1. 개요 + +BT5-Dev C안 승인에 따라 Unity 프로젝트 자동 sync 체계가 구축되었습니다. +- **Unity Editor 측**: `Assets/Editor/GitAutoSync/GitAutoSync.cs` — 시작 시 자동 pull, 종료 시 자동 push, Menu "Tools/Git/*" +- **BT 본 레포 측**: `scripts/unity_auto_sync.sh` — 실제 git 작업 수행 (검증된 BT 스크립트 체계 재사용) + +**PM 집행 완료 (현 시점)**: +- Unity 프로젝트 git init + 초기 commit `9f689c1` (`E:/NerdNavis/EerieVillage/EerieVillage/.git`) +- `.gitignore` Unity 표준 배치 +- `GitAutoSync.cs` Editor 스크립트 배치 +- `scripts/unity_auto_sync.sh` BT 본 레포 신설 (bash syntax 검증 완료) +- `paths.local.json.template` `UNITY_GIT_REMOTE` 필드 추가 + +**PD 수동 집행 필요 (아래 3단계)** + +--- + +## 2. PD 수동 단계 — 3단계 + +### 2-1. Gitea에 EerieVillage 레포 생성 + +1. 브라우저로 `https://burning.i234.me/repo/create` 접속 +2. 조직(Owner): **`NerdNavis_AiDev`** 선택 +3. 레포 이름: **`EerieVillage`** 입력 +4. Description (선택): `기묘한 고을 : 조선퇴마뎐 / EerieVillage: Joseon Exorcist — Unity 프로젝트 (BurningTimes 조직)` +5. 공개 설정: **Private** 권장 (조직 내부) +6. **"Initialize Repository"는 체크 해제** (로컬에 이미 초기 commit `9f689c1` 있음) +7. "Create Repository" 클릭 + +결과 URL (가정): `https://burning.i234.me/NerdNavis_AiDev/EerieVillage.git` + +### 2-2. `paths.local.json` 갱신 + +PD님 PC의 `E:/BurningTimes/paths.local.json` 파일 열어 아래 필드 추가·갱신: + +```json +{ + "UNITY_PROJECT_ROOT": "E:/NerdNavis/EerieVillage/EerieVillage", + "UNITY_GIT_REMOTE": "https://burning.i234.me/NerdNavis_AiDev/EerieVillage.git" +} +``` + +- `UNITY_PROJECT_ROOT` 값 확인 필수 (PD 환경 기준 `E:/NerdNavis/EerieVillage/EerieVillage`) +- `UNITY_GIT_REMOTE` 새로 추가 (2-1에서 생성한 URL) + +### 2-3. 최초 push + 자동 sync 검증 + +**옵션 A — 터미널에서 직접** (권장): +```bash +cd "E:/NerdNavis/EerieVillage/EerieVillage" +git remote add origin "https://burning.i234.me/NerdNavis_AiDev/EerieVillage.git" +git push -u origin main +``` + +**옵션 B — Unity Editor Menu에서** (자동화 테스트 겸): +1. Unity Editor로 EerieVillage 프로젝트 열기 +2. 상단 메뉴 **"Tools > Git > Push Now"** 클릭 (단축키 `Ctrl+Shift+P`) +3. Unity Console에 `✅ push 완료` 로그 확인 + +**연동 검증**: +- Gitea UI에서 EerieVillage 레포에 commit 히스토리 확인 +- Unity Editor Menu **"Tools > Git > Status"** 로 상태 확인 +- Unity Editor 재시작 후 Console에 `[GitAutoSync] Unity Editor 시작 — auto pull` 로그 확인 + +--- + +## 3. 일상 운용 — PD님 개발 시 동작 + +### 자동 동작 +| 시점 | 동작 | 근거 | +|------|------|------| +| Unity Editor 시작 | 자동 `git pull` (ff-only) | `GitAutoSync.OnEditorStart` → `unity_auto_sync.sh pull` | +| Unity Editor 종료 | 자동 `git add -A && commit && push` | `GitAutoSync.OnEditorQuit` → `unity_auto_sync.sh push` | + +### 수동 발동 메뉴 (Unity Editor 상단) +- **Tools/Git/Pull Now** (`Ctrl+Shift+G`) — 즉시 pull +- **Tools/Git/Push Now** (`Ctrl+Shift+P`) — 즉시 add+commit+push +- **Tools/Git/Status** — 현재 작업 트리 상태 + 최근 3 commit +- **Tools/Git/Init Repo (최초 1회)** — 레포 재초기화 (이미 완료) +- **Tools/Git/Toggle Auto Pull On Load** — 자동 pull 토글 +- **Tools/Git/Toggle Auto Push On Quit** — 자동 push 토글 + +### 커밋 메시지 자동 생성 +``` +auto: 2026-04-23 15:30 · scene: MainGameScene · 7 files +``` + +### 로그 위치 +모든 sync 이력: `$HOME/.claude/burningtimes-audit/unity_sync/YYYY-MM-DD.log` + +### 실패 처리 +- **pull 실패 (충돌)**: Unity Console Error + Dialog 알림 → PD 수동 해결. 자동 rebase·force 금지 (C6-2 데이터 보호) +- **push 실패 (네트워크)**: 로컬 commit은 유지 → 다음 push 시 재시도 +- **스크립트 부재**: Unity Console Warning "BT 본 레포 확인 필요" + +--- + +## 4. 다른 PC 이관 시 (향후) + +1. BT 본 레포 `git clone` + setup 스크립트 실행 +2. Unity 프로젝트 `git clone https://burning.i234.me/NerdNavis_AiDev/EerieVillage.git` + Unity Hub로 열기 +3. `paths.local.json` 2-2와 동일하게 설정 (PC별 `UNITY_PROJECT_ROOT` 경로 조정) +4. Unity Editor 시작 시 자동 pull 동작 확인 + +--- + +## 5. 연관 자산 + +- **Unity Editor 스크립트**: `E:/NerdNavis/EerieVillage/EerieVillage/Assets/Editor/GitAutoSync/GitAutoSync.cs` +- **BT 본 레포 스크립트**: `scripts/unity_auto_sync.sh` +- **Template**: `paths.local.json.template` (`UNITY_GIT_REMOTE` 필드) +- **PD 지시 로그**: `공유/PD_지시_트래킹/개발팀_PD_지시_로그.md` BT5-Dev + +## 6. 주의 + +- Unity Editor **비정상 종료 시**(크래시·강제 종료) `quitting` 이벤트 미발동 → 자동 push 생략. 다음 정상 종료 or 수동 "Push Now"로 보완 +- 대용량 바이너리 에셋(.png·.fbx 등) 축적 시 git LFS 도입 권고 (별도 안건화 필요) +- Library/·Temp/·Logs/는 `.gitignore` 대상 — PC별 별도 생성됨 +- `paths.local.json` 은 **`.gitignore` 대상** (PC별 실값, 공유 금지)