OpenSpec 入门:AI 时代的规范驱动开发
AI 编码助手指令模糊时会靠猜,OpenSpec 通过规范驱动开发(SDD)让 AI 先搞清楚要做什么,再动手写代码。
开篇
让 Claude 或 Cursor 写一段功能,体验过的人多半都遇到过同一种尴尬:
你说「加个注册登录页」,它噼里啪啦写了 800 行——多了个忘记密码、多了个三方登录、还顺手装了三个新依赖。你愣两秒说「我没让你做这些」,它回一句「我以为你需要」。
这是当前 AI 编码助手最大的灰色地带。指令模糊的时候,AI 必须靠猜。 猜对了你赚到,猜错了从头返工。
OpenSpec 想解决的就是这一件事:让你别再让 AI 猜。
第一层:三层工具各管什么?
要理解 OpenSpec 的价值,先得把它和已有的工具区分开。很多人第一次看会觉得「这不就是 CLAUDE.md 换了个名字」——其实是完全不同的层次。
第一层:CLAUDE.md — 行为风格
管的是 AI 写代码时该守哪些规矩:
- 别过度设计
- 别动没让你动的代码
- 遵循项目的代码风格
它回答的问题是:「写代码的时候注意什么?」
第二层:Skill — 做事流程
管的是 重复任务的标准化步骤:
- 改公众号文章该按哪几步走
- 写 API 文档的固定模板
- 发版前的 checklist
它回答的问题是:「这类任务怎么做?」
第三层:OpenSpec — 需求定义
管的是 这一次具体要做什么、做到哪算完、有哪些边界条件。
它回答的问题是:「这次我们要解决什么问题?」
举个例子。「加个注册登录页」这句话扔给 Claude:
- CLAUDE.md 帮不了你——它只管 AI 怎么写代码,不管该写什么
- Skill 也未必帮得上——这不是你重复在做的事
- 你真正需要的是一份双方都点头同意的需求文档
这个空缺,就是 OpenSpec 想填的。
它的核心思想叫 SDD(Spec-Driven Development,规范驱动开发)。一句话讲清楚就是:
先把规范写清楚,再让 AI 按规范施工。
第二层:OpenSpec 具体干什么
OpenSpec 是一个开源 CLI 工具(Fission-AI/OpenSpec),免费、无需 API Key,支持所有主流 AI 编码助手(Claude Code / Cursor / Codex 等)。
它的产物是一组结构化的变更文件夹。每次做一个功能,就有一个独立的目录:
| 文件 | 作用 |
|---|---|
proposal.md | 为什么做、做什么、影响什么 |
tasks.md | 实施的任务清单 |
design.md | 技术决策(可选) |
specs/ | 本次新增或修改的规范增量 |
这堆文件不是给人单独看的,是给 AI + 人一起看的合同。AI 看着它写代码,人看着它审查。等代码合并,规范增量也合并到项目主规范里。
目录结构
openspec/
├── project.md # 项目整体约定(技术栈、风格)
├── AGENTS.md # 给 AI 的工作流说明
├── specs/ # 主规范(项目当前的"唯一真相")
│ ├── spec.md
│ └── design.md
└── changes/ # 变更提案
├── add-auth-pages/ # 一次具体的变更
│ ├── proposal.md
│ ├── tasks.md
│ ├── design.md
│ └── specs/ # 这次变更带来的规范增量
└── archive/ # 已完成的变更归档
看一遍就懂了——每次变更都是一个可审计的小盒子,做完归档进档案柜。
第三层:一次完整的工作流
把「加个注册登录页」这个例子整段走一遍。
Step 1:起草提案
打开 Claude Code,丢一句话:
创建一个 OpenSpec 变更提案,用于添加一个注册登录页面
AI 不会立刻动手写代码。它会先反问。
因为 OpenSpec 的工作流要求它必须先把规范写清楚再说。通常它会问几个关键问题:
- 认证方式是本地还是接 API?
- 要不要忘记密码?要不要三方登录?
- 路由用 Vue Router 还是别的?
- 登录后跳到哪?
你逐条回答完,AI 才会生成 proposal.md、tasks.md、specs/ 这一整套提案文档,并自动调用 openspec validate 验证。这一步不通过,下一步走不了。
这个「被强制反问」的体验是 OpenSpec 最值钱的部分。很多模糊需求的坑,都是在这一步暴露出来的。
Step 2:审查对齐
提案生成出来,你扫一遍 proposal.md 和 tasks.md。这里没扫干净,后面 AI 写出来的就是你不想要的东西。
不满意当场补:
密码强度不要做客户端校验,挪到登录后端再校验
AI 会同步更新提案。改到你点头为止。
Step 3:实施
实施 add-auth-pages 变更提案
AI 严格按照 tasks.md 一项一项做,做完一项打勾一项。
中间你看到样式不对、想换个交互方式,直接说就行——但说完之后,最好让它把改动同步更新到提案里,而不是只改代码不改规范。不然过几天再回来看,代码和规范对不上,OpenSpec 的复利就断了。
Step 4:归档
归档变更 add-auth-pages
OpenSpec 会做两件事:
- 把
changes/add-auth-pages/整个移到changes/archive/下,加上时间戳 - 把这次变更带来的规范增量,合并到
openspec/specs/主规范里
到这一步,「加注册登录页」这件事就在项目史里留下了完整的痕迹:提案在哪、为什么这么做、做了哪些任务、最后规范长成什么样。一年后新人接手,照着 openspec/specs/ 读就够了。
第四层:为什么这件事在 AI 时代特别重要
第一次看 OpenSpec 的时候,第一反应是:「这不就是把以前 PRD 的事情用 markdown 重做了一遍?」
后来想明白了,不太一样。
PRD 写完之后还得有人翻译成代码,中间有大量「我以为你懂」的损耗——产品经理觉得讲清楚了,工程师听到的是另一回事。OpenSpec 的规范直接给 AI 当输入,AI 拿着规范就开始写代码,中间不需要人当翻译。
翻译这层一消失,模糊性就藏不住了。
以前你可以靠「工程师会脑补」蒙混过关,现在 AI 也会脑补,只不过它脑补的方向你预测不了,最后给你写出 800 行你不想要的东西。
这就是 SDD 这个词最近在 AI 圈反复被提起的原因。AI 让 build 变快之后,最大的瓶颈从「会不会写」变成了「能不能讲清楚要写什么」。 讲不清楚的代价,从工程师摸鱼变成了 AI 一头扎进错的方向。
OpenSpec 把「讲清楚」这件事做成了一套有目录、有验证、有归档的流程。
人定义 What,AI 负责 How——这是它想要的分工。
第五层:避坑与边界
怎么装
前置条件:Node.js 20.19.0 及以上。
npm install -g @fission-ai/openspec@latest
openspec init
openspec init 会让你选 AI 工具(Claude Code / Cursor 等都支持),选完会在项目里生成对应的自定义命令,比如 /openspec:proposal、/openspec-apply、/openspec-archive。
初始化完,三句话就能上路:
- 「请阅读
openspec/project.md,根据我的项目情况帮我填一下」 - 「我想加 XXX 功能,请创建一个 OpenSpec 变更提案」
- 「请阅读
openspec/AGENTS.md,告诉我我们应该怎么协作」
整个学习曲线大约就在这三句话里。
坑一:学习成本不是零
OpenSpec 引入了一套自己的目录结构和命令体系,第一次用得花十几二十分钟搞清楚 proposal / tasks / specs / archive 这几个概念之间的关系。如果团队里没有一个人当锚,很容易用着用着就乱。
坑二:小项目不必上
写个爬虫、跑个数据清洗的 notebook、做个一周后就扔的内部工具,引入 OpenSpec 是杀鸡用牛刀。它的好处在中长期项目上才显现——做得久、规范积累得厚,回头读规范才省事。
坑三:改了代码没更新规范
最容易踩的坑就是实施时改了代码但没更新规范。这一步守不住,OpenSpec 就废了一半,因为下次新人来读 openspec/specs/ 看到的是错的真相。这件事得靠习惯,工具帮不了你。
总结
以前「先想清楚再动手」是一句鸡汤,因为成本上没人逼你想。
现在 AI 让 build 变得太便宜,前面少想一步的代价是后面 AI 帮你 build 出 10 倍的错东西。OpenSpec 把「想清楚」这一步从口号变成了一个有目录、有文件、有验证的环节,让你不得不走一遍。
如果你已经在做一个跑了三个月以上、还会继续做下去的项目,值得花一个下午把它装上跑一遍。
参考:@freeman1266 X Article