feat(setup): PD 지시 #8 — 개발실 셋팅 마무리 잔여 과제 3종 완결
- 개발실/.claude/agents/개발실장.md 구 경로 3건을 paths.local.json 변수로 치환 - scripts/verify_setup.ps1 신설: 파일·OS reparse·실행 결과 3축 검증 - 공유/조직공지/신PC_셋팅_체크리스트_v1.md 신설: clone→setup→verify 5단계 표준 - 개발실_PD_지시_로그.md #8 등재 + 2026-04-15_개발실.md §15 append Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1e89f1793e
commit
4a15ed28ad
|
|
@ -0,0 +1,178 @@
|
|||
# 너드나비스 조직 레포 - 신 PC 셋팅 검증 스크립트 (Windows / PowerShell)
|
||||
#
|
||||
# 목적: `setup/setup_windows.ps1` 실행 후, 본 PC가 조직 레포를 정상 사용할 수 있는 상태인지
|
||||
# 파일 존재·OS 동작(reparse point)·실행 결과(JSON 파싱) 3축으로 검증.
|
||||
#
|
||||
# 사용: PowerShell에서
|
||||
# .\scripts\verify_setup.ps1
|
||||
# 또는 (상세 출력) .\scripts\verify_setup.ps1 -Verbose
|
||||
#
|
||||
# Exit code: 0 = OK, 1 = 결함 발견 (stderr에 항목 나열)
|
||||
|
||||
[CmdletBinding()]
|
||||
param()
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot "..")).Path
|
||||
$fail = @()
|
||||
$warn = @()
|
||||
|
||||
function Check([string]$name, [bool]$ok, [string]$detail) {
|
||||
if ($ok) {
|
||||
Write-Host "[OK] $name — $detail"
|
||||
} else {
|
||||
Write-Host "[FAIL] $name — $detail" -ForegroundColor Red
|
||||
$script:fail += "$name :: $detail"
|
||||
}
|
||||
}
|
||||
|
||||
function Warn([string]$name, [string]$detail) {
|
||||
Write-Host "[WARN] $name — $detail" -ForegroundColor Yellow
|
||||
$script:warn += "$name :: $detail"
|
||||
}
|
||||
|
||||
Write-Host "=== 너드나비스 셋팅 검증 ==="
|
||||
Write-Host "RepoRoot: $repoRoot"
|
||||
Write-Host ""
|
||||
|
||||
# 1. paths.local.json 실파일·파싱·필수 키
|
||||
$pathsFile = Join-Path $repoRoot "paths.local.json"
|
||||
$paths = $null
|
||||
if (Test-Path $pathsFile) {
|
||||
try {
|
||||
$raw = Get-Content $pathsFile -Raw -Encoding UTF8
|
||||
$paths = $raw | ConvertFrom-Json
|
||||
Check "paths.local.json 존재·JSON 파싱" $true $pathsFile
|
||||
} catch {
|
||||
Check "paths.local.json 존재·JSON 파싱" $false "JSON 파싱 실패: $_"
|
||||
}
|
||||
} else {
|
||||
Check "paths.local.json 존재" $false "파일 없음. setup_windows.ps1 선행 필요: $pathsFile"
|
||||
}
|
||||
|
||||
$required = @("NERDNAVIS_ROOT","UNITY_PROJECT_ROOT","FRAMEWORK_PKG_ROOT","TABLE_EXPORT_ROOT")
|
||||
if ($paths) {
|
||||
foreach ($k in $required) {
|
||||
$v = $paths.$k
|
||||
$ok = [bool]$v
|
||||
Check "paths.local.json 키 [$k]" $ok ("값=" + ($v -as [string]))
|
||||
}
|
||||
|
||||
# NERDNAVIS_ROOT 실제 디렉토리 존재 여부
|
||||
if ($paths.NERDNAVIS_ROOT) {
|
||||
Check "NERDNAVIS_ROOT 디렉토리 존재" (Test-Path $paths.NERDNAVIS_ROOT) $paths.NERDNAVIS_ROOT
|
||||
}
|
||||
# Unity·Framework·TableExport는 경고 수준 (존재하지 않아도 일부 작업은 가능)
|
||||
foreach ($k in @("UNITY_PROJECT_ROOT","FRAMEWORK_PKG_ROOT","TABLE_EXPORT_ROOT")) {
|
||||
$v = $paths.$k
|
||||
if ($v -and -not (Test-Path $v)) {
|
||||
Warn "$k 디렉토리 미존재" "$v (해당 부서 작업 시 필요)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# 2. Claude 사용자 메모리 junction 검증
|
||||
$orgMemoryTarget = Join-Path $repoRoot "memory\org"
|
||||
Check "memory/org 실체 존재" (Test-Path $orgMemoryTarget) $orgMemoryTarget
|
||||
|
||||
$claudeMemoryBase = "$env:USERPROFILE\.claude\projects"
|
||||
if (Test-Path $claudeMemoryBase) {
|
||||
$found = $false
|
||||
$junctionOk = $false
|
||||
foreach ($d in (Get-ChildItem $claudeMemoryBase -Directory -ErrorAction SilentlyContinue)) {
|
||||
$memLink = Join-Path $d.FullName "memory"
|
||||
if (Test-Path $memLink) {
|
||||
$found = $true
|
||||
$item = Get-Item $memLink -Force
|
||||
$isReparse = ($item.Attributes -band [IO.FileAttributes]::ReparsePoint) -ne 0
|
||||
if ($isReparse) {
|
||||
# 타깃이 memory\org 인지 확인 (memory 자체가 memory\org를 가리킴)
|
||||
$target = (Get-Item $memLink -Force).Target
|
||||
if (-not $target) { $target = (& cmd /c "dir `"$($item.Parent.FullName)`" 2>&1" | Out-String) }
|
||||
$pointsToOrg = $target -like "*memory\org*" -or $target -like "*memory/org*"
|
||||
if ($pointsToOrg) {
|
||||
Check "junction [$($d.Name)/memory]" $true "-> memory\org (reparse OK)"
|
||||
$junctionOk = $true
|
||||
} else {
|
||||
Warn "junction 타깃 확인 불가" "[$($d.Name)/memory] target=$target (수동 확인 권장)"
|
||||
}
|
||||
} else {
|
||||
Check "junction [$($d.Name)/memory]" $false "reparse point 아님 (실체 폴더). setup 재실행 필요"
|
||||
}
|
||||
}
|
||||
}
|
||||
if (-not $found) {
|
||||
Check "Claude 프로젝트 해시 폴더 내 memory 링크" $false "$claudeMemoryBase 에서 memory 링크를 찾지 못함. setup_windows.ps1 재실행 필요"
|
||||
} elseif (-not $junctionOk) {
|
||||
Warn "junction 상태" "타깃 검증에 성공한 링크가 없음. 수동 확인 권장"
|
||||
}
|
||||
|
||||
# MEMORY.md 로드 가능 여부 (junction 통해 읽기)
|
||||
$memoryMdCandidates = Get-ChildItem $claudeMemoryBase -Directory -ErrorAction SilentlyContinue |
|
||||
ForEach-Object { Join-Path $_.FullName "memory\MEMORY.md" } |
|
||||
Where-Object { Test-Path $_ }
|
||||
if ($memoryMdCandidates.Count -gt 0) {
|
||||
Check "MEMORY.md junction 경유 읽기" $true ($memoryMdCandidates[0])
|
||||
} else {
|
||||
Warn "MEMORY.md 읽기" "junction 경유로 MEMORY.md 를 찾지 못함"
|
||||
}
|
||||
} else {
|
||||
Warn "Claude 메모리 베이스" "$claudeMemoryBase 미존재. Claude Code 첫 실행 전일 가능성"
|
||||
}
|
||||
|
||||
# 3. 경로 추상화 적용 여부 (CLAUDE.md 계열에 구 하드코딩 경로 잔존 확인)
|
||||
$hardcodePatterns = @("C:/Users/PC/Documents", "D:/NerdNavis/FilGoodBandits", "D:/NerdNavis/NerdNavis.Framework")
|
||||
$scanTargets = @(
|
||||
(Join-Path $repoRoot "CLAUDE.md"),
|
||||
(Join-Path $repoRoot "개발실\CLAUDE.md"),
|
||||
(Join-Path $repoRoot "기획실\CLAUDE.md"),
|
||||
(Join-Path $repoRoot "개발실\.claude\agents"),
|
||||
(Join-Path $repoRoot "기획실\.claude\agents")
|
||||
) | Where-Object { Test-Path $_ }
|
||||
|
||||
$hits = @()
|
||||
foreach ($t in $scanTargets) {
|
||||
$files = if ((Get-Item $t).PSIsContainer) { Get-ChildItem $t -Recurse -File -Include *.md } else { @(Get-Item $t) }
|
||||
foreach ($f in $files) {
|
||||
$content = Get-Content $f.FullName -Raw -ErrorAction SilentlyContinue
|
||||
foreach ($p in $hardcodePatterns) {
|
||||
if ($content -match [regex]::Escape($p)) {
|
||||
$hits += "$($f.FullName) :: '$p'"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ($hits.Count -eq 0) {
|
||||
Check "CLAUDE.md 계열 경로 추상화" $true "하드코딩 구 경로 미발견"
|
||||
} else {
|
||||
Warn "CLAUDE.md 계열 경로 추상화" ("잔존 " + $hits.Count + "건 — 변수화 후보")
|
||||
foreach ($h in $hits) { Write-Host " - $h" -ForegroundColor DarkYellow }
|
||||
}
|
||||
|
||||
# 4. .gitignore 핵심 규칙 (paths.local.json 무시)
|
||||
$gi = Join-Path $repoRoot ".gitignore"
|
||||
if (Test-Path $gi) {
|
||||
$giText = Get-Content $gi -Raw
|
||||
Check ".gitignore paths.local.json 제외" ($giText -match "paths\.local\.json") ".gitignore 라인 확인됨"
|
||||
} else {
|
||||
Check ".gitignore 존재" $false ".gitignore 파일 없음"
|
||||
}
|
||||
|
||||
# 5. settings.json (조직 공용 승인) 존재
|
||||
$settings = Join-Path $repoRoot ".claude\settings.json"
|
||||
Check ".claude/settings.json (조직 공용 승인)" (Test-Path $settings) $settings
|
||||
|
||||
# 결과
|
||||
Write-Host ""
|
||||
Write-Host "=== 결과 요약 ==="
|
||||
Write-Host "PASS: 상기 [OK] 표기"
|
||||
if ($warn.Count -gt 0) {
|
||||
Write-Host "WARN: $($warn.Count)건 — 블로커 아님" -ForegroundColor Yellow
|
||||
}
|
||||
if ($fail.Count -gt 0) {
|
||||
Write-Host "FAIL: $($fail.Count)건 — 아래 항목 해결 필요" -ForegroundColor Red
|
||||
foreach ($f in $fail) { Write-Host " - $f" -ForegroundColor Red }
|
||||
exit 1
|
||||
}
|
||||
Write-Host "셋팅 검증 통과. 작업 착수 가능." -ForegroundColor Green
|
||||
exit 0
|
||||
|
|
@ -35,7 +35,7 @@ model: opus
|
|||
|
||||
## 기획실 연동
|
||||
|
||||
기획실(`C:/Users/PC/Documents/너드나비스/기획실/`)과 공유 채널(`C:/Users/PC/Documents/너드나비스/공유/`)을 통해 협업합니다.
|
||||
기획실(`${NERDNAVIS_ROOT}/기획실/`)과 공유 채널(`${NERDNAVIS_ROOT}/공유/`)을 통해 협업합니다. 실값은 레포 루트 `paths.local.json` 참조 (PC별 상이).
|
||||
|
||||
### 요청 처리 흐름
|
||||
1. `공유/기획실→개발실/` 폴더에 요청서가 들어옴
|
||||
|
|
@ -44,7 +44,7 @@ model: opus
|
|||
4. 완료된 요청서를 `완료/` 폴더로 이동
|
||||
|
||||
### 기획실 데이터 참조
|
||||
- **데이터 SOT**: `D:/NerdNavis/FilGoodBandits/DeckBuilding/Assets/ResWork/Table/Export/` (JSON)
|
||||
- **데이터 SOT**: `${TABLE_EXPORT_ROOT}` (= `${UNITY_PROJECT_ROOT}/Assets/ResWork/Table/Export/`, JSON)
|
||||
- **기획 밸런싱 문서**: `기획실/밸런싱/`
|
||||
- **기획 시뮬레이터**: `기획실/.cache/`
|
||||
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ C3·C13 위반에 해당. **즉시 자진 보고 후 소급 등록**.
|
|||
| 6 | 2026-04-15 | (PD님 직접 지시, #4 범위 확장분) **조직 전체(PM·기획·개발) 에이전트 자산 Git 동기화 즉시 착수** + **C14(토큰 최소화 우선 설계)·C15(일정·기한 개념 배제) 신규 코어룰 신설** + 개발실장 주도 팀장급 회의 진행 후 병렬 작업 가능 상태로 준비, 이후 총괄PM 세션에서 PD님 최종 확인·승인 | 완료 | 산출물 3종 (위 v2·C14C15·준비패키지) + 기획팀장 ⑧·⑨ 수렴(B/A안) + 총괄PM ⑦ 분류(메인 Private+하이브리드) | - | PD님 일괄 승인 완료, #7로 이행 |
|
||||
| 7 | 2026-04-15 | (PD님 직접 지시) #6 일괄 승인. **조직 전체 프로세스·노하우를 Git 저장소에 동기화 + push 완료 + 저장소 위치 보고**. 다른 PC에서 동기화 검증 예정 | **완료** | 본인 작업 완료: C14·C15 정식 편입 + 조직공지 + CLAUDE.md 갱신. 개발실장 작업: **로컬 git init → 스캐폴드(.gitignore/.gitattributes/README/paths.local.json.template/setup_windows.ps1/setup_macos.sh) 작성 → C14-4 참조 무결성 정리(공통_업무_규칙.md 부록 A SOT 신설, 개발실·기획실 CLAUDE.md 복붙 제거) → memory/org/ 사용자 메모리 복사 → 82개 파일 초기 커밋 + push 완료**. 첫 커밋 SHA: `4e2b236dbf7e9ed2b62d6565d45985055cc427fc`. Remote 확인: `https://burning.i234.me/NerdNavis/NerdNavisAi.git` refs/heads/main | - | PAT 실측 결과: **Windows Credential Manager v2(cmdkey 비노출 형식)에 이미 캐싱되어 있었음**. 첫 ls-remote는 401이었으나 push 시 자동 자격증명 처리되어 성공. 최종 검증 PD님 다른 PC에서 clone 테스트 대기 |
|
||||
| 7-α | 2026-04-15 | (PD님 직접 지시, #7 후속 확장) **`NerdNavisAi` 저장소 생성 권한 확인 및 생성**. 권한 있으면 Private 레포 생성 후 clone URL 회신, 없으면 검토 결과 보고 | **완료** (2026-04-15 총괄PM 세션 점검 시 상태 갱신, PD님 승인) | Private 레포 생성·push 완료: `https://burning.i234.me/NerdNavis/NerdNavisAi.git` (SSH: `ssh://git@burning.i234.me:30030/NerdNavis/NerdNavisAi.git`). 첫 커밋 `4e2b236`. #7 산출물에 흡수되어 실질 완결 | - | 교훈: 서브 연번(-α 등) 항목은 상위 항목 완료 시 동시 마감 누락되지 않도록 주의. 총괄PM 점검에서 소급 정정 |
|
||||
| 8 | 2026-04-15 | (PD님 직접 지시, 개발실장 주도) **§14.4 잔여 과제 3종 처리**: (a) `개발실/CLAUDE.md` 계열 구 경로 `paths.local.json` 변수화, (b) `scripts/verify_setup.ps1` 신설 (3축 검증), (c) `공유/조직공지/신PC_셋팅_체크리스트_v1.md` 신설. 커밋·푸시 완료 후 보고 | **완료** | (a) `개발실/.claude/agents/개발실장.md` L38·L47 `C:/Users/PC/...`·`D:/NerdNavis/...` → `${NERDNAVIS_ROOT}`·`${TABLE_EXPORT_ROOT}`·`${UNITY_PROJECT_ROOT}` 변수화. (b) `scripts/verify_setup.ps1` 신설 — `paths.local.json` 파싱·필수 키·`memory` junction reparse point·`MEMORY.md` 읽기·경로 추상화 잔존 스캔·`.gitignore`·`.claude/settings.json` 검증. (c) `공유/조직공지/신PC_셋팅_체크리스트_v1.md` 신설 — Clone → setup → paths 보정 → verify → Claude 동작 확인 5단계 + 자주 발생 문제표. / 본 세션 PM-general 공유 + 일일보고 §15 append | - | **재발 방지 메모 적재 권고**: 신 PC 재현성은 "파일 존재·OS 동작(reparse)·실행 결과(파싱·읽기)" 3축 검증 필수. 본 체크리스트를 표준으로 유지. 변경 시 v2 발행 규칙(버전 표기·변경 이력 섹션) 준수 |
|
||||
|
||||
> **2026-04-15 오후 추가 갱신 (C4·C13 위반 자진 정정 2차)**:
|
||||
> #5번 신규 등재. PD님 3대 지시(A/B/C) 및 #1 산출물 경로에 Framework Tier 1 구현체(`D:/NerdNavis/NerdNavis.Framework/`)를 소급 등록. **B 착수 시점 및 Git 동기화 병렬 지시(#4) 착수 시점에 총괄PM 공유를 누락**한 건을 PD님이 직접 지적하여 즉시 정정. 근본 원인: "C 항목 진행 전 지시 대기" 지시를 본인이 **PM 공유 전체 보류**로 잘못 확대 해석. C4(총괄PM 하달)·C13(4단계 가시화)의 "작업 착수 시점=상시 공유 의무" 원칙을 거스른 것. 재발 방지 관례: **신규 트랙 착수 즉시 pm-general 공유 → TodoWrite 항목 생성** (총괄PM 채택 권고). 자체 경위는 `공유/일일보고/2026-04-15_개발실.md` 오후 섹션 참조.
|
||||
|
|
|
|||
|
|
@ -549,3 +549,34 @@ C15 일정 표현 사용 금지, 다만 **막히지 않는 작업은 병행**
|
|||
|
||||
### 14.6 갱신한 파일
|
||||
- `공유/일일보고/2026-04-15_개발실.md` §14 본 섹션 신설
|
||||
|
||||
---
|
||||
|
||||
## 15. PD 지시 #8 — §14.4 잔여 과제 3종 처리 (개발실장 주도, 2026-04-15 말미 append)
|
||||
|
||||
### 15.1 배경
|
||||
§14.4 에서 식별된 잔여 과제(경로 추상화 잔존·재현성 검증 스크립트 부재·신 PC 체크리스트 부재)를 PD님이 #8 로 직접 지시. 개발실장 주도로 처리 후 커밋·푸시 완료.
|
||||
|
||||
### 15.2 산출물 (3종)
|
||||
|
||||
| # | 경로 | 내용 | 검증 |
|
||||
|---|------|------|------|
|
||||
| a | `개발실/.claude/agents/개발실장.md` | L38·L47 구 경로를 `${NERDNAVIS_ROOT}`·`${TABLE_EXPORT_ROOT}`·`${UNITY_PROJECT_ROOT}` 로 변수화 | `verify_setup.ps1` 의 경로 추상화 스캔에서 하드코딩 미발견 확인 |
|
||||
| b | `scripts/verify_setup.ps1` | 3축 검증 스크립트 신설 (파일·OS reparse·실행) | 본 worktree 에서 dry-run: `paths.local.json` 없음 1건 FAIL 외 전부 OK (worktree 특성, 메인 레포에선 정상 통과 예상) |
|
||||
| c | `공유/조직공지/신PC_셋팅_체크리스트_v1.md` | 신 PC 재현 표준 5단계 + 자주 발생 문제표 + 변경 이력 | 파일 실존·내부 링크 경로 확인 |
|
||||
|
||||
### 15.3 작업 기법 메모 (인사이트)
|
||||
- **BOM 이슈 재확인**: Write 툴 기본값(UTF-8 no BOM) 로 작성한 PowerShell 스크립트에 한글 문자 포함 시 PowerShell 5.1 파서가 구조 토큰 매칭에 실패 → 실행 불가. `verify_setup.ps1` 작성 후 UTF-8 BOM 추가 후에만 정상 파싱. **정식 룰**: PowerShell 스크립트는 반드시 UTF-8 with BOM 으로 저장. setup_windows.ps1 이 `paths.local.json` 을 no-BOM 으로 쓰는 것과는 반대 규칙이므로 혼동 주의.
|
||||
- **`${…}` 서브식 금지**: PowerShell 확장 문자열에서 `${(식)}` 형태는 중괄호 짝을 깨뜨림. `$(식)` 를 쓸 것.
|
||||
- **Worktree 에서의 검증 한계**: worktree 에는 `paths.local.json` 이 없음(메인 레포 상위에만 존재하거나 없거나). 검증 스크립트가 FAIL 내는 것은 정상. 메인 레포 루트에서 재실행 필요.
|
||||
|
||||
### 15.4 PM 공유
|
||||
- `공유/PD_지시_트래킹/개발실_PD_지시_로그.md` #8 등재 (처리 상태: **완료**)
|
||||
- 본 세션 종료 시 총괄PM 공유 예정 (pm-general 또는 직접 서브에이전트 경로로 결정은 PD님 판단)
|
||||
|
||||
### 15.5 갱신한 파일
|
||||
- `개발실/.claude/agents/개발실장.md` (경로 변수화)
|
||||
- `scripts/verify_setup.ps1` (신설, UTF-8 BOM)
|
||||
- `공유/조직공지/신PC_셋팅_체크리스트_v1.md` (신설)
|
||||
- `공유/PD_지시_트래킹/개발실_PD_지시_로그.md` (#8 등재)
|
||||
- `공유/일일보고/2026-04-15_개발실.md` (§15 본 섹션)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,147 @@
|
|||
# 신 PC 셋팅 체크리스트 v1
|
||||
|
||||
> **발행**: 2026-04-15 (개발실장 주도, 총괄PM·PD님 공유)
|
||||
> **목적**: 회사/집/노트북 등 새로운 PC에서 조직 레포(`NerdNavisAi`)를 가동할 때 동일한 재현 결과를 보장하기 위한 표준 체크리스트.
|
||||
> **근거**: PD 지시 #7·#7-α (Git 동기화 완료) → #8 (개발실 셋팅 마무리 잔여 과제 3종).
|
||||
> **원칙**: C5 (정보의 정직성) · C14 (토큰 최소화 — 본 문서가 유일한 셋팅 SOT) · `공유/공통_업무_규칙.md` P-설정 관련 조항 준수.
|
||||
|
||||
---
|
||||
|
||||
## 0. 전제
|
||||
|
||||
- Windows 10/11 + PowerShell 5.1 이상 (또는 macOS/Linux — macOS는 `setup/setup_macos.sh` 사용)
|
||||
- Git 설치 완료
|
||||
- Claude Code CLI 설치 완료
|
||||
- Gitea 접근 자격 (PAT 또는 SSH key) 준비
|
||||
|
||||
---
|
||||
|
||||
## 1. Clone
|
||||
|
||||
레포 루트는 **사용자가 원하는 위치**(예: `C:/Users/PC/Documents/너드나비스` 또는 `E:/NerdNavisAi`)로 자유 선택 가능.
|
||||
|
||||
```powershell
|
||||
# HTTPS
|
||||
git clone https://burning.i234.me/NerdNavis/NerdNavisAi.git "<원하는 경로>"
|
||||
|
||||
# 또는 SSH
|
||||
git clone ssh://git@burning.i234.me:30030/NerdNavis/NerdNavisAi.git "<원하는 경로>"
|
||||
```
|
||||
|
||||
**체크**
|
||||
- [ ] clone 성공
|
||||
- [ ] `cd <레포 루트>` 후 `git log -1` 로 최신 커밋 확인
|
||||
|
||||
---
|
||||
|
||||
## 2. 셋업 스크립트 실행
|
||||
|
||||
### Windows
|
||||
|
||||
```powershell
|
||||
cd <레포 루트>
|
||||
.\setup\setup_windows.ps1
|
||||
```
|
||||
|
||||
스크립트가 수행하는 작업:
|
||||
1. `paths.local.json` 자동 생성 (레포 루트 드라이브 기준으로 `UNITY_PROJECT_ROOT`·`FRAMEWORK_PKG_ROOT` 추정)
|
||||
2. `memory/org/` 디렉토리 준비
|
||||
3. `~/.claude/projects/<해시>/memory/` junction → `memory/org/` 연결
|
||||
|
||||
### macOS / Linux
|
||||
|
||||
```bash
|
||||
cd <레포 루트>
|
||||
bash setup/setup_macos.sh
|
||||
```
|
||||
|
||||
**체크**
|
||||
- [ ] 스크립트 정상 종료 (`셋업 완료. 'git pull'로 최신 상태 유지 권장.` 메시지)
|
||||
- [ ] `paths.local.json` 파일 실존
|
||||
- [ ] Claude 프로젝트 해시 폴더에서 `memory` junction 생성 로그 확인
|
||||
|
||||
---
|
||||
|
||||
## 3. paths.local.json 실값 확인·보정
|
||||
|
||||
자동 추정값이 실제와 다른 경우 수동 보정.
|
||||
|
||||
```json
|
||||
{
|
||||
"NERDNAVIS_ROOT": "<레포 루트 실경로>",
|
||||
"UNITY_PROJECT_ROOT": "<Unity 프로젝트 실경로 — 미설치 시 빈 값 가능>",
|
||||
"FRAMEWORK_PKG_ROOT": "<NerdNavis.Framework 실경로 — 미설치 시 빈 값 가능>",
|
||||
"TABLE_EXPORT_ROOT": "${UNITY_PROJECT_ROOT}/Assets/ResWork/Table/Export",
|
||||
"GITEA_URL": "https://burning.i234.me",
|
||||
"GITEA_SSH": "ssh://git@burning.i234.me:30030",
|
||||
"HOSTNAME": "<본 PC 식별자>"
|
||||
}
|
||||
```
|
||||
|
||||
**체크**
|
||||
- [ ] `NERDNAVIS_ROOT` 가 레포 실경로와 일치
|
||||
- [ ] `UNITY_PROJECT_ROOT`·`FRAMEWORK_PKG_ROOT` 가 본 PC에 존재하거나 의도적으로 빈 값
|
||||
- [ ] 파일이 `.gitignore` 로 추적 제외 상태 (`git status` 에 나타나지 않음)
|
||||
|
||||
---
|
||||
|
||||
## 4. 검증 스크립트 실행 (필수)
|
||||
|
||||
```powershell
|
||||
# Windows
|
||||
.\scripts\verify_setup.ps1
|
||||
```
|
||||
|
||||
3축 검증을 수행:
|
||||
1. **파일 존재**: `paths.local.json` 파싱·필수 키·`memory/org` 실체
|
||||
2. **OS 동작**: junction 의 reparse point 속성·타깃 경로
|
||||
3. **실행 결과**: `MEMORY.md` junction 경유 읽기 가능 여부, 경로 추상화 잔존 구 경로 스캔, `.gitignore` 규칙, 조직 공용 승인 `.claude/settings.json`
|
||||
|
||||
**체크**
|
||||
- [ ] `exit 0` 로 종료 (= "셋팅 검증 통과. 작업 착수 가능.")
|
||||
- [ ] `[FAIL]` 라인 0건
|
||||
- [ ] `[WARN]` 은 본인 환경상 허용 가능한 것인지 육안 확인 (예: Unity 미설치 PC의 `UNITY_PROJECT_ROOT` 경고)
|
||||
|
||||
---
|
||||
|
||||
## 5. Claude Code 동작 확인
|
||||
|
||||
```bash
|
||||
# 레포 루트에서
|
||||
claude
|
||||
```
|
||||
|
||||
- [ ] `MEMORY.md` 가 세션 초입에 자동 로드됨 (user memory 인덱스 표시)
|
||||
- [ ] `CLAUDE.md` (조직 최상위) 의 지시가 인지됨 — "PD님"·"총괄PM" 호칭 사용
|
||||
- [ ] 조직 공용 승인(`.claude/settings.json`) 의 Bash/Edit/Write 포괄 허용이 반영됨 (개별 승인 반복 없음)
|
||||
|
||||
---
|
||||
|
||||
## 6. 자주 발생하는 문제
|
||||
|
||||
| 증상 | 원인 | 조치 |
|
||||
|------|------|------|
|
||||
| `verify_setup.ps1` 파싱 에러 | 파일 인코딩이 UTF-8 BOM 아님 | 레포 재 clone 또는 스크립트 재 pull |
|
||||
| junction 이 실체 폴더로 존재 | Claude Code 가 기존에 실제 `memory` 폴더를 만들어둠 | `setup_windows.ps1` 재실행 (자동 백업 후 junction 교체) |
|
||||
| `MEMORY.md` 안 읽힘 | junction 타깃이 `memory` 루트가 아니라 `memory/org` 여야 함 | `setup` 스크립트는 정상이지만 수동 생성 시 `memory -> memory/org` 구조 확인 |
|
||||
| `paths.local.json` 이 커밋되려 함 | `.gitignore` 누락 | 레포 재 pull 또는 `.gitignore` 에 `paths.local.json` 라인 존재 확인 |
|
||||
| PC 간 승인 설정 불일치 | `.claude/settings.local.json` 은 `.gitignore` 대상이라 이동 불가 | 공용 승인은 **`.claude/settings.json`** (커밋됨) 로 유지. 개별 실험은 local 로 분리 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 변경 이력
|
||||
|
||||
| 버전 | 일자 | 변경 | 담당 |
|
||||
|------|------|------|------|
|
||||
| v1 | 2026-04-15 | 최초 발행 (PD 지시 #8 처리) | 개발실장 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 참조
|
||||
|
||||
- `setup/setup_windows.ps1`, `setup/setup_macos.sh`
|
||||
- `scripts/verify_setup.ps1`
|
||||
- `paths.local.json.template`
|
||||
- `README.md` (레포 루트)
|
||||
- `공유/공통_업무_규칙.md` (부록 A: 작업 착수 체크)
|
||||
- `memory/org/MEMORY.md` 인덱스 — [PC 간 승인 설정 일관성](../../memory/org/feedback_permissions_portability.md)
|
||||
Loading…
Reference in New Issue