Claude-skill-registry 20-build-domain

20-build-domain

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.md
source 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도메인 식별자 (예:
Game
,
Common
)
ProtocolGroup프로토콜 그룹 식별자 (예:
Game
)
buildInputJsonDirbuildInputJson 파일이 위치한 디렉토리. 상대경로 해석의 기준
{tempDir}빌드 중간 산출물이 생성되는 staging 디렉토리
{configJson}빌드 설정 파일 (출력 경로 등 정의)

3. 빌드 실행

스크립트 실행

bash input/build.sh <buildInputJson>

직접 실행

node framework-ts/tools/builder/build.js <buildInputJson>
  • <buildInputJson>
    은 빌드 입력 JSON 파일 경로 (예:
    input/input_common.json
    )
  • 빌더는
    buildInputJson
    을 읽고, 그 안의
    configPath
    로 설정 파일을 로드한다.

4. 입력 파일 스펙 (build json)

최상위 필드

필드타입설명
version
string빌드 스펙 버전
configPath
string설정 파일 경로 (buildInputJsonDir 기준 상대경로)
tempDir
stringstaging 디렉토리 경로
domains
object도메인 정의 (map 형태)
protocols
array프로토콜 정의 (배열 형태)

domains (map)

{
  "DomainKey": {
    "contractDir": "Domains/Game/contracts",
    "contractFiles": ["*.json"],
    "tableDir": "Domains/Game/tables",
    "tableFiles": ["*.xlsx"]
  }
}
  • key는
    DomainKey
    (예:
    "Game"
    ,
    "Common"
    )
  • contractDir
    ,
    tableDir
    는 buildInputJsonDir 기준 상대경로

protocols (array)

[
  {
    "group": "Game",
    "protocolDir": "Protocols/Game",
    "protocolFiles": ["C2Game.json", "Game2C.json"]
  }
]
  • group
    ProtocolGroup
    식별자

5. 설정 파일 스펙 (config.json)

csConfig (C# 출력)

필드필수설명
moduleDir
C# 모듈 출력 디렉토리
generateDir
옵션C# 생성 코드 디렉토리 (미지정 시 moduleDir 사용)

tsConfig (TypeScript 출력)

필드필수설명
moduleDir
TS 모듈 출력 디렉토리
generateDir
옵션TS 생성 코드 디렉토리 (미지정 시 moduleDir 사용)

upmConfig (UPM 패키지)

필드필수설명
sourceDir
UPM 소스 디렉토리
packageDir
UPM 패키지 출력 디렉토리

tableConfig (데이터 출력)

필드필수설명
tableDirs
테이블 출력 디렉토리 배열
stringDirs
String 테이블 출력 디렉토리 배열
soundDirs
사운드 데이터 출력 디렉토리 배열

CRITICAL: config.json에

dataConfig
키가 존재하면 빌드가 즉시 FAIL한다 (deprecated). tableConfig의 각 Dir 배열에 대해 해당 데이터 유형이 출력된다.

samplePackages

필드타입설명
samplePackages
string[]샘플 패키지 목록 (com.devian.samples만 허용)

Hard Rule: samplePackages cannot contain libraries/domains

  • samplePackages
    에는
    com.devian.samples
    만 포함할 수 있다.
  • com.devian.foundation
    또는
    com.devian.domain.*
    가 들어가면 FAIL (Generated 덮어쓰기/삭제 위험).
  • staticUpmPackages
    키는 금지이며 존재 시 FAIL.

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 규칙

  • {tempDir}
    staging 전용이며 커밋 금지
  • 빌드 완료 후 staging에서 최종 위치로 복사됨

필수 필드 FAIL

조건결과
tableConfig.tableDirs
누락
즉시 FAIL
tableConfig.stringDirs
누락
즉시 FAIL
tableConfig.soundDirs
누락
즉시 FAIL

Forbidden 필드 FAIL

아래 필드가 존재하면 즉시 FAIL 처리됨:

위치Forbidden 필드
config.json
dataConfig
(deprecated)
domains[*]
csTargetDir
domains[*]
tsTargetDir
domains[*]
dataTargetDirs
protocols[*]
csTargetDir
protocols[*]
tsTargetDir
protocols[*]
upmName
protocols[*]
upmTargetDir

총 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

  1. input/config.json
    samplePackages: ["com.devian.samples"]
    만 존재한다.
  2. input/config.json
    staticUpmPackages
    키가 존재하지 않는다 (금지 필드).
  3. 빌드 후
    framework-cs/upm/com.devian.domain.sound/Runtime/Generated/Sound.g.cs
    가 존재한다.
  4. 빌드 후
    framework-cs/apps/UnityExample/Packages/com.devian.domain.sound/Runtime/Generated/Sound.g.cs
    가 존재한다.
  5. samplePackages 처리 이후에도 (3), (4)가 삭제되지 않는다.
  6. Unity 컴파일 에러
    CS0246 (SOUND/VOICE not found)
    가 발생하지 않는다.

Verification Checklist (Dependencies)

  • framework-cs/upm/**/package.json
    에서
    com.devian.core
    ,
    com.devian.unity
    dependency가 0개여야 한다.
  • framework-cs/apps/UnityExample/Packages/**/package.json
    에서도 위 dependency가 0개여야 한다.

9. Reference

빌더 (SSOT)

  • framework-ts/tools/builder/build.js

입력/설정 예시

  • input/input_common.json
    — 빌드 입력 예시
  • input/config.json
    — 설정 파일 예시

관련 스킬

스킬설명
skills/devian-core/03-ssot/SKILL.md
전체 SSOT 정책
skills/devian-tools/21-build-error-reporting/SKILL.md
빌드 에러/로그 표준
skills/devian-examples/01-policy/SKILL.md
Game 예제 정책
skills/devian-unity/02-unity-bundles/SKILL.md
UPM 번들/복사 흐름