OpenSpec:让 AI 编程从碰运气到有章可循
用 AI 写代码久了,你可能会遇到这些场景:
- 和 AI 反复拉扯,修改了 N 遍还是不对
- 明明上次说好的规范,新会话又忘了
- 代码改完不敢合并,因为不知道到底改了啥
- 几个人一起用 AI 开发,结果代码风格完全不统一
如果这些问题你都遇到过,说明你不是一个人。这篇文章想聊聊为什么会这样,以及如何用 OpenSpec 来解决这些问题。
第一部分:Vibe Coding 的困境
什么是 Vibe Coding?
Vibe Coding,也叫”氛围编程”,就是用自然语言和 AI 对话来完成编程任务。比如:
- “帮我写个用户登录功能”
- “这个按钮的样式改成蓝色”
- “优化一下这段代码的性能”
听起来很美好对吧?但实际使用中,我们遇到了一系列问题。
10 个常见痛点
我总结了 AI 编程中的 10 个常见痛点:
表达层问题:
- 词不达意(Expression Gap):想得清楚但说不清楚。你脑子里有个很清晰的概念,但就是说不出来,或者说出来 AI 理解的不是你想的那个意思。
- 意图偏离(Intent Drift):AI 理解和你想的不一样。你说”加个缓存”,AI 给你上了 Redis 分布式缓存,其实你只想要个内存缓存。
- 范围蔓延(Scope Creep):边界模糊导致功能膨胀。你说”加个搜索”,AI 给你实现了关键词搜索、模糊匹配、拼音搜索、搜索历史、热门推荐……你只要一个简单的关键词搜索。你说”加个头像功能”,AI 给你头像上传、裁剪、历史记录、审核功能全套……你只是想显示个头像而已。
记忆层问题:
- 上下文断裂(Context Fragmentation):跨会话丢失约定。上周和 AI 说好用 Tailwind,今天新会话又给你用 styled-components。
- 变更混乱(Change Chaos):不知道改了什么、为什么改。AI 说”帮你优化了一下”,结果改了 15 个文件,你都不知道为什么要改。
- 重复劳动(Repetitive Work):每次都要重新解释。每个新会话都要重新介绍项目背景、技术栈、代码规范……
- 协作困难(Collaboration Friction):多人信息不对称。你让 AI 实现了用户模块用方案 A,同事不知道,也让 AI 实现了用户相关功能用方案 B,结果产生冲突。
执行层问题:
- 不可预测(Unpredictability):同样的话,不同的结果。第一次问”写个表单验证”用 Yup,第二次问可能用 Zod。
- 场景遗漏(Scenario Gaps):只考虑正常路径。AI 实现了登录成功的情况,但密码错误、账号锁定、网络超时这些异常情况都没考虑。
- 机械执行(Blind Execution):不质疑明显问题。你说”在登录页加个删除用户按钮”,AI 也不问为什么,直接给你加上了。
问题的根源
这些问题的根源是什么?
AI 的不确定性。
AI 大语言模型是基于概率的。它的工作原理是:
1 | 输入 Token → 概率分布 → 采样 → 输出 Token |
这中间有个 temperature 参数控制随机性。这意味着:
- 同样的输入,可能产生不同的输出
- AI 的”理解”是概率性的,而非确定性的
- 无法保证每次都得到一致的结果
我们无法改变 AI 的本质。但我们可以通过结构化的输入和约束来降低输出的不确定性。
第二部分:解决思路
既然知道了问题的根源,我们就可以想对策了。
七大解决策略
- 结构化的表达格式:用模板替代自由文本,减少表达歧义
- 强制的对齐环节:在执行前确保理解一致
- 明确的边界定义:定义”做什么”和”不做什么”
- 持久化的上下文:项目信息跨会话保持一致
- 完整的变更记录:每次变更都有清晰的追溯
- 可复用的知识库:积累的项目知识可以持续复用
- 统一的规范来源:团队共享同一份”真相”
这些策略都很好,但如果人工来执行:
- 每次手写模板,格式不统一
- 人工组织 Review,流程不固化
- 复制粘贴项目信息,繁琐易错
- 手动创建目录和文件,结构不一致
结论:策略是好策略,但人工执行成本太高,难以坚持。
我们需要一个工具来帮我们自动化这些事情。这个工具就是 —— OpenSpec。
第三部分:OpenSpec 介绍
什么是 OpenSpec?
OpenSpec 是一个面向 AI 编码助手的规范驱动开发(Spec-driven Development)工具。
核心理念是:在编写代码之前,让人类与 AI 达成一致。
用一个公式来表达:
1 | OpenSpec = 结构化需求 + 变更管理 + AI 指令 + CLI 工具 |
六大核心特性
- 无需 API 密钥:OpenSpec 不调用 AI API,只生成指令文件供各种 AI 工具读取
- 轻量级工作流:文件即文档,Markdown 即规范,Git 即版本控制
- 支持 20+ AI 工具:Claude Code、Cursor、Copilot、CodeBuddy 等主流工具都支持
- Brownfield 友好:可以渐进式引入到现有项目
- Delta-based 变更:只记录变化,不复制全量
- 可追溯可审计:每个变更都有完整的生命周期记录
三阶段工作流
OpenSpec 的核心是三阶段工作流:
1 | Stage 1: 创建变更 Stage 2: 实施变更 Stage 3: 归档变更 |
这个流程的关键在于:提案审核是强制环节。在 AI 开始写代码之前,必须先生成结构化的提案,经过人工审核确认后,才能开始实施。
第四部分:产物与流程
产物目录结构
初始化 OpenSpec 后,项目会增加以下目录结构:
1 | openspec/ |
各产物的作用
project.md:定义项目整体信息,供 AI 理解项目背景。包括技术栈、代码规范、架构模式、测试策略等。
AGENTS.md:指导 AI 如何使用 OpenSpec,定义三阶段工作流,约束 AI 行为。
**specs/**:记录已实现功能的需求规范,是”当前真相”(Single Source of Truth)。
**changes/**:存放变更提案,包括提案说明、任务清单、技术设计和规范增量。
规范文件格式
spec.md 使用特定格式:
1 | ### Requirement: User Login |
格式要点:
### Requirement:定义需求(3 个 #)#### Scenario:定义场景(4 个 #)- 每个需求至少一个场景
- 使用 SHALL/MUST 表示规范性要求
第五部分:示例演示
让我用一个实际例子来演示 OpenSpec 的完整流程。
场景:添加收藏功能
假设我们有一个电商项目,需要添加”用户收藏商品”功能。
Step 1: 初始化项目
1 | cd my-ecommerce-project |
选择要配置的 AI 工具(如 Claude Code、CodeBuddy),系统会自动创建目录结构和配置文件。
然后填写 project.md,定义项目上下文。
Step 2: 创建提案
向 AI 描述需求:
我想让用户可以收藏商品,方便之后购买。用户可以在商品详情页点击收藏按钮,在个人中心可以看到收藏列表,也可以取消收藏。
执行 /openspec:proposal,AI 会生成:
proposal.md:
1 | ## Why |
tasks.md:
1 | ## 1. Database Setup |
spec delta:
1 | ## ADDED Requirements |
Step 3: 人工审核
这一步非常关键。我需要检查:
- Why 是否准确描述了需求背景?
- What Changes 是否完整列出了变更?
- Scenarios 是否覆盖了边界情况?
比如我发现少了一个场景:”商品下架后收藏列表如何处理?”
就让 AI 补充:
1 | #### Scenario: View favorites with unavailable products |
确认无误后,告诉 AI:”提案已批准,可以开始实施”。
Step 4: 执行实施
执行 /openspec:apply add-product-favorites,AI 按 tasks.md 顺序执行任务:
- 创建数据库模型
- 实现 API 端点
- 创建前端组件
- 编写测试
每完成一项,tasks.md 中对应的 [ ] 会变成 [x]。
Step 5: 归档变更
所有任务完成后:
1 | openspec archive add-product-favorites |
系统会:
- 将 delta 合并到
specs/product-catalog/spec.md - 将变更目录移动到
changes/archive/2025-01-15-add-product-favorites/
归档后,规范更新了,历史也保留了。
第六部分:OpenSpec 解决了哪些问题?
直接解决的 8 个问题
| 痛点 | OpenSpec 方案 |
|---|---|
| 词不达意 | 结构化模板强制完整表达 |
| 意图偏离 | 提案审核机制对齐意图 |
| 范围蔓延 | Goals/Non-Goals 明确边界 + 审核限制扩展 |
| 上下文断裂 | project.md 持久化上下文 |
| 变更混乱 | changes/ 完整追踪 |
| 重复劳动 | 规范复用,无需重复解释 |
| 场景遗漏 | Scenario 格式强制覆盖 |
| 协作困难 | specs/ 作为统一真相来源 |
间接缓解的 2 个问题
- 不可预测:技术栈约束减少选择空间,但 AI 生成仍有随机性
- 机械执行:澄清环节提供质疑机会,但不能保证 AI 一定会质疑
无法完全解决的问题
- 代码质量仍依赖模型能力
- 复杂业务逻辑需要人工验证
- 安全漏洞需要专门工具检测
第七部分:优缺点与适用场景
优点
- 降低不确定性:从”赌运气”变成”有章可循”
- 知识沉淀复用:项目越用越”聪明”
- 变更可追溯:知道”改了什么”、”为什么改”
- 团队协作友好:消除信息不对称
- 工具无关性:支持 20+ AI 工具
- 轻量级实施:低成本引入,渐进式采用
缺点
- 增加前期工作量:写提案比直接写代码”慢”
- 学习成本:需要学习新的概念和流程
- 维护负担:需要持续维护规范文档
- 不保证代码质量:约束”做什么”,不保证”做得好”
- 小任务过重:简单任务走完整流程太繁琐
适用场景
适合使用:
- 中大型功能开发(开发时间 > 2 小时)
- 团队协作项目
- 长期维护项目
- 复杂业务逻辑
不适合使用:
- 快速原型验证
- 一次性脚本/工具
- 简单修改/Bug 修复
- 学习/实验项目
第八部分:实践中的问题与改进
在实际使用中,我发现了一些流程上的缺口:
问题 1:提案缺乏强制校验
提案生成后,可能有格式错误或决策问题,完全依赖人工审核。
改进:创建 /proposal-verify Skill,在提案完成后自动验证格式、检查决策、触发自我反思。
问题 2:实施缺乏对齐检查
实施完成后,没有自动检查代码是否符合提案、场景是否都实现了。
改进:创建 /apply-verify Skill,验证任务完成度、提案对齐、场景覆盖、副作用检测。
问题 3:归档缺乏规范约束
有时候会用 mv 命令直接移动目录,跳过了 delta 合并。
改进:创建 /archive-verify Skill,强制使用正确的归档命令,验证合并正确性。
改进后的流程
1 | 需求 → 提案 → [proposal-verify] → 实施 → [apply-verify] → 归档 → [archive-verify] |
第九部分:最佳实践总结
何时需要提案?
1 | 新请求到来 |
推荐流程
- 初始化:
openspec init,填写 project.md - 提案:描述需求,执行
/openspec:proposal,审核确认 - 实施:执行
/openspec:apply,监督执行,更新进度 - 归档:
openspec archive,合并规范,存档历史
核心原则
- 提案是强制环节,不可跳过
- 审核是人的责任,不可偷懒
- 规范是团队共享的真相来源
- 变更可追溯,决策有记录
总结
OpenSpec 的核心价值是什么?
在编码前对齐意图,通过结构化的表达、持久化的上下文、可追溯的变更记录,让人与 AI 的协作从”碰运气”变成”有章可循”。
它不是银弹,不能解决所有问题。但对于需要准确性和可维护性的场景——团队协作、长期维护、复杂业务——OpenSpec 可以显著降低 AI 编程的不确定性,提高一次性成功率。
如果你经常和 AI 反复拉扯,如果你在 AI 编程中遇到协作问题,不妨试试 OpenSpec。
1 | npm install -g openspec |
感兴趣的话可以到项目主页查看更多信息:https://github.com/fission-ai/openspec