diff --git a/.claude/skills/d8d-dev/journey-mode.md b/.claude/skills/d8d-dev/journey-mode.md index 8f7907f..0dee123 100644 --- a/.claude/skills/d8d-dev/journey-mode.md +++ b/.claude/skills/d8d-dev/journey-mode.md @@ -428,7 +428,6 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 - [ ] `browser_take_screenshot` = PNG 截图保存(用于视觉验证),**每个步骤必须** - [ ] 截图文件名**必须**包含 `.png` 扩展名(`journey-epic-N-M-step-S.png`) - [ ] 截图**必须**保存到 `tests/e2e/screenshots/` 目录,不能保存到当前工作目录 -- [ ] **每个截图文件必须是真正的 PNG 图片** → `file ` 检测输出必须包含 "PNG image data" - [ ] **强制:每截一张图立刻检查** → `browser_take_screenshot` 完成后**立刻**执行 `file` 检测格式,失败立刻重截 - [ ] 每个用户步骤完成 → `browser_take_screenshot` + `file` 格式验证 + `analyze_image` → 视觉验证关卡 - [ ] 旅程最终完成 → `browser_take_screenshot` 最终截图 + `browser_network_requests` 资源检查 @@ -438,7 +437,7 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这 对每条旅程: 1. 准备阶段: - - browser_resize → 正确视口(小程序 375x812 / 管理后台 1440x900) + - browser_resize → 正确视口(小程序 390x844 / 管理后台 1440x900) - 读取旅程定义的前置条件 - curl/API 验证前置条件(✅ 允许 curl) - 前置条件不满足 → FAIL diff --git a/.claude/skills/d8d-dev/phase-00-setup.md b/.claude/skills/d8d-dev/phase-00-setup.md index 3a76ed2..cd920e9 100644 --- a/.claude/skills/d8d-dev/phase-00-setup.md +++ b/.claude/skills/d8d-dev/phase-00-setup.md @@ -5,7 +5,6 @@ ## SETUP 步骤 - 1. **加载配置** - 读取 `{project-root}/_bmad/bmm/config.yaml` - 解析:`project_name`、`planning_artifacts`、`implementation_artifacts` 路径 @@ -66,11 +65,7 @@ } ``` - 标记:Epic 0 完成后此文件才可生效(项目目录需先存在) - - ⛔ **HMR 降级策略(备选)**:配置了 `allowedDevOrigins` 后,外网域名的 HMR 通常可以正常工作。仅在以下情况下降级到生产模式: - - 配置了 `allowedDevOrigins` 后 HMR 仍失败 - - 需要最大化测试稳定性(生产模式无 HMR 干扰) - - 降级步骤(`next start` 替代 `next dev`): + - ⛔ **HMR 降级策略**:外网域名 E2E 测试/旅程验证时,如果 HMR WebSocket 失败(控制台 `webpack-hmr` 错误),必须切换到生产模式: ```bash npx next build pm2 stop app && pm2 delete app @@ -118,7 +113,7 @@ 当某个服务返回 502 但 localhost 可用时,这是配置问题,必须修复: a. 检查服务监听地址:netstat -tlnp | grep {port} - 期望: 0.0.0.0:{port} 或 ::::{port}(所有接口) - - 如果是 ::1:{port} 或 127.0.0.1:{port} → 仅 localhost,NPM 无法转发 + - 如果 ::1:{port} 或 127.0.0.1:{port} → 仅 localhost,NPM 无法转发 b. 修复方法(按框架): - Vite(uni-app/mini-program):vite.config.ts 添加 server: { host: "0.0.0.0" } - Next.js:默认绑定所有接口,通常不需要修改 @@ -192,33 +187,7 @@ - 此步骤创建的 .env.local 不应提交到 git(应在 .gitignore 中排除) - 更新 pipeline-context.md 记录注入状态 -4.8. **Next.js allowedDevOrigins 配置(⛔ 外网域名访问时强制)** - - 当通过外网域名(如 `*.dev.d8d.fun`)访问 Next.js 开发服务器时,必须在 `next.config.ts` 中配置 `allowedDevOrigins`,否则会出现 "Invalid Host header" 错误。 - - **配置示例**: - ```typescript - // next.config.ts - import type { NextConfig } from "next"; - - const nextConfig: NextConfig = { - allowedDevOrigins: [ - "*.dev.d8d.fun", - "localhost", - ], - }; - - export default nextConfig; - ``` - - **配置后重启服务**: - ```bash - pm2 restart vividspark - ``` - - 详见 `./reference/platform-nextjs.md` §10 - -4.9. **MinIO 外网地址注入(⛔ 强制)** +4.8. **MinIO 外网地址注入(⛔ 强制)** 检测容器环境变量 `MINIO_HOST`,将外网地址注入到 `.env` 中的 `S3_PUBLIC_URL`: @@ -314,13 +283,13 @@ ``` 上下文压缩发生 - ↓ + ↓ 读取 pipeline-context.md(恢复凭据/端口/路由/进度) - ↓ + ↓ 读取 pipeline-state.yaml(恢复 Story 级验证状态) - ↓ + ↓ TaskList(恢复 Task 进度) - ↓ + ↓ 继续执行未完成的 Story ``` @@ -407,4 +376,3 @@ TaskList(恢复 Task 进度) 1. `pm2 list` 确认服务状态 2. 读取 `pipeline-state.yaml` 确认进度 3. 创建 `pipeline-context.md` 并填充基础信息 - diff --git a/.claude/skills/d8d-dev/reference/platform-nextjs.md b/.claude/skills/d8d-dev/reference/platform-nextjs.md index 9c8f5d2..18347fc 100644 --- a/.claude/skills/d8d-dev/reference/platform-nextjs.md +++ b/.claude/skills/d8d-dev/reference/platform-nextjs.md @@ -231,19 +231,11 @@ NPM 代理主机默认配置会阻断 WebSocket,导致: `get_proxy_host` 确认:`block_exploits: false` + `allow_websocket_upgrade: true` -### §7.1 HMR 降级策略(备选方案) - -#### 前置条件 - -配置了 `allowedDevOrigins` 后,外网域名的 HMR 通常可以正常工作,**不再需要降级到 `next start`**。 - -仅在以下情况下考虑降级: -- 配置了 `allowedDevOrigins` 后 HMR 仍失败 -- 需要最大化测试稳定性(生产模式无 HMR 干扰) +### §7.1 HMR 降级策略(⛔ E2E 测试/旅程验证时强制) #### 问题描述 -即使 NPM 代理已正确配置(`block_exploits: false` + `allow_websocket_upgrade: true`)且已配置 `allowedDevOrigins`, +即使 NPM 代理已正确配置(`block_exploits: false` + `allow_websocket_upgrade: true`), 通过外网域名访问 `next dev` 时 HMR WebSocket 仍可能失败(握手阶段 Invalid status line)。 这导致: - 浏览器控制台持续 `WebSocket connection to 'ws://.../_next/webpack-hmr' failed: Error during WebSocket handshake` @@ -254,9 +246,10 @@ NPM 代理主机默认配置会阻断 WebSocket,导致: #### 检测条件 -满足以下条件时考虑降级: -1. 已配置 `allowedDevOrigins` 但 HMR WebSocket 仍连接失败 -2. 正在执行 E2E 测试或旅程验证,且 HMR 干扰测试稳定性 +满足以下条件时触发降级: +1. 浏览器控制台出现 HMR WebSocket 连接失败错误 +2. NPM 代理已正确配置(`allow_websocket_upgrade: true`) +3. 正在执行 E2E 测试或旅程验证 #### 降级步骤 @@ -283,8 +276,8 @@ pm2 start "npx next dev --port 3001" --name app #### 注意事项 - **代码修改后需重新 build**:生产模式下修改源码不会自动生效,必须 `next build` 后重启 -- **开发调试优先用 `next dev`**:通过外网域名访问需配置 `allowedDevOrigins`,可获得热重载体验 -- **仅在必要时用 `next start`**:当 HMR 干扰测试稳定性或配置 `allowedDevOrigins` 后仍失败时使用 +- **E2E/旅程验证优先用 `next start`**:避免 HMR 干扰测试稳定性 +- **开发调试用 `next dev`**:需要热重载时使用,通过 localhost 访问可避免 HMR 问题 --- @@ -372,8 +365,6 @@ browser_network_requests(static=true, filter="\\.(jpg|jpeg|png|gif|webp|svg|mp4| # 状态码 403/404 → 资源不可访问 → AUTO-FIX ``` ---- - ## 10. allowedDevOrigins 配置(⛔ 外网域名访问时强制) ### 问题描述 @@ -431,4 +422,3 @@ pm2 start "pnpm dev" --name vividspark - 需要最大化测试稳定性(生产模式无 HMR 干扰) 详见 §7.1 - diff --git a/.claude/skills/d8d-dev/validation-mode.md b/.claude/skills/d8d-dev/validation-mode.md index 16397fd..0736874 100644 --- a/.claude/skills/d8d-dev/validation-mode.md +++ b/.claude/skills/d8d-dev/validation-mode.md @@ -15,11 +15,6 @@ - `implemented` → 从 TEST 恢复 - `tested-fail` → 从 AUTO-FIX 恢复 4. 跳过 sprint-status 中已标记 `done` 的 Story -5. **步骤级恢复**(⛔ 增强 — 优先于 Story 级恢复): - - 读取 `verification-checklist.yaml` → 找到当前 Story 中第一个 `status: pending` 的 step - - 读取 `pipeline-state.yaml` 的 `step_results` → 确认最后一个已完成步骤 - - 从下一个步骤继续执行(跳过已完成的步骤,不重复截图/分析) - - 如无 pending step → 该 Story 验证已完成,继续下一个 Story ## 验证模式续跑 @@ -85,40 +80,12 @@ Story 类型: API+前端 (assignee: frontend+backend) ``` -3. **生成步骤级验证清单**(⛔ 强制 — 写入 verification-checklist.yaml) - - 为每个待验证 Story 从 V1/V2/V3 检查点生成操作步骤条目 - - 每个步骤包含:id、phase(api/e2e/source-check)、action、expected、screenshot_required、screenshot_path、analyze_image_required、status(初始 pending) - - 为每个 Story 生成 gate_check 条目(9 项检查,初始 pending) - - 写入 `_bmad-output/implementation-artifacts/verification-checklist.yaml`: - ```yaml - generated_at: "{ISO timestamp}" - mode: "validation" - stories: - "X-Y-title": - title: "{Story 标题}" - assignee: "{assignee}" - steps: - - id: "X-Y-s{N}" - phase: "api|e2e|source-check" - action: "{操作描述}" - expected: "{预期结果}" - screenshot_required: true/false - screenshot_path: "tests/e2e/screenshots/story-X-Y-step{N}.png" - analyze_image_required: true/false - status: "pending" - gate_check: - - check: "{检查项名称}" - status: "pending" - ``` - -4. **标记已完成的 Task** +3. **标记已完成的 Task** - 已 `verified: true` 的 Story → 立即 `TaskUpdate: completed` - - 同步将 verification-checklist.yaml 中对应 Story 的所有 steps 标记为 `skipped` - 输出: `已创建 N 个验证 Task,其中 M 个已完成(跳过),K 个待验证` -5. **恢复时检查 TaskList 和清单文件** +4. **恢复时检查 TaskList** - 如果 TaskList 已有 Task(续跑场景)→ 跳过批量创建,直接找 pending Task 继续 - - 如果 verification-checklist.yaml 已存在 → 跳过清单生成,从第一个 status=pending 的 step 继续执行 ### Phase 0V COMPLETE GATE @@ -386,76 +353,8 @@ echo "placeholder_functions=$PLACEHOLDER_COUNT" - 关卡 = browser_take_screenshot + analyze_image(使用 visual-verification.md 标准提示词) - 关卡未通过 → 按分流规则处理,不得进入下一个操作 -**⛔ 步骤级跟踪(每个 E2E 操作步骤完成后强制执行)**: - -每个操作步骤完成后,必须执行以下 5 项操作(与视觉验证关卡配合执行): - -``` -步骤级跟踪流程(每个 E2E 操作后): - 1. 截图保存 → browser_take_screenshot - 2. 视觉分析 → analyze_image(如 analyze_image_required=true) - 3. 更新清单 → Edit verification-checklist.yaml 对应 step 的 status - 4. 记录结果 → 追加 step_results 到 pipeline-state.yaml: - ```yaml - - step_id: "X-Y-s{N}" - phase: "e2e" - action: "{操作描述}" - status: "pass|fail|fixed|skipped" - screenshot_path: "tests/e2e/screenshots/story-X-Y-step{N}.png" - analyze_image_result: { ... } # 如有 - issues_detected: [ ... ] # 检测到的问题(如有) - auto_fixes: [ ... ] # 自动修复记录(如有) - step_gate: "pass|fail|blocked" # 步骤级门禁结果 - gate_checks: # 5 项检查结果 - - check: "screenshot_consistency" - result: "pass|fail" - - check: "analyze_image_executed" - result: "pass|fail" - - check: "checklist_synced" - result: "pass|fail" - - check: "state_persisted" - result: "pass|fail" - - check: "all_issues_resolved" - result: "pass|fail" - executed_at: "{ISO timestamp}" - note: "{备注}" - ``` - 5. 步骤级 GATE → 检查 5 项条件: - ├── G1: screenshot_consistency — 如步骤要求截图,screenshot_path 文件存在 - ├── G2: analyze_image_executed — 如步骤要求分析,analyze_image_result 非空 - ├── G3: checklist_synced — verification-checklist.yaml 中 step status 已更新 - ├── G4: state_persisted — pipeline-state.yaml step_results 已追加 - └── G5: all_issues_resolved — issues_detected 中所有问题有对应 auto_fix 且 result=pass - 任一 FAIL → 阻断,不得继续下一步骤 -``` - -**检测到问题时的记录格式**(issues_detected): -```yaml -issues_detected: - - issue_id: "ISSUE-{NNN}" - type: "{问题类型}" # layout_overflow | english_enum | emoji_icons | broken_images | svg_data_uri | dual_nav | placeholder | api_target | constraint_mismatch - severity: "{严重程度}" # bug | unimplemented | data_issue | env_limit - description: "{问题描述}" - detected_by: "{检测方式}" # browser_evaluate | analyze_image | source_scan | curl - detected_at: "{ISO timestamp}" -``` - -**自动修复记录格式**(auto_fixes): -```yaml -auto_fixes: - - fix_id: "FIX-{NNN}" - issue_id: "ISSUE-{NNN}" # 关联的问题 - fix_type: "AUTO-FIX|AUTO-IMPLEMENT|AUTO-DATA-FIX" - description: "{修复描述}" - files_changed: [ "{文件路径}" ] - retry_count: {N} # 重试次数 - result: "pass|fail" # 修复结果 - fixed_at: "{ISO timestamp}" - screenshot_after_fix: "{修复后截图路径}" # 修复后重测截图 -``` - #### 步骤 5: 最终截图保存(Story 涉及前端页面时) -- browser_take_screenshot → filename: "tests/e2e/screenshots/story-{x}-{y}.png", type: "png" +- 保存最终状态截图到 `tests/e2e/screenshots/story-x-y.png` - 管理后台和小程序分别截图时使用不同后缀: - `story-x-y-admin.png`(管理后台页面) - `story-x-y-mini.png`(小程序页面) @@ -483,10 +382,7 @@ GATE-CHECK 检查项: ├── source_code_no_localhost === true ← 步骤 3.5 检查 1(localhost fallback) ├── icon_solution_compliant === true ← 步骤 3.5 检查 2(图标方案合规,小程序/移动端) ├── source_code_no_emoji_icons === true ← 步骤 3.5 检查 3(Emoji 充当图标) -├── no_placeholder_functions === true ← 步骤 3.5 检查 4("暂未开放"等未实现占位符) -├── SG1: all_steps_gated === true ← 所有 step_results 的 step_gate 均为 "pass" -├── SG2: no_unresolved_issues === true ← 所有 steps 的 issues_detected 都有对应 resolved 的 auto_fix -└── SG3: checklist_complete === true ← verification-checklist.yaml 中所有 steps 的 status 均非 "pending" +└── no_placeholder_functions === true ← 步骤 3.5 检查 4("暂未开放"等未实现占位符) 任一 FAIL → 分类分流: Bug(代码有但值错误)→ AUTO-FIX @@ -496,23 +392,6 @@ GATE-CHECK 检查项: **⛔ 跳过此步骤直接执行步骤 7 是严重违规行为。** -**SG1-SG3 详细判定**: -``` -SG1 (all_steps_gated): - 读取 step_results → 所有条目的 step_gate === "pass" - 任一 step_gate === "fail" 或 "blocked" → SG1 FAIL - -SG2 (no_unresolved_issues): - 遍历所有 step_results 的 issues_detected: - 对每个 issue → 在 auto_fixes 中找到 issue_id 匹配的修复记录 → result === "pass" - 无匹配修复或 result !== "pass" → SG2 FAIL - -SG3 (checklist_complete): - 读取 verification-checklist.yaml 当前 Story 的 steps: - 所有条目的 status !== "pending" - 任一 status === "pending" → SG3 FAIL -``` - #### 步骤 7: 标记完成(三个写入操作,缺一不可) **7a. TaskUpdate**: @@ -534,23 +413,18 @@ story_results: screenshot_path: "tests/e2e/screenshots/story-x-y.png" analyze_image_called: true/false url_used: "外网域名" / "localhost(fallback)" - api_centralized: true/false + # 新增字段(⛔ 强制填写) + api_centralized: true/false # 前端 API 调用是否使用集中式模块 layout_check: - horizontal_overflow: true/false - tabbar_visible: true/false/null - document_width: 375 - viewport_width: 375 + horizontal_overflow: true/false # 页面宽度是否溢出视口 + tabbar_visible: true/false/null # 底部 TabBar 是否可见(null=无TabBar) + document_width: 375 # 实际文档宽度 + viewport_width: 375 # 视口宽度 icons_check: - tabbar_icons_visible: true/false - broken_images: true/false - emoji_as_icons: true/false - dual_write_verified: true - # ===== 新增: 步骤级结果 ===== - step_results: [] # 已在步骤 3/4 执行过程中逐步追加 - # ===== 新增: Story 级问题汇总 ===== - total_issues_detected: 0 # 所有步骤检测到的问题总数 - total_auto_fixes: 0 # 所有步骤的自动修复总数 - all_issues_resolved: true # 所有问题是否全部修复 + tabbar_icons_visible: true/false # TabBar 图标是否全部可见 + broken_images: true/false # 是否有加载失败的图片 + emoji_as_icons: true/false # 是否有 emoji 充当功能图标 + dual_write_verified: true # 三写一致性验证是否通过 note: "简短验证摘要" ``` diff --git a/.claude/skills/d8d-dev/visual-diff-mode.md b/.claude/skills/d8d-dev/visual-diff-mode.md index 76efcea..f46f45b 100644 --- a/.claude/skills/d8d-dev/visual-diff-mode.md +++ b/.claude/skills/d8d-dev/visual-diff-mode.md @@ -1,14 +1,6 @@ # 原型对比验证模式(Visual Diff Mode) -> **定位**:在回归验证和旅程验证之后,将实际页面实现与原型做逐页视觉对比,发现布局偏差、组件遗漏、交互方式差异等视觉问题。 -> -> **两种对比方式**(任选其一): -> | 方式 | 来源 | 适用场景 | -> |------|------|---------| -> | **Pencil MCP 直接版**(推荐) | `.pen` 设计源文件 | 有 `.pen` 文件时首选,100% 设计稿保真度 | -> | **HTML 原型版** | `prototype/pages/*.html` | 无 `.pen` 文件或需要 HTML 交互时 | -> -> Pencil MCP 直接版文档:**[visual-diff-mode-pencil.md](./visual-diff-mode-pencil.md)** +> **定位**:在回归验证和旅程验证之后,将实际页面实现与原型 HTML 页面做逐页视觉对比,发现布局偏差、组件遗漏、交互方式差异等视觉问题。 > > **与其他模式的关系**: > - 回归验证模式 → 检查功能点存在且正确(类比单元测试) diff --git a/.claude/skills/d8d-dev/visual-verification.md b/.claude/skills/d8d-dev/visual-verification.md index c903197..cebf855 100644 --- a/.claude/skills/d8d-dev/visual-verification.md +++ b/.claude/skills/d8d-dev/visual-verification.md @@ -227,37 +227,6 @@ verification_detail: details: "描述" ``` -**⛔ 步骤级关联**:上述 verification_detail 中发现的每个问题,必须同时记录到对应步骤的 `step_results[].issues_detected` 中(含 `step_id` 关联),确保问题可追溯到具体操作步骤: - -```yaml -# step_results 中的关联记录示例 -step_results: - - step_id: "2-1-s2" - # ... 其他字段 ... - issues_detected: - - issue_id: "ISSUE-001" - type: "layout_overflow" - severity: "bug" - description: "水平溢出: document_width=420 > viewport=375" - detected_by: "browser_evaluate" - detected_at: "{ISO timestamp}" - # ⛔ 关联: 此问题同时记录在 verification_detail.layout_check.horizontal_overflow = true - analyze_image_result: - # ⛔ 以下字段与 verification_detail 同步(同一来源) - design_compliance: "PASS" # → verification_detail.design_check.design_compliance - icons_check: { emoji_as_icons: "NONE", broken_images: "NONE" } - layout_check: { horizontal_overflow: true } # → verification_detail.layout_check.horizontal_overflow -``` - -**跨步骤累计检测规则增强**:累计检测按 `step_id` 追踪,每个步骤的检测结果独立记录但跨步骤累计: -``` -跨步骤累计: - step 1: emoji_as_icons = NONE → 累计 0 - step 2: emoji_as_icons = FOUND → 累计 1 → ⛔ 触发修复(step_id: "2-1-s2") - 修复后 step 2 重测: emoji_as_icons = NONE → 累计重置为 0 - step 3: emoji_as_icons = NONE → 累计 0 → 不触发 -``` - --- ## 视觉检查问题分流规则 diff --git a/.claude/skills/d8d-dev/workflow.md b/.claude/skills/d8d-dev/workflow.md index 0b258af..3299c91 100644 --- a/.claude/skills/d8d-dev/workflow.md +++ b/.claude/skills/d8d-dev/workflow.md @@ -87,14 +87,7 @@ | **单 Epic 模式** | 执行指定 Epic 的所有 Story | 按模块开发 | | **回归验证模式** | 不做实现,逐 Story 验证功能点存在且正确 | 代码已实现需回归验证(类比:单元测试) | | **旅程验证模式** | 专用用户旅程定义+验证(跨页面完整流程) | 跨 Story/Epic 的用户体验验证(类比:E2E 测试) | -| **原型对比验证模式** | 截取原型和实际页面截图,使用 ui_diff_check 对比差异 | Epic 完成后的视觉还原度检查(类比:视觉回归测试) | - -### 原型对比验证子模式 - -| 子模式 | 原型来源 | 推荐场景 | -|--------|---------|---------| -| **Pencil MCP 直接版**(优先) | `.pen` 设计文件(如 VividSpark1.2.pen) | 有 .pen 文件时首选,100% 设计稿保真度 | -| **HTML 原型版** | `prototype/pages/*.html` | 无 .pen 文件或需要 HTML 交互时 | +| **原型对比验证模式** | 截取原型和实际页面截图,使用 ui_diff_check + analyze_image 对比差异 | Epic 完成后的视觉还原度检查(类比:视觉回归测试) | ## 模式选择与流转 @@ -190,18 +183,9 @@ Read fully and follow: ./journey-mode.md ### 原型对比验证模式 ``` -自动检测并选择: -├── 存在 .pen 设计文件(如 VividSpark1.2.pen) -│ └── Read fully and follow: ./visual-diff-mode-pencil.md # Pencil MCP 直接版 -│ -└── 不存在 .pen 文件,但存在 prototype/pages/*.html - └── Read fully and follow: ./visual-diff-mode.md # HTML 原型版 +Read fully and follow: ./visual-diff-mode.md ``` -**手动指定子模式**: -- `/d8d-dev visual-diff --pencil` → 强制使用 Pencil MCP 直接版 -- `/d8d-dev visual-diff --html` → 强制使用 HTML 原型版 - ### 仅测试模式 / 仅审查模式 直接读取对应 Story 的 phase-04-test.md 或 phase-05-review.md 中的相关部分。 diff --git a/.claude/skills/d8d-iterate/SKILL.md b/.claude/skills/d8d-iterate/SKILL.md index b09ae1b..7a5163a 100644 --- a/.claude/skills/d8d-iterate/SKILL.md +++ b/.claude/skills/d8d-iterate/SKILL.md @@ -13,25 +13,21 @@ description: '需求迭代自动化编排技能。智能检测项目状态,分 | 类型 | 触发条件 | 执行路径 | |------|----------|----------| -| **completion** | 上次迭代有跳过的步骤 | 仅补跑跳过的 Phase/Step(最高优先级) | | **feature** | 已有完整文档,需增加新 Epic | edit-prd → update docs → new epic → dev | | **greenfield** | 无现有文档 | d8d-requirements → d8d-prototype → d8d-dev | | **bugfix** | 代码已实现但有问题 | dev single-story 或直接修复 | | **refactor** | 需调整架构但功能不变 | correct-course → update arch → dev | -| **regression** | 验证已有功能 | dev regression → journey | +| **regression** | 验证已有功能 | dev regression | | **design** | 只改 UI 不改逻辑 | prototype → dev 相关 story | ## 使用方式 ``` -/d8d-iterate <变更描述> # 提供描述时按描述分析 -/d8d-iterate # 无描述时自动检测 git 变更并推断 +/d8d-iterate <变更描述> 示例: /d8d-iterate 增加多城市批量任务调度功能 /d8d-iterate 修复搜索结果为空的问题 /d8d-iterate 重构数据模型为多城市支持 /d8d-iterate 回归验证所有功能 -/d8d-iterate # 自动检测最近代码变更,智能路由 -/d8d-iterate 验证一下 # 模糊描述也能正确路由 ``` diff --git a/.claude/skills/d8d-iterate/phase-00-scan.md b/.claude/skills/d8d-iterate/phase-00-scan.md index a809d18..14ca206 100644 --- a/.claude/skills/d8d-iterate/phase-00-scan.md +++ b/.claude/skills/d8d-iterate/phase-00-scan.md @@ -170,110 +170,3 @@ IF design_file_changed == true: ``` 将项目类型写入 `iterate-checkpoint.md`。 - -### 3.6 代码变更扫描(⭐ 新增) - -扫描当前代码变更,用于辅助变更分析和路由决策。 - -**检测流程**: - -``` -1. git status --short → 检测未提交的变更文件列表 -2. git diff HEAD~1 --stat → 检测最近一次提交的变更文件 -3. git log --oneline -5 → 获取最近 5 次提交记录 -4. 汇总变更文件,按目录分类: - - src/app/api/ → API 路由变更 - - src/server/ → 后端逻辑变更(provider、service 等) - - src/components/ → UI 组件变更 - - prisma/ → 数据模型变更 - - 其他文件 -``` - -**智能分类规则**: - -``` -IF 变更文件数 = 0 且无未提交变更: - → code_changed: false - -IF 变更文件数 1-3 且集中在同一模块: - → code_changed: true, change_scale: small - -IF 变更文件数 > 3 或跨多模块: - → code_changed: true, change_scale: medium/large - -IF 涉及数据模型(prisma/): - → 额外标记 schema_changed: true -``` - -**输出写入 iterate-context.md**: - -```markdown -### 代码变更状态 -code_changed: true/false -change_scale: none | small | medium | large -schema_changed: true/false - -最近提交: -| 提交 | 描述 | 文件数 | -|------|------|--------| -| abc1234 | fix: xxx | 3 | - -变更文件: -| 文件 | 变更类型 | 分类 | -|------|---------|------| -| src/server/providers/amap-provider.ts | modified | provider | -``` - -**无 git 仓库时**:跳过此步骤,`code_changed: unknown`。 - -### 3.7 上次迭代残留状态检查(⭐ 新增) - -检测上次 d8d-iterate 迭代是否有未完成的步骤需要补跑。 - -**检测流程**: - -``` -1. 读取 {planning_artifacts}/.iterate-checkpoint.md - → 获取 status、change_type、completed_phases -2. 读取 {planning_artifacts}/.iterate-progress.md - → 获取每个 Phase/Step 的详细执行状态 -3. 检查规则: - IF checkpoint 不存在: - → has_previous_iteration: false, 跳过 - IF checkpoint.status == "in_progress": - → has_incomplete_steps: true(上次中断了,需要恢复) - → 记录 current_phase 作为恢复点 - IF checkpoint.status == "completed": - → 扫描 progress 中所有 Phase/Step - → IF 任何 Step 状态为 "skipped": - → has_incomplete_steps: true - → 记录所有 skipped 的 Phase + Step + 原因 - → ELSE: - → has_incomplete_steps: false(上次迭代完全成功) - IF checkpoint.status == "failed": - → has_incomplete_steps: true(需要从失败点恢复) - → 记录失败的 Phase/Step -``` - -**输出写入 iterate-context.md**: - -```markdown -### 上次迭代残留状态 -has_previous_iteration: true -previous_iteration_type: regression -previous_status: completed -has_incomplete_steps: true -incomplete_steps: - - phase: phase-05-verify - step: journey - reason: "skipped (d8d-iterate 回归模式)" - step_completed: regression (3/3 PASS) -``` - -或 - -```markdown -### 上次迭代残留状态 -has_previous_iteration: false -has_incomplete_steps: false -``` diff --git a/.claude/skills/d8d-iterate/phase-01-analyze.md b/.claude/skills/d8d-iterate/phase-01-analyze.md index 11ded61..ef22c7c 100644 --- a/.claude/skills/d8d-iterate/phase-01-analyze.md +++ b/.claude/skills/d8d-iterate/phase-01-analyze.md @@ -35,53 +35,6 @@ **混合类型处理**:如果包含多种意图,按优先级 feature > refactor > bugfix > design 取主要类型,次要类型记录为附加任务。 -**⭐ 自动推断(用户描述模糊或未提供时)**: - -当用户描述为以下情况时,触发代码变更状态推断: -- 未提供描述(空字符串) -- 极短描述(<10字符,如"验证"、"看看"、"跑一下") -- 描述不含任何上表分类关键词 - -推断优先级:上次迭代残留检查 > 用户描述关键词 > 代码变更状态推断 - -**⭐⭐ 最高优先级:上次迭代残留检查**: - -在所有其他推断之前,先检查 iterate-context.md 的「上次迭代残留状态」: - -``` -IF has_incomplete_steps == true: - → 变更类型: completion(补完上次迭代跳过的步骤) - → 跳过后续所有推断逻辑 - → 执行路径:根据 incomplete_steps 精确路由 - 例:上次 journey 被跳过且 regression 已 PASS - → 直接执行 Phase 5 Step 5.2 (journey),跳过 Step 5.1 (regression) - → 写入 iterate-context.md 并说明补完理由 - → 更新 iterate-checkpoint.md: status=in_progress, change_type=completion -``` - -IF has_incomplete_steps == false 或 has_previous_iteration == false: - → 继续下面的推断逻辑 - -推断逻辑(读取 iterate-context.md 的代码变更状态): - -``` -IF code_changed == false: - → regression(代码没改,只需验证现有功能) - -IF code_changed == true: - → 分析变更文件路径和 commit message 自动分类: - - change_scale=small + 集中在后端(provider/service) → bugfix - - 涉及新文件/新路由/新组件 → feature - - 跨多模块 + commit 含"重构/优化/迁移" → refactor - - 仅样式/布局文件变更 → design - - 无法判断 → 默认 regression + 在报告中说明推断理由 - -IF code_changed == unknown(非 git 仓库): - → 跳过推断,回退到询问用户 -``` - -将推断结果写入 iterate-context.md 并说明推断理由。 - ### Step 1.3: 影响范围评估 根据变更类型,评估影响范围: @@ -140,14 +93,6 @@ IF code_changed == unknown(非 git 仓库): 根据变更类型和影响评估,确定执行路径: ``` -completion(⭐⭐ 最高优先级,补完上次迭代跳过的步骤): - → 根据 incomplete_steps 精确路由到对应的 Phase/Step - → 跳过已完成的步骤(检查 iterate-progress.md 中已 PASS/completed 的步骤) - → 例:上次 regression PASS 但 journey skipped - → 只执行 Phase 5 Step 5.2 (journey),跳过 Step 5.1 (regression) - → 执行前更新 iterate-checkpoint.md: status=in_progress - → 执行完成后更新 iterate-progress.md 并标记 status: completed - greenfield: → 调用 d8d-requirements (全量) → 完成后自动触发 d8d-prototype @@ -156,43 +101,42 @@ greenfield: feature (low risk, 无新 UI 页面): → Phase 2: edit-prd + update arch/ux + new epic → Phase 4: d8d-dev --epic {new-epic} - → Phase 5: d8d-dev --regression → d8d-dev --journey + → Phase 5: d8d-dev --regression feature (low risk, 有新 UI 页面): → Phase 2: edit-prd + update arch/ux + new epic → Phase 3: d8d-prototype --incremental [P] 或 [A](⛔ 铁律六 MANDATORY) → Phase 4: d8d-dev --epic {new-epic} - → Phase 5: d8d-dev --regression → d8d-dev --journey + → Phase 5: d8d-dev --regression feature (medium/high risk): → Phase 2: edit-prd + correct-course + update docs + new epic → Phase 3: d8d-prototype --incremental(⛔ 如有新 UI 则 MANDATORY,铁律六) → Phase 4: d8d-dev --epic {new-epic} - → Phase 5: d8d-dev --regression → d8d-dev --journey + → Phase 5: d8d-dev --regression bugfix (single file): → Phase 4: 直接修复 + d8d-dev --story {story-id} - → Phase 5: d8d-dev --regression (可选) → d8d-dev --journey (可选,依赖回归执行) + → Phase 5: d8d-dev --regression (可选) bugfix (multi file): → Phase 2: 如果需要更新文档 → Phase 4: d8d-dev --story {story-id} - → Phase 5: d8d-dev --regression → d8d-dev --journey + → Phase 5: d8d-dev --regression refactor: → Phase 2: correct-course + update docs → Phase 4: d8d-dev --epic {affected-epic} - → Phase 5: d8d-dev --regression → d8d-dev --journey + → Phase 5: d8d-dev --regression regression: - → Phase 5: d8d-dev --regression → d8d-dev --journey - (Phase 5 包含回归验证和旅程验证两步,回归 PASS 后必须继续旅程验证) + → Phase 5 only: d8d-dev --regression design: → Phase 2.5: 设计工具适配层重新提取设计变量(⭐ 如 design_file_changed=true 则必须) → Phase 3: d8d-prototype --incremental(使用最新设计截图作为基准) → Phase 4: d8d-dev --story {affected-stories} - → Phase 5: d8d-dev --regression (可选) → d8d-dev --journey (可选,依赖回归执行) + → Phase 5: d8d-dev --regression (可选) ``` ## 输出 diff --git a/.claude/skills/d8d-iterate/phase-04-dev.md b/.claude/skills/d8d-iterate/phase-04-dev.md index 5383b93..316a1e9 100644 --- a/.claude/skills/d8d-iterate/phase-04-dev.md +++ b/.claude/skills/d8d-iterate/phase-04-dev.md @@ -44,8 +44,6 @@ Skill(skill: "d8d-dev", args: "--epic epic-7") - 逐 Story 执行 CREATE-SPEC → IMPLEMENT → TEST → REVIEW → MARK-DONE - 更新 pipeline-state.yaml -**⛔ 方式 A 完成后,零暂停自动执行 Phase 5 验证。** 加载 [phase-05-verify.md](phase-05-verify.md) 执行回归验证、旅程验证和变更报告。不得在 Phase 4 完成后停止或等待用户输入。 - ### 方式 B: 单 Story 修复 定位到具体 Story 进行修复。 @@ -62,8 +60,6 @@ args: "--story {story-id}" Skill(skill: "d8d-dev", args: "--story 7-3") ``` -**⛔ 方式 B 完成后,零暂停自动执行 Phase 5 验证。** 加载 [phase-05-verify.md](phase-05-verify.md) 执行回归验证、旅程验证和变更报告。不得在 Phase 4 完成后停止或等待用户输入。 - ### 方式 C: Bug 直接修复(无 Story) 对于简单的 bug,无需创建 Story,直接修复: @@ -81,8 +77,6 @@ Skill(skill: "d8d-dev", args: "--story 7-3") **注意**:此方式不调用 Skill tool,直接在当前对话中执行修复。修复完成后必须自动提交推送,不询问用户。 -**⛔ 方式 C 完成后,零暂停自动执行 Phase 5 验证。** 加载 [phase-05-verify.md](phase-05-verify.md) 执行回归验证、旅程验证和变更报告。不得在 Phase 4 完成后停止或等待用户输入。 - ## 输出 更新 `iterate-progress.md`: diff --git a/.claude/skills/d8d-iterate/phase-05-verify.md b/.claude/skills/d8d-iterate/phase-05-verify.md index 64540fe..5159295 100644 --- a/.claude/skills/d8d-iterate/phase-05-verify.md +++ b/.claude/skills/d8d-iterate/phase-05-verify.md @@ -4,43 +4,8 @@ **验证顺序**(与 d8d-dev 铁律一致):回归验证 → 旅程验证,不得跳过回归直接旅程。 -## ⛔ Phase 5 入口检查(每次进入或恢复本文件时执行) - -1. 读取 `iterate-progress.md` -2. 根据 Phase 5 Step 状态定位恢复点: - - `step-51-regression` 不存在 → 从 Step 5.0 开始 - - `step-51-regression: completed` + `step-51-result: PASS` + `step-52-journey: pending` → **直接跳到 Step 5.2**(跳过已完成的构建和回归) - - `step-51-regression: completed` + `step-51-result: FAIL` → **跳到 Step 5.3**(跳过旅程) - - `step-52-journey: completed` → **跳到 Step 5.3**(生成报告) - ## 执行步骤 -### Step 5.0: 生产构建与外网验证 - -**⛔ Phase 4 代码变更完成后必须执行。即使是跳过回归的低风险 bugfix 也必须执行。** - -#### 5.0.1: 生产构建 + 重启 - -按照 d8d-dev (`reference/platform-nextjs.md`) 的 HMR 降级策略执行: - -```bash -npx next build -pm2 restart app -``` - -等待服务就绪:`pm2 logs app --lines 3 --nostream` - -#### 5.0.2: 外网域名验证 - -复用 d8d-dev (`phase-00-setup.md` 步骤 4.5~4.6) 的外网域名发现与连通性验证流程: - -1. 从 NPM MCP 获取外网域名,或从 `pipeline-context.md` 读取 -2. 使用 Playwright 在外网域名上打开本次变更涉及的功能页面 -3. 确认页面正常加载(无 stale chunk 错误) -4. 对本次变更点做基本交互验证 - -**条件跳过**:如果 `pipeline-context.md` 中 `URL_MODE` 为 `localhost(fallback)` 且外网域名不可达 → 跳过,记录原因 - ### Step 5.1: 回归测试 **⛔ 必须调用 Skill tool 执行 d8d-dev 回归验证。** @@ -78,10 +43,7 @@ IF 变更类型 == feature 且 risk == low: **⛔ 结果判定**(Skill 调用返回后立即判断): -- 全部 PASS → ⛔ 立即执行以下三步(零暂停,不输出汇总,不询问用户): - 1. 更新 `iterate-progress.md`: `step-51-regression: completed, step-51-result: PASS, step-52-journey: pending` - 2. 读取 `iterate-progress.md` 确认状态 - 3. 调用 Skill tool 执行 Step 5.2 旅程验证 +- 全部 PASS → 零暂停,自动继续 Step 5.2 旅程验证 - 有 FAIL → **⛔ 自动修复流程**: 1. 分析失败原因,定位 bug 2. 使用 Edit tool 修复 @@ -108,11 +70,6 @@ skill: "d8d-dev" args: "--journey 旅程验证。验证所有用户旅程,包括已有旅程和新增功能的旅程。" ``` -**⛔ Step 5.2 返回后三步协议**: -1. 写入进度:`step-52-journey: completed, step-52-result: PASS/FAIL` -2. 读取 `iterate-progress.md` 确认状态 -3. 零暂停继续 Step 5.3 生成变更报告 - **铁律**: - 回归验证 PASS 后才能执行旅程验证 - 功能不存在时测旅程无意义(⛔ 不得跳过回归直接旅程) diff --git a/.claude/skills/d8d-iterate/workflow.md b/.claude/skills/d8d-iterate/workflow.md index 734618e..beaa28e 100644 --- a/.claude/skills/d8d-iterate/workflow.md +++ b/.claude/skills/d8d-iterate/workflow.md @@ -41,7 +41,6 @@ ↓ ┌──────────────────────┐ │ 决策路由 │ - │ completion? ─→ 仅执行上次跳过的 Phase/Step(⭐⭐ 最高优先级) │ greenfield? ───→ 全量流程 (d8d-requirements → prototype → dev) │ feature? ───→ Phase 2 → (has UI? → Phase 3 ⛔) → Phase 4 → 5 │ bugfix? ───→ Phase 4 (single-story) @@ -124,13 +123,7 @@ phase-01-analyze: completed | skipped | failed phase-02-docs: completed | skipped | failed phase-03-prototype: completed | skipped | failed phase-04-dev: completed | skipped | failed -phase-05-verify: - step-50-build: completed | skipped | failed - step-51-regression: completed | skipped | failed - step-51-result: PASS | FAIL | SKIPPED - step-52-journey: pending | completed | skipped | failed - step-52-result: PASS | FAIL | SKIPPED - step-53-report: pending | completed +phase-05-verify: completed | skipped | failed ``` ## 执行流程 @@ -139,7 +132,7 @@ phase-05-verify: **输入**: 用户通过 `/d8d-iterate <描述>` 提供的变更需求。 -如果用户未提供描述或描述模糊(<10字符且无分类关键词),**不询问用户**,Phase 0 扫描时自动检测 git 变更,Phase 1 基于代码变更状态自动推断变更类型。仅在推断信心低时才询问用户确认。 +如果用户未提供描述,询问:请描述您需要的变更。 ### Step 1: 执行 Phase 0 — 项目状态扫描 @@ -159,7 +152,6 @@ phase-05-verify: | 变更类型 | 执行路径 | 跳过 | |----------|----------|------| -| **completion** | 仅执行上次跳过的 Phase/Step(⭐ 最高优先级) | 所有已完成的 Phase/Step | | **greenfield** | Phase 0 → 调用 d8d-requirements → d8d-prototype → d8d-dev(内置回归+旅程) | Phase 1-5 全跳过 | | **feature** | Phase 2 → (Phase 3: 有新UI则⛔MANDATORY) → Phase 4 → Phase 5 | 按需 | | **bugfix** | Phase 4 (single-story) → Phase 5 | Phase 2, 3 | @@ -171,8 +163,6 @@ phase-05-verify: 每个 Phase 加载对应的 phase-XX 文件,**零暂停**依次执行。 -**⛔ Phase 过渡铁律**:每个 Phase 文件末尾的"继续下一 Phase"指令与铁律同等优先级。Phase 4 完成后**必须**加载 [phase-05-verify.md](phase-05-verify.md) 执行验证,无论变更类型(bugfix 也不例外)。不得在任意 Phase 完成后停止或等待用户输入。 - ### Step 5: 输出变更报告 所有 Phase 完成后,生成变更报告: @@ -211,14 +201,3 @@ Phase 5 — 旅程验证: 4. **错误恢复**:Phase 失败时记录状态,支持从断点恢复 5. **复用子技能**:通过 Skill tool 调用 d8d-requirements/d8d-prototype/d8d-dev,不重新实现 6. **自动提交推送**:每个 Phase 产生代码变更后立即 git commit + git push,不询问用户。包括 bug 修复、文档更新、状态文件变更 — 全部自动提交推送 - -### ⛔ Phase 内 Step 过渡守卫 - -Phase 内含多个 Step 且 Step 间有 Skill 调用时,Skill 返回后执行**"写-读-继续"三步**: - -1. **写**:立即将当前 Step 结果写入 `iterate-progress.md` -2. **读**:读取 `iterate-progress.md` 确认当前进度 -3. **继续**:找到下一个 pending 的 Step 执行(不询问、不停顿) - -进度文件是跨 Skill 调用的"外部记忆",确保上下文丢失或压缩后仍可恢复。 -任何 Step 完成后,必须检查进度文件中是否还有 pending 的 Step,而非直接结束 Phase。 diff --git a/.claude/skills/d8d-requirements/workflow.md b/.claude/skills/d8d-requirements/workflow.md index 698c21d..40fdbe6 100644 --- a/.claude/skills/d8d-requirements/workflow.md +++ b/.claude/skills/d8d-requirements/workflow.md @@ -51,7 +51,6 @@ progress_file: '{planning_artifacts}/.pipeline-progress.md' | 2-规划 | 2.1 | `bmad-create-prd` | `*prd*.md` | 产品简报 | | 2-规划 | 2.2 | `bmad-validate-prd` | 验证报告(内嵌) | PRD | | 2-规划 | 2.3 | `bmad-create-ux-design` | `*ux*.md` | PRD | -| 2-规划 | 2.4 | (流水线内置) | `.pen` 设计文件同步 | PRD, UX, 已有 .pen | | 3-解决方案 | 3.1 | `bmad-create-architecture` | `*arch*.md` | PRD, UX | | 3-解决方案 | 3.2 | `bmad-create-epics-and-stories` | `*epic*.md` | PRD, 架构 | | 3-解决方案 | 3.3 | `bmad-check-implementation-readiness` | 就绪报告 | 全部 | @@ -97,8 +96,7 @@ phase-01 → 预读上下文 → bmad-product-brief → 验证 → 三文件更 phase-02 → 2.1: 预读产品简报 → bmad-create-prd → 验证 → 三文件更新 2.2: 预读PRD → bmad-validate-prd → 读取结果 → 如Critical自动修复循环 - 2.3: 预读PRD+设计 → bmad-create-ux-design → 验证 → 三文件更新 - 2.4: 检测 UX 设计文档是否新增页面规范 → 如果需要,调用 Pencil MCP 在 .pen 中创建对应页面 → 截图验证设计效果 → 如视觉效果不佳,自动进入优化循环(调整布局配色直到满意)→ 更新设计上下文 → 三文件更新 → 自动继续 + 2.3: 预读PRD+设计 → bmad-create-ux-design → 验证 → 三文件更新 → 自动继续 phase-03 → 3.1: 预读PRD+UX → bmad-create-architecture → 验证 → 三文件更新 3.2: 预读PRD+架构+UX → bmad-create-epics-and-stories → 验证 → 三文件更新 @@ -208,9 +206,8 @@ phases: status: in_progress steps: prd: done - prd-validation: done - ux-design: done - design-sync: pending + prd-validation: in_progress + ux-design: pending phase-03: status: pending steps: @@ -248,7 +245,6 @@ phases: | create-prd | 页面导航流程 + 功能区域 + 组件概览 | | validate-prd | (不注入,验证已有PRD) | | create-ux-design | 完整设计系统:变量、组件、页面布局 | -| **design-sync (built-in)** | 检查 UX 文档是否新增页面 → 创建页面 → **截图验证 + 自动优化循环** → 更新设计上下文 | | create-architecture | 组件层级 + 数据流模式 | | create-epics | 页面级功能分解 | | check-readiness | (不注入,验证已有产物) | @@ -264,7 +260,6 @@ phases: ✅ 2.1 PRD done ✅ 2.2 PRD验证 Pass ✅ 2.3 UX设计 done -✅ 2.4 设计文件同步 done ✅ 3.1 架构 done ✅ 3.2 史诗与故事 done ✅ 3.3 就绪检查 Pass