规约驱动开发工具 OpenSpec 的实践总结:以 elder-friendly-calculator 为例
1. OpenSpec 是什么
OpenSpec 是一套规约驱动开发(Spec-Driven Development)的工作流工具。它要解决的问题是:在 AI 智能体参与编码的场景下,如何让"想清楚 → 写计划 → 写代码"这三个动作不互相污染,并且让代码之外还有一份可追溯的事实来源。
1.1 两种产物
| 产物 | 位置 | 回答的问题 | 生命周期 |
|---|---|---|---|
| specs(规格) | openspec/specs/<capability>/spec.md |
系统现在是什么行为(已交付、已归档的能力) | 长期存在,随每次归档增量演进 |
| changes(变更) | openspec/changes/<change-name>/ |
这一次要改什么(尚未实现的计划) | 完成后整体移入 changes/archive/ |
一句话:specs/ 是唯一事实来源,changes/ 是待实现的增量,archive/ 是它是如何达成的历史。
关键差别在于 specs/ 是能力(capability)维度、changes/ 是变更维度。同一个能力会被多次变更反复修改,每次修改只写"增量"(delta),不重写整份规格。
1.2 五步循环
每个变更都走同一条闭环,本项目严格落在这条闭环上:
flowchart LR
E["1 · Explore<br/>和智能体一起想清楚"] --> P["2 · Propose<br/>Agent 起草方案(不写代码)"]
P --> R["3 · Review<br/>你修正方案"]
R --> A["4 · Apply<br/>Agent 逐项构建"]
A --> AR["5 · Archive<br/>增量写入 specs 并归档"]
AR -. "下一次变更" .-> E
若渲染环境不支持 Mermaid,可读作线性流程:Explore → Propose → Rev