screen-inventory
screen-inventory 스킬
한 BC가 기여하는 화면 목록을 정리한다. 한 화면이 여러 BC의 데이터를 섞어 보여주면 각 BC의 Screen Inventory에 동일 화면이 등장하되, 관점이 다르게 기술된다.
이 산출물의 존재 이유는 read-path 강제 노출. 요구사항이 동사 중심으로 정리되면 조회 요구가 빠지기 쉬운데, 화면 단위로 보면 "이 화면엔 이 데이터가 필요" 가 자동으로 드러난다.
와이어프레임 없이도 작성 가능. 표시 데이터와 액션만 자연어로 기술하면 충분.
대화 UX 규약 (필수)
- 카테고리 선택은 숫자 메뉴. 자유 입력 금지.
- 화면 1개당 1문 1답 묶음. (개별 필드가 아닌 화면 단위로 묶어 질문)
- 진행 표시:
[Q 3/7 · 화면: 내 신청 목록] - "나중에" / "모름" / "스킵" 허용 →
⚠️ 미정. - 화면이 없는 BC면 즉시 종료 — "이 BC는 UI 노출 없음"이라고 안내하고 파일을 만들지 않음.
1. 언제 트리거하는가
/ddd-workshop:screen-inventory <bc-name>context-designer완료 후 UI 있는 BC에 대해 개별 호출- "스크린 인벤토리", "화면 목록 정리", "read path 뽑아줘"
- 기존 Screen Inventory 업데이트 →
--update
호출 단위: BC 1개당 1회. 여러 BC에 적용하려면 여러 번 호출.
2. 입력
docs/shared/contexts/<bc>/_canvas.md— 주 입력- 해당 BC의 Inbound Commands/Queries
- 관여 액터
docs/shared/event-flow.md— 이벤트 흐름 (액터 활동 추출)docs/shared/context-map.md— BC 간 관계 (어느 BC가 어느 데이터 권위인지 확인)
3. Step 0 — 화면 존재 여부 확인
[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가 충분히
기술됩니다.
4. 진행 단계 (화면 있는 BC)
Step 1 — 화면 목록 초안
Canvas의 Inbound Commands/Queries와 event-flow의 액터 활동을 근거로 화면 후보를 제시:
[Q · 화면 후보 검토]
이 BC가 기여하는 화면 후보입니다. 빠진 것 있나요?
액터별 후보:
- [사원]
1) 내 신청 목록
2) 내 신청 상세
3) 신청 작성
4) 연차 잔고 위젯
- [결재자]
5) 내 결재 대기함
- [관리자]
6) 전체 신청 관리
7) 잔고 조정 화면
1) 이대로 OK
2) 추가할 화면이 있음
3) 위 목록에서 제거할 화면
4) 화면 이름 변경
Step 2 — 화면별 상세 (1화면 1문)
각 화면마다 다음을 묶음으로 질문:
[Q 2/7 · 화면: 내 신청 목록]
이 화면에 대해 확인합니다.
- 경로: /me/leave-requests
- 주 액터: 사원
- 표시 데이터 후보: 신청 ID, 기간, 휴가 종류, 상태, 제출일, 잔여 연차
- 액션 후보: 상세 보기, 취소 신청
- 필터/정렬 후보: 상태별, 최근순
1) 이대로 OK
2) 표시 데이터 수정
3) 액션 수정
4) 경로 수정
5) 이 화면은 제거
Step 3 — Query 이름 부여
각 화면의 데이터 공급원이 될 Query 이름을 정한다. 이 이름이 aggregate-designer의 Exposed Queries와 매칭된다.
[Q · Query 이름 확정]
"내 신청 목록" 화면의 데이터 공급 Query를 다음과 같이 제안:
listMyLeaveRequests(employeeId, status?, range?)
1) 이대로 OK
2) 이름 수정
3) 매개변수 수정
4) 이 화면은 2개 이상의 Query가 필요함 (분리)
주의: Query는 BC 권위 데이터만 반환. 타 BC의 데이터(예: 잔여 연차)는 별도 Query로 분리해 합성.
Step 4 — 타 BC 의존 식별
한 화면이 여러 BC 데이터를 필요로 하면 명시:
[Q · 타 BC 의존]
"내 신청 목록" 화면은 다음 BC 데이터도 필요합니다:
- Leave Balance BC의 `getBalance(employeeId)` — 잔여 연차 표시용
이 의존 관계를 기록할까요?
1) 기록
2) 이 화면에서는 잔여 연차 제외 (별 화면에서만)
Step 5 — 범위 밖 화면 명시
"이 BC의 범위가 아닌" 화면을 분명히 마킹:
[Q · 범위 밖 화면]
혹시 이 BC에 속한 줄 알았지만 범위 밖인 화면이 있나요?
예:
- 관리자 통계 대시보드 → Later (현재 범위 밖)
- 캘린더 뷰 → 다른 BC(Leave Balance)의 Screen Inventory
1) 없음
2) 있음 (목록 제공)
5. 산출물
기본 경로 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 명세를 동기화.
6. 업데이트 모드 (--update)
_canvas.mdupdated_at비교 → stale 경고 (Canvas가 바뀌면 Inventory도 바뀔 수 있음).- "무엇을 업데이트?" 숫자 메뉴:
1) 화면 추가 2) 기존 화면의 표시 데이터·액션 수정 3) Query 이름 변경 (aggregate-designer와 동기화 필요) 4) 화면 제거 - 해당 부분만 delta 질문.
주의: Query 이름 변경은 aggregate-designer와 반드시 동기화. 사용자에게 "aggregate 파일도 업데이트할까요?" 안내.
7. 강제 체크리스트
□ Step 0에서 UI 존재 확인됨
□ UI 없으면 파일 생성 없이 종료
□ 화면마다 경로·주 액터·표시 데이터·액션 모두 기재
□ 화면마다 Query 이름 부여됨
□ 타 BC 의존은 명시됨 (해당 BC.QueryName 형식)
□ 범위 밖 화면 명시됨 (없으면 "없음")
□ Frontmatter 없음
8. 맥락별 조정
| 맥락 | 화면 수 (한 BC당) | Query 수 |
|---|---|---|
| 학습 | 1~3 | 2~5 |
| 개인 | 2~5 | 3~8 |
| 사내 | 3~10 | 5~15 |
| B2B | 5~15 | 10~25 |
| B2C | 5~20 | 10~30 |
9. 절대 하지 말 것
- UI 없는 BC에 Screen Inventory 강제 생성.
- 화면 1개를 여러 BC에서 같은 관점으로 중복 기술 (각 BC는 자기 기여분만).
- Query 이름을 aggregate-designer와 동기화 없이 변경.
- 표시 데이터와 DB 스키마를 동일시 (표시는 사용자 관점, 스키마는 저장 관점).
- 와이어프레임 없다고 작성 거부 (자연어만으로 충분).
- Frontmatter 추가.
10. 왜 이 단계가 필요한가
ddd-workshop 파이프라인은 전통적으로 command 중심(event·aggregate·invariant)으로 설계되어 있어, 조회(read) 요구가 누락되는 실질 문제가 반복 관측됐다.
Screen Inventory는:
- BC Canvas의 Inbound Queries를 구체화.
- Aggregate의 Exposed Queries에 이름 매칭으로 연결.
- 누락된 read-path를 와이어프레임 없이도 강제 노출.
Alberto Brandolini의 Event Storming 공식 산출물 중 "Screen Inventory" 가 본래 존재하며, 이 스킬은 그 관행을 스킬화한 것.
More from dev-goraebap/skills
claude-hook-notify-setup
>
23media-storage
파일 업로드·저장소·첨부 관리 패턴. Actions: 파일 업로드, 이미지 업로드, 파일 처리, 저장소 연동, 썸네일 첨부, 색상 추출, file upload, image upload, storage, attachment, thumbnail. Patterns: Active Storage, blobs 테이블, attachments 테이블, 다형적 첨부, 중복 파일 감지. Storage: Cloudflare R2, AWS S3, @aws-sdk/client-s3, UUID key, 2-level 디렉토리, CDN URL, presigned URL. DB: Drizzle ORM, blob, checksum, MD5, metadata JSON, MIME, byte_size. Color: 지배적 색상 추출, dominant color, Gemini API, hex, blobs.metadata. Query: 썸네일 조회, 서브쿼리, leftJoin, view-model, CDN URL 변환.
22sveltekit-progressive-architecture
SvelteKit 프로젝트 아키텍처·코드 규칙. Actions: 작성, 구현, 리뷰, 리팩터, 검토, 추가, 설계, 수정, write, implement, review, refactor, fix. Base Rules: 컴포넌트 재사용, $lib, 라우트 배치, 인라인 타입 금지, interface, type, script 섹션, 주석, 가독성, code style, TypeScript. Server Architecture: 서버 아키텍처, Active Record, Query Service, REST API, Drizzle, +server.ts, +page.server.ts, server/domain, server/infra, 뷰모델, view-model, form actions, ORM, schema, 레이어 분리, CUD, load.
18agent-wiki
>
15html-prototype
>
12mvp-preview
아이디어나 기능을 빠르게 만들어 링크로 공유하는 MVP 워크플로우. 사용자가 '프로토타입 만들어줘', '데모 페이지 필요해', '빠르게 만들어줘', '클라이언트한테 보여줄 거 만들어줘', '아이디어 구체화해줘', '링크 공유해야 해', '배포해줘', 'MVP 만들기', '기획 검토용 화면'처럼 말하면 반드시 이 스킬을 사용한다. 아이디어가 막연해도 괜찮다. 토론으로 범위를 좁히고, 최소 코드로 가치를 증명하고, 링크 하나로 전달하는 전 과정을 다룬다.
12