Files
2026-07-13 21:37:08 +08:00

200 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: spec-driven-development
description: 在编码前先创建规格说明。适用于启动新项目、新功能或重大变更且尚无规格说明的场景。适用于需求不明确、含糊不清或仅为一个模糊构思的情况。
---
# 规格驱动开发
## 概述
在编写任何代码之前,先撰写一份结构化的规格说明。规格说明是你与人类工程师之间共享的事实源头——它定义了我们正在构建什么、为什么构建以及如何判断完成。没有规格说明的代码就是瞎猜。
## 何时使用
- 启动新项目或新功能
- 需求含糊不清或不完整
- 变更涉及多个文件或模块
- 你即将做出架构决策
- 任务实施时间超过 30 分钟
**何时不使用:** 单行修复、拼写更正,或需求明确且自包含的变更。
## 门控工作流
规格驱动开发分为四个阶段。在当前阶段未经验证之前,不得进入下一阶段。
```
SPECIFY ──→ PLAN ──→ TASKS ──→ IMPLEMENT
│ │ │ │
▼ ▼ ▼ ▼
人工审核 人工审核 人工审核 人工审核
```
### 阶段 1:规格定义
从高层愿景开始。向人类提出澄清性问题,直到需求变得具体。
**立即暴露假设。** 在撰写任何规格内容之前,列出你所做的假设:
```
我正在做的假设:
1. 这是一个 Web 应用(不是原生移动端)
2. 认证使用基于会话的 Cookie(不是 JWT)
3. 数据库是 PostgreSQL(基于现有的 Prisma 模式)
4. 我们只针对现代浏览器(不支持 IE11)
→ 请现在纠正我,否则我将按此推进。
```
不要默默填补模糊的需求。规格说明的整个目的就是在代码编写*之前*暴露误解——而假设是最危险的误解形式。
**撰写涵盖以下六个核心领域的规格文档:**
1. **目标**——我们在构建什么以及为什么?用户是谁?成功是什么样子?
2. **命令**——包含标志的完整可执行命令,而不仅仅是工具名称。
```
构建:npm run build
测试:npm test -- --coverage
代码检查:npm run lint --fix
开发:npm run dev
```
3. **项目结构**——源代码在哪里,测试放哪里,文档归哪里。
```
src/ → 应用程序源代码
src/components → React 组件
src/lib → 共享工具函数
tests/ → 单元测试和集成测试
e2e/ → 端到端测试
docs/ → 文档
```
4. **代码风格**——一段真实的代码示例胜过三段描述。包括命名约定、格式化规则以及合格输出的示例。
5. **测试策略**——使用什么框架、测试放在哪里、覆盖率要求、针对哪些关注点使用哪些测试层级。
6. **边界**——三层体系:
- **始终执行:** 提交前运行测试、遵循命名约定、验证输入
- **先询问:** 数据库模式变更、添加依赖项、更改 CI 配置
- **绝不执行:** 提交密钥、编辑供应商目录、未经批准删除失败的测试
**规格模板:**
```markdown
# 规格:[项目/功能名称]
## 目标
[我们要构建什么以及为什么。用户故事或验收标准。]
## 技术栈
[框架、语言、关键依赖项及版本]
## 命令
[构建、测试、代码检查、开发——完整命令]
## 项目结构
[目录布局及描述]
## 代码风格
[示例代码片段 + 关键约定]
## 测试策略
[框架、测试位置、覆盖率要求、测试层级]
## 边界
- 始终执行:[...]
- 先询问:[...]
- 绝不执行:[...]
## 成功标准
[如何判断完成——具体、可测试的条件]
## 未决问题
[任何需要人工输入的未解决事项]
```
**将指令重新表述为成功标准。** 当收到模糊需求时,将其转化为具体条件:
```
需求:"让仪表盘更快"
重新表述的成功标准:
- 在 4G 网络下,仪表盘 LCP < 2.5 秒
- 初始数据加载在 500 毫秒内完成
- 加载过程中无布局偏移(CLS < 0.1
→ 这些是合适的目标吗?
```
这样你就可以朝着明确的目标进行循环、重试和问题解决,而不是猜测"更快"是什么意思。
### 阶段 2:计划
有了经过验证的规格说明,生成技术实施方案:
1. 识别主要组件及其依赖关系
2. 确定实施顺序(必须先构建什么)
3. 记录风险及应对策略
4. 识别哪些可以并行构建,哪些必须顺序进行
5. 在阶段之间定义验证检查点
计划应可供审核:人类应能阅读后说"是的,这是正确的方法"或"不,请修改 X"。
### 阶段 3:任务
将计划拆分为离散的、可实施的任务:
- 每个任务应能在一次专注的会话中完成
- 每个任务有明确的验收标准
- 每个任务包含一个验证步骤(测试、构建、手动检查)
- 任务按依赖关系排序,而非按感知重要性排序
- 每个任务涉及的更改文件不应超过约 5 个
**任务模板:**
```markdown
- [ ] 任务:[描述]
- 验收标准:[完成时必须满足的条件]
- 验证方式:[如何确认——测试命令、构建、手动检查]
- 涉及文件:[将被更改的文件]
```
### 阶段 4:实施
按照 `skills/incremental-implementation/SKILL.md``incremental-implementation`)和 `skills/test-driven-development/SKILL.md``test-driven-development`)的指导,逐个执行任务。使用 `skills/context-engineering/SKILL.md``context-engineering`)在每一步加载正确的规格章节和源文件,而不是用整个规格说明淹没 Agent。
## 保持规格说明的活力
规格说明是一份持续更新的文档,而非一次性产物:
- **决策变更时更新**——如果发现数据模型需要更改,先更新规格说明,然后再实施。
- **范围变更时更新**——新增或删减的功能应反映在规格说明中。
- **提交规格说明**——规格说明应与代码一同纳入版本控制。
- **在 PR 中引用规格说明**——链接回每个 PR 所实现的规格章节。
## 常见借口
| 借口 | 现实 |
|---|---|
| "这个很简单,不需要规格说明" | 简单的任务不需要*长篇*规格说明,但仍然需要验收标准。两行的规格说明也完全没问题。 |
| "我先写完代码再写规格说明" | 那是文档,不是规格说明。规格说明的价值在于在*编写代码之前*迫使思路清晰。 |
| "规格说明会拖慢进度" | 15 分钟的规格说明可以避免数小时的重做。15 分钟的水文设计胜过 15 小时的调试。 |
| "需求反正会变" | 正因为如此,规格说明才是一份持续更新的文档。过时的规格说明仍然比没有规格说明要好。 |
| "用户知道他们想要什么" | 即使明确的需求也包含隐含假设。规格说明正是为了暴露这些假设。 |
## 警示信号
- 在没有书面需求的情况下开始编写代码
- 在明确"完成"是什么意思之前就问"我是不是可以直接开始构建?"
- 实现任何规格说明或任务列表中都未提及的功能
- 做出架构决策但不记录
- 因为"要构建什么很明显"而跳过规格说明
## 验证
在进入实施之前,请确认:
- [ ] 规格说明涵盖了全部六个核心领域
- [ ] 人类已审核并批准了规格说明
- [ ] 成功标准是具体且可测试的
- [ ] 边界(始终执行/先询问/绝不执行)已定义
- [ ] 规格说明已保存到仓库中的文件中