ddd-workshop/skills/screen-inventory/SKILL.md
ddd-workshop 파이프라인의 4-옵션 단계 (선택적). context-designer 완료 후 UI가 있는 BC에 대해서만 호출. 해당 BC가 기여하는 화면 목록을 표시 데이터·액션·Query 이름과 함께 정리해 **read-path를 1급 산출물로** 노출시킨다. 와이어프레임 없이도 작성 가능하며 후속 aggregate-designer의 "Exposed Queries" 섹션과 이름 매칭으로 크로스체크된다. UI가 없는 Generic BC(알림 등)에는 호출하지 않는다. "스크린 인벤토리", "screen inventory", "UI 인벤토리", "화면 목록", "read path", "조회 경로", "screen-inventory", "ddd-workshop 4-옵션" 같은 요청에 트리거한다.
npx skillsauth add dev-goraebap/skills screen-inventoryInstall 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.
한 BC가 기여하는 화면 목록을 정리한다. 한 화면이 여러 BC의 데이터를 섞어 보여주면 각 BC의 Screen Inventory에 동일 화면이 등장하되, 관점이 다르게 기술된다.
이 산출물의 존재 이유는 read-path 강제 노출. 요구사항이 동사 중심으로 정리되면 조회 요구가 빠지기 쉬운데, 화면 단위로 보면 "이 화면엔 이 데이터가 필요" 가 자동으로 드러난다.
와이어프레임 없이도 작성 가능. 표시 데이터와 액션만 자연어로 기술하면 충분.
[Q 3/7 · 화면: 내 신청 목록]⚠️ 미정./ddd-workshop:screen-inventory <bc-name>context-designer 완료 후 UI 있는 BC에 대해 개별 호출--update호출 단위: BC 1개당 1회. 여러 BC에 적용하려면 여러 번 호출.
docs/shared/contexts/<bc>/_canvas.md — 주 입력
docs/shared/event-flow.md — 이벤트 흐름 (액터 활동 추출)docs/shared/context-map.md — BC 간 관계 (어느 BC가 어느 데이터 권위인지 확인)[Q · 이 BC에 화면이 있나요?]
이 BC의 외부 노출 형태를 확인합니다.
1) 사용자 UI가 있음 (웹·모바일 화면)
2) 관리자 UI만 있음
3) 외부 API만 제공 (UI 없음, 타 BC/시스템이 호출)
4) 내부 전용 (타 BC만 사용, UI·API 모두 없음)
2번도 Screen Inventory 대상입니다.
3번·4번은 이 스킬을 종료합니다.
3·4 선택 시 종료 메시지:
✅ 이 BC는 UI 노출이 없어 Screen Inventory가 필요 없습니다.
aggregate-designer의 "Exposed Queries" 섹션만으로 read-path가 충분히
기술됩니다.
Canvas의 Inbound Commands/Queries와 event-flow의 액터 활동을 근거로 화면 후보를 제시:
[Q · 화면 후보 검토]
이 BC가 기여하는 화면 후보입니다. 빠진 것 있나요?
액터별 후보:
- [사원]
1) 내 신청 목록
2) 내 신청 상세
3) 신청 작성
4) 연차 잔고 위젯
- [결재자]
5) 내 결재 대기함
- [관리자]
6) 전체 신청 관리
7) 잔고 조정 화면
1) 이대로 OK
2) 추가할 화면이 있음
3) 위 목록에서 제거할 화면
4) 화면 이름 변경
각 화면마다 다음을 묶음으로 질문:
[Q 2/7 · 화면: 내 신청 목록]
이 화면에 대해 확인합니다.
- 경로: /me/leave-requests
- 주 액터: 사원
- 표시 데이터 후보: 신청 ID, 기간, 휴가 종류, 상태, 제출일, 잔여 연차
- 액션 후보: 상세 보기, 취소 신청
- 필터/정렬 후보: 상태별, 최근순
1) 이대로 OK
2) 표시 데이터 수정
3) 액션 수정
4) 경로 수정
5) 이 화면은 제거
각 화면의 데이터 공급원이 될 Query 이름을 정한다. 이 이름이 aggregate-designer의 Exposed Queries와 매칭된다.
[Q · Query 이름 확정]
"내 신청 목록" 화면의 데이터 공급 Query를 다음과 같이 제안:
listMyLeaveRequests(employeeId, status?, range?)
1) 이대로 OK
2) 이름 수정
3) 매개변수 수정
4) 이 화면은 2개 이상의 Query가 필요함 (분리)
주의: Query는 BC 권위 데이터만 반환. 타 BC의 데이터(예: 잔여 연차)는 별도 Query로 분리해 합성.
한 화면이 여러 BC 데이터를 필요로 하면 명시:
[Q · 타 BC 의존]
"내 신청 목록" 화면은 다음 BC 데이터도 필요합니다:
- Leave Balance BC의 `getBalance(employeeId)` — 잔여 연차 표시용
이 의존 관계를 기록할까요?
1) 기록
2) 이 화면에서는 잔여 연차 제외 (별 화면에서만)
"이 BC의 범위가 아닌" 화면을 분명히 마킹:
[Q · 범위 밖 화면]
혹시 이 BC에 속한 줄 알았지만 범위 밖인 화면이 있나요?
예:
- 관리자 통계 대시보드 → Later (현재 범위 밖)
- 캘린더 뷰 → 다른 BC(Leave Balance)의 Screen Inventory
1) 없음
2) 있음 (목록 제공)
기본 경로 docs/shared/contexts/<bc>/_screens.md. 프로젝트 관례가 다르면 사용자에게 확인.
Frontmatter 없음. 본문만.
# Screen Inventory — <BC Name>
## 범위
이 BC가 **기여하는** 화면만 기재. 한 화면이 여러 BC의 데이터를 섞어
보여주면 각 BC의 Screen Inventory에 동일 화면이 등장할 수 있음 (관점이 다름).
## 화면 목록
### S1. 내 신청 목록
- **경로**: `/me/leave-requests`
- **주 액터**: 사원
- **표시 데이터**:
- (이 BC) 신청 ID, 기간, 휴가 종류, 상태, 제출일
- (Leave Balance 의존) 잔여 연차
- **액션**: 상세 보기, 취소 신청
- **필터/정렬**: 상태별, 최근순 기본
- **Query**: `listMyLeaveRequests(employeeId, status?, range?)`
- **타 BC 의존**: Leave Balance.`getBalance(employeeId)`
### S2. 내 결재 대기함
- **경로**: `/leave-requests?assigned-to-me`
- **주 액터**: 결재자 (팀장·관리자)
- **표시 데이터**: 신청자, 기간, 휴가 종류, 제출일, 사유 요약
- **액션**: 승인, 반려(사유 필수), 상세 보기
- **Query**: `listPendingApprovals(approverId)`
(이하 화면들)
## 범위 밖
- 관리자 통계 대시보드 — Later
- 캘린더 뷰 — Leave Balance BC의 Screen Inventory 참조
## ⚠️ 미정
- S3 "신청 작성"에서 결재선 미리보기 API 구조
## 다음 단계
→ `aggregate-designer`의 "Exposed Queries" 섹션에서 위 Query 이름들을 구현.
누락된 Query가 생기면 이 파일과 Aggregate 명세를 동기화.
--update)_canvas.md updated_at 비교 → stale 경고 (Canvas가 바뀌면 Inventory도 바뀔 수 있음).1) 화면 추가
2) 기존 화면의 표시 데이터·액션 수정
3) Query 이름 변경 (aggregate-designer와 동기화 필요)
4) 화면 제거
주의: Query 이름 변경은 aggregate-designer와 반드시 동기화. 사용자에게 "aggregate 파일도 업데이트할까요?" 안내.
□ Step 0에서 UI 존재 확인됨
□ UI 없으면 파일 생성 없이 종료
□ 화면마다 경로·주 액터·표시 데이터·액션 모두 기재
□ 화면마다 Query 이름 부여됨
□ 타 BC 의존은 명시됨 (해당 BC.QueryName 형식)
□ 범위 밖 화면 명시됨 (없으면 "없음")
□ Frontmatter 없음
| 맥락 | 화면 수 (한 BC당) | Query 수 | |---|---|---| | 학습 | 1~3 | 2~5 | | 개인 | 2~5 | 3~8 | | 사내 | 3~10 | 5~15 | | B2B | 5~15 | 10~25 | | B2C | 5~20 | 10~30 |
ddd-workshop 파이프라인은 전통적으로 command 중심(event·aggregate·invariant)으로 설계되어 있어, 조회(read) 요구가 누락되는 실질 문제가 반복 관측됐다.
Screen Inventory는:
Alberto Brandolini의 Event Storming 공식 산출물 중 "Screen Inventory" 가 본래 존재하며, 이 스킬은 그 관행을 스킬화한 것.
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 접속" 같은 요청에 트리거한다.