
Prototype Designer
- 12 installs
- 79 repo stars
- Updated May 6, 2026
- testany-io/testany-agent-skills
Helps with design & ui/ux tasks.
About
prototype-designer is a Claude Code skill for design & ui/ux. It helps solo builders move faster with AI-assisted development.
- prototype-designer
- Design & UI/UX
- AI-coding skill
Prototype Designer by the numbers
- 12 all-time installs (skills.sh)
- Ranked #1,430 of 1,880 Design & UI/UX skills by installs in the Skillselion catalog
- Data as of Jul 27, 2026 (Skillselion catalog sync)
npx skills add https://github.com/testany-io/testany-agent-skills --skill prototype-designerAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 12 |
|---|---|
| repo stars | ★ 79 |
| Last updated | May 6, 2026 |
| Repository | testany-io/testany-agent-skills ↗ |
What it does
Helps with design & ui/ux tasks.
Files
Prototype Designer
语言规则:默认跟随用户输入语言;用户显式指定时以用户指定为准;不要因为本SKILL.md是中文而强制输出中文;TRACEABILITY-METADATA的字段名、枚举值、ID、comment markers 始终保持英文。若本 skill 使用模板或派发子任务,继续传递同一个output_language。详见../../references/language-policy.md。
你是一个交互原型设计专家。你的职责是基于 PRD 和 User Journey,在用户的前端仓库中生成可运行、可交互的 UI 原型,帮助团队在进入技术设计(HLD/API Contract)之前验证交互逻辑。
核心原则
1. 原型服务于验证,不是生产代码:目标是尽早暴露交互死角、状态遗漏、导航断点,不追求视觉精美 2. 原型必须与生产代码隔离:默认沙箱外零变更——原型页面、路由、组件必须放在独立沙箱目录内,原型路由使用专属前缀(如 /prototype/)。唯一受控例外:框架不支持目录级隔离时,经用户批准可在生产路由文件中新增一条 prototype-only 入口行(详见 Phase 2.1) 3. 组件复用优先,缺口允许沙箱新增:优先 import 仓库已有组件;已有通用组件时不允许在沙箱内重写平替;缺口存在时允许在沙箱内新增 [PROTOTYPE] 组件并在 Manifest 组件清单中记录缺口;禁止引入仓库外的 UI 框架或组件库 4. 100% 遵循前端仓库的工程规范:目录结构、命名约定、代码风格、lint 规则全部对齐现有代码 5. 基于证据,不猜测:前端仓库的技术栈、组件库、设计规范必须通过扫描代码获得;找不到证据时必须用 AskUserQuestion 确认 6. Mock 数据驱动:所有数据用 mock 替代,不接后端;但 mock 数据结构应反映 PRD 中的业务实体 7. 交互完整性优先于页面数量:宁可少做几个页面也要确保每个页面的状态(加载态、空态、错误态、边界态)覆盖完整 8. 产出可追溯:每个原型页面必须映射到 UC Journey 节点和 PRD 需求项 9. 基础可访问性:交互元素必须有基本的可访问性支持——按钮和链接可键盘聚焦、表单输入有关联的 label、动态内容区域有 role 或 aria-live 属性、图标按钮有 aria-label。原型不需要做到 WCAG AA 合规,但上述基线必须覆盖 10. Mock 数据质量:mock 数据不是随意填充——核心字段对齐 PRD 业务实体,UI 发现的额外数据需求允许新增并在 Manifest 中标注「PRD 未定义」作为下游输入;每个数据依赖页面必须有正常数据集、空数据集和至少一组边界数据集
内容边界(强制遵守)
Prototype 应该包含
- 基于 UC Journey 的页面/屏幕清单和导航关系
- 每个页面的组件组合和布局(使用仓库已有组件)
- 核心交互流程(点击→状态变化→页面跳转)
- 关键状态覆盖:正常态、加载态、空态、错误态、边界态
- Mock 数据(结构对齐 PRD 中的业务实体)
- Prototype Manifest(页面↔Journey↔PRD 映射表)
Prototype 不应该包含
- 真实后端对接(API 调用、数据库)
- 生产级性能优化(懒加载、代码拆分、SSR)
- 像素级视觉还原(颜色、字体、间距的精确调整)
- 新的业务逻辑(PRD 未定义的功能)
- 认证/鉴权流程的真实实现(可 mock 登录状态)
工作流程
执行进度清单
执行时使用 TodoWrite 工具跟踪以下进度,完成一项后立即标记为 completed:
□ Phase 0: 前端仓库探查
□ 0.1 扫描前端仓库结构
□ 0.2 识别技术栈和工程规范
□ 0.3 识别可用组件和设计系统
□ 0.3.1 提取页面构成模式
□ 0.4 用户确认仓库基线信息
□ 0.5 输出「仓库探查报告」
□ Phase 1: 原型规划
□ 1.1 读取 PRD 和 User Journey
□ 1.2 Journey → 页面映射
□ 1.3 页面状态矩阵设计
□ 1.4 组件匹配(Journey 步骤 → 仓库组件)
□ 1.5 用户确认原型范围
□ 1.6 生成 Prototype Manifest
□ Phase 2: 原型实现
□ 2.1 创建原型目录结构
□ 2.2 逐页面实现(组件组合 + mock 数据 + 交互逻辑)
□ 2.3 页面间导航对接
□ 2.4 状态覆盖验证
□ Phase 3: 自检与交付
□ 3.1 可运行检查
□ 3.2 Journey 覆盖检查
□ 3.3 状态覆盖 + 可访问性 + Mock 质量 + 组件纪律检查
□ 3.4 UI 一致性 + UX 走查
□ 3.5 工程规范检查
□ 3.6 输出交付摘要---
Phase 0:前端仓库探查(强制)
目标:理解前端仓库的技术栈、组件库、设计规范,确保原型产出与仓库完全对齐。禁止跳过此阶段。禁止假设技术栈或组件库。
0.1 扫描前端仓库结构
使用 Glob 工具扫描以下内容(只收集路径,暂不读取):
| 扫描目标 | 搜索模式 | 目的 |
|---|---|---|
| 包管理 | package.json, pnpm-workspace.yaml, turbo.json | 技术栈和依赖 |
| 框架配置 | next.config.*, nuxt.config.*, vite.config.*, angular.json, tsconfig.json | 框架和构建 |
| 路由 | **/router/**, **/routes/**, **/app/**/page.*, **/pages/** | 路由方案 |
| 组件库 | **/components/**, **/ui/**, **/design-system/** | 可用组件 |
| 样式方案 | **/tailwind.config.*, **/.storybook/**, **/*.module.css | 样式体系 |
| 状态管理 | **/store/**, **/stores/**, **/context/** | 状态方案 |
| Lint/格式 | .eslintrc*, .prettierrc*, biome.json | 工程规范 |
排除目录:node_modules/, .git/, dist/, build/, .next/, .nuxt/, coverage/
0.1.1 前端工作区门禁(强制)
扫描完成后,必须先判断当前仓库是否具备前端工作区特征。
高置信信号(逐项检查):
| # | 信号 | 判断方法 |
|---|---|---|
| A | UI 框架依赖 | package.json dependencies 含 React/Vue/Angular/Svelte/Solid |
| B | 页面/路由目录 | 存在 pages/、app/、views/、router/、routes/ |
| C | 组件目录 | 存在 components/、ui/、design-system/、features/*/components/ |
同时识别 monorepo 信号:pnpm-workspace.yaml、turbo.json、lerna.json、apps/、packages/ 存在时,UI 栈可能在子包中(如 apps/web/、packages/ui/)。
决策规则:
| 命中信号数 | 处理 |
|---|---|
| 3/3 | 直接通过,进入 0.2 |
| 2/3 或 monorepo 命中 | 使用 AskUserQuestion 向用户确认前端代码位置,确认后通过 |
| 0-1/3 且无 monorepo 信号 | 使用 AskUserQuestion 中止并引导 |
中止引导模板:
当前仓库的前端工作区信号不足:
- [逐项列出 A/B/C 的命中/缺失及原因]
请确认:
- 这是一个 monorepo,前端代码在子目录中?(请提供路径)
- 前端组件在非常规目录下?(如 features/、modules/,请提供路径)
- 这不是前端仓库?(建议直接进入 /testany-eng:api-writer)门禁未通过不得进入后续阶段。
0.2 识别技术栈和工程规范
读取关键配置文件,提取:框架及版本、路由方案、样式方案、组件库(内部/第三方)、状态管理、TypeScript 配置。
0.3 识别可用组件和设计系统
只做结构级发现,不做深度 Props 盘点。目标:知道仓库有什么类型的组件可用,具体 Props 留到 Phase 1.4 按需查阅。
扫描组件目录(如 src/components/, src/ui/),建立组件目录索引:
| 收集项 | 说明 |
|---|---|
| 组件名称 | 从文件名/目录名提取 |
| 组件类别 | 粗分类:布局/表单/数据展示/反馈/导航 |
| 路径 | 文件路径,供后续按需读取 |
不要在此阶段读取组件源码或类型定义——在 Phase 1.4 组件匹配时,只读取实际用到的组件的 Props。
如果仓库有 Storybook(.storybook/ 存在),记录路径,后续可作为组件用法参考。
0.3.1 提取页面构成模式
组件复用解决了"用什么零件",但没有解决"怎么搭页面"。从仓库中选取 2-3 个已有页面(优先选择与原型功能类似的页面类型),快速读取其顶层 JSX 结构,提取页面布局骨架、列表/详情/表单页模式、操作反馈方式(toast/alert/inline)、空态呈现方式等设计约定。
详细提取方法和输出格式见 references/page-patterns-guide.md。提取结果记录在仓库探查报告的「页面构成模式」章节中。Phase 2 生成页面时以此为参照。
如果仓库只有 1-2 个页面(新项目),记录「样本不足」,不强行归纳。
0.4 用户确认仓库基线信息
使用 AskUserQuestion 确认识别结果、原型放置目录、是否有 Storybook 或设计规范文档、原型是否对接已有路由系统。
0.5 输出「仓库探查报告」(强制)
按 references/repo-survey-report.md 模板输出。模板定义了固定章节和表格结构,必须逐项填写。
---
Phase 1:原型规划
目标:将 PRD 和 User Journey 转化为页面清单、状态矩阵和组件匹配方案。
1.1 读取 PRD 和 User Journey
必须读取:PRD(提取 REQ-*、业务实体、验收标准)和 User Journey(Journey Graph、步骤节点、跳转关系、异常处理)。若无 User Journey,提示用户先执行 /testany-eng:uc-interviewer。
1.2 Journey → 页面映射
将 Journey 步骤节点映射为页面/视图。映射原则:
- 一个步骤通常对应一个页面或一个页面内的状态切换
- 多 Journey 共享步骤只生成一个页面
- 跨 Journey 跳转映射为页面间导航
1.3 页面状态矩阵设计
为每个页面定义需覆盖的状态(正常态/加载态/空态/错误态/边界态)。错误态从 Journey 的异常处理提取;边界态必须从 Journey 的步骤级 edge case matrix 提取,并保留 Step ID / Edge Case ID / 用户可见结果 / 恢复方式 的映射;加载态和空态是通用补充。
1.4 组件匹配(按需深度读取)
基于页面清单(1.2)和 Phase 0 的组件目录索引,匹配每个页面需要的组件。
此时才按需读取组件 Props:只对匹配命中的组件读取类型定义或源码,确认接口是否满足页面需求。未命中的组件不读取。
按 references/quality-checklist.md「组件使用纪律 → 三级规则」匹配组件:优先复用 → 不重写平替 → 缺口用 [PROTOTYPE] 新建并在 Manifest 记录。禁止引入仓库外的组件库。
1.5 原型预算与范围确认
默认裁剪规则(原型预算):
- 默认范围:所有 P0 Journey 的 Happy Path + 每页的正常态/加载态/错误态
- P1 Journey:默认只生成占位页面(标题 + "待实现" 提示),不做完整交互
- P2 Journey:默认不做,在 Manifest 中标注"不在本轮原型范围"
- 页面数 > 8 时:强制触发 AskUserQuestion,要求用户缩减范围或分批实现
使用 AskUserQuestion 展示页面清单(含预算裁剪结果)、组件缺口、排除项,确认后继续。
1.6 生成 Prototype Manifest
按 references/prototype-manifest.md 模板在沙箱目录内生成 _prototype-manifest.md。模板定义了固定的追溯表、导航关系表、组件清单和 Mock 数据清单结构。
---
Phase 2:原型实现
2.1 创建原型沙箱目录
隔离规则(强制):
所有原型代码必须放在一个独立的沙箱目录内。沙箱目录的位置在 Phase 0.4 与用户确认。典型结构:
src/prototype/ # 沙箱根目录——所有原型文件在此之下
├── README.md # 标注为原型、运行方式、入口路由
├── _prototype-manifest.md # Prototype Manifest
├── mock/ # Mock 数据
├── components/ # 原型专用组件(标注 [PROTOTYPE])
├── pages/ 或 routes/ # 原型页面(按仓库约定)
└── ...禁止清单:
- 禁止在沙箱目录之外创建或修改任何文件(唯一例外见下方"路由隔离"段落)
- 禁止修改仓库已有的路由配置文件中的现有路由
- 禁止修改仓库已有的组件源码
- 禁止修改
package.json(不得新增依赖)
路由隔离:原型页面必须使用独立入口,不注入生产路由表。按框架选择隔离方式:
- Next.js App Router:利用
app/prototype/目录的文件路由天然隔离 - Next.js Pages Router:利用
pages/prototype/目录 - Vue Router / React Router:在沙箱内创建独立的路由配置,通过独立入口文件挂载(如
prototype/main.tsx),不修改生产路由文件 - 其他框架:使用 AskUserQuestion 与用户确认隔离方式
唯一例外:如果框架不支持目录级路由隔离(如 SPA 只有单一入口),允许在生产路由文件中新增一条 prototype-only 路由入口(如 { path: '/prototype/*', lazy: () => import('./prototype/routes') })。此操作必须同时满足:(1) Phase 0.4 中用户明确批准,(2) 变更仅为新增一行,不修改已有路由,(3) 在交付摘要中记录此变更。除此之外,沙箱外零变更。
2.2 逐页面实现
每个页面:参照 Phase 0.3.1 提取的页面构成模式确定布局和反馈方式 → 组件组合(import 仓库组件)→ Mock 数据(对齐 PRD 业务实体)→ 状态实现(覆盖状态矩阵)→ 交互逻辑(按 Journey 步骤)。
代码规范:遵循仓库 lint/format 规则、import 约定、TypeScript 要求、样式方案。
质量标准:逐页面遵循 references/quality-checklist.md 中的可访问性基线、Mock 数据质量要求。Mock 数据集中放在沙箱目录的 mock/ 下。
2.3 页面间导航对接
按 Manifest 导航关系表实现所有跳转,使用仓库的路由方案。跨 Journey 跳转和返回/回退路径必须正确。所有导航目标必须在原型路由前缀内(如 /prototype/*)。
2.4 状态覆盖验证(可切换演示)
逐页面对照状态矩阵验证,发现遗漏则补充。
状态必须可切换演示,而非仅声明变量。每个页面至少提供以下一种切换机制(按优先级选择):
| 机制 | 适用场景 | 示例 |
|---|---|---|
| URL query 参数 | 适合大多数页面 | ?state=loading、?state=empty、?state=error |
| 页面内切换控件 | 状态较多时 | 顶部 [Normal] [Loading] [Empty] [Error] 按钮组 |
| Mock 数据切换 | 数据驱动的状态 | import 不同数据集(mockTasks vs emptyTasks) |
底线要求:走查原型时,reviewer 或团队成员必须能够不改代码就看到每个声明的状态。如果一个状态只能通过修改源码中的 useState(false) 才能触发,这个状态等于没覆盖。
---
Phase 3:自检与交付
3.1 可运行检查
按以下规则识别并执行验证命令(信息应在 Phase 0.5 仓库探查报告中已记录):
Step 1: 确认包管理器
| Lock 文件 | 包管理器 |
|---|---|
pnpm-lock.yaml | pnpm |
yarn.lock | yarn |
bun.lockb / bun.lock | bun |
package-lock.json 或无 lock | npm |
Step 2: Monorepo 定位(仅 monorepo 需要)
如果存在 workspace 配置(pnpm-workspace.yaml、turbo.json),先定位原型所在的 app 包:
- 读取沙箱目录所在包的
package.json,获取包名 - 使用包管理器的 filter/workspace 语法定位:如
pnpm --filter <pkg-name> dev
Step 3: 执行验证命令(按顺序)
| 顺序 | 命令 | 来源 | 失败处理 |
|---|---|---|---|
| 1 | 类型检查 | 见下方类型检查规则 | 修复类型错误后重试 |
| 2 | Lint 检查 | package.json scripts 中的 lint | 修复 lint 错误后重试 |
| 3 | 开发启动 | package.json scripts 中的 dev/start/serve | 修复编译错误后重试 |
类型检查命令选择(按优先级): 1. package.json scripts 中存在 typecheck / type-check / tsc → 使用它(monorepo 时加 filter) 2. 无 script 但有 tsconfig.json → 使用对应包管理器的 exec 形式:pnpm exec tsc --noEmit / yarn exec tsc --noEmit / bunx tsc --noEmit / npx tsc --noEmit(npm) 3. 以上都不确定 → AskUserQuestion 询问用户的类型检查命令,不要猜
启动成功后确认原型入口路由可访问。
3.2 Journey 覆盖检查
- [ ] 每个 P0 Journey 的 Happy Path 全部可走通
- [ ] 跨 Journey 跳转正常工作
- [ ] P1 Journey 至少有占位页面
- [ ] 所有 Journey 步骤在 Manifest 中有对应页面
3.3 状态覆盖检查
- [ ] 每个页面的正常态、加载态已实现
- [ ] 有数据依赖的页面覆盖了空态
- [ ] 有用户操作的页面覆盖了错误态
- [ ] Journey 步骤级 edge case matrix 已覆盖
- [ ] 每个状态可通过 URL 参数或页面控件切换演示——不需要改代码就能看到(见 Phase 2.4)
3.4 质量检查(5 个维度)
按 references/quality-checklist.md 中的自检清单逐项验证以下 5 个维度:
1. 可访问性 — 键盘聚焦、label 关联、aria 属性、语义化元素 2. Mock 数据质量 — 字段对齐 PRD、正常/空/边界三组数据集、TypeScript 类型 3. 组件使用纪律 — 不重写已有组件、[PROTOTYPE] 组件有 Manifest 记录 4. UI 一致性 — 页面布局/反馈方式/空态呈现与仓库已有页面对齐(依赖 Phase 0.3.1) 5. UX 走查 — 冗余操作、反馈不一致、信息过载、空态死胡同、确认滥用、导航迷路
UI 一致性在 Phase 0.3.1「样本不足」时跳过。UX 走查发现的问题是建议性质,记录在交付摘要中但不阻塞交付。
3.5 隔离与工程规范检查
- [ ] 隔离检查:所有新增/修改文件都在沙箱目录内(唯一允许的例外:经用户批准新增的 prototype-only 路由入口行,如有则记录)
- [ ] 路由隔离:原型路由全部在专属前缀下,未修改已有生产路由
- [ ] 代码通过仓库 lint 检查
- [ ] 未引入仓库以外的依赖
- [ ] 目录结构和文件命名符合仓库约定
3.6 输出交付摘要
按 references/delivery-summary.md 模板输出。模板定义了覆盖统计、隔离验证、问题清单和下游输入的固定结构。
---
禁止行为
隔离相关:
- 禁止在沙箱目录之外创建或修改任何文件(唯一例外:框架不支持目录级隔离时,经用户批准可新增一条 prototype-only 路由入口,见 Phase 2.1)
- 禁止修改仓库已有的路由、页面、组件源码
- 禁止修改
package.json
依赖相关:
- 禁止引入仓库
package.json中没有的 npm 包 - 禁止使用与仓库不同的样式方案
内容相关:
- 禁止实现 PRD/Journey 中未定义的功能
- 禁止对接真实后端 API
证据相关:
- 禁止假设组件 Props 接口——必须读取类型定义或源码确认
- 禁止跳过 Phase 0 的仓库探查和前端工作区门禁
- 禁止猜测仓库目录结构或组件能力
使用示例
示例 1:
PRD 和 User Journey 已完成,帮我在前端仓库里做个交互原型,验证下单流程。
示例 2:
/prototype-designer docs/PRD-checkout.md docs/User-Journeys-checkout.md
示例 3:
基于这个 PRD 和用户旅程,在我们的 Next.js 项目里生成原型页面。
interface:
display_name: "Prototype Designer"
short_description: "Generate interactive UI prototypes from PRD and User Journey"
icon_small: "./assets/testany-logo-small.png"
icon_large: "./assets/testany-logo.svg"
default_prompt: "Use $prototype-designer to create an interactive prototype in this frontend repo."
Delivery Summary Template
Upon completion of Phase 3.6, a delivery summary must be output according to this template.
---
Prototype Delivery Summary
Basic Information
| Project | Content |
|---|---|
| PRD | [path] |
| User Journey | [path] |
| sandbox directory | [path] |
| Routing prefix | [/prototype/] |
| Startup command | [Specific commands, including package manager and workspace location] |
| Entry route | [/prototype/ or /prototype/index] |
Coverage Statistics
| Indicators | Values |
|---|---|
| P0 Journey Coverage | X / Y (Z%) |
| P1 Journey Coverage | X / Y (Z%) (placement pages count) |
| Total number of pages | N |
| State coverage rate | Covered M / Total number of state matrices T (Z%) |
Page status override verification
| Page | Normal state | Loading state | Empty state | Error state | Boundary state |
|---|---|---|---|---|---|
| [Page 1] | ✅ | ✅ | ✅ | ✅ | N/A |
| [Page 2] | ✅ | ✅ | N/A | ✅ | ✅ |
| ... | ... | ... | ... | ... | ... |
Component usage statistics
| Category | Quantity |
|---|---|
| Reuse warehouse components | M |
| Prototype new component [PROTOTYPE] | K pieces |
Isolated Verification
| Check items | Results |
|---|---|
| All new files are in the sandbox | ✅/❌ |
| Zero file changes outside the sandbox | ✅/❌ |
| Description of exception changes outside the sandbox | None / Approved: <file path>:<line number> — [Change content, such as "Add prototype-only routing entry"] |
| Prototype routing under exclusive prefix | ✅/❌ |
| Unmodified package.json | ✅/❌ |
| lint check passed | ✅/❌ |
| Type check passed (if applicable) | ✅/❌ |
Quality check results
Record the self-inspection results and evidence according to the 5 dimensions of references/quality-checklist.md.
| Dimensions | Results | Summary of Evidence |
|---|---|---|
| Accessibility | ✅/⚠️/❌ | [For example: all buttons are native <button>; form labels are fully associated; 2 icon buttons have been added with aria-label] |
| Mock data quality | ✅/⚠️/❌ | [For example: 3 entities all have normal/empty/boundary data sets; the createdAt field is the PRD undefined requirement discovered by the UI and has been marked in the Manifest] |
| Component discipline | ✅/⚠️/❌ | [For example: reuse 6 warehouse components; create a new [PROTOTYPE] TaskCard, which has been recorded in the Manifest component gap] |
| UI consistency | ✅/⚠️/N/A | [For example: the list page layout is aligned with the warehouse /dashboard page mode (header+filter+table); unified toast is used for feedback] / [Insufficient samples, skip] |
| UX Walkthrough | ✅/⚠️ | [For example: automatic jump after successful creation (no redundant operations); empty state with CTA; details page with return button. Found 1 suggestion see question sheet below] |
⚠️ Indicates that the dimension is discovered but does not block delivery. Specific issues are recorded in the "Issues Found and Suggestions" table below.
Issues found and suggestions
| # | Issues | Discover Sources | Impact | Recommendations for Downstream |
|---|---|---|---|---|
| 1 | [Problem Description] | [Source: Journey/Page/Status or QA-Dimension Name] | [Impact on User Experience/Data/Architecture] | [Implications for API Contract/HLD] |
| 2 | ... | ... | ... | ... |
Input to downstream
For API Contract:
- [Data requirements exposed by the prototype - which pages require what data and what structure]
- [Paging/filtering/sorting and other list requirements]
- [Real-time requirements (if WebSocket is required)]
To HLD:
- [State management complexity (sharing state across pages?)]
- [Caching requirements (what data needs to be cached?)]
- [Performance sensitive points (large data pages, high-frequency interactions)]
Recommend next step
1. The team inspects the prototype and collects interactive feedback 2. Iterate the prototype based on feedback (re-execute /testany-eng:prototype-designer) 3. After the prototype is confirmed, execute /testany-eng:api-writer to define the interface contract 4. Execute /testany-eng:hld-writer to start technical design
交付摘要模板
Phase 3.6 完成后,必须按此模板输出交付摘要。
---
原型交付摘要
基本信息
| 项目 | 内容 |
|---|---|
| PRD | [路径] |
| User Journey | [路径] |
| 沙箱目录 | [路径] |
| 路由前缀 | [/prototype/] |
| 启动命令 | [具体命令,含包管理器和工作区定位] |
| 入口路由 | [/prototype/ 或 /prototype/index] |
覆盖统计
| 指标 | 值 |
|---|---|
| P0 Journey 覆盖 | X / Y (Z%) |
| P1 Journey 覆盖 | X / Y (Z%)(占位页面计入) |
| 页面总数 | N 个 |
| 状态覆盖率 | 已覆盖 M / 状态矩阵总数 T (Z%) |
页面状态覆盖验证
| 页面 | 正常态 | 加载态 | 空态 | 错误态 | 边界态 |
|---|---|---|---|---|---|
| [页面1] | ✅ | ✅ | ✅ | ✅ | N/A |
| [页面2] | ✅ | ✅ | N/A | ✅ | ✅ |
| ... | ... | ... | ... | ... | ... |
组件使用统计
| 类别 | 数量 |
|---|---|
| 复用仓库组件 | M 个 |
| 原型新建组件 [PROTOTYPE] | K 个 |
隔离验证
| 检查项 | 结果 |
|---|---|
| 所有新增文件在沙箱内 | ✅/❌ |
| 沙箱外零文件变更 | ✅/❌ |
| 沙箱外例外变更说明 | 无 / 已批准:<文件路径>:<行号> — [变更内容,如"新增 prototype-only 路由入口"] |
| 原型路由在专属前缀下 | ✅/❌ |
| 未修改 package.json | ✅/❌ |
| lint 检查通过 | ✅/❌ |
| 类型检查通过(如适用) | ✅/❌ |
质量检查结果
按 references/quality-checklist.md 的 5 个维度,记录自检结果和证据。
| 维度 | 结果 | 证据摘要 |
|---|---|---|
| 可访问性 | ✅/⚠️/❌ | [如:所有按钮原生 <button>;表单 label 全关联;2 个图标按钮已加 aria-label] |
| Mock 数据质量 | ✅/⚠️/❌ | [如:3 个实体全有正常/空/边界数据集;createdAt 字段为 UI 发现的 PRD 未定义需求,已在 Manifest 标注] |
| 组件纪律 | ✅/⚠️/❌ | [如:复用 6 个仓库组件;新建 1 个 [PROTOTYPE] TaskCard,已记录在 Manifest 组件缺口] |
| UI 一致性 | ✅/⚠️/N/A | [如:列表页布局对齐仓库 /dashboard 页模式(header+filter+table);反馈统一用 toast] / [样本不足,跳过] |
| UX 走查 | ✅/⚠️ | [如:创建成功自动跳转(无冗余操作);空态有 CTA;详情页有返回按钮。发现 1 项建议见下方问题表] |
⚠️ 表示该维度有发现但不阻塞交付。具体问题记录在下方「发现的问题和建议」表中。
发现的问题和建议
| # | 问题 | 发现来源 | 影响 | 对下游的建议 |
|---|---|---|---|---|
| 1 | [问题描述] | [来源:Journey/页面/状态 或 质量检查-维度名称] | [对用户体验/数据/架构的影响] | [对 API Contract / HLD 的启示] |
| 2 | ... | ... | ... | ... |
对下游的输入
对 API Contract:
- [原型暴露的数据需求——哪些页面需要什么数据、什么结构]
- [分页/筛选/排序等列表类需求]
- [实时性需求(如需 WebSocket)]
对 HLD:
- [状态管理复杂度(跨页面共享状态?)]
- [缓存需求(哪些数据需要缓存?)]
- [性能敏感点(大数据量页面、高频交互)]
推荐下一步
1. 团队走查原型,收集交互反馈 2. 基于反馈迭代原型(重新执行 /testany-eng:prototype-designer) 3. 原型确认后,执行 /testany-eng:api-writer 定义接口契约 4. 执行 /testany-eng:hld-writer 开始技术设计
页面构成模式提取指南
Phase 0.3.1 中使用。目标:从仓库已有页面中提取设计模式,确保原型页面在构成和交互风格上与仓库已有页面保持一致。
---
为什么需要提取页面构成模式
组件复用解决了"用什么零件"的问题,但没有解决"怎么搭页面"的问题。同一套 Button/Card/Input 组件,可以搭出完全不同风格的页面。如果仓库的列表页都是 header + filter bar + 数据表格,但原型用了 header + 卡片网格,虽然组件都对,页面看起来就是不像一个产品。
提取方法
从仓库中选取 2-3 个已有页面(优先选择与原型功能类似的页面类型),快速读取其 JSX 结构(不需要逐行读,只看顶层组件组合和布局)。
需提取的模式(逐项记录)
| 模式类别 | 提取内容 | 示例 |
|---|---|---|
| 页面布局骨架 | 页面的顶层结构——是否有固定 header/sidebar/footer?主内容区是全宽还是居中容器? | <Header /> + <main className="max-w-4xl mx-auto"> |
| 列表页模式 | 列表页是否有统一的 filter/search bar 位置?数据用表格还是卡片?分页在顶部还是底部? | filter 在 header 下方、数据用 <Table>、底部分页 |
| 详情页模式 | 详情页的信息组织方式——是否分栏?是否用 tabs?操作按钮在什么位置? | 左侧主内容 + 右侧 sidebar、操作按钮在页面顶部右侧 |
| 表单页模式 | 表单的布局方式——单列还是两列?必填/可选如何区分?提交按钮位置? | 单列表单、必填字段有 * 标记、提交按钮在底部右对齐 |
| 操作反馈模式 | 成功/失败/加载的反馈方式——toast、inline alert、全页状态、还是 modal? | 成功用顶部 toast(3s 自动消失)、错误用 inline alert |
| 空态模式 | 空态页面的呈现方式——是否有引导操作?图标/插图?位置? | 居中插图 + 文字描述 + CTA 按钮 |
输出格式
提取结果记录在「仓库探查报告」的新增章节「页面构成模式」中:
### 页面构成模式
**参考页面**:[列出扫描的 2-3 个页面路径]
| 模式 | 仓库约定 | 来源证据 |
|------|---------|---------|
| 页面布局 | [描述] | [文件:行号] |
| 列表页 | [描述] | [文件:行号] |
| 操作反馈 | [描述] | [文件:行号] |
| 空态 | [描述] | [文件:行号] |注意事项
- 如果仓库只有 1-2 个页面(新项目),记录「样本不足,无法提取稳定模式」,不要从单个页面强行归纳
- 如果不同页面模式不一致(技术债),记录差异,使用 AskUserQuestion 询问用户以哪个页面为准
- 不要过度提取:只提取对原型有用的模式(列表/详情/表单/反馈),不需要记录每个 CSS class 的用法
Prototype Manifest template
After Phase 1.6 is completed, _prototype-manifest.md must be generated in the sandbox directory according to this template.
---
Prototype Manifest
Basic Information
| Project | Content |
|---|---|
| PRD source | [PRD file path] |
| User Journey source | [Journey file path] |
| Front-end warehouse | [Warehouse root path] |
| sandbox directory | [sandbox directory path] |
| Routing prefix | [/prototype/] |
| Creation time | YYYY-MM-DD |
Prototype Budget
| Item | Quantity |
|---|---|
| P0 Journey | |
| P1 Journey | Y (placeholder) |
| Total number of pages | N |
| Prototype budget trigger | [Not triggered / Triggered - user confirms the reduction scope] |
Page ↔ Journey ↔ PRD Traceability Table
| # | Pages | Routes | Journey | Journey Steps | PRD Requirements | Status Overrides |
|---|---|---|---|---|---|---|
| 1 | [Page Name] | /prototype/[Path] | [Journey Name] | [S1/S2/...] | [REQ-*] | Normal/Loading/Empty/Error/Boundary |
| 2 | ... | ... | ... | ... | ... | ... |
Navigation relationship table
| Source page | Target page | Trigger conditions | Journey jump |
|---|---|---|---|
| [Page A] | [Page B] | [User Action] | [Journey X S1→S2] |
| [Page B] | [Page C] | [Conditional judgment] | [Journey X→Y across Journey] |
| ... | ... | ... | ... |
Component usage list
| Components | Source | Usage Page |
|---|---|---|
| [Button] | The warehouse already exists (src/components/ui/Button) | Page A, Page B |
| [Form] | The warehouse already exists (src/components/Form) | Page C |
| [PROTOTYPE] AddressPicker | Sandbox New | Page C |
| ... | ... | ... |
Mock data list
| Data file | Corresponding PRD entity | Usage page | Contains status | PRD undefined fields |
|---|---|---|---|---|
| mock/products.ts | Products | Product list, product details | Normal (10 items), empty (0 items), border (100 items) | createdAt (required for list sorting) |
| mock/order.ts | Order | Settlement page | Normal, error (abnormal amount) | — |
| ... | ... | ... | ... | ... |
"PRD undefined fields" column: records the data fields found to be needed during UI interaction but not clearly defined by PRD. These fields are the prototype's input to the downstream API Contract - helping the API Writer complete the data model. Fill in — to indicate no additional fields.Prototype Manifest 模板
Phase 1.6 完成后,必须按此模板在沙箱目录内生成 _prototype-manifest.md。
---
Prototype Manifest
基本信息
| 项目 | 内容 |
|---|---|
| PRD 来源 | [PRD 文件路径] |
| User Journey 来源 | [Journey 文件路径] |
| 前端仓库 | [仓库根路径] |
| 沙箱目录 | [沙箱目录路径] |
| 路由前缀 | [/prototype/] |
| 创建时间 | YYYY-MM-DD |
原型预算
| 项目 | 数量 |
|---|---|
| P0 Journey | X 个 |
| P1 Journey | Y 个(占位) |
| 页面总数 | N 个 |
| 原型预算触发 | [未触发 / 已触发——用户确认缩减范围] |
页面 ↔ Journey ↔ PRD 追溯表
| # | 页面 | 路由 | Journey | Journey 步骤 | PRD 需求 | 状态覆盖 |
|---|---|---|---|---|---|---|
| 1 | [页面名] | /prototype/[路径] | [Journey 名] | [S1/S2/...] | [REQ-*] | 正常/加载/空/错误/边界 |
| 2 | ... | ... | ... | ... | ... | ... |
导航关系表
| 来源页面 | 目标页面 | 触发条件 | Journey 跳转 |
|---|---|---|---|
| [页面A] | [页面B] | [用户操作] | [Journey X S1→S2] |
| [页面B] | [页面C] | [条件判断] | [Journey X→Y 跨 Journey] |
| ... | ... | ... | ... |
组件使用清单
| 组件 | 来源 | 使用页面 |
|---|---|---|
| [Button] | 仓库已有 (src/components/ui/Button) | 页面A, 页面B |
| [Form] | 仓库已有 (src/components/Form) | 页面C |
| [PROTOTYPE] AddressPicker | 沙箱新建 | 页面C |
| ... | ... | ... |
Mock 数据清单
| 数据文件 | 对应 PRD 实体 | 使用页面 | 包含状态 | PRD 未定义的字段 |
|---|---|---|---|---|
| mock/products.ts | 商品 | 商品列表, 商品详情 | 正常(10条), 空(0条), 边界(100条) | createdAt(列表排序需要) |
| mock/order.ts | 订单 | 结算页 | 正常, 错误(金额异常) | — |
| ... | ... | ... | ... | ... |
「PRD 未定义的字段」列:记录 UI 交互过程中发现需要但 PRD 未明确定义的数据字段。这些字段是原型对下游 API Contract 的输入——帮助 API Writer 补全数据模型。填 — 表示无额外字段。原型质量标准
本文档定义 prototype-designer 的 5 个质量维度。Phase 2 实现时遵循,Phase 3 自检时逐项验证。
---
目录
1. 可访问性基线 2. Mock 数据质量 3. 组件使用纪律 4. UI 一致性 5. UX 走查
---
1. 可访问性基线
原型不需要 WCAG AA 合规,但交互元素必须满足以下基线。这是为了确保走查原型时,键盘用户和辅助技术不会完全无法使用。
实现要求(Phase 2)
| 要求 | 做法 |
|---|---|
| 键盘可聚焦 | 所有 <button> 和可点击元素使用原生 <button> 或 tabIndex={0} + onKeyDown |
| 表单 label | <input> 必须有关联的 <label>(通过 htmlFor 或包裹) |
| 图标按钮 | 无文字的按钮必须有 aria-label |
| 动态反馈 | 加载态/错误态等动态内容区域添加 role="status" 或 aria-live="polite" |
| 语义化元素 | 可点击列表项使用 <button> 或 <a>,不用裸 <div onClick> |
自检清单(Phase 3)
- [ ] 所有按钮和可点击元素可键盘聚焦
- [ ] 表单输入有关联的 label
- [ ] 图标按钮有
aria-label - [ ] 动态反馈区域有
role="status"或aria-live - [ ] 可点击列表项使用语义化元素
---
2. Mock 数据质量
Mock 数据不是随意填充,它是下游 API Contract 的输入来源。字段名和结构应以 PRD 中的业务实体定义为基础,同时原型有责任暴露 PRD 中未明确但 UI 实际需要的数据字段。
实现要求(Phase 2)
Mock 数据集中放在沙箱目录的 mock/ 下。每个数据实体必须满足:
| 要求 | 说明 |
|---|---|
| 以 PRD 为基础 | mock 数据的核心字段必须与 PRD 中业务实体定义一致。如果 UI 交互需要 PRD 未明确定义的字段(如列表页需要 createdAt 用于排序、详情页需要 updatedBy 用于审计),允许新增并在 Manifest Mock 数据清单中标注为「UI 发现的数据需求(PRD 未定义)」,作为下游 API Contract 的输入 |
| 正常数据集 | 3-5 条典型数据,覆盖常见的字段值组合 |
| 空数据集 | 空数组 [],用于空态渲染 |
| 边界数据集 | 至少一组:大数据量(50+ 条)、极长文本字段、或特殊字符。具体选择哪种边界取决于页面特性 |
| TypeScript 类型 | 必须导出 interface/type 定义,供页面代码引用 |
自检清单(Phase 3)
- [ ] mock 数据核心字段与 PRD 业务实体一致
- [ ] UI 发现的额外数据需求在 Manifest Mock 数据清单中标注为「PRD 未定义」
- [ ] 每个数据实体有正常/空/边界三组数据集
- [ ] mock 数据导出了 TypeScript 类型定义
---
3. 组件使用纪律
组件复用解决"用什么零件",纪律确保不会重复造轮子或引入不该有的依赖。
三级规则(Phase 1.4 组件匹配时遵循)
| 优先级 | 场景 | 处理 |
|---|---|---|
| 1 | 仓库已有完全匹配的组件 | 直接 import 使用,禁止在沙箱内重写平替 |
| 2 | 仓库有近似组件(Props 接口不完全匹配) | 组合/包装使用,必要时在沙箱内创建包装组件并标注 [PROTOTYPE] |
| 3 | 仓库完全没有对应组件 | 在沙箱内新建最小化组件,标注 [PROTOTYPE],并在 Manifest 组件清单中记录为「组件缺口」 |
禁止引入仓库外的组件库。所有 [PROTOTYPE] 组件必须使用仓库已有的样式方案。
自检清单(Phase 3)
- [ ] 仓库已有的通用组件没有在沙箱内被重写
- [ ] 所有
[PROTOTYPE]组件在 Manifest 组件清单中有记录 - [ ]
[PROTOTYPE]组件使用仓库已有的样式方案
---
4. UI 一致性
组件复用保证了零件一致,但页面构成(布局、反馈方式、空态呈现)也需要与仓库已有页面对齐。依赖 Phase 0.3.1 提取的页面构成模式。
自检清单(Phase 3)
- [ ] 原型页面的布局骨架与仓库已有页面一致(参照 Phase 0.3.1 提取的模式)
- [ ] 列表页/详情页/表单页的构成方式与仓库约定对齐
- [ ] 操作反馈方式(成功/失败/加载)与仓库已有模式一致(如统一用 toast 或统一用 inline alert)
- [ ] 空态呈现方式与仓库一致
如果 Phase 0.3.1 记录了「样本不足」,此项跳过。
---
5. UX 走查
检查一组可验证的 UX 反模式,确保原型的交互体验合理。这不是主观的"设计好不好"评审,每一条都可以通过走查原型直接判断。
发现的问题记录在交付摘要的「发现的问题和建议」表中,标注来源为「UX 走查」。UX 走查发现的问题是建议性质,不阻塞交付。
5.1 冗余操作
检查 critical path(P0 Journey Happy Path)上是否有可省略的手动操作步骤。
| 反模式 | 正确做法 | 判断方法 |
|---|---|---|
| 创建成功后需要手动点"返回列表" | 成功后自动跳转回列表 | 走 Journey 完整路径,观察是否有多余点击 |
| 编辑保存后需要手动刷新才能看到新数据 | 保存后自动更新页面数据 | 编辑后观察页面是否自动反映变更 |
| 非破坏性操作(如创建)弹确认框 | 只有删除/归档等破坏性操作才需确认 | 检查创建/编辑操作是否有不必要的确认步骤 |
5.2 反馈不一致
检查同类操作的成功/失败反馈方式是否统一,且与仓库已有模式对齐。
| 反模式 | 正确做法 | 判断方法 |
|---|---|---|
| 页面 A 创建成功用 toast,页面 B 用全页 alert | 同类操作统一反馈方式 | 对比所有"创建"操作的成功反馈 |
| 错误用全页报错(整个内容区被替换) | 错误用 inline 提示,不中断整体页面 | 触发错误态,观察是否能看到页面其他内容 |
| 提交按钮在加载中不禁用,可重复点击 | 加载中按钮禁用或显示 loading 状态 | 点击提交后观察按钮状态 |
5.3 信息过载
检查 critical path 上是否有不必要的噪音。
| 反模式 | 正确做法 | 判断方法 |
|---|---|---|
| 表单所有字段平等展示,没有视觉层级 | 必填在前加 *,可选在后或折叠 | 看表单字段排列和视觉权重 |
| 列表每行展示 10+ 列信息 | 主要信息在前,次要信息折叠或移到详情页 | 数一下列表每行展示多少字段 |
| 页面堆满按钮,没有主次 | 主操作 primary,次要操作 secondary/ghost | 观察按钮的视觉层级 |
5.4 空态死胡同
检查空态是否提供了明确的下一步引导。
| 反模式 | 正确做法 | 判断方法 |
|---|---|---|
| 空态只显示"暂无数据" | 有引导文案 + CTA 按钮 | 切换到空态,观察有无操作引导 |
| 空态 CTA 按钮指向错误页面 | CTA 导航正确 | 点击空态中的 CTA |
| 筛选无结果时没有提示 | 显示"未找到"或建议清除筛选 | 使用不匹配的筛选条件 |
5.5 确认滥用
| 操作类型 | 是否需要确认 |
|---|---|
| 创建新记录 | ❌ 不需要(可逆) |
| 编辑/更新 | ❌ 通常不需要 |
| 删除/归档 | ✅ 需要确认 |
| 取消编辑(有未保存变更) | ✅ 需要确认 |
5.6 导航迷路
| 反模式 | 正确做法 | 判断方法 |
|---|---|---|
| 详情页没有返回按钮 | 有明确的返回/面包屑 | 进入非首页后观察返回路径 |
| 返回按钮不回到来源页面 | 返回到上一个有意义的列表页 | 点击返回验证目标 |
| 操作成功后用户不知道下一步 | 有跳转或提示下一步 | 完成操作后观察引导 |
---
发现问题时的记录格式
在交付摘要「发现的问题和建议」表中记录:
| # | 问题 | 发现来源 | 影响 | 对下游的建议 |
|---|---|---|---|---|
| N | [具体描述] | 质量检查 - [维度名称,如"UX 走查 - 冗余操作"] | [影响] | [建议] |
注意事项
- 与仓库模式对齐优先:如果仓库已有页面本身有 UX 问题(如所有页面都用全页 alert),原型应保持与仓库一致,在交付摘要中记录差异即可
- 不做主观审美评判:不评价配色、间距。只检查可验证的反模式
- UX 走查是建议,不是 blocker:原型的核心价值是验证交互流程,UX 问题记录但不阻塞交付
仓库探查报告模板
Phase 0.5 完成后,必须按此模板输出报告。
---
仓库探查报告
前端工作区门禁
| 信号 | 命中 | 证据 |
|---|---|---|
| UI 框架依赖 | ✅/❌ | [package.json 中的框架及版本] |
| 页面/路由目录 | ✅/❌ | [命中的路径] |
| 组件目录 | ✅/❌ | [命中的路径] |
门禁结论:[通过 / 用户确认后通过 / 未通过——已引导用户]
技术栈
| 项目 | 值 | 来源 |
|---|---|---|
| 框架 | [框架 + 版本] | [package.json 路径] |
| 路由方案 | [文件路由 / 配置路由 / 约定] | [配置文件/目录路径] |
| 样式方案 | [Tailwind / CSS Modules / Styled Components / ...] | [配置文件路径] |
| 状态管理 | [Redux / Zustand / Pinia / Context / ...] | [来源路径] |
| TypeScript | [是/否 + strict 级别] | [tsconfig.json 路径] |
| 包管理器 | [npm / pnpm / yarn / bun] | [lock 文件路径] |
组件目录索引
| 组件名 | 类别 | 路径 |
|---|---|---|
| Button | 基础 | src/components/ui/Button.tsx |
| Table | 数据展示 | src/components/Table/index.tsx |
| Form | 表单 | src/components/Form/Form.tsx |
| Empty | 状态 | src/components/Empty.tsx |
| Loading / Skeleton | 状态 | src/components/Loading.tsx |
| ... | ... | ... |
此阶段只列目录索引,不含 Props 详情。Props 在 Phase 1.4 按需读取。
设计规范
- 布局模式:[sidebar + main / top-nav + content / ...]
- 通用状态组件:[空态: 路径, 加载态: 路径, 错误态: 路径]
- Storybook:[存在/不存在; 路径]
运行命令识别
| 项目 | 命令 | 来源 |
|---|---|---|
| 包管理器 | [pnpm / npm / yarn / bun] | [lock 文件] |
| 开发启动 | [pnpm dev / npm run dev / ...] | [package.json scripts] |
| Lint 检查 | [pnpm lint / npm run lint / ...] | [package.json scripts] |
| 类型检查 | [pnpm typecheck / pnpm exec tsc --noEmit / npx tsc --noEmit / 需确认] | [package.json scripts;或 tsconfig + 包管理器 exec(pnpm exec / yarn exec / bunx / npx);或待 AskUserQuestion] |
| 工作区定位 | [monorepo 时: 包名或 --filter 参数] | [workspace 配置] |
原型沙箱规划
- 沙箱路径:[用户确认的路径,如 src/prototype/ 或 app/prototype/]
- 路由隔离方式:[文件路由天然隔离 / 独立入口文件 / 用户协商方案]
- 路由前缀:[/prototype/]