Merge pull request 'sync: visual-diff-mode-pencil 增加逐页门禁检查和 AUTO-FIX 循环' (#28) from sync/d8d-skills-20260413-142113 into master

Reviewed-on: http://gitea.d8d.fun/d8dfun/bmad-method-template/pulls/28
This commit is contained in:
2026-04-13 14:23:51 +00:00

View File

@@ -117,75 +117,154 @@ mkdir -p tests/e2e/screenshots/visual-diff-pencil
---
## Phase PVD-1: 逐页对比循环
## Phase PVD-1: 逐页门禁对比循环
对映射表中每个 `status: active` 的页面执行以下流程。
**核心原则:逐页执行,每页必须通过门禁才能继续下一页。禁止全量截图后批量对比。**
对映射表中每个 `status: active` 的页面,依次执行以下完整循环:
```
PVD-1 PER-PAGE LOOP:
A. 导出设计截图
B. 截取实际页面
C. AI 视觉对比
D. 差异分级
E. PAGE GATE-CHECK ⛔
├── 🟢 通过 → G. 记录 → NEXT PAGE
└── 🔴/🟡 未通过 → F. AUTO-FIX → 重截 → 重比 → 重新 GATE-CHECK
G. 记录结果到 pipeline-state.yaml
```
### 1.A Pencil MCP 导出设计帧截图
```
工具: mcp__pencil__export_nodes
参数:
- filePath: "VividSpark1.2.pen"
- nodeIds: ["{design_frame_id}"] # 从映射表获取
- filePath: "ui.pen"
- nodeIds: ["{当前页面的帧 ID}"] # 每次只导出 1 个
- outputDir: "tests/e2e/screenshots/visual-diff-pencil"
- format: "png"
- scale: 2 # 2x 高清
```
导出后的文件路径:
- `tests/e2e/screenshots/visual-diff-pencil/{design_frame_id}.png`
重命名为可读名称:
- `tests/e2e/screenshots/visual-diff-pencil/{name}-design.png`
### 1.B 截取实际页面截图
同 HTML 原型版,使用 Playwright
使用 Playwright
```
1. browser_navigate → {实际 URL}{route}
2. browser_resize → 1440x900与设计帧尺寸匹配
1. browser_resize → 375x812移动端或 1440x900管理后台
2. browser_navigate → {实际 URL}{route}
3. 处理认证(如需要)
4. browser_wait_for → time=3
5. browser_take_screenshot(fullPage=false)
→ tests/e2e/screenshots/visual-diff-pencil/{name}-actual.png
```
### 1.C UI 差异对比
### 1.C AI 视觉对比
使用 Read 工具分别查看设计截图和实际截图,然后综合分析差异:
```
工具: ui_diff_check
参数:
- expected_image_source: "tests/e2e/screenshots/visual-diff-pencil/{name}-design.png"
- actual_image_source: "tests/e2e/screenshots/visual-diff-pencil/{name}-actual.png"
- prompt: "对比这两张截图:第一张是 Pencil 设计稿,第二张是实际实现。列出所有视觉差异,包括布局结构、组件排列、颜色、间距、字体、图标等。按严重程度排序。"
步骤:
1. Read 工具查看设计截图 → 理解设计意图(布局、颜色、组件)
2. Read 工具查看实际截图 → 识别实现状态
3. 综合两图分析差异,关注:
- 布局结构(网格/弹性/定位)
- 组件排列(导航栏、卡片、按钮、图标)
- 颜色Neon Pulse 规范:#000000 背景、#ffb3b5 粉色、#e8b3ff 紫色、#00dce5 青色)
- 间距(内边距、外边距、元素间距)
- 字体(大小、粗细、颜色)
- 图标(是否存在、是否 emoji 替代、是否损坏)
```
### 1.D 差异分级
同 HTML 原型版:
| 级别 | 标准 | 示例 |
|------|------|------|
| 🔴 严重 | 布局结构不同、关键组件缺失 | 原型有两列布局实际一列 |
| 🟡 中等 | 颜色/间距偏差、图标不一致 | 卡片圆角不一致 |
| 🟢 轻微 | 微小像素差异 | 1-2px 偏移 |
### 1.E PAGE GATE-CHECK ⛔(每页门禁)
**每页对比完成后必须执行门禁检查。不通过则阻断,进入修复循环。**
```
GATE-CHECK 规则:
├── 🔴 critical_count > 0 → FIX REQUIRED阻断
├── 🟡 moderate_count > 3 → FIX REQUIRED阻断
└── 🟢 匹配或轻微差异 → PASS放行
通过条件: critical_count == 0 AND moderate_count <= 3
```
### 1.F AUTO-FIX LOOP每页修复循环max 3x
门禁未通过时自动触发修复。修复后重新截图、重新对比、重新门禁。
```
FIX LOOP (最多 3 轮):
F1. 分析差异描述 → 定位需要修改的代码文件
- 移动端页面: app/mini-program/src/pages/{page}/index.vue
- 管理后台页面: app/admin/src/app/dashboard/{page}/page.tsx
- 全局样式: app/mini-program/src/App.vue 或 app/admin/src/app/globals.css
F2. 修改代码CSS/组件/布局/颜色)
- 使用 Edit 工具修改对应文件
- 参照设计稿的 Neon Pulse 设计规范
F3. 重启服务(如修改了后端或需要刷新构建)
- Bash: pm2 restart mini-h5移动端或 pm2 restart admin管理后台
F4. 重截实际页面
- Playwright: browser_navigate → browser_wait_for → browser_take_screenshot
- 保存为 {name}-actual-v{N}.pngN 为修复轮次)
F5. 重新对比(重复 1.C + 1.D
F6. GATE-CHECK → 通过? → RECORD → NEXT PAGE
未通过? → 重试 (回到 F1max 3x)
3 轮修复后仍未通过:
→ 记录为 "fix-failed",记录剩余差异描述
→ 继续下一页(不阻塞整体流程)
```
### 1.G 记录结果
每页完成后立即更新 `pipeline-state.yaml`
```yaml
visual_diff_pencil:
status: in_progress
pages:
"{page_name}":
design_frame: "{frame_id}"
actual_route: "{route}"
diff_level: "match|minor|moderate|critical"
critical_count: N
moderate_count: N
minor_count: N
auto_fix_attempted: true/false
auto_fix_rounds: N
auto_fix_files: ["file1.vue", "file2.tsx"]
auto_fix_result: "PASS (N critical fixed)" | "fix-failed (remaining: ...)"
gate_check: "pass|fix-failed"
```
---
## Phase PVD-2: 汇总报告
### 2.1 生成报告
生成 `tests/e2e/screenshots/visual-diff-pencil/visual-diff-pencil-report.md`
所有页面完成 PVD-1 循环后,生成 `tests/e2e/screenshots/visual-diff-pencil/visual-diff-pencil-report.md`
```markdown
# Visual Diff Report (Pencil MCP Direct)
生成时间: {timestamp}
对比页面数: {total_pages}
数据来源: VividSpark1.2.pen (Pencil MCP 直接导出)
数据来源: ui.pen (Pencil MCP 直接导出)
模式: 逐页门禁对比(含 AUTO-FIX 循环)
## Summary
@@ -196,11 +275,21 @@ mkdir -p tests/e2e/screenshots/visual-diff-pencil
| 🟢 轻微 | {minor_count} |
| ✅ 匹配 | {match_count} |
## 修复统计
| 指标 | 数值 |
|------|------|
| 触发 AUTO-FIX 页面数 | {fix_attempted_count} |
| 修复成功页面数 | {fix_pass_count} |
| 修复失败页面数 | {fix_failed_count} |
## 详细对比结果
### 🔴 {page_name}
- 设计截图: `visual-diff-pencil/{name}-design.png`
- 实际截图: `visual-diff-pencil/{name}-actual.png`
### {page_name} — {gate_check_result}
- 设计截图: `{name}-design.png`
- 实际截图: `{name}-actual.png`
- 差异级别: {diff_level}
- AUTO-FIX: {auto_fix_result}
- 差异描述...
...
@@ -211,14 +300,19 @@ mkdir -p tests/e2e/screenshots/visual-diff-pencil
```yaml
visual_diff_pencil:
status: completed
total_pages: 11
compared_pages: 11
critical_count: 0
moderate_count: 3
minor_count: 5
match_count: 3
total_pages: {total}
compared_pages: {compared}
critical_count: {total_critical}
moderate_count: {total_moderate}
minor_count: {total_minor}
match_count: {total_match}
fix_attempted_count: {fix_attempted}
fix_pass_count: {fix_pass}
fix_failed_count: {fix_failed}
pages:
"{page_name}": { ... } # 来自 1.G 的逐页记录
report_path: "tests/e2e/screenshots/visual-diff-pencil/visual-diff-pencil-report.md"
timestamp: "2026-04-08T12:00:00Z"
timestamp: "{ISO timestamp}"
```
---
@@ -231,4 +325,6 @@ visual_diff_pencil:
| 截图工具 | `mcp__pencil__export_nodes` | Playwright 访问 `localhost:8080` |
| 保真度 | 100% 设计稿 | 可能有转换损耗 |
| 启动依赖 | 无 | 需启动 `prototype/server.js` |
| 门禁机制 | ✅ 逐页 GATE-CHECK + AUTO-FIX | N/A |
| 修复循环 | ✅ max 3x per page | N/A |
| 推荐场景 | 有 `.pen` 文件时首选 | 无 `.pen` 或需 HTML 交互时 |