A planning-concretization deliverable skill that creates and verifies ui-proto screens.
The core of this skill is not team automation, but concretizing human intent into screens/actions/states to produce deliverables that business stakeholders can review as if they were a real program.
Core principles
- No Backend: All APIs go through a Mock interceptor (keep calling useApi())
- Generation method: Reference the test-data guide code as the base skeleton, then adapt it specifically for Mock
- Component usage: Use kebab-case (e.g.
<u-button>,<u-modal>,<my-component>) - Completion criteria: vue-tsc + lint + build all pass
- Preparation for production transition: Keep API signatures intact; real-server integration possible by replacing only the Mock
- Repository separation (decided 2026-04-27): Accumulated not in this project but in a separate ui-proto repository의
src/modules-task/{년월}/{태스크폴더}/accumulated in - Spec source material: Vue screens + Mock data + overview explanation pages become the input for the follow-up
peach-gen-specbecomes input for - First-pass completeness support: Leave screen lists, key actions, and completion/error states so that
peach-gen-speccan create a confirmed Spec - Planning concretization first: When a planner concretizes directly without a Spec, prioritize the solo/conversational flow, and the AI team does not arbitrarily amplify requirements
Role boundaries
| Skill | Responsibility |
|---|---|
peach-team-ui-proto |
Mock-based planning-review screens + task metadata + overview + screen/action/state generation and verification |
peach-team-dev |
Implement this project's code based on the prepared DB/Spec/ui-proto |
peach-team-e2e |
After main development is complete, verify the actual browser flow matches the plan |
peach-gen-ui |
Standalone generation of UI based on real API/Store |
ui-proto is not the main development code. Modifying production code, real API integration, final E2E judgment, and designing complete E2E scenarios are not handled by this skill.
ui-proto repository structure
This skill runs in a separate ui-proto repository(e.g. peach-ui-proto-backoffice).
If it is not the current project, confirm the repository location with the user.
peach-ui-proto-{도메인}/ ← 별도 저장소
└── src/modules-task/
└── {년월}/ 예: 2604
└── {년월일-이니셜-태스크명}/ 예: 260427-{이니셜}-goods
├── _task-meta.ts 메타 (날짜/담당자/제목/modules)
├── _routes.ts overview + 서브모듈 라우트
├── layout/
│ ├── task-layout.vue 서브모듈용 (배너+사이드바)
│ └── task-overview-layout.vue 기획서용 (배너+전체)
├── overview/pages/overview.vue 기획서 화면
└── {서브모듈}/ 실제 UI 화면
├── pages/
├── store/
└── type/
When creating a new task, it is faster to copy an existing task folder (e.g. 2603/260320-{이니셜}-board/) wholesale and then modify only the metadata, routes, and submodule names. For details, see the ui-proto repository's AGENTS.md reference.
Conditional team formation (decided 2026-04-27, direction reinforced 2026-05-04)
This skill automatically branches into team mode/solo modedepending on request complexity. However, the purpose of team mode is not autonomous development but improving the quality of the criteria for subsequent development/verification.
Mode decision tree
화면/흐름 요구가 충분히 주어짐?
│
├─ Yes + 복잡 화면 → 자동 팀 모드
│ (proto-ui-dev + proto-ui-qa)
│ 목적: 화면/액션/상태/overview 품질 보강
│ 랄프루프: 5회(단순) / 10회(복잡)
│
├─ Yes + 단순 화면 → 단독 모드
│ 기획자가 직접 빠르게 구체화하는 경우
│ 랄프루프: 5회 (단독 검증만)
│
└─ No → 요구사항 구체화 요청
team=Y만 있고 화면/흐름 요구가 없으면 진행하지 않음
team=Yteam mode can be forced with , but screen/flow requirements are essential. team=N Solo mode can be forced with the argument.
Team mode (when complex screen/flow requirements are input)
Input type
/peach-team-ui-proto [모듈명] "화면/흐름 요구사항" [옵션]
/peach-team-ui-proto [모듈명] req=<요구사항 파일 경로> [옵션]
/peach-team-ui-proto [모듈명] spec=<Spec 파일 경로> [옵션]
spec=is an optional input used when an already-organized requirements document exists. ui-proto's standard responsibility is to produce the input artifact for the follow-up peach-gen-spec, so Spec is not required as mandatory.
Team composition
| Role | Responsibility |
|---|---|
| proto-ui-dev | Screen implementation based on screen/flow requirements (create modules-task folder) |
| proto-ui-qa | Visual/UX verification + verification of suitability as follow-up gen-spec input (independent worktree, read-only) |
proto-ui-qa verification items
- Were all of the user's screen/flow requirements reflected
- Compliance with NuxtUI v4 component usage rules
- This project (
peach-{도메인}) consistency with component patterns - Avoidance of AI Slop patterns (gradients, purple colors, etc.)
- Compliance with modules-task folder structure rules (
_task-meta.ts,_routes.ts, layout separation, etc.) - Compliance with route integration rules (
_task.routes.tsadded to taskDetailRoutes) - If DESIGN.md exists, compliance with design system rules (colors, component naming, typography)
- Are the screen list and main features explained in the overview
- Are the completion and error states of main actions (search/save/approve/reject/upload/download, etc.) expressed on the screen
- Follow-up
peach-gen-specAre there sufficient clues about the screen transition flow so that E2E scenario candidates can be organized - Follow-up
peach-gen-specAre screen/Store/API expectations sufficiently revealed so that a development Spec can be created
Ralph loop 5/10 judgment criteria
| Mode | Max iterations |
|---|---|
| Simple screen (list only, single modal) | 5회 |
| Complex screen (multi-tab, multiple modals, charts, multi-step forms) | 10회 |
When the upper limit is reached, report to the user and stop.
Solo mode (simple screen or team=N)
When the planner concretizes directly. Performs only self-verification (no separate QA agent). Ralph loop 5 times (attempt to pass vue-tsc + lint + build).
Auto-generate module name/task folder name
When a requirements document or natural language input is given:
- From the requirements body and user input, extract
planner,date,titlecandidates - Task folder name:
{YYMMDD}-{planner}-{영문슬러그}format (Korean prohibited) - With the confirmed meta,
_task-meta.tsis generated. Afterwards,peach-gen-spec proto=<경로>reads this meta and the screen files to generate a development Spec - Show auto-extraction results to the user and get confirmation
When given as natural language input:
- AI proposes 1~3 candidates → user selects
Prototype characteristics
- Without Backend, using Mock interceptor
useApi()Handles the call. - Mock data is
mock/separated into, and the signature is maintained when switching to the real API. - For visual quality and AI Slop prevention details, follow
peach-gen-ui/references/core/visual-guide.md. Shared UI patterns followpeach-gen-ui가 SoT다.
First-pass completeness deliverable
The overview and screen files must reveal the following information. This information is not a complete E2E scenario, but peach-gen-specthese are the screen/action/state criteria for creating the development Spec.
## UI Proto 검증 매핑
### 화면 목록
| 화면 | 경로 | 목적 |
|------|------|------|
### 주요 액션
| 액션 | 시작 화면 | 결과 화면/상태 |
|------|-----------|----------------|
### 완료/오류 상태
| 상태 | 표시 위치 | 메시지/피드백 |
|------|-----------|---------------|
### 결정 필요 항목
| 항목 | 모호한 이유 | 후속 처리 |
|------|------------|-----------|
Writing rules:
- Items whose actual data accuracy cannot be verified due to Mock data limitations are left as items requiring a decision.
- If the permission/state/error rules are not finalized by the screen alone,
peach-gen-specrecord it so the user can confirm it in. - The detailed selectors, fixtures, and suite combinations of the scenario are left as the responsibility of
peach-team-e2e.
Absolutely required patterns (common to all UI patterns)
Warning: The patterns below must be applied in all UI patterns. If omitted, search, paging, and URL state management will not work.
Required checklist
| # | Pattern | Application location |
|---|---|---|
| 1 | <form @submit.prevent="listAction"> |
list-search.vue |
| 2 | @change="listAction" (select, radio) |
list-search.vue, list-table.vue |
| 3 | @update:modelValue="listAction" (date) |
list-search.vue |
| 4 | @update:page="listMovePage" (pagination) |
list-table.vue |
| 5 | watch pattern (route → listParams) | list-search.vue |
| 6 | watch pattern (route → getList) | list-table.vue |
| 7 | listAction(), resetAction(), listMovePage() |
Each component |
Detailed code and prohibited patterns:
peach-gen-ui/references/core/common-patterns.mdreference (required, shared SoT)
Input method
/peach-team-ui-proto [모듈명] [옵션]
Option
| Option | Default value | Description |
|---|---|---|
| excel | N | Excel download/upload feature (Mock) |
| file | N | File upload feature (Mock) |
| req | (none) | Screen/flow requirements file path. If complex, team mode auto-entry |
| spec | (none) | Path of an already-written Spec or requirements document. If complex, team mode auto-entry |
| team | (auto) | team=Yforce team mode with, team=Nforce-disable team mode with |
Example
# 단독 모드 (기획자 직접 작업)
/peach-team-ui-proto notice-board
/peach-team-ui-proto member-manage excel=Y
/peach-team-ui-proto product file=Y excel=Y
# 복잡 화면 팀 모드
/peach-team-ui-proto product team=Y "상품 목록, 검색, 등록, 수정, 삭제, 엑셀 다운로드, 상태별 승인 흐름이 필요함"
/peach-team-ui-proto product req=docs/prd/product.md
# 팀 모드 강제 비활성화
/peach-team-ui-proto product team=N
UI patterns are selected interactively after execution (Step 1) For complex screens, after request analysis, automatically switch to proto-ui-dev + proto-ui-qa team mode.
Workflow
Step 0. Check design system
cat DESIGN.md 2>/dev/null | head -200
- If present: Inject component rules, colors, and typography into the context and reflect them in subsequent steps
- If not present: Output the warning below and continue
⚠️ DESIGN.md 없음 — 디자인 시스템 문서가 없습니다. 작성을 권장합니다.
참고: peach-harness/templates/DESIGN-template.md (또는 /peach-gen-design)
Step 1: Required UI pattern selection
This step cannot be skipped! Always ask the planner about the UI pattern and proceed only after receiving a selection. You must not start code generation without a selection.
To the planner, must ask the question below and receive a selection:
## UI 패턴 선택 (필수)
어떤 UI 패턴을 사용할까요?
### 기본 UI 패턴 (test-data 가이드 있음)
| 패턴 | 설명 | 사용 시기 |
|------|------|----------|
| **crud** | 목록 + 모달 | 일반적인 CRUD, 입력 10개 미만 |
| page | 목록 + 별도 페이지 | 입력 10개 이상, URL 공유 필요 |
| two-depth | 좌우 분할 | 목록/상세 동시 표시 |
| infinite-scroll | 무한 스크롤 | 피드형, 모바일 최적화 |
| select-list | 선택 모달 | 다른 화면에서 데이터 참조 |
| show-more | 더보기 버튼 | 적은 데이터, 단계별 로드 |
| batch-process | 일괄 처리 | 순차 작업 진행바 |
### 추가 옵션 (기본 패턴과 조합)
| 옵션 | 설명 |
|------|------|
| excel | 엑셀 다운로드/업로드 (Mock 로컬 생성) |
| file | 파일 업로드 (Mock UUID 반환) |
### 고급 UI 패턴 (MCP 활용, test-data 없음)
| 패턴 | 설명 |
|------|------|
| adv-search | 복합 검색 (5개 이상 조건) |
| calendar | 달력 UI |
| kanban | 칸반 보드 |
| mega-form | 대량 입력 폼 (50개+) |
| tab-list | 탭 내 리스트 |
선택해주세요 (예: crud, excel=Y)
Guide code path:
- crud:
src/modules/test-data/pages/crud/if present, reference it first - Other patterns:
src/modules/test-data/pages/[패턴명]/or the closest existingsrc/modules-task/{년월}/{태스크폴더}/
Step 2: Check test-data guide code + detect ui-proto repository
# test-data 모듈 존재 여부 확인
ls src/modules/test-data/ 2>/dev/null
# _common 래퍼 컴포넌트 존재 여부 확인
ls src/modules/_common/components/ 2>/dev/null
# 빌드 도구 감지
ls package.json && head -20 package.json
ls bun.lockb 2>/dev/null && echo "BUILD_TOOL=bun"
# 공유 UI 패턴 references 경로 감지 (SoT: peach-gen-ui)
SHARED_UI_REFS=$(find ~/.claude ~/.agents ~/.codex "${CODEX_HOME:-$HOME/.codex}/skills" -path "*/peach-gen-ui/references" -type d 2>/dev/null | head -1)
# proto 자체 references 경로 (Mock 특화 패턴)
PROTO_REFS=$(find ~/.claude ~/.agents ~/.codex "${CODEX_HOME:-$HOME/.codex}/skills" -path "*/peach-team-ui-proto/references" -type d 2>/dev/null | head -1)
- test-data present → generate based on guide code
- no test-data → generate based on references documents
- no SHARED_UI_REFS → there is no shared UI pattern SoT, so report to the user and stop
- no PROTO_REFS → proto-specific Mock patterns cannot be read, so report to the user and stop
Separation of shared/proto-specific patterns
peach-team-ui-protodoes not hold a copy of the UI pattern catalog. For shareable UI patterns, read peach-gen-ui/references, and keep only the Mock differences needed only by proto in its own references.
| Classification | Location | Content |
|---|---|---|
| Shared UI SoT | ${SHARED_UI_REFS} |
common-patterns, ui-patterns, visual-guide, Store/Type skeleton, basic/advanced UI patterns, validator |
| proto-specific | ${PROTO_REFS} |
mock-service, mock-store, Mock excel/file option, completion/validation, proto team agent |
In team mode, proto-ui-dev와 proto-ui-qa pass the value of SHARED_UI_REFS, PROTO_REFS together with the work instruction.
Build tool basis
| File existence | Build tool | Validation command |
|---|---|---|
bun.lockb |
bun | bunx vue-tsc --noEmit && bun run lint:fix && bun run build |
Prefer _common wrapper (conditional)
In the target project,
_common/components/if the directory exists, use wrapper components first instead of using NuxtUI directly.
| NuxtUI | _common wrapper (preferred if present) |
|---|---|
<UInput> |
<p-input-box> |
<USelect> |
<p-nuxt-select> |
<UFormField> |
<p-form-field> |
<UFileInput> |
<p-file-upload> |
_common/components/if absent → use NuxtUI directly (keep existing approach)
Step 2.5: Domain analysis (Analyze)
Compare and analyze the test-data UI and the requested domain:
- UI complexity assessment: number of fields, search conditions, table column composition
- Mock data design: devise realistic sample data suited to the domain
- Adaptation decision:
- Must Follow → as is (script setup, required patterns, no AI Slop)
- May Adapt → tailored to domain (table columns, search form, modal form composition)
- Structure suggestion (May Suggest):
If the analysis shows a structure other than the guide code is more suitable, propose it to the user:
- Component separation (e.g., split a complex form into per-step components)
- Page composition change (e.g., list within tabs, separate detail page)
- Apply after user confirmation. Do not violate Must Follow.
Step 3: Mock service + Store + code generation
Reference the selected pattern's guide code as the base skeleton, then adapt it to the domain:
3-1. Mock data generation (required)
${PROTO_REFS}/core/mock-service-pattern.md reference
mock/[모듈명].mock.ts 생성:
- 도메인 맞춤 샘플 데이터 (5~10건)
- 동적 데이터 생성 함수
- API 시그니처 유지 (프로덕션 전환 대비)
3-2. Store generation (via Mock useApi())
${PROTO_REFS}/core/mock-store-pattern.md reference
store/[모듈명].store.ts 생성:
- useApi() 경유 패턴 유지
- Mock interceptor가 요청을 가로채서 Mock 데이터 반환
- 프로덕션 전환 시 interceptor만 제거하면 됨
3-3. Page generation
| Pattern | Guide code path | Reference documents (peach-gen-ui SoT) |
|---|---|---|
| crud | test-data/pages/crud/ |
${SHARED_UI_REFS}/basic/page-pattern.md + ${SHARED_UI_REFS}/basic/modal-pattern.md |
| page | test-data/pages/crud/ + detail-page.vue |
${SHARED_UI_REFS}/basic/page-pattern.md |
| two-depth | test-data/pages/two-depth/ |
${SHARED_UI_REFS}/basic/two-depth-pattern.md |
| infinite-scroll | test-data/pages/infinite-scroll-list/ |
${SHARED_UI_REFS}/basic/infinite-scroll-pattern.md |
| select-list | test-data/pages/select-list/ |
${SHARED_UI_REFS}/basic/select-list-pattern.md |
| batch-process | test-data/modals/list-table-progress.modal.vue |
${SHARED_UI_REFS}/basic/batch-process-pattern.md |
Required standard patterns: ${SHARED_UI_REFS}/core/common-patterns.md Reference
- Selectbox pattern (all options value='')
- Router sync pattern (listAction, resetAction, watch)
- Date search pattern (initial values: 5 years ago ~ today)
Step 4: Verification & completion
# ui-proto 저장소 루트 기준
bunx vue-tsc --noEmit # 타입 체크
bun run lint:fix # 린트
bun run build # 빌드
On error: analyze cause → fix code → verify again → repeat until it passes
Generated file structure
src/modules-task/{년월}/{태스크폴더}/ Under _task-meta.ts, _routes.ts, layout/, overview/, {서브모듈}/pages, {서브모듈}/store, {서브모듈}/type, {서브모듈}/modalsis generated. For the subsequent peach-gen-spec proto=<경로>, pass this task folder path.
Bounded Autonomy (autonomous adaptation rules)
Must Follow (absolute compliance)
<script setup>Required- NuxtUI components first, no AI Slop
- Required patterns:
listAction,resetAction,listMovePage, watch pattern @submit.prevent="listAction",@change="listAction"pattern- Module boundary:
_common만 import - Mock data is separated into the
mock/directory - Maintain the pattern of going through useApi() (in preparation for production transition)
May Adapt (supplement after analysis)
- Table column composition (tailored to domain fields)
- Search form composition (layout according to number of fields)
- Modal/page form composition (grouping input fields)
- Mock data composition (domain-specific samples)
- UI interaction flow (domain-specific UX)
May Suggest (confirm with user after suggesting)
- Component separation (e.g., splitting a complex form into step-by-step components)
- Page composition changes (e.g., list within a tab, separating detail pages)
- Suggest UI pattern changes (e.g., page is more suitable than crud)
When suggesting: present the reason to the user and apply after confirmation. Do not infringe on Must Follow.
Adapt conditions
When supplementing, always: (1) explain the reason (2) do not infringe on Must Follow (3) pass vue-tsc + lint + build
Completion conditions
- UI pattern selection complete
- Mock data, Store, page/modal component creation complete
vue-tsc,lint,buildpasses- Team mode requires
proto-ui-qaAPPROVED or user-approved CONDITIONAL
Do not declare completion without a successful build.
Guidance after completion
Report created/modified files, vue-tsc/lint/build results, browser verification path, and the scope of Mock removal for production transition.
Conditional reference guide (token saving)
Important: Read only the reference files for the selected pattern! Do not load all references at once.
Required references (must read - do not omit!)
Warning: The files below must be read first regardless of which pattern is selected! If you do not read these files, search, paging, and URL state management patterns will be missing.
${SHARED_UI_REFS}/core/common-patterns.md- URL Watch pattern, Selectbox, Router sync, Date search, modal open pattern${PROTO_REFS}/core/mock-service-pattern.md- Mock data definition, dynamic generation, maintaining API signatures${PROTO_REFS}/core/mock-store-pattern.md- Mock useApi() via Store pattern
Reference mapping by pattern
| Selected pattern | Files to read |
|---|---|
| crud | Shared: basic/page-pattern.md + basic/modal-pattern.md |
| page | Shared: basic/page-pattern.md |
| two-depth | Shared: basic/two-depth-pattern.md |
| infinite-scroll | Shared: basic/infinite-scroll-pattern.md |
| select-list | Shared: basic/select-list-pattern.md |
| batch-process | Shared: basic/batch-process-pattern.md |
| adv-search | Shared: advanced/adv-search-pattern.md |
| calendar | Shared: advanced/calendar-pattern.md |
| kanban | Shared: advanced/kanban-pattern.md |
| mega-form | Shared: advanced/mega-form-pattern.md |
| tab-list | Shared: advanced/tab-list-pattern.md |
Additional references by option
| Option | Files to read |
|---|---|
| excel=Y | proto-specific: options/excel-pattern.md |
| file=Y | proto-specific: options/file-upload-pattern.md |
| validator required | Shared: options/validator-pattern.md |
Conditional references
| Situation | Files to read |
|---|---|
| loading state required | Shared: core/loading-state-pattern.md |
| error handling required | Shared: core/error-handling-pattern.md |
Reference
- Guide code (preferred):
src/modules/test-data/or existingsrc/modules-task/{년월}/{태스크폴더}/ - Mock data:
src/modules-task/{년월}/{태스크폴더}/{서브모듈}/mock/ - Store:
src/modules-task/{년월}/{태스크폴더}/{서브모듈}/store/
Reference the test-data guide code as the baseline skeleton, but adapt it within the Bounded Autonomy scope to suit Mock specialization + domain characteristics