blueprints/skills/domain-models/SKILL.md
Aggregate 하나를 `{aggregate}.md` 한 장으로 생성·관리하는 스킬. Aggregate의 Role, Ubiquitous Language(용어 사전), 내부 구조(Entity·VO), 불변 규칙(Invariants), 교체 가능한 비즈니스 정책(Policies), 외부 의존을 담아 해당 Aggregate를 빠르게 파악할 수 있는 밀도를 목표로 한다. 기본은 `domain/` 하위에 평탄(flat) 파일로 두고, Bounded Context가 명확해지면 `domain/{bc}/` 폴더로 묶는다. "도메인 모델 만들어줘", "도메인 스펙 정리", "Aggregate 정의", "DOMAIN.md 만들어줘", "Ubiquitous Language 정리", "Aggregate 정리", "주문 도메인 문서화", "조직 도메인 문서화" 같은 요청에 트리거한다.
npx skillsauth add dev-goraebap/skills domain-modelsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Aggregate 하나가 **"뭐 하는 곳이고, 어떤 용어로 말하며, 어떤 규칙·구조를 가지는가"**를 {aggregate}.md 한 장으로 기록한다. 구현 상세(흐름·AC)는 다른 문서에 맡기고, 여기서는 변하지 않는 뼈대만 담는다.
references/에 완성 예제 3종이 있다. 생성 시 해당 예제의 밀도·톤을 따른다.
| 예제 | 파일 | 특징 |
|------|------|------|
| Order | references/example-order.md | 단일 Aggregate, flat 구조 |
| User · Session | references/example-identity.md | 2개 Aggregate, BC 폴더 구조 |
| Organization · Position · Employee | references/example-organization.md | 3개 Aggregate, BC 폴더 구조 |
기존 파일을 주며 "Invariant 추가해줘" / "VO 빠졌어"처럼 증분 수정을 요청해도 이 스킬이 처리한다.
이 스킬은 경로를 별도 config 파일에도, 전용 섹션에도 저장하지 않는다. 루트 AGENTS.md(우선) 또는 CLAUDE.md의 기존 ## References 섹션에 한 줄로 얹는다.
기본 — Aggregate 단위 flat 구조
Bounded Context가 불명확하거나 단일 BC인 경우 도메인 폴더 바로 아래에 Aggregate명으로 파일을 둔다.
docs/domains/
├── employee.md
├── organization.md
└── rank.md
BC 명확 시 — 폴더로 묶기
설계 초기부터 BC가 명확하거나, 개발 중 BC 경계가 드러나면 해당 BC 폴더를 만들고 그 안에 Aggregate 파일들을 둔다.
docs/domains/
├── workforce/
│ ├── employee.md
│ ├── organization.md
│ └── rank.md
├── payroll/
│ └── payroll.md
└── attendance/
└── attendance.md
BC 폴더 이름은 서비스 이름이 아닌 실제 영역 이름. (hr-service X → workforce O)
프로젝트 루트에서 source 파일 선택 — AGENTS.md → CLAUDE.md 순.
## References(또는 등가) 섹션에서 도메인 폴더 경로를 찾는다 — "Domain models:", "도메인 모델:", "domains:" 같은 한 줄.
찾으면 그 경로 사용.
못 찾으면 인터뷰:
도메인 문서를 어디에 저장할까요?
기본값: docs/domains/
결과를 ## References 섹션에 한 줄 추가:
## References
- Domain models: `docs/domains/`
이후 호출부터는 재질문하지 않는다.
파일 하나 = Aggregate 하나.
order.buyerId: string).Rank, Money, Email 같이 식별자 없이 의미 성립 → VO.BC는 용어·규칙이 일관성 있게 해석되는 경계다. 이 스킬에서는 BC = 폴더 묶음 기준.
Project / Service
└─ Bounded Context (= 폴더) ← 명확할 때만
└─ Aggregate (= 파일 하나)
└─ Root Entity + Entity·VO
각 Aggregate당 한 장을 {aggregate-slug}.md에 둔다.
| # | 섹션 | 용도 | 분량 | |---|------|------|------| | 1 | Role | 이 Aggregate가 책임지는 일과 책임지지 않는 일 | 2~4문장 | | 2 | Ubiquitous Language | 용어 → 의미 표 | 표, 3~10행 | | 3 | Invariants | 불변 규칙 | 항목 목록 |
| 섹션 | 언제 추가 | |------|-----------| | Structure | 내부 Entity·VO가 여럿이라 명시 필요할 때 | | Policies | "어기면 도메인이 망가지진 않지만" 교체 가능한 비즈니스 규칙이 있을 때 | | External Dependencies | 다른 Aggregate/BC를 참조할 때 | | Open Questions | 미결정 사안 |
내부 구성이 복잡할 때만 추가. 단순하면 생략.
## Structure
- **Root**: Employee
- **내부 Entity**: (없음)
- **VO**: EmployeeStatus, Rank
"이걸 어기면 도메인이 망가지나?" → Yes면 여기. No면 Policies 섹션.
## Invariants
- 직원은 반드시 소속 조직이 있다
- 직급 변경은 12개월 이상 근속 후 가능
- 상태 전이: ACTIVE → INACTIVE → DELETED (역방향 불가)
| 항목 | 예시 | 어디로? | |------|------|---------| | 도메인 본질 규칙 | "주문은 최소 1개 항목" | Invariants | | 도메인 본질 규칙 | "총금액 = 항목금액 합" | Invariants | | 비즈니스 의사결정 | "주문 후 7일 내 무료 반품" | Policies | | 비즈니스 의사결정 | "3만 원 이상 배송비 무료" | Policies |
"어기면 도메인이 망가지진 않지만" 비즈니스 결정으로 바뀔 수 있는 규칙을 기록한다. 구현 시 Strategy·Specification·Domain Service 패턴 후보가 된다.
## Policies
| 정책명 | 설명 | 구현 힌트 |
|--------|------|-----------|
| ShippingFeePolicy | 3만 원 이상 주문 시 무료배송 | Strategy |
| DiscountPolicy | VIP 등급 10% 할인 적용 | Specification + Strategy |
정책이 없으면 섹션을 추가하지 않는다.
## External Dependencies
| Aggregate / BC | 참조 방식 | 비고 |
|----------------|-----------|------|
| Organization | `organizationId: OrganizationId` | ID 참조 |
| Payment BC | `paymentId: string` | ID 참조, 결제 승인은 Payment BC 소관 |
어떤 Aggregate를 만들까요?
Root Entity 이름: # 예: Employee, Order, Organization
파일명(slug): # 자동 제안, 사용자 확인 (예: employee)
여러 Aggregate를 한 번에 요청하면 하나씩 순서대로 진행하거나, 인터뷰를 공통으로 진행 후 파일을 나눠 저장한다.
이 Aggregate가 속하는 Bounded Context(폴더)가 있나요?
- 없음(기본): docs/domains/employee.md
- 있음: 폴더명 → 예) workforce → docs/domains/workforce/employee.md
BC 폴더가 이미 존재하면 그 안에 바로 배치. 없으면 신설.
이 Aggregate가 책임지는 일과 책임지지 않는 일을 한두 문장으로 정의해주세요.
예: "직원의 생성·상태 전이·직급 관리를 담당한다.
급여 계산과 근태 집계는 각각 Payroll / Attendance 소관이다."
이 Aggregate에서 중요한 용어 3~8개를 알려주세요.
직원(Employee): ...
직원상태(EmployeeStatus): ACTIVE / INACTIVE / DELETED
직급(Rank): 직원이 가지는 값 객체 (VO)
내부 구성을 알려주세요.
Root Entity:
내부 Entity (있으면):
VO (있으면):
외부 참조 (다른 Aggregate ID):
단순하면 생략 가능. 섹션을 추가할지 물어본다.
규칙 후보를 하나씩 판단 질문으로 분류한다.
"이걸 어기면 도메인이 망가지나요?"
Yes → Invariants
No → "비즈니스 결정으로 바뀔 수 있는 규칙인가요?"
Yes → Policies (정책명·구현 힌트 함께 수집)
No → 불필요 — 기록 대상 아님
추가로 담을 섹션을 선택해주세요:
[ ] Policies (교체 가능한 비즈니스 정책)
[ ] External Dependencies (다른 Aggregate/BC 참조)
[ ] Open Questions (미결정 사안)
전체 초안을 보여주고 "이대로 저장?" 확인.
ShippingFeePolicy)Strategy / Specification / Domain Service 중 하나 이상.Aggregate의 트랜잭션 일관성이 유지되는가?" → Yes면 Policy.기존 파일 수정 요청:
| 요청 | 처리 |
|------|------|
| "VO 추가" | Structure 섹션 + Ubiquitous Language에 반영 |
| "Invariant 추가" | 판단 질문 후 Invariants 또는 Policies에 반영 |
| "정책 추가" | Policies 섹션에 정책명·설명·구현 힌트 추가 |
| "외부 의존 제거" | External Dependencies 해당 행 제거 + Role 재검토 제안 |
| "용어 재정의" | Ubiquitous Language 수정 + 본문 전역 변경은 grep 기반 안내 |
| "BC 폴더로 묶어줘" | flat 파일을 {bc}/ 폴더로 이동 제안 (git mv는 사용자 수동) |
docs/domains/ ← flat (BC 불명확)
├── employee.md
├── organization.md
└── order.md
docs/domains/ ← BC 폴더 (BC 명확)
├── workforce/
│ ├── employee.md
│ └── organization.md
└── commerce/
└── order.md
---
aggregate: Employee # Aggregate Root 이름
context: workforce # 선택 — BC 폴더 사용 시
status: active # draft | active | deprecated
related_aggregates: [Organization, Rank] # 선택 — 같은 BC 내 관련 Aggregate
---
context는 BC 폴더 사용 시에만 기재.
---
aggregate: Employee
context: workforce
status: active
related_aggregates: [Organization, Rank]
---
# Employee
## Role
직원의 생성·상태 전이·직급 관리를 담당한다.
급여 계산과 근태 집계는 각각 Payroll / Attendance 소관이다.
## Ubiquitous Language
| 용어 | 정의 |
|------|------|
| 직원(Employee) | 조직에 소속된 구성원. 상태와 직급을 가진다. |
| 직원상태(EmployeeStatus) | ACTIVE / INACTIVE / DELETED |
| 직급(Rank) | 직원이 보유하는 값 객체. 변경 시 이력 없음. |
## Structure
- **Root**: Employee
- **VO**: EmployeeStatus, Rank
- **외부 참조**: `organizationId: OrganizationId`
## Invariants
- 직원은 반드시 소속 조직이 있다
- 상태 전이: ACTIVE → INACTIVE → DELETED (역방향 불가)
## Policies
| 정책명 | 설명 | 구현 힌트 |
|--------|------|-----------|
| RankPromotionPolicy | 직급 변경은 12개월 이상 근속 후 가능 | Strategy |
## External Dependencies
| Aggregate | 참조 방식 | 비고 |
|-----------|-----------|------|
| Organization | `organizationId: OrganizationId` | ID 참조. 조직 상세는 Organization 소관. |
git mv는 사용자 수동.status: deprecated로 표시 (파일 삭제 X).testing
도메인 일반 패턴을 강의 모드로 가르치는 인지과학 기반 학습 스킬. AI가 가상 도메인 전문가(선생님) 역할을 하고 사용자가 학생으로 낯선 도메인을 차근차근 배운다. 메뉴로 시작해서 페이즈를 골라 잠수 → 능동 회상 Q&A → 자기 설명(Feynman) 순서로 진행. Dunlosky 메타분석 기반 인지과학 8원칙(Cognitive Load, Practice Testing, 정교화 질문, Self-Explanation, Schema 연결, Dual Coding, Desirable Difficulty, 분산 학습)을 본문에 명시 적용. 도메인의 법령·산업 표준·인증을 학습 본문에 정식 통합 (출처 인용이 아니라 학습 대상). AI가 판단해 보편적이고 자료 풍부한 도메인은 자료 요청 없이 진행, 좁고 깊은 도메인일 때만 사용자에게 자료 있는지 묻기. 산출물은 학습 노트 스타일 (진도 체크박스 + 페이즈별 일관 구조 + 출처 링크). 페르소나 강요 없이 보편 액터 표현("사원 A", "관리자 A"). bigpicture의 이전 단계로 작동하거나 단독 사용 가능. Triggers — "도메인 학습", "낯선 도메인 가르쳐줘", "이 산업 어떻게 굴러가요", "선생님 모드", "1:1 강의", "도메인 입문", "도메인 일반 패턴", "HR 플랫폼이 뭔지", "이커머스 흐름", "domain classroom", "/domain-classroom".
development
빅픽처 이벤트스토밍의 1:1 분석 도구. 학습 단계(domain-classroom)에서 머리에 박힌 도메인 일반 패턴을 클라이언트 시스템에 매핑해 빅픽처 산출물(시간순 도메인 이벤트·페이즈·액터·외부시스템·핫스팟·피벗)을 누적한다. domain-classroom의 학습 노트(docs/learning-notes/{도메인}- classroom.md)와 클라이언트 자료(RFP·요구사항정의서·기존 시스템 스키마)를 입력으로 받아 페이즈 단위로 진행. 페르소나·서사 없는 분석 톤. 도메인 이벤트 판별 4기준(도메인 전문가 관심·비즈니스 상태 변화·법적 의미·다른 흐름 트리거)을 명시 적용해 UI/Telemetry 이벤트 혼입 방지. 이벤트는 한국어 자연어 + Code Identifier 이중 표기. 핫스팟에 ID·답할 위치·확신도 태그 부여. 산출물은 docs/eventstorming.md 단일 파일로 시작, 후속 단계 스킬(process-modeling·software-design)이 추가될 때 폴더로 자연 분기. Initial/Update/Cycle 모드 지원 — 코드 작성 후에도 다시 사이클 가능. Triggers — "빅픽처", "빅픽처 만들어줘", "이벤트스토밍", "도메인 이벤트 정리", "Big Picture EventStorming", "페이즈 매핑", "도메인 산출물 정리", "/bigpicture".
data-ai
빅픽처 이벤트스토밍의 1:1 학습 친화 변형. 그룹 워크샵에서 도메인 전문가가 던지는 이벤트를 받아 적는 대신, AI가 가상 도메인 전문가 역할을 하고 사용자가 학습자로 1:1 인터뷰하며 빅픽처를 누적한다. 산출물(시간순 도메인 이벤트·액터· 외부시스템·핫스팟·피벗)은 빅픽처 이벤트스토밍과 거의 동일하지만, 한 보드에 한 번에 펼치는 방식이 아니라 **한 액터·한 챕터씩 시간순 서사로 누적**한다. 각 장면마다 "왜 이게 필요한가?" 설명을 곁들여 학습자가 따라올 수 있게 한다. RFP·요구사항정의서·기존 도메인 자료를 입력으로 받거나, 자료가 없으면 AI 사전 리서치(보편 사례·법령·산업 표준)로 보충해 진행. 페르소나 시점의 챕터 단위 (5~7개 장면) + 확신도 태그 [확실/일반론/추측]로 검증 지점 명시 + 사용자 인터랙션 + 액터 전환으로 빅픽처를 점진적으로 채운다. 산출물 저장은 옵셔널 — 이해 자체가 목적이다. Triggers — "낯선 도메인 이해", "도메인 차근차근 알려줘", "1:1 빅픽처", "솔로 이벤트스토밍", "RFP 분석", "비즈니스 흐름 이해", "액터 시나리오", "신규 프로젝트 도메인 파악", "빅픽처 스토리타임", "bigpicture storytime", "/bigpicture-storytime".
databases
PostgreSQL DB에 직접 접근하는 스킬. DB 조회, 테이블 구조 확인, 데이터 검증이 필요할 때 사용한다. Node.js 스크립트로 직접 연결하며 접속 정보는 환경변수 또는 credentials 파일에서 읽는다. "postgres 조회", "DB 확인", "테이블 구조", "pg-query", "쿼리 실행", "데이터 검증", "PostgreSQL 접속" 같은 요청에 트리거한다.