OpenSpec:规范驱动开发(SDD)实践指南
在 AI 编程时代,"氛围编码(Vibe Coding)"虽然让开发变得轻松,但 AI 生成代码的随机性与软件工程对确定性、可靠性的要求存在冲突。**规范驱动开发(Spec-Driven Development, SDD)**正是为了解决这一核心矛盾而诞生的方法论,而 OpenSpec 是该领域最流行的开源框架。
什么是 SDD
传统开发流程:需求 → 代码 → 测试
SDD 开发流程:需求 → 规范(Spec)→ 代码 → 测试
SDD 的核心思想是:在写任何代码之前,人和 AI 先就"要构建什么"达成一致。规范(Spec)成为唯一的真实来源(Single Source of Truth),它存储在代码仓库中,结构化的、可被 AI 直接读取和执行。
为什么需要 SDD
| 问题 | SDD 的解决方式 |
|---|---|
| AI 理解偏差,生成的代码不是你想要的 | 先写规范对齐意图,再生成代码 |
| 多轮对话后 AI 忘了上下文 | 规范文件持久化在仓库中,随时可读 |
| 团队成员用不同 AI 工具,结果不一致 | 统一的规范文件作为所有 AI 的指令源 |
| 代码改了但不知道为什么改 | 每次变更都有提案(proposal)记录动机 |
| AI 一次改太多,难以审查 | 变更被拆分为原子化的任务清单 |
什么是 OpenSpec
OpenSpec 是一个轻量级的 SDD 框架,遵循五个设计原则:
- 流动而非僵化(Fluid not Rigid)—— 任何产出物可随时更新,无阶段门禁
- 迭代而非瀑布(Iterative not Waterfall)—— 持续改进,非一次定稿
- 简单而非复杂(Easy not Complex)—— 最小化仪式感
- 存量优先(Brownfield-first)—— 专为已有项目设计,不只是新建项目
- 可伸缩(Scalable)—— 从个人项目到企业级均适用
OpenSpec 支持 20+ 种 AI 编程工具,包括 Claude Code、Cursor、GitHub Copilot、Windsurf 等。
安装与初始化
环境要求
- Node.js >= 20.19.0
安装
# npm
npm install -g @fission-ai/openspec@latest
# pnpm
pnpm add -g @fission-ai/openspec@latest
# yarn
yarn global add @fission-ai/openspec@latest
初始化项目
cd your-project
openspec init
初始化过程中会交互式地让你选择使用的 AI 工具(Claude Code、Cursor 等),然后自动生成配置和目录结构。
也可以通过参数直接指定:
openspec init --tools claude,cursor
核心概念:双文件夹模型
OpenSpec 最关键的设计是将当前系统状态和变更提案物理隔离到两个文件夹:
project_root/
├── openspec/
│ ├── AGENTS.md # AI 行为指引(机器可读)
│ ├── project.md # 全局上下文:技术栈、架构、约定
│ ├── specs/ # 当前系统的真实规范(Source of Truth)
│ │ ├── user-auth/
│ │ │ └── spec.md
│ │ └── payment/
│ │ └── spec.md
│ └── changes/ # 进行中的变更提案
│ ├── add-oauth-login/
│ │ ├── proposal.md # 变更理由和范围
│ │ ├── design.md # 技术方案
│ │ ├── tasks.md # 实现任务清单
│ │ └── specs/ # 规范差异(Delta)
│ └── archive/ # 已完成的变更归档
├── src/
└── ...
为什么要分离
| 文件夹 | 含义 | 类比 |
|---|---|---|
specs/ | "系统现在是什么样的" | Git 的 main 分支 |
changes/ | "我想把系统改成什么样" | Git 的 feature 分支 |
这种分离让你清楚地区分已有功能和正在修改的功能,避免混淆,也让变更审查变得简单。
核心文件说明
project.md —— 全局上下文
定义项目的技术栈、架构模式、编码规范等全局信息,所有 AI 工具读取此文件来理解项目背景:
# 项目名称
## 技术栈
- 后端:Spring Boot 3.2, Java 17
- 数据库:PostgreSQL 15
- 缓存:Redis 7
## 架构模式
- COLA 四层架构
- DDD 领域驱动设计
## 编码规范
- 依赖注入使用 @RequiredArgsConstructor
- 日期类型使用 LocalDateTime
AGENTS.md —— AI 行为指引
包含 <openspec-instructions> 标签,指导 AI 在生成代码前先阅读相关规范:
<openspec-instructions>
Before generating any code:
1. Read openspec/project.md for global context
2. Check openspec/specs/ for current system state
3. Read openspec/changes/ for active proposals
4. Follow the tasks.md checklist when implementing
</openspec-instructions>
proposal.md —— 变更提案
记录变更的业务动机和范围:
# 提案:添加双因素认证(2FA)
## 背景
当前系统仅支持用户名密码登录,安全性不足。
## 目标
- 支持 TOTP 方式的双因素认证
- 用户可选择开启/关闭 2FA
## 范围
- 新增:2FA 配置接口、验证接口
- 修改:登录流程增加 2FA 校验步骤
- 不变:注册流程、密码重置流程
tasks.md —— 实现任务清单
将变更拆分为原子化的实现步骤:
# 任务清单
- [ ] 创建 `totp_config` 数据表
- [ ] 实现 TOTP 密钥生成服务
- [ ] 实现 2FA 配置 API(开启/关闭)
- [ ] 修改登录流程,增加 2FA 校验
- [ ] 添加单元测试
- [ ] 更新 API 文档
design.md —— 技术方案
记录关键技术决策:
# 技术设计
## TOTP 实现
- 使用 `com.eatthepath:java-otp` 库
- 密钥存储在 `totp_config` 表,加密存储
## 接口设计
- POST /v1/pt/totp/enable —— 开启 2FA,返回密钥和二维码
- POST /v1/pt/totp/verify —— 验证 TOTP 码
- DELETE /v1/pt/totp/disable —— 关闭 2FA