OpenSpec 实战指南:从规范到代码的完整工作流
发布日期:2026-06-06 | 分类:AI 开发方法论 | 难度:进阶
一、简介
本文通过一个完整的实战案例——为电商后台添加订单导出功能——带你走一遍 OpenSpec + Claude Code 的完整工作流。你将看到从需求提出到规范编写、从技术设计到代码实施、再到归档的全过程。
前置要求
- ✅ 了解 OpenSpec 基本概念(建议先阅读 OpenSpec 基础概念与 OPSX 工作流)
- ✅ 已安装 OpenSpec CLI:
npm install -g @fission-ai/openspec@latest - ✅ 项目已初始化:
openspec init - ✅ 已配置 CLAUDE.md 绑定 OpenSpec 工作流
二、实战场景
2.1 项目背景
你正在开发一个电商后台管理系统,技术栈如下:
1 | 前端:React 18 + TypeScript + Tailwind CSS |
openspec/project.md 已配置好项目信息。
2.2 需求描述
用户提了一个新需求:
「订单列表页面需要加一个『导出 Excel』功能,支持按时间范围筛选导出。导出的 Excel 包含订单编号、用户昵称、商品名称、数量、单价、总金额、下单时间、订单状态。导出超过 5000 条时异步生成,完成后发通知。」
这个需求大约需要 半天到一天 的开发工作量,非常适合走完整的 OPSX 流程。
三、Step 1: /opsx:propose — 提出变更
在 Claude Code 中执行:
1 | /opsx:propose "订单列表页面加导出 Excel 功能,支持按时间范围筛选,导出超过5000条时异步生成" |
AI 生成 proposal.md:
1 | # Proposal: 订单导出功能 |
人类审核清单 ✅
| 检查项 | 通过? |
|---|---|
| 范围描述准确覆盖需求? | ✅ |
| 「不做」列表合理? | ✅ |
| 工作量估算合理? | ✅ 约 7.5 小时 |
| 有没有遗漏的边界情况? | ✅ 已覆盖同步/异步两种模式 |
四、Step 2: /opsx:explore — 探索与细化
4.1 生成 spec.md
AI 分析现有代码(订单 Model、Controller、Router 结构),生成行为规范:
1 | # Spec: 订单导出功能 |
4.2 生成 design.md
1 | # Design: 订单导出功能 |
前端导出按钮 → API 层 → Service 层 → Excel 生成
↓
BullMQ 队列(异步模式)
↓
完成后存储到 temp/exports/
↓
通知服务发送下载链接
1 |
|
同步模式:
用户点击导出 → 前端调 GET /api/orders/export
→ OrderExportService 查询 DB → 生成 Excel → 直接下载
异步模式:
用户点击导出 → 前端调 POST /api/orders/export-async
→ 返回 taskId → 前端轮询 GET …/status
→ BullMQ worker 处理 → 生成 Excel → 存文件
→ WebSocket 通知 → 前端显示下载按钮
1 |
|
4.3 生成 tasks.md
1 | # Tasks: 订单导出功能 |
人类三审清单 ✅
| 检查项 | 通过? |
|---|---|
| spec 覆盖了同步/异步两种模式? | ✅ |
| 错误边界完整(400/413/429 等)? | ✅ |
| 安全考量充分(权限、审计、自动清理)? | ✅ |
| design 的架构方案合理? | ✅ BullMQ 是标准异步队列方案 |
| tasks 粒度适中(每个 ≤ 50 行)? | ✅ |
| 有没有遗漏的测试场景? | ✅ 边界条件已覆盖 |
五、Step 3: /opsx:apply — 实施
5.1 实施过程示例
进入 apply 阶段后,AI 逐条执行 tasks.md:
1 | ✅ 1.1 安装 exceljs 依赖 |
以下是 AI 生成的 OrderExportService 核心代码:
1 | // src/services/order-export.service.ts |
5.2 实施过程中的常见 AI 偏差及修正
| 偏差 | 发现方式 | 修正方法 |
|---|---|---|
| AI 忘记添加自动筛选(autoFilter) | 复审 diff 发现 | 在 design.md 补充要求,重新 apply |
| 时间范围验证写在了 Controller 而非 Service 层 | 代码审查 | 要求移动到 Service 层,保持 Controller 薄 |
| 前端导出按钮没有禁用状态 | 前端测试 | 在 spec.md 补充「导出中按钮应禁用并显示 loading」 |
关键原则: 发现偏差时,优先修改 spec/design 而非直接改代码。这样 AI 下次 apply 时就不会犯同样的错误。
六、Step 4: /opsx:archive — 归档
完成后执行 /opsx:archive,生成归档:
1 | openspec/archive/2025Q2/order-export/ |
归档的 tasks.md 会保存每条任务的最终状态:
1 | - [x] 1.1 安装 exceljs 依赖 |
七、CLAUDE.md 黄金配置模板
下面是经过验证的、完整的 CLAUDE.md 配置,适合所有使用 OpenSpec 的项目:
1 | # CLAUDE.md |
八、高级技巧
8.1 快速通道:/opsx:ff
当你需要快速修复时(比如修一个 typo 或者 3 行以内的改动):
1 | /opsx:ff "修复订单详情页的金额显示少了一位小数" |
效果:直接进入 apply 阶段,跳过 propose 和 explore。
8.2 增量开发:先核心后完善
对于大型功能,可以分多次 OPSX 循环:
1 | 第一次循环:核心导出逻辑(生成 Excel + 同步下载) |
每次循环专注于一个子目标,降低单次复杂度。
8.3 与代码审查结合
在 /opsx:apply 过程中,让 AI 每完成一个 task 就停下来,人类审查 diff:
1 | > 继续下一个 task … 先让我看看上个 task 的 diff |
这样可以尽早发现偏差,避免后面改大堆代码。
8.4 使用 archive 做回顾
定期查看 openspec/archive/,你可以获得以下价值:
- 变更统计: 这个季度做了哪些功能?每个功能花了多久?
- 模式识别: 哪些类型的 spec 经常被 AI 误解?修改 spec 的写法来避免
- 新人培训: 新人看 archive 就知道项目演进的完整历程
九、常见问题 (FAQ)
Q1: AI 生成的 design 不理想怎么办?
先不要急着改 design。尝试在 /opsx:explore 阶段给 AI 更多上下文,例如:
- 「参考 UserService 的写法」
- 「这个项目的架构模式是 repository pattern」
- 「使用我们已有的示例模式」
如果你给的上下文足够明确,AI 生成的 design 质量会大幅提升。如果仍不理想,手动编辑 design.md 中的关键部分,然后重新执行 /opsx:apply。
Q2: 实施过程中发现 spec 遗漏了某些情况怎么办?
不要直接改代码。 正确的做法是:
- 暂停当前 apply
- 执行
/opsx:explore(重新生成 spec) - AI 会保留原有 spec 内容并在其基础上补充
- 审核更新后的 spec
- 重新
/opsx:apply
Q3: 同一个功能的 tasks 超过 20 条怎么办?
说明这个功能太大了,应该拆分为多个小功能。例如「订单导出功能」可以拆为:
order-export-core:核心导出(Excel 生成 + 同步 API)order-export-async:异步导出队列order-export-frontend:前端 UI
每个子功能单独走一次 OPSX 循环。
Q4: 多人协作时,每个人的 OpenSpec 文件放在哪里?
统一放在项目仓库的 openspec/ 目录下。不同人负责不同的 specs/<change-name>/。建议约定命名规范:
auth-forgot-password/order-export-async/dashboard-revenue-chart/
使用短横线连接、全小写、描述性的目录名。
Q5: 如何管理 OpenSpec 文件本身的版本?
OpenSpec 文件与代码一起 Git 管理。每次 /opsx:archive 后提交一次 commit:
1 | git add openspec/ |
不建议将 spec 文件放在 .gitignore 中——它们是最有价值的设计文档。
Q6: 同一个功能改了多次,archive 会保留多个版本吗?
不会。当一个 change-name 被重新 archive 时,它会覆盖之前的版本。如果你想保留多个迭代版本,为每次迭代使用不同的 change name:
order-export-v1/order-export-v2/order-export-v3/
十、总结
通过本文的实战案例,你已体验了完整的 OpenSpec 工作流:
1 | proposal → spec → design → tasks → apply → archive |
| 阶段 | 人类参与 | AI 参与 | 产出物 |
|---|---|---|---|
| propose | 描述需求 | 生成提案 | proposal.md |
| explore | 三审 | 生成 spec/design/tasks | 三个文件 |
| apply | 审查 diff | 逐条实施代码 | 代码变更 |
| archive | - | 整理归档 | 归档记录 |
核心教训:
- 在 spec 上花的时间,会在 debug 上省回来
- 发现偏差先改 spec,别直接改代码
- tasks 粒度要小(≤ 50 行),大了就拆功能
- archive 是无价的项目资产
本文基于 OpenSpec v0.x + Claude Code 的最新版本。实战中的具体命令和配置可能因版本更新而略有变化。