[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBVJW4WSCRBJ358FMWBVCZ":3,"skill-same:01M6CBVJW4WSCRBJ358FMWBVCZ":44},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":13,"repositoryHtmlUrl":26,"repositoryHomepageUrl":6,"ownerHtmlUrl":27,"ownerBlogUrl":6,"ownerDescription":28,"updatedAt":29,"install":30,"resources":43},"01M6CBVJW4WSCRBJ358FMWBVCZ","03-ssot",null,"devwinsoft\u002Fdevian","devwinsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22570160?v=4","01M6C6RR8W05NH8NPKQNCE3Q72","maoshy","01M6C6RRDJ5TJJCZXRTY801YDH",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F03-ssot\u002FSKILL.md",[],[18],"03 ssot","2026-11-10 10:12:30",false,"# 03-ssot — Tools\n\nStatus: ACTIVE\nAppliesTo: v10\nParentSSOT: skills\u002Fdevian\u002F10-module\u002F03-ssot\u002FSKILL.md\n\n---\n\n## Scope\n\n이 문서는 **빌드 파이프라인, 검증, 워크스페이스** 관련 SSOT를 정의한다.\n\n**중복 금지:** 공통 용어\u002F플레이스홀더\u002F입력 분리\u002F머지 규칙은 [Root SSOT](..\u002F..\u002F10-module\u002F03-ssot\u002FSKILL.md)가 정본이며, 이 문서는 재정의하지 않는다.\n\n---\n\n## Phase 모델\n\n빌드는 **5단계**로 해석한다.\n\n1. **Generate**: 모든 산출물은 **staging({tempDir})에만 생성**\n2. **Materialize**: staging → module\u002Fupm\u002Fts-modules로 **clean + copy** (모듈\u002F패키지 단위)\n3. **Validate**: module\u002Fmodule과 upm의 **완결성 검증**\n4. **Sync**: upm → packageDir로 **패키지 단위 동기화**\n5. **SampleSync**: upm Samples~ Generated → sampleFolder로 **Generated 코드만 동기화** (선택적, `sampleFolder` 설정 시)\n\n> staging({tempDir}) 외의 위치에 직접 생성하는 동작은 금지한다(SampleSync 제외 — UPM 정본의 Generated를 Assets\u002FSamples로 복사).\n\n---\n\n## Generated Only 정책 (Hard Rule)\n\n**생성기(clean+generate)가 건드리는 영역은 오직 폴더명이 `Generated`인 디렉토리만 허용한다.**\n\n| 영역 | 허용 경로 | 금지 |\n|------|-----------|------|\n| staging | `{tempDir}\u002F{DomainKey}\u002Fcs\u002FGenerated\u002F**` | `generated`, `_Shared`, `Templates` 등 |\n| staging | `{tempDir}\u002F{DomainKey}\u002Fts\u002FGenerated\u002F**` | 동일 |\n| final (CS) | `{csConfig.generateDir}\u002F...\u002FGenerated\u002F**` | 동일 |\n| final (TS) | `{tsConfig.generateDir}\u002F...\u002FGenerated\u002F**` | 동일 |\n| UPM | `Runtime\u002FGenerated\u002F**`, `Editor\u002FGenerated\u002F**` | `Runtime\u002FGenerated`, `Runtime\u002F_Shared` 등 |\n\n**고정 유틸(수기 코드) 영역:**\n\n`com.devian.foundation`의 아래 폴더는 수기 코드로 유지하며, 생성기가 절대 clean\u002Fgenerate하지 않는다:\n- `Runtime\u002FUnity\u002F_Shared\u002F` — UnityMainThread, UnityMainThreadDispatcher\n- `Runtime\u002FUnity\u002FSingletons\u002F` — Singleton, SingletonRegistry, AutoSingleton, CompoSingleton\n- `Runtime\u002FUnity\u002FPool\u002F` — IPoolable, IPoolFactory, PoolManager, Pool\n- `Runtime\u002FUnity\u002FPoolFactories\u002F` — InspectorPoolFactory, BundlePoolFactory\n- `Runtime\u002FUnity\u002FAssetManager\u002F` — AssetManager, BundleManager (bootstrap\u002Fdownload utilities)\n- `Runtime\u002FModule\u002F` — 순수 C# 코드 (UnityEngine 의존 없음)\n\n**레거시 경로 cleanup:**\n- 빌더는 기존 `generated`(소문자) 폴더가 존재하면 자동 제거\n- 마이그레이션 완료 후 레포에 `generated` 폴더가 0개여야 함\n\n---\n\n## TypeScript Workspace 정본 (Hard Rule)\n\n- TS 의존성 설치는 `framework-ts\u002F` 루트에서만 수행한다. (단일 `node_modules`)\n- workspace root는 `framework-ts\u002Fpackage.json` 단 하나만 허용한다.\n- lockfile은 `framework-ts\u002Fpackage-lock.json` 단 하나만 허용한다.\n\n자세한 규칙: [skills\u002Fdevian\u002F05-workspace](..\u002F..\u002F05-workspace\u002FSKILL.md)\n\n---\n\n## tsConfig 설정 (v10)\n\nTS 산출물의 반영 위치를 관리하는 설정:\n\n```json\n\"tsConfig\": {\n  \"moduleDir\": \"..\u002Fframework-ts\u002Fmodule\"\n}\n```\n\n| 필드 | 역할 | 필수 | 예시 |\n|------|------|------|------|\n| `moduleDir` | TS 모듈 루트 | ✅ | `..\u002Fframework-ts\u002Fmodule` |\n| `generateDir` | 생성 TS 모듈 루트 (선택) | ❌ | `..\u002Fframework-ts\u002Fmodule-gen` |\n\n**통합 모드 (기본):**\n- `generateDir`를 생략하면 `moduleDir`을 생성 출력 루트로 사용\n- 빌더는 `moduleDir` 하위에 staging 결과를 **clean+copy**\n\n**분리 모드 (선택):**\n- `generateDir`를 `moduleDir`와 다른 경로로 명시하면 분리 모드\n- 이 경우 `moduleDir`은 검증만, `generateDir`에만 clean+copy\n\n---\n\n## Validate 단계 (Hard Rule)\n\n**C# 모듈 검증:**\n- `module` (수동): 각 모듈에 `.csproj` 존재, \"완벽한 C# 모듈\"\n- `module` (생성): 각 모듈에 `.csproj` 존재, \"완벽한 C# 모듈\"\n\n**UPM 패키지 검증:**\n- `upm` (수동): 각 패키지에 `package.json` 존재, 폴더명 == `package.json.name`\n- `upm` (생성): 각 패키지에 `package.json` 존재, 폴더명 == `package.json.name`\n\n> \"완벽한 C# 모듈\" = `.csproj` 존재 + ProjectReference 경로 유효 + dotnet build 가능\n\n---\n\n## tempDir 경로 해석 및 분리 (Hard Rule)\n\n**`{tempDir}`는 실행한 입력 설정 JSON이 위치한 디렉토리 기준 상대경로로 해석된다.**\n\n빌더는 실행 시 `{tempDir}`를 **clean(rm -rf) 후 재생성**한다. 따라서:\n\n- **동일 repo에서 서로 다른 입력 설정 JSON을 번갈아 실행하는 경우, tempDir을 공유하면 서로 staging을 삭제할 수 있으므로 tempDir 분리는 필수다.**\n\n| 설정 파일 | tempDir 권장값 |\n|----------|---------------|\n| `{buildInputJson}` (예: `input\u002Fbuild_input.json`) | `\"temp\"` |\n| 대체 입력 (예시) | `\"temp_alt\"` |\n\n---\n\n## Clean + Copy 정책\n\n- Copy 단계는 targetDir을 **clean 후 copy**한다.\n- **충돌 방지 책임은 `{buildInputJson}` 설계(타겟 분리)에 있다.**\n  - 동일 targetDir에 여러 DomainKey\u002FProtocolGroup을 매핑하면, clean 단계 때문에 서로 덮어쓰거나 삭제될 수 있다.\n\n---\n\n## 디렉토리 역할 정의\n\n| 디렉토리 | 역할 | 빌드 동작 |\n|----------|------|-----------|\n| `framework-cs\u002Fmodule` | 수동\u002F생성 C# 모듈 | staging 결과로 생성\u002F반영 |\n| `framework-ts\u002Fmodule` | 수동\u002F생성 TS 모듈 | staging 결과로 생성\u002F반영 |\n| `framework-cs\u002Fupm` | 수동\u002F생성 UPM 패키지 | staging 결과로 생성\u002F반영 |\n| `framework-cs\u002Fapps\u002FUnityExample\u002FPackages` | Unity 최종 패키지 | upm → sync |\n\n---\n\n## 공식 빌드 러너\n\n공식 빌드 실행은 Node 기반 빌더를 사용한다: `framework-ts\u002Ftools\u002Fbuilder\u002Fbuild.js`\n\n실행 예시: `npm run builder -- ..\u002F{buildInputJson}`\n\n### 빌드 입력\u002F설정\u002F산출물\n\n도메인\u002F프로토콜 동적 빌드 정책 (입력 스펙, 설정 스펙, 산출물 규칙):\n\n> **정책 문서:** [skills\u002Fdevian\u002F80-tools\u002F11-builder\u002F20-build-pipeline](..\u002F11-builder\u002F20-build-pipeline\u002FSKILL.md)\n\n### 빌드 에러 리포팅\n\n빌드 실패 시 에러 출력 규격 및 로그 파일 규칙:\n\n> **정책 문서:** [skills\u002Fdevian\u002F80-tools\u002F11-builder\u002F21-build-error-reporting](..\u002F11-builder\u002F21-build-error-reporting\u002FSKILL.md)\n\n---\n\n## See Also\n\n- [Root SSOT](..\u002F..\u002F10-module\u002F03-ssot\u002FSKILL.md) — 공통 용어\u002F플레이스홀더\u002F머지 규칙\n- [Tools Policy](..\u002F01-policy\u002FSKILL.md)\n- [Workspace](..\u002F..\u002F05-workspace\u002FSKILL.md)\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F80-tools\u002F03-ssot","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":7,"skillName":5,"commands":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add devwinsoft\u002Fdevian --skill 03-ssot",{"tool":36,"command":37},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 03-ssot",{"tool":39,"command":40},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 03-ssot","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F03-ssot\u002FSKILL.md",true,[],[45,51,59,67,76,83],{"skillNo":46,"name":47,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":48,"categories":49,"keywords":50,"publishedAt":19},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[47],{"skillNo":52,"name":53,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":56,"publishedAt":19},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[57,58],"archive","90 project archive",{"skillNo":60,"name":61,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":19},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[65,66],"management","30 env management",{"skillNo":68,"name":69,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":70,"categories":71,"keywords":72,"publishedAt":19},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[73,74,75],"push","page","19 page push send",{"skillNo":77,"name":78,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":81,"publishedAt":19},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[74,82],"18 page savedata",{"skillNo":84,"name":85,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":86,"categories":87,"keywords":88,"publishedAt":19},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[74,89],"17 page deobfuscate"]