Repository navigation
Skill new module
🤖
skill-archive워크플로가 레포 원본에서 자동 생성한 페이지예요. 위키에서 직접 고치면 다음 동기화 때 덮어써지니, 수정은 원본 파일에서 PR로 해주세요.
새 Tuist 모듈 생성 (레이어+모듈명, 의존성 자동 추론)
WSS-iOS-V2 프로젝트에서, 새 Tuist 모듈을 생성할 때 사용한다. 레이어(domain|data|core|ui|feature)와 모듈명을 받아 ModuleType.swift 등록 → 의존성 자동 추론 → Project.swift 생성 → tuist generate → 모듈 가이드까지 수행한다. "새 모듈 만들어줘", "도메인/데이터/Feature 모듈 추가", 또는 "/new-module " 같은 요청에 트리거.
- 원본: .claude/skills/new-module/SKILL.md
- 추가 이유·변경 이력: 아카이브 이슈 (Discord 스레드 링크도 거기 있어요)
- 호출: Claude Code에서
/new-module또는 설명의 트리거 문구로 요청
새 모듈을 만든다. 인자: <layer> <ModuleName> (예: data Foo, domain Foo, ui FooView). 비면 사용자에게 묻는다.
layer ∈ domain | data | core | ui | feature.
⚠️ drift 방지: 값을 추측하지 말고 항상 (1)Plugins/DependencyPlugin/ProjectDescriptionHelpers/ModuleType.swift와 (2) 같은 레이어의 기존 모듈Project.swift를 먼저 읽어 현재 패턴을 그대로 따른다.
-
layer,ModuleName확보. 비면 사용자에게 묻는다. - enum case는 camelCase (예:
novelReview), 모듈명은ModuleType.name이 만든다(Xxx+suffix). 헷갈리면ModuleType.swift의name/directoryName로직 확인.
- 해당 enum에 case 추가:
domain→DomainModule,data→DataModule,core→CoreModule,ui→UIModule,feature→FeatureModule. - 기존 정렬/스타일 유지. (UI는
name커스텀 매핑이 있는지 확인)
-
domain:
[.module(.domain(.base))] -
data:
[.module(.core(.networking)), .module(.core(.logger)), .module(.data(.base)), .module(.domain(.base)), .module(.domain(.<같은이름>))]- 토큰/인증 관련이면
.module(.core(.keychain))추가. ⚠️ 대응<같은이름>Domain이 없으면 사용자에게 알리고, 먼저 domain부터 만들지 물어본다.
- 토큰/인증 관련이면
-
ui:
[.module(.ui(.designSystem)), .module(.domain(.base))] -
core: 기본
[], 필요한 다른 core만. -
feature:
[.module(.domain(.base)), .module(.domain(.<같은이름>)), .module(.ui(.designSystem)), .module(.ui(.wssComponent)), .module(.core(.logger))]-
demoDependencies:[.module(.data(.<같은이름>)), .module(.data(.base)), .module(.core(.networking))]— Demo 앱만 실서버 조립용(App DI 대행).Sources는 여전히 Data를 모른다. - 정본:
Projects/Feature/NovelReviewFeature/Project.swift(첫 Feature 모듈에서 검증된 패턴). ⚠️ 대응<같은이름>Domain이 없으면(순수 입력 화면)domain(.<같은이름>)을 빼고demoDependencies는 통째로[]로 둔다(도메인이 없으면 Demo가 실서버 조립할 Repository 자체가 없다) — 판정 기준은new-feature스킬 0단계 참조.
-
- 추론한 의존성은 왜 넣었는지 한 줄로 보고하고, 애매하면 확인받는다.
Projects/<directoryName>/<ModuleName>/Project.swift 생성. 같은 레이어 기존 모듈을 복제해 create<Layer>Module(...) 형태/targets/internalDependencies를 맞춘다.
- targets 기본: domain
[.sources, .testing, .tests], data/core[.sources, .demo, .testing, .tests], ui[.sources, .demo], feature[.sources, .demo, .tests].
-
Sources/생성. 레이어 표준 하위 폴더를 만든다(빈 폴더 대신 최소 placeholder 또는 첫 타입):- domain:
Entity/,UseCase/,Repository/ - data:
DTO/,Service/,Mapper/,Repository/,Factory/,Endpoint/,Logger/ - feature:
Factory/+ 화면별 폴더(<Screen>/— 타입별 분리 ❌), 별도로Demo/(Demo 앱). 골격은new-feature스킬이 담당.
- domain:
- domain이면
Testing/,Tests/{Entity,UseCase}/도.
-
tuist generate실행. 실패하면 출력 그대로 보고 (에셋/Derived 문제면 안내).
-
docs/MODULE_GUIDE_TEMPLATE.md를 복사해Projects/<dir>/<ModuleName>/CLAUDE.md작성 (시나리오·함정 중심, 지금은 골격만).
- 등록한 case, 생성 파일, 선택한 의존성과 근거를 요약.
- domain이면: "테스트 필수 —
docs/TESTING.md, CI는/domain-test로 폴더 자동 인식" 안내. - 커밋은 사용자가 지시할 때만. ([Type] #이슈 규약은 docs/WORKFLOW.md)