PRD2HTML — PRD可视化引擎
核心原则
- 完整保留PRD结构:章节顺序、层级、子节与原文完全一致,不阉割
- 先理解再执行:通读PRD后再设计,不预设视觉方案
- 调性自适应:UI风格随项目调性动态匹配品牌色、字体、布局
- 一次成型:单次调用输出高完成度HTML
🔴 模型选择(开始任何任务前)
PRD 中图片处理的质量直接取决于模型是否具备视觉识别能力。
Phase 0 第一步:检测并提示用户。
- 读取 PRD 后,统计
page.images数量 + 架构图/流程图/示意图标注数量 - 总量 > 0 → 🔴 暂停执行。用以下文字回复用户,等待确认后再继续:
⚠️ 检测到 PRD 含 {N} 张嵌入图片 + {M} 处图表标注。
当前对话模型如不支持图片识别(image input):
✓ 仍可提取图片二进制数据(pdfplumber)
✗ 无法"看懂"图片内容——判断类型、验证边界、提取结构
✗ 架构图 SVG 复现将降级为"从文字描述推断"(准确度下降)
🟢 建议切换支持图片识别的模型以获得最佳效果
🟡 回复"继续"以当前模型执行
能力边界
| 拒绝场景 | 替代方案 |
|---|---|
| 纯API文档/技术规格书 | 自行探寻其它方案 |
| 超25屏PRD | 拆分子PRD |
| 无产品视角的需求列表 | 先结构化整理 |
| 对外官网/落地页 | frontend-design |
| 需CMS持续编辑 | 自行探寻其它方案 |
> Phase 0 先诊断;命中拒绝场景直接告知;边缘案例咨询用户。
工作流路由
Phase 0: 读取 + 提取(含强制门禁)
Step 1: 读取 PRD
# PDF: 用 pdfplumber 提取文本
python -c "
import pdfplumber
with pdfplumber.open('PRD_PATH') as pdf:
for p in pdf.pages:
t = p.extract_text()
if t: print(t)
"
Step 2: 📷 用户原图询问(🔴 暂停,等待用户回复)
🔴 停止执行。向用户发送以下文字:
📷 这份 PRD 中是否有需要原样呈现的图片?
(比如 UI 原型截图、产品渲染图、专属图表、照片等)
如果有,请:
1. 在 PRD 同目录下创建 images 文件夹
2. 按章节命名图片:{序号}_{章节名}.png
例如:04_产品架构图.png、07_UI原型-首页.jpg
3. 将图片放入后告诉我"已就绪"
如果没有,回复"跳过"。
处理规则:
- 用户放置的图片 → 直接 <img src="data:image/png;base64,..."> 嵌入,不做其它处理
- 用户跳过 → 进入 Step 3 自动视觉内容处理
- images/ 目录存在但为空 → 视为"跳过";未搜到目录请用户告知目录路径
- 所有用户图片必须按文件名排序嵌入到对应章节
Step 3: 🔴 视觉内容处理 — 强制门禁
按内容类型分策略:
| 内容类型 | 策略 | 说明 |
|---|---|---|
| 架构图/流程图/关系图/层级图 | SVG 精准复现 | 从 PRD 提取结构 → 生成 SVG 方框+连线+箭头 |
| UI 截图/照片/不可复现视觉 | 边界检测截图 → data:image | pdfplumber 精确裁剪 |
| 全文纯文字无图表 | 跳过 |
SVG 复现流程:
1. 从 PRD 原文提取章节标题和图表描述文字
2. 根据描述生成 SVG(<rect> + <line> + <text> + 箭头 marker)
3. 使用页面 CSS 变量(--color-primary 等)保持视觉一致
4. SVG 放置于对应 section 标题下方
5. 所有文字必须与 PRD 原文一致,不允许编造
门禁规则:
- 每个标有"图:/架构图/流程图/示意图"的 PRD 章节 → HTML 中必须有对应的 <svg> 或 <img>
- 遗漏任何一处 → Phase 0 不合格,重做
- 详见 references/image-extraction.md
Step 4: 提取章节大纲(必须输出)
Step 5: 识别 project_type
Phase 1: 调性发现
品牌检测(必须在 Q1 之前执行):
1. 扫描 PRD 全文,识别PRD内容所属品牌名称
2. WebSearch 搜索品牌官网/VI/设计指南,提取真实色号;brand-palettes.md 的静态表仅为搜索结果的缓存兜底
3. 提取品牌设计语言:Primary/Secondary 色号、深浅偏好、字体偏好、特殊视觉元素
4. 匹配成功 → 品牌色覆盖 style 预设的 primary/accent/gradient;设计语言覆盖对应 token
5. 纯内部项目/新品牌/通用方案 → 跳过品牌检测,正常走 Q1-Q3
交互式决策树(一次一题,可跳过由 agent 推断):
| 问题 | 内容 | 路由 |
|---|---|---|
| Q1 视觉定位 | A个人品牌 / B产品概念(推荐) / C专业文档 / D自定义 | 决定 Hero 骨架 |
| Q2 品牌色系 | A品牌色为主 / B品牌色+中性色(推荐) / C自定义 | 决定色彩策略 |
| Q3 风格参考 | 条件触发:无品牌+无风格偏好时 | A-H → 9套流行风格 |
| Q4 Hero策略 | A产品+Slogan / B数据冲击 / C混合(推荐) | 决定首屏骨架 |
| Q5 交互模块 | 从PRD提取选项,≥3个 | 决定交互嵌入位置 |
- 大类预设:
project_type→references/README.md10 套 category - 风格叠加:选 A-H → 额外加载
style-*.md - 跳过所有问题 → 大类预设自动匹配
Phase 2: 生成 HTML
子代理分派(🔴 强烈建议,节省上下文窗口)
使用 Agent 工具并行派发 3 个子任务(run_in_background: true),主代理收结果后拼合。
调用方式(每个分派 = 一次 Agent 工具调用):
Agent({ name: "css", run_in_background: true, prompt: "读取以下文件并生成完整设计系统CSS:..." })
Agent({ name: "svg", run_in_background: true, prompt: "读取以下文件并生成架构图SVG:..." })
Agent({ name: "interact", run_in_background: true, prompt: "读取以下模板并生成交互模块:..." })
每个 prompt 必须包含(🔴 缺一不可):
1. 要读取的 reference 文件相对路径(相对于本 Skill 根目录,如 references/category-*.md)
2. 主代理从 Phase 0/1 获取的参数(品牌色号、章节大纲、概念类型→模板映射)
3. 输出格式要求
3 个子任务:
| 子代理 | 读取文件 | 输出 |
|---|---|---|
| "css" | README.md + category-.md + style-.md + design-constants.md | :root CSS变量 + 组件CSS + 响应式 |
| "svg" | svg-animation.md + 章节大纲 | 所有架构图/流程图 SVG |
| "interact" | js-robustness.md + interactive-templates/{类型}.md | 交互模块 HTML+JS |
> ⚠️ 如果当前平台不支持 Agent 工具 → 降级为顺序执行,主代理自行完成。
分派判断:
| 模块 | 是否分派 | 原因 |
|---|---|---|
| CSS 设计系统 | ✅ 分派 | 需读取 category/style token 文件,独立输出 |
| 架构图/流程图 SVG | ✅ 分派 | 从 PRD 描述→SVG,完全独立,上下文重 |
| 交互模块 | ✅ 分派 | 7 种模板独立,按需选择分派 1~3 个 |
> 如果不支持子代理 → 降级为顺序执行,主代理自行完成所有模块。
加载路由表
| 步骤 | 加载文件 | 内容 |
|---|---|---|
| Phase 0 | references/image-extraction.md |
图片提取:SVG复现/边界检测/用户原图 |
| Phase 1 | references/brand-palettes.md |
品牌色检测:WebSearch + 静态表缓存 |
| Phase 1 | references/README.md |
Category/Style token 索引与映射 |
| 2.1 | references/design-constants.md |
间距/字号/对比度/断点 |
| 2.2 | references/layout-skeletons.md |
12 种版式骨架 + 匹配规则 |
| 2.3 | 输出规范(下方) | 固定导航/渐入动画/章节标签/表格/响应式 |
| 2.4 | references/svg-animation.md |
SVG 动画设计指南 |
| 2.5 | references/interactive-templates/ |
7 种概念类型 × 7 种交互模板 |
| 2.7 | references/js-robustness.md |
JS 健壮性约束 + 交互模板索引 |
| 2.8 | — | 导航覆盖:所有 section id 必须有导航链接,生成后用正则核对 |
输出规范
- 单文件 HTML,CSS/JS 全内联
- 浏览器直接打开,无需服务器
- 路径:PRD 同目录
设计决策树
| 决策 | 原因 |
|---|---|
| 前3屏 100vh 全屏 | Hero抓注意力→Problem共鸣→Solution信心,第一印象形成区 |
| 双模而非全交互 | 交互辅助理解,文档保留原文,互补不替代 |
| 交互原位展开而非弹窗 | 弹窗打断阅读流,原位保留上下文 |
| SVG 分步不挤一图 | 逐步推进帮助理解节奏,一图塞满只能"看"不能"懂" |
| 调性自适应而非固定模板 | PRD类型多样,一套固定视觉必翻车 |
| 品牌色点缀而非铺满 | 大色块桌面端疲劳,点缀/CTA用品牌色,正文中性色 |
| reveal 渐入而非一次性渲染 | 逐section渐入控制节奏,一次性全渲染信息淹没 |
红线
- ❌ 不可阉割 PRD 内容
- ❌ 不可使用纯装饰性动画
- ❌ 不可编造数据
- ❌ 不可跳过调性发现
- ❌ 不可依赖外部运行时(Node/React)
- ❌ 不可用
box-shadow做 SVG 阴影 →filter: drop-shadow() - ❌ 不可丢弃 PRD 图片/流程图/架构图
- ❌ 不可生成无法点击的交互模块
- ❌ 不可因修 bug 删交互功能
- ❌ 不可遗漏导航锚点