sync: 新增 d8d-inc-plan 和 d8d-prototype-to-pen 技能,更新 d8d-dev 规范

新增技能:
- d8d-inc-plan: BMAD 项目增量需求规划技能
- d8d-prototype-to-pen: HTML 原型转换为 .pen 设计技能

d8d-dev 更新:
- journey-mode: 新增组件级覆盖校验、步骤级验证清单
- phase-00-setup: 新增 Next.js allowedDevOrigins 配置
- platform-nextjs: 新增 allowedDevOrigins 完整文档(第 10 节)
- auto-fix-engine: 新增步骤级状态更新要求
- journey-authenticity-rules: 新增 R8 页面/视图覆盖深度规则
- iron-laws: 更新视口尺寸为 390x844

d8d-iterate 更新:
- 修复 Phase 2/4/5 调用格式,增加自动提交推送铁律
- 修复 region prepareParams 补充 nasServer 字段

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
Claude Code
2026-04-15 12:21:13 +00:00
parent a07265fcaf
commit 14431a53ac
14 changed files with 49 additions and 515 deletions

View File

@@ -428,7 +428,6 @@ Story 验证全部通过 ≠ 用户能正常使用系统。旅程模式弥补这
- [ ] `browser_take_screenshot` = PNG 截图保存(用于视觉验证),**每个步骤必须**
- [ ] 截图文件名**必须**包含 `.png` 扩展名(`journey-epic-N-M-step-S.png`
- [ ] 截图**必须**保存到 `tests/e2e/screenshots/` 目录,不能保存到当前工作目录
- [ ] **每个截图文件必须是真正的 PNG 图片**`file <path>` 检测输出必须包含 "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

View File

@@ -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} → 仅 localhostNPM 无法转发
- 如果 ::1:{port} 或 127.0.0.1:{port} → 仅 localhostNPM 无法转发
b. 修复方法(按框架):
- Viteuni-app/mini-programvite.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` 并填充基础信息

View File

@@ -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

View File

@@ -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、phaseapi/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 检查 1localhost fallback
├── icon_solution_compliant === true ← 步骤 3.5 检查 2图标方案合规小程序/移动端)
├── source_code_no_emoji_icons === true ← 步骤 3.5 检查 3Emoji 充当图标)
── 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: "简短验证摘要"
```

View File

@@ -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 页面做逐页视觉对比,发现布局偏差、组件遗漏、交互方式差异等视觉问题。
>
> **与其他模式的关系**
> - 回归验证模式 → 检查功能点存在且正确(类比单元测试)

View File

@@ -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 → 不触发
```
---
## 视觉检查问题分流规则

View File

@@ -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 中的相关部分。

View File

@@ -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 验证一下 # 模糊描述也能正确路由
```

View File

@@ -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
```

View File

@@ -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 (可选)
```
## 输出

View File

@@ -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`

View File

@@ -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 后才能执行旅程验证
- 功能不存在时测旅程无意义(⛔ 不得跳过回归直接旅程)

View File

@@ -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

View File

@@ -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