| name | new-module |
| description | WSS-iOS-V2 프로젝트에서, 새 Tuist 모듈을 생성할 때 사용한다. 레이어(domain|data|core|ui|feature)와 모듈명을 받아 ModuleType.swift 등록 → 의존성 자동 추론 → Project.swift 생성 → tuist generate → 모듈 가이드까지 수행한다. "새 모듈 만들어줘", "도메인/데이터/Feature 모듈 추가", 또는 "/new-module <layer> <ModuleName>" 같은 요청에 트리거. |
| metadata | {"short-description":"새 Tuist 모듈 생성 (레이어+모듈명, 의존성 자동 추론)"} |
New Module — 새 Tuist 모듈 생성 (WSS-iOS-V2)
새 모듈을 만든다. 인자: <layer> <ModuleName> (예: data Foo, domain Foo, ui FooView). 비면 사용자에게 묻는다.
layer ∈ domain | data | core | ui | feature.
⚠️ drift 방지: 값을 추측하지 말고 항상 (1) Plugins/DependencyPlugin/ProjectDescriptionHelpers/ModuleType.swift
와 (2) 같은 레이어의 기존 모듈 Project.swift 를 먼저 읽어 현재 패턴을 그대로 따른다.
절차
1. 인자 파싱
layer, ModuleName 확보. 비면 사용자에게 묻는다.
- enum case는 camelCase (예:
novelReview), 모듈명은 ModuleType.name이 만든다(Xxx+suffix). 헷갈리면 ModuleType.swift의 name/directoryName 로직 확인.
2. ModuleType.swift 등록 (단일 진실 소스)
- 해당 enum에 case 추가:
domain→DomainModule, data→DataModule, core→CoreModule, ui→UIModule, feature→FeatureModule.
- 기존 정렬/스타일 유지. (UI는
name 커스텀 매핑이 있는지 확인)
3. 의존성 추론 (기본값 — 형제 모듈로 검증 후 조정)
- 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단계 참조.
- 추론한 의존성은 왜 넣었는지 한 줄로 보고하고, 애매하면 확인받는다.
4. Project.swift 생성
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].
5. 소스 디렉토리
Sources/ 생성. 레이어 표준 하위 폴더를 만든다(빈 폴더 대신 최소 placeholder 또는 첫 타입):
- domain:
Entity/, UseCase/, Repository/
- data:
DTO/, Service/, Mapper/, Repository/, Factory/, Endpoint/, Logger/
- feature:
Factory/ + 화면별 폴더(<Screen>/ — 타입별 분리 ❌), 별도로 Demo/(Demo 앱). 골격은 new-feature 스킬이 담당.
- domain이면
Testing/, Tests/{Entity,UseCase}/도.
6. 프로젝트 생성
tuist generate 실행. 실패하면 출력 그대로 보고 (에셋/Derived 문제면 안내).
7. 모듈 가이드
docs/MODULE_GUIDE_TEMPLATE.md를 복사해 Projects/<dir>/<ModuleName>/CLAUDE.md 작성 (시나리오·함정 중심, 지금은 골격만).
8. 마무리 보고
- 등록한 case, 생성 파일, 선택한 의존성과 근거를 요약.
- domain이면: "테스트 필수 —
docs/TESTING.md, CI는 /domain-test로 폴더 자동 인식" 안내.
- 커밋은 사용자가 지시할 때만. ([Type] #이슈 규약은 docs/WORKFLOW.md)