install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/20-build-domain" ~/.claude/skills/majiayu000-claude-skill-registry-20-build-domain && rm -rf "$T"
manifest:
skills/data/20-build-domain/SKILL.mdsource content
20-build-domain
Status: ACTIVE
AppliesTo: v10
0. 목적
- 특정 게임이 아니라 도메인/프로토콜이 동적으로 바뀌는 빌드를 표준화한다.
와DomainKey
이 추가될 때마다 빌드 산출물이 자동으로 늘어나는 구조를 정의한다.ProtocolGroup- 빌드 입력/설정/산출물 원칙을 명확히 하여 빌더 구현과의 불일치를 제거한다.
1. 적용 범위
적용 대상
기반 빌드 전반framework-ts/tools/builder/build.js- 입력:
(예:{buildInputJson}
)input/input_common.json - 설정:
(예:{configJson}
)input/config.json
비대상
- 런타임 실행 로직
- 에러/로그 표준 (→
)skills/devian-tools/21-build-error-reporting/SKILL.md
2. 용어
| 용어 | 정의 |
|---|---|
| DomainKey | 도메인 식별자 (예: , ) |
| ProtocolGroup | 프로토콜 그룹 식별자 (예: ) |
| buildInputJsonDir | buildInputJson 파일이 위치한 디렉토리. 상대경로 해석의 기준 |
| {tempDir} | 빌드 중간 산출물이 생성되는 staging 디렉토리 |
| {configJson} | 빌드 설정 파일 (출력 경로 등 정의) |
3. 빌드 실행
스크립트 실행
bash input/build.sh <buildInputJson>
직접 실행
node framework-ts/tools/builder/build.js <buildInputJson>
은 빌드 입력 JSON 파일 경로 (예:<buildInputJson>
)input/input_common.json- 빌더는
을 읽고, 그 안의buildInputJson
로 설정 파일을 로드한다.configPath
4. 입력 파일 스펙 (build json)
최상위 필드
| 필드 | 타입 | 설명 |
|---|---|---|
| string | 빌드 스펙 버전 |
| string | 설정 파일 경로 (buildInputJsonDir 기준 상대경로) |
| string | staging 디렉토리 경로 |
| object | 도메인 정의 (map 형태) |
| array | 프로토콜 정의 (배열 형태) |
domains (map)
{ "DomainKey": { "contractDir": "Domains/Game/contracts", "contractFiles": ["*.json"], "tableDir": "Domains/Game/tables", "tableFiles": ["*.xlsx"] } }
- key는
(예:DomainKey
,"Game"
)"Common"
,contractDir
는 buildInputJsonDir 기준 상대경로tableDir
protocols (array)
[ { "group": "Game", "protocolDir": "Protocols/Game", "protocolFiles": ["C2Game.json", "Game2C.json"] } ]
은group
식별자ProtocolGroup
5. 설정 파일 스펙 (config.json)
csConfig (C# 출력)
| 필드 | 필수 | 설명 |
|---|---|---|
| ✓ | C# 모듈 출력 디렉토리 |
| 옵션 | C# 생성 코드 디렉토리 (미지정 시 moduleDir 사용) |
tsConfig (TypeScript 출력)
| 필드 | 필수 | 설명 |
|---|---|---|
| ✓ | TS 모듈 출력 디렉토리 |
| 옵션 | TS 생성 코드 디렉토리 (미지정 시 moduleDir 사용) |
upmConfig (UPM 패키지)
| 필드 | 필수 | 설명 |
|---|---|---|
| ✓ | UPM 소스 디렉토리 |
| ✓ | UPM 패키지 출력 디렉토리 |
tableConfig (데이터 출력)
| 필드 | 필수 | 설명 |
|---|---|---|
| ✓ | 테이블 출력 디렉토리 배열 |
| ✓ | String 테이블 출력 디렉토리 배열 |
| ✓ | 사운드 데이터 출력 디렉토리 배열 |
CRITICAL: config.json에
키가 존재하면 빌드가 즉시 FAIL한다 (deprecated). tableConfig의 각 Dir 배열에 대해 해당 데이터 유형이 출력된다.dataConfig
samplePackages
| 필드 | 타입 | 설명 |
|---|---|---|
| string[] | 샘플 패키지 목록 (com.devian.samples만 허용) |
Hard Rule: samplePackages cannot contain libraries/domains
에는samplePackages
만 포함할 수 있다.com.devian.samples
또는com.devian.foundation
가 들어가면 FAIL (Generated 덮어쓰기/삭제 위험).com.devian.domain.*
키는 금지이며 존재 시 FAIL.staticUpmPackages
6. 산출물 규칙
원칙
- 도메인/프로토콜 추가에 따라 출력이 늘어남 (동적)
- 개별 도메인 고정표 대신 템플릿 기반으로 산출물 경로가 결정됨
- 정확한 디렉토리/파일 배치는 빌더 구현이 SSOT
C# Domain 템플릿
{csConfig.generateDir}/Devian.Domain.{DomainKey}/
TypeScript Domain 템플릿
{tsConfig.generateDir}/devian-domain-{domainKeyLower}/
UPM Domain 템플릿
{upmConfig.sourceDir}/com.devian.domain.{domainKeyLower}/
Protocol 템플릿 (동일 원칙)
C#: {csConfig.generateDir}/Devian.Protocol.{ProtocolGroup}/ TS: {tsConfig.generateDir}/devian-protocol-{protocolGroupLower}/ UPM: {upmConfig.sourceDir}/com.devian.protocol.{protocolGroupLower}/
데이터 산출물
일반 테이블 (tableConfig.tableDirs):
{tableDir}/ndjson/{TableName}.json {tableDir}/pb64/{TableName}.asset
String Table (tableConfig.stringDirs):
{stringDir}/ndjson/{Language}/{TableName}.json {stringDir}/pb64/{Language}/{TableName}.asset
Sound 데이터 (tableConfig.soundDirs):
{soundDir}/ndjson/{TableName}.json {soundDir}/pb64/{TableName}.asset
- 복수 타겟 가능 (각 Dir 배열의 모든 경로에 복사)
- 도메인 폴더 미사용: 최종 경로에
폴더 없음{DomainKey} - 동일 파일명 충돌 시 빌드 FAIL (조용한 덮어쓰기 금지)
7. Hard Rules
Staging 규칙
는 staging 전용이며 커밋 금지{tempDir}- 빌드 완료 후 staging에서 최종 위치로 복사됨
필수 필드 FAIL
| 조건 | 결과 |
|---|---|
누락 | 즉시 FAIL |
누락 | 즉시 FAIL |
누락 | 즉시 FAIL |
Forbidden 필드 FAIL
아래 필드가 존재하면 즉시 FAIL 처리됨:
| 위치 | Forbidden 필드 |
|---|---|
| (deprecated) |
| |
| |
| |
| |
| |
| |
| |
총 8개 금지 필드. 하나라도 발견되면 빌드가 중단된다.
8. 예시
Game 도메인/프로토콜 예제의 상세 설명은 별도 스킬 문서를 참조한다:
예제 정책:
skills/devian-examples/01-policy/SKILL.md
예제 입력 위치:
devian/input/Domains/Game/contracts/**devian/input/Domains/Game/tables/**devian/input/Protocols/Game/**
Verification Checklist
에input/config.json
만 존재한다.samplePackages: ["com.devian.samples"]
에input/config.json
키가 존재하지 않는다 (금지 필드).staticUpmPackages- 빌드 후
가 존재한다.framework-cs/upm/com.devian.domain.sound/Runtime/Generated/Sound.g.cs - 빌드 후
가 존재한다.framework-cs/apps/UnityExample/Packages/com.devian.domain.sound/Runtime/Generated/Sound.g.cs - samplePackages 처리 이후에도 (3), (4)가 삭제되지 않는다.
- Unity 컴파일 에러
가 발생하지 않는다.CS0246 (SOUND/VOICE not found)
Verification Checklist (Dependencies)
에서framework-cs/upm/**/package.json
,com.devian.core
dependency가 0개여야 한다.com.devian.unity
에서도 위 dependency가 0개여야 한다.framework-cs/apps/UnityExample/Packages/**/package.json
9. Reference
빌더 (SSOT)
framework-ts/tools/builder/build.js
입력/설정 예시
— 빌드 입력 예시input/input_common.json
— 설정 파일 예시input/config.json
관련 스킬
| 스킬 | 설명 |
|---|---|
| 전체 SSOT 정책 |
| 빌드 에러/로그 표준 |
| Game 예제 정책 |
| UPM 번들/복사 흐름 |