Skip to content

/plan

需求分析与方案设计。输出结构化的实现方案文件,等待人工审批后再执行。

需求分析与方案设计

步骤

Step 1: 理解需求

使用 AskUserQuestion 确认功能行为、边界、是否有类似功能可参考。

判断功能规模:

  • 小功能(改动 ≤ 3 个源码文件,无新数据模型):确认需求后进入 Step 2,Step 5 持久化为可选(问用户是否需要写 plan 文件)
  • 中大功能(跨模块 / 新数据模型 / 新 API / 改动 > 3 个源码文件):如果项目有 docs/spec.mddocs/product-spec.md,基于它设计方案;如果没有,追加结构化提问:
    • 目标用户是谁?要解决什么问题?
    • 核心用户故事(3-5 条)
    • In scope / Out of scope
    • 验收标准(Given/When/Then)

文件计数:只算源码文件(src/、lib/、app/ 等),不算测试、配置、文档。

判断改动性质(在 Step 2 搜索代码后可调整):

  • 兼容型 — 新增功能,不改已有接口 → 正常流程
  • 破坏型 — 修改现有 API 签名 / 数据结构 / 公共接口 → Step 3 先输出接口变更清单
  • 横切型 — 一个决策影响大量文件(如 i18n、主题系统、权限模型)→ Step 3 使用横切型四阶段结构

如果在 Step 1 无法确定改动性质,标记为"待定",Step 2 搜索代码后再判断。

Step 2: 检查现有代码

搜索代码库中已有的类似功能或可复用模块:

  1. 用 Grep 搜索与需求相关的关键词(功能名、领域词)
  2. 用 Glob 搜索相关目录结构(如 src/components/**/*.tsxsrc/api/**/*.ts
  3. 列出可复用的组件、工具函数、类型定义

搜索结果如何影响方案:

  • 找到可复用模块 → 方案中标注"复用 X",不重新实现
  • 找到类似功能 → 参考其模式和架构风格,保持一致性
  • 什么都没找到 → 直接说"无可复用代码",继续

此时可以重新评估 Step 1 的改动性质判断(如发现影响文件远超预期,调整为横切型)。

Step 3: 输出实现方案

所有方案必须包含的基础结构:

## 方案概述
[一句话描述实现思路]

## 影响范围
- 新建文件:[列出]
- 修改文件:[列出,标注改动点]
- 依赖变更:[列出新增/移除的包]

## 实现步骤
1. [步骤1 - 具体到文件和函数级别]
2. [步骤2]
...

## 非目标(本次不做)
- [明确列出不做的事项及理由,防止范围蠕变]

## 风险点
- [可能出问题的地方及应对措施]

中大功能追加(在基础结构前面):

  • 目标与非目标 + 用户故事与验收标准 + 范围边界
  • 部署路径验证(M0):本地→staging→production 的配置差异和验证步骤
  • 技术选型决策日志:新引入的技术/框架需记录选型理由和备选方案

破坏型追加(在方案最前面):

## 接口变更清单
| 变更项 | 变更前 | 变更后 | 受影响的调用方 |
|--------|--------|--------|--------------|
| [接口/类型] | [原签名] | [新签名] | [文件:函数] |

横切型替换实现步骤为四阶段:

## 实现步骤(横切型四阶段)
1. **基础设施**:建立横切能力的核心(context/provider/hook/middleware)
2. **数据层**:准备所有横切数据(翻译字典/主题 token/权限矩阵)
3. **批量替换**:改动所有消费方(文件多时可拆多个子代理并行,每个负责一组文件)
4. **测试修复**:统一修复因横切变更断裂的测试

横切型阶段 3 是唯一允许子代理并行的场景(文件间无联动依赖)。其他场景涉及 3+ 文件联动修改时,在主上下文顺序执行,不拆子代理。

执行约束(方案确认前自检):

  • 方案中不得出现"或"/"可选"/"也可以"等模糊措辞,每个步骤的技术选型必须唯一确定
  • 如果项目有 docs/product-spec.md,每个任务标注它服务的旅程(Journey: §3.x
  • 多阶段方案(分阶段交付)—— 每个阶段必须含三件套:①影响范围(新建/修改文件列表,到模块级)②量化验收阈值(可观测/可测试指标,如 "首屏 ≤0.3s"、"覆盖率 ≥80%"、"3 次自动提示触发")③风险点(阶段级,含尚未决策的技术选型)。不允许出现"能展示"/"可以调整"/"基本可用"等无量化措辞

Step 4: 等待确认

输出方案后,明确问用户:"方案是否可以?有需要调整的部分吗?"

处理用户反馈:

  • 确认("可以"/"没问题"/"开始做")→ 进入 Step 5
  • 部分修改("X 部分换一种方式")→ 修改方案中对应部分,重新展示变更处,再次确认
  • 全面否定("方案不对,换个思路")→ 回到 Step 1 重新理解需求
  • 追加需求("再加一个 Y 功能")→ 评估影响范围,更新方案,再次确认

Step 5: 持久化方案

用户确认后,将方案写入 docs/plans/{slug}.md

文件格式:

markdown
# {方案名称}
Status: active
Progress: 0/{N}
Date: YYYY-MM-DD

## 目标
[从 Step 1 提炼]

## 任务清单
- [ ] {步骤 1}(`涉及的文件`
- [ ] {步骤 2}
...

## 关键决策
[重大选型摘要,如有对应 ADR 则链接]

命名和索引规则:

  • slug 用 kebab-case,纯语义(如 auth-oauth.mdorder-export.md
  • N = 任务清单条目数
  • Status 只允许 4 个值:active / done / draft / superseded
  • 如果 docs/plans/ 不存在则创建
  • 如果同名 slug 文件已存在,追加数字后缀(如 auth-oauth-2.md
  • 如果 docs/plans/README.md 存在,追加一行索引;不存在则跳过

小功能快速路径: Step 1 判断为小功能时,问用户"需要写 plan 文件吗?"。用户说不需要则跳过 Step 5,方案只在对话中交付。

IMPORTANT

  • 里程碑拆分原则(中大功能适用):
    • 高技术风险任务前置(如未验证的第三方库、新数据库引擎)
    • 每个里程碑独立可交付、可验收
    • 接口设计预留后续扩展点(前向兼容)
    • 分层递进:基础层 → 功能层 → 体验层 → 质量层
  • 方案确认前不修改代码 — /plan 是纯分析阶段,在 Step 4 用户确认前,不要修改任何源码文件
  • 方案确认后不自行实现 — 方案写入 plan 文件后停止。代码实现由用户决定何时开始
  • Status 值标准化 — 只用 active / done / draft / superseded 四个值,不要用 completecompletedapproved 等近义词
  • 消除模糊措辞 — 方案中不得出现"或"/"可选"/"也可以",每个步骤的选型必须唯一确定
  • 小功能可跳过持久化 — 改动 ≤ 3 个源码文件的小功能,持久化为可选,不强制写 plan 文件

面向个人开发者的 AI 辅助编程工程化方案