From 3163e860cabd6fde5ff449a9330f73fd0b2b1a6a Mon Sep 17 00:00:00 2001 From: zyh Date: Wed, 15 Apr 2026 10:12:58 +0000 Subject: [PATCH] =?UTF-8?q?sync:=20=E6=95=B4=E7=90=86=20E3.6=20=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=AE=9A=E4=B9=89=20+=20=E4=BF=AE=E5=A4=8D=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=90=8D=20result=20=E2=86=92=20resultList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/d8d-dev/journey-mode.md | 38 +++++++++---------- .../skills/d8d-dev/visual-diff-mode-pencil.md | 11 +++--- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/.claude/skills/d8d-dev/journey-mode.md b/.claude/skills/d8d-dev/journey-mode.md index 9adec13..8f7907f 100644 --- a/.claude/skills/d8d-dev/journey-mode.md +++ b/.claude/skills/d8d-dev/journey-mode.md @@ -204,17 +204,17 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 1. 读取所有 epic-N-journeys.md ↓ 1.5 执行前校验与自动修复(⛔ 强制) - **Read fully and follow: ./journey-authenticity-rules.md** - - 按统一规则 R1-R5 + R7 校验所有旅程文件 - - R7 约束一致性校验:对含"可选/可跳过/选填"关键词的步骤,grep 对应源码验证逻辑 - - 不一致 → 自动修复旅程定义(使其准确反映代码)→ 重新校验 - - 违规 → 自动修复旅程文件 → 重新校验(max 3x) - - 环境适配:读取 pipeline-context.md 确定当前环境,按 R3 适配 + **Read fully and follow: ./journey-authenticity-rules.md** + - 按统一规则 R1-R5 + R7 校验所有旅程文件 + - R7 约束一致性校验:对含"可选/可跳过/选填"关键词的步骤,grep 对应源码验证逻辑 + - 不一致 → 自动修复旅程定义(使其准确反映代码)→ 重新校验 + - 违规 → 自动修复旅程文件 → 重新校验(max 3x) + - 环境适配:读取 pipeline-context.md 确定当前环境,按 R3 适配 ↓ 1.8 生成步骤级验证清单(⛔ 强制 — 写入 verification-checklist.yaml) - - 解析每个旅程的「技术验证步骤」→ 为每个步骤生成 step 条目 - - 提取验收标准 → 生成 acceptance_criteria 条目 - - 写入/追加到 verification-checklist.yaml 的 journeys 部分: + - 解析每个旅程的「技术验证步骤」→ 为每个步骤生成 step 条目 + - 提取验收标准 → 生成 acceptance_criteria 条目 + - 写入/追加到 verification-checklist.yaml 的 journeys 部分: ```yaml journeys: epic_N: @@ -232,12 +232,12 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 - criterion: "{验收标准}" status: "pending" ``` - - 如 verification-checklist.yaml 已存在 → 跳过已 pass 的步骤,从 pending 步骤恢复 + - 如 verification-checklist.yaml 已存在 → 跳过已 pass 的步骤,从 pending 步骤恢复 ↓ 2. 询问: 验证全部 Epic 还是指定 Epic?(确定验证范围) ↓ 1.9 创建旅程任务清单(⛔ 强制 — 根据范围筛选,每条旅程一个 Task) - - 为每条待验证旅程**创建独立的 Task 任务**,使用 `TaskCreate` 工具: + - 为每条待验证旅程**创建独立的 Task 任务**,使用 `TaskCreate` 工具: - 每个任务记录:Epic 编号、旅程名称、旅程文件路径、前置条件 - 便于独立追踪每条旅程的验证进度 - 避免单个 agent 上下文过大导致污染或遗漏 @@ -256,10 +256,10 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 ``` ↓ 1.10 启动逐个任务验证(每条旅程独立 agent) - - 对**每个任务**启动一个**独立的 agent**,按照后续「执行模板」执行验证 - - 独立 agent 避免上下文污染,执行更精准 + - 对**每个任务**启动一个**独立的 agent**,按照后续「执行模板」执行验证 + - 独立 agent 避免上下文污染,执行更精准 - ⛔ **强制规则:禁止在主 agent 中一次性串行执行多条旅程** + ⛔ **强制规则:禁止在主 agent 中一次性串行执行多条旅程** ↓ 3. 汇总所有任务结果 → 生成旅程验证报告 ↓ @@ -271,7 +271,7 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 ## 旅程验证核心原则 ⛔ **核心原则:每条旅程独立 agent 执行,禁止一次性串行执行所有旅程。** -**最佳实践:每个旅程启动一个独立 agent,避免上下文污染,执行更精准。** +**最佳实践:每个旅程启动一个独立 agent,分批并行执行,避免上下文污染和 Playwright MCP 配额超限,执行更精准。** 所有旅程验证任务创建完成后,由独立 agent 按照后续「执行铁律」和「执行模板」依次执行单条旅程的完整验证。 @@ -429,7 +429,7 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 - [ ] 截图文件名**必须**包含 `.png` 扩展名(`journey-epic-N-M-step-S.png`) - [ ] 截图**必须**保存到 `tests/e2e/screenshots/` 目录,不能保存到当前工作目录 - [ ] **每个截图文件必须是真正的 PNG 图片** → `file ` 检测输出必须包含 "PNG image data" -- [ ] **强制:每截一张图立刻检查** → `browser_take_screenshot` 完成后立刻执行 `file` 检测格式,失败立刻重截 +- [ ] **强制:每截一张图立刻检查** → `browser_take_screenshot` 完成后**立刻**执行 `file` 检测格式,失败立刻重截 - [ ] 每个用户步骤完成 → `browser_take_screenshot` + `file` 格式验证 + `analyze_image` → 视觉验证关卡 - [ ] 旅程最终完成 → `browser_take_screenshot` 最终截图 + `browser_network_requests` 资源检查 - [ ] 违反任意一条 → 中断补全,不能继续 @@ -487,8 +487,6 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 result: "pass|fail" - check: "file_format_validation" result: "pass|fail" - executed_at: "{ISO timestamp}" - note: "{备注}" ``` c. 步骤级 GATE 检查(6 项,任一 FAIL → 阻断): ├── G1: screenshot_consistency — screenshot_path 文件存在 @@ -539,8 +537,8 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 **Pencil MCP 模式(优先)**: - 读取 pipeline-context.md 获取设计文件路径(如 VividSpark1.2.pen) - mcp__pencil__batch_get → 搜索与当前状态匹配的帧 - - 搜索关键词: "{Page}-{State}" 如 "Dashboard-Modal", "Login-Error", "Upload-Loading" - - 或按 frame 类型和名称模式匹配 + - 搜索关键词: "{Page}-{State}" 如 "Dashboard-Modal", "Login-Error" + - 或按 frame 类型和名称模式匹配 - 如找到匹配帧 → mcp__pencil__export_nodes 导出设计截图 **HTML 原型模式(回退)**: diff --git a/.claude/skills/d8d-dev/visual-diff-mode-pencil.md b/.claude/skills/d8d-dev/visual-diff-mode-pencil.md index 27f8c45..a7d1b98 100644 --- a/.claude/skills/d8d-dev/visual-diff-mode-pencil.md +++ b/.claude/skills/d8d-dev/visual-diff-mode-pencil.md @@ -150,7 +150,7 @@ visual_diff_pencil_mapping: ``` 原理:代码中存在的页面一定要对比,不能因为自动映射失败就漏掉。 1. 读取 app/mini-program/src/pages.json - 2. 提取 all pages 和 subpackages 中的页面路径 + 2. 提取所有 pages 和 subpackages 中的页面路径 3. 对每个页面路径: - 提取页面名 = 路径倒数第二段("pages/withdraw/index" → "withdraw") - 检查当前映射表中是否已有该页面 @@ -161,7 +161,6 @@ visual_diff_pencil_mapping: ``` 这样可以确保**代码中有的页面一定会被对比**,不会因为名称提取问题漏掉。 - ### 0.6 创建截图输出目录 ```bash @@ -292,10 +291,10 @@ PVD-1 PER-PAGE LOOP: if node.name != null && node.name != "": resultList.push({path: path + node.name, node: node}) for each child in node.children: - collectNamedNodes(child, path + node.name + ".", result); - + collectNamedNodes(child, path + node.name + ".", resultList); + **强制要求**: **任何层级**只要节点有 name 属性,都必须提取并检查。**不允许只检查顶层不检查深层**。 - + 结果包含所有层级:topBar, topBar.topLeft, topBar.topRight, tabSection, tabSection.tabLeft, barCard1, barCard1.ratingBadge, barCard1.activitySnippet 等等(深度嵌套没问题,全部提取)。 示例: topBar.topLeft / tabSection.tabLeft / availableCard / amountInput / ... 3. **检查全局配置关联**: 如果设计帧包含 name=bottomNav/BottomNav 且是 ref 组件 @@ -485,7 +484,7 @@ FIX LOOP (最多 3 轮): 2. 修正名称 → 按 Material → Lucide 映射表修改正确名称 3. 添加CSS → 确保 `svg { fill: currentColor; }` 让颜色正确继承 F3. 重启服务(如修改了后端或需要刷新构建) - - Bash: pm2 restart mini-h5(移动端)或 pm2 restart admin(管理后台) + - Bash: pm2 restart mini-h5(移动端)or pm2 restart admin(管理后台) F4. 重截实际页面 - Playwright: browser_navigate → browser_wait_for → browser_take_screenshot - 保存为 {name}-actual-v{N}.png(N 为修复轮次)