# 너드나비스 조직 레포 - Windows PC 셋업 # 사용: PowerShell에서 실행 # .\setup_windows.ps1 # 또는 인자로 지정: .\setup_windows.ps1 -NerdNavisRoot "C:\...\너드나비스" param( [string]$NerdNavisRoot = $(Resolve-Path (Join-Path $PSScriptRoot "..")).Path, [string]$UnityRoot = "", [string]$FrameworkRoot = "", [string]$GiteaUrl = "https://burning.i234.me", [string]$GiteaSsh = "ssh://git@burning.i234.me:30030" ) $ErrorActionPreference = "Stop" # 경로 추정: NerdNavisRoot 드라이브 기반 동적 default (PC별 하드코딩 회피) # 사용자가 -UnityRoot/-FrameworkRoot 명시하면 그 값 우선, 미명시면 NerdNavisRoot 드라이브의 \NerdNavis\* 패턴으로 추정 $rootDriveLetter = (Split-Path $NerdNavisRoot -Qualifier).TrimEnd(':') if (-not $UnityRoot) { $UnityRoot = "${rootDriveLetter}:\NerdNavis\FilGoodBandits\DeckBuilding" } if (-not $FrameworkRoot) { $FrameworkRoot = "${rootDriveLetter}:\NerdNavis\NerdNavis.Framework" } Write-Host "=== 너드나비스 조직 레포 셋업 ===" Write-Host "NerdNavisRoot: $NerdNavisRoot" Write-Host "UnityRoot: $UnityRoot $(if (-not (Test-Path $UnityRoot)) { '(경로 미존재 - paths.local.json 생성 후 수동 수정 권장)' })" Write-Host "FrameworkRoot: $FrameworkRoot $(if (-not (Test-Path $FrameworkRoot)) { '(경로 미존재 - paths.local.json 생성 후 수동 수정 권장)' })" # 1. Git 확인 git --version | Out-Null if (-not $?) { throw "Git이 설치되지 않았습니다." } # 2. paths.local.json 생성 $pathsFile = Join-Path $NerdNavisRoot "paths.local.json" if (-not (Test-Path $pathsFile)) { $paths = [ordered]@{ "_description" = "로컬 환경 경로. 커밋 금지." NERDNAVIS_ROOT = $NerdNavisRoot UNITY_PROJECT_ROOT = $UnityRoot FRAMEWORK_PKG_ROOT = $FrameworkRoot TABLE_EXPORT_ROOT = (Join-Path $UnityRoot "Assets\ResWork\Table\Export") GITEA_URL = $GiteaUrl GITEA_SSH = $GiteaSsh HOSTNAME = $env:COMPUTERNAME } # UTF-8 BOM 없음으로 명시 출력 (PowerShell 5.1의 기본 -Encoding utf8은 BOM 포함 + 한국어 깨짐 이슈 회피) $jsonText = $paths | ConvertTo-Json -Depth 5 [System.IO.File]::WriteAllText($pathsFile, $jsonText, [System.Text.UTF8Encoding]::new($false)) Write-Host "paths.local.json 작성 완료 (UTF-8 no BOM): $pathsFile" } else { Write-Host "paths.local.json 이미 존재. 유지." } # 3. Claude 사용자 메모리 연결 (junction) $claudeMemoryBase = "$env:USERPROFILE\.claude\projects" $orgMemoryTarget = Join-Path $NerdNavisRoot "memory\org" if (-not (Test-Path $orgMemoryTarget)) { New-Item -ItemType Directory -Path $orgMemoryTarget | Out-Null } $hashDirs = @() if (Test-Path $claudeMemoryBase) { # Claude Code는 프로젝트 경로의 각 세그먼트를 '-'로 이어 해시 폴더명을 만든다 # (예: E:\NerdNavisAi → E--NerdNavisAi, C:\Users\PC\Documents\너드나비스 → C--Users-PC-Documents-너드나비스) # NerdNavisRoot의 리프 이름·드라이브 prefix·관례적 키워드를 모두 포괄하도록 필터 확장 $rootLeaf = Split-Path $NerdNavisRoot -Leaf $rootDrive = (Split-Path $NerdNavisRoot -Qualifier).TrimEnd(':') $hashDirs = Get-ChildItem $claudeMemoryBase -Directory -ErrorAction SilentlyContinue | Where-Object { $_.Name -like "*Documents*" -or $_.Name -like "*너드나비스*" -or $_.Name -like "*NerdNavis*" -or $_.Name -like "*$rootLeaf*" -or $_.Name -like "$rootDrive--*" } } foreach ($d in $hashDirs) { $memLink = Join-Path $d.FullName "memory" if (Test-Path $memLink) { $attr = (Get-Item $memLink -Force).Attributes if (($attr -band [IO.FileAttributes]::ReparsePoint) -eq 0) { # 실체 폴더. 백업 후 junction으로 교체 $bak = "$memLink.bak-$(Get-Date -Format yyyyMMddHHmmss)" Rename-Item $memLink $bak Write-Host "기존 memory 폴더 백업: $bak" cmd /c mklink /J "`"$memLink`"" "`"$orgMemoryTarget`"" | Out-Null Write-Host "Junction 생성: $memLink -> $orgMemoryTarget" } else { Write-Host "이미 junction/symlink. 유지: $memLink" } } else { cmd /c mklink /J "`"$memLink`"" "`"$orgMemoryTarget`"" | Out-Null Write-Host "Junction 생성: $memLink -> $orgMemoryTarget" } } if ($hashDirs.Count -eq 0) { Write-Warning "Claude 프로젝트 해시 폴더를 찾지 못했습니다. 수동 연결 필요." } # 4. .claude/settings.json 부서 동기화 (루트 SOT → 개발실/기획실 복제) # Claude Code는 .claude/ 계층 auto-merge를 지원하지 않으므로 자식 디렉토리에서 세션 시작 시 # 루트 settings.json을 인식하지 못함. 이를 우회하기 위해 루트 settings.json을 부서 디렉토리로 복제. $rootSettings = Join-Path $NerdNavisRoot ".claude\settings.json" if (Test-Path $rootSettings) { $deptPaths = @("개발실", "기획실") foreach ($dept in $deptPaths) { $deptClaudeDir = Join-Path $NerdNavisRoot "$dept\.claude" $deptSettings = Join-Path $deptClaudeDir "settings.json" if (-not (Test-Path $deptClaudeDir)) { New-Item -ItemType Directory -Path $deptClaudeDir -Force | Out-Null } Copy-Item -Path $rootSettings -Destination $deptSettings -Force Write-Host "settings.json 동기화: $dept/.claude/settings.json" } } else { Write-Warning "루트 .claude/settings.json 미발견. 부서 동기화 생략." } Write-Host "셋업 완료. 'git pull'로 최신 상태 유지 권장." Write-Host "※ .claude/settings.json 변경사항은 세션 재시작 후 적용됨."