searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

玩转 AI Coding(四):OpenSpec 工程化实践

2026-05-08 16:26:20
118
0

AI Coding的困境

AI 编码助手已经成为了很多开发者的标配工具。你能够通过人类语言告诉它你想要什么,它就能给你一个可运行的成品,感觉效率拉满!

但 AI 给出的代码真的是你想要的吗?

答案却是: That depends! (看情况)

  • “帮我实现一个网页版象棋游戏”, 这类任务AI通常能够很好的执行, 因为它足够独立。
  • “后端API访问需要添加鉴权管理,每一个API都需要和用户角色关联,确保用户角色取得访问权限后才可以执行”,然后它给我重构了半个项目:添加了新的数据表,实现新接口和鉴权逻辑。 而这些原本是存在的,仅需要补充字段,添加关联映射即可。
  • “之前网页通知模式采用js 的websocket存在连接不稳定情况,请撤销重做,并修改为基于后端请求的轮询模式",然后它重新实现了一套基于轮询的通知机制,并且之前ws 模式下的代码依然遗留在系统中,调用的API也为完全切换。
  • ...

以上种种,您是否似曾相识?

问题不在于 AI 不够聪明,而在于 AI 的记忆是会话级别的(Seesion/Context)。
你今天在 Cursor 里讲好的架构决策,明天新开一个对话它全不记得了;你在聊天框里给 AI 讲了二十分钟的上下文,它在第 21 条消息时就开始"忘事";事先约定了很多细节,在上下文压缩时已经 被 summary 了。

更要命的是:当你的需求稍微复杂一点——比如同时涉及数据库 Schema 变更、接口改动和前端组件重构——AI 在没有明确规格约束的情况下,很可能:

过度实现:你要的是加个按钮,它给你重构了整个状态管理

欠拟合:你要的是完整功能,它给你实现了一半然后说"其余你自己补吧"

需求漂移:做到第三步发现已经偏离原始设计十万八千里

这就是开发者们熟悉的"AI 乱猜" 或 “AI幻觉” 状态。

总结而言,传统AI coding 最大的困境是: 因contex上下文限制,而呈现出来的记忆缺失 和过程不可预期!

这些问题的原因,我们在上一章中,已经讨论过了。

传统解法

当然,有经验的开发者会说:把需求写清楚嘛!在 prompt 里把上下文交代清楚!用agent.md readme.md 记录

确实,这能缓解问题,但不能根治。因为:

  • Context 是一次性的:写在聊天框里的需求,换个会话就消失了
  • 同步成本高:团队协作时,每个人告诉 AI 的上下文不一致
  • 不可追溯:代码里看不出当初做这个决策的理由是什么
  • 难以复查:没有结构化的"变更说明",代码评审只能靠猜

SDD新思路

‌规格驱动开发(Spec-Driven Development, SDD)‌ 是一种以规范文档为核心的软件工程方法论:主张"规范先行,代码自动",将规格说明作为人、团队与 AI 之间的动态契约和唯一事实来源。把" 我们要做什么、为什么做、怎么做"写成结构化的 Markdown 文件,和代码一起存进 Git 仓库。AI 助手不再依赖你在聊天框里的临时描述,而是从仓库里读取持久化的规格文档,然后照单执行。

而 OpenSpec,就是把 SDD 落地的那把利器。

OpenSpec 介绍

OpenSpec 是一个轻量级、开源的规格驱动开发框架,通过结构化的 Markdown 文件帮助人类和 AI 编码助手在写代码之前就达成一致。

它本质上是一套工作流规范 + CLI 工具,让你的 AI 助手能够:

  • 读懂你真正想要什么(proposal.md)
  • 理解具体的需求约束(specs/)
  • 知道技术怎么实现(design.md)
  • 按步骤系统地执行(tasks.md)

整套文档住在你的项目仓库里,持久存在,永不遗忘。

核心概念速览

在深入使用方法之前,先认识几个关键词,别让它们在后面绊倒你:

术语 描述
Change(变更) 一个独立的功能开发或修改任务,是 OpenSpec 的最小工作单元
proposal.md "我们为什么要做这件事,做什么,不做什么"的说明书
specs/ 具体需求场景,用 Given/When/Then 格式写清楚验收条件
design.md 技术方案文档,怎么做,用什么技术,关键决策是什么
tasks.md AI 实现时的步骤清单,打勾制度,做一步标一步
AGENTS.md 给 AI 助手看的项目级说明书,告诉它这个项目怎么运转
Fast-Forward(ff) 一键生成全套规划文档的快捷操作,懒人必备
Archive(归档) 变更完成后,将变更文件夹归档,并将规格合并到主文档

OpenSpec 的文件夹结构

初始化后,你的项目会多出这样的目录:

openspec-dirtory.png

其中:
changes: 就是你的进行中队列,一目了然看到有哪些功能在开发(任务专注);
archive: 是历史记录;
specs: 是反映当前系统真实状态的活文档——每次 archive 操作都会自动把变更同步进来(工程级记忆的关键)。

OpenSpec 的核心四阶段工作流

step 1: 需求探索(Explore)

产品功能描述 转化为 需求规格的关键。通过多轮次的对话,将需求目标、范围、边界进行定义和决策,技术方案选型,细节对齐。

step 2: 定义变更 (Propose)

将需求定义为一个独立的变更,并形成提案(proposal.md);
基于提案,梳理规格,形成规格说明(spec.md);
基于规格说明,进行方案设计,形成设计说明(design.md)
基于设计说明,进行任务拆解,形成任务计划(tasks.md)

step 3: 实施(Apply)

该步骤时AI真正执行实施的过程, 按照tasks.md 逐条实现,并进行确认,每完成一条对该条目进行打钩。包含部分测试验证条目。
注意,部分条目需要人工进行验证(比如涉及到生产环境上的一些验证)。
所有tasks完成后,本任务完成。

step 4: 归档(archive)

当所有tasks均完成后, 该任务完成。
注意,这一步最后人工验收(编译、构建、安装、关键功能验证等)。
验收通过后, 对当前变更进行归档:将 changes 内容移动到archive 中,同时合并到主specs中。
后续的变更,可以参考主specs中的记录,让AI理清整个项目的演化(全局记忆), 编译前后关联。

为什么要分四阶段?

因为这四个阶段对应着四种种不同的思维模式:

  • 探索阶段: 是"发散思维",核心是想清楚要做什么,允许反复推敲
  • 规划阶段: 是"正规化",核心是确认方案和边界,是需求 转换为实现 的关键映射
  • 实现阶段: 是"收敛执行",核心是严格按照规格,保障计划任务完成,不做规格之外的事
  • 归档阶段: 是"沉淀知识",核心是让完成的工作成为持久的项目知识

OpenCode + penSpec 工程化实践

注意:当前验证是基于linux 环境验证和记录,windows 类似,但需要注意默认配置路径等需要对应调整!

安装

通过npm 直接安装 OpenSpec

# 需要 Node.js 20.19.0 或更高版本

# 安装openspec

npm install -g @fission-ai/openspec@latest

# 验证安装

openspec --version

注意:openspec 本身是一套skill规范,需要搭配AI 编程工具使用(Claude-cli,Codex-cli,opencode,cursor等等),因此openspec 本身并不需要配置大模型!

核心工作流实战演示

这里我们选择opencode。
如果还没有安装、配置opencode, 请参考上一篇 《玩转 AI Coding(二):基于opencode 的AI编程初体验》。

接下来,我将结合一个实际场景:
“为操作系统AI智能组手(ctsh-asst)新增息壤大模型接入能力”

为大家演示OpenCode + OpenSpec 的工程化过程。

开始之前,先对ctsh项目执行 openspec init,初始化工程配置,并指定AI 工具为opencode:

完成后,在当前目录运行opencode,进入交互式终端,进入正题!

step1 需求探索

首先,将我们的需求通过 opencode 内置命令 /opsx-explore (通过openspec init 注入skill实现) 发起需求探索。

course4-openspec-explore.png
之后opencode 会依据openspec 定义的explore 探索方式,展开对代码的分析和历史spec的检索,以确认方案;过程中,通常会识别到一些不同的实现方式,需要开发人员交互式的进行确认(方案选择、边界确认、需求细化的过程)

course4-openspec-explore-check.png

该过程可以持续多轮,直到AI能够明确设计:

course4-openspec-explore-verify.png

step2 创建变更

探索阶段,AI没有修改任何工程文件,它仅是梳理和明确了本次变更的顶层目标、范围、和大体方案。
然后需要通过 /opsx-propose 将需求进行明确、设计,并拆解为可执行的多个任务。

course4-openspec-propose.png

同样,在该过程中,您需要关注proposal.md 文件内容,确保与真实需求是匹配的;也可以与AI进行多轮次对话,确保设计方案与预期相符。
最终, 变更创建完成,并记录到change目录下

course4-openspec-check.png

注意: 变更名字尽量自命名,并保证 见文知意(类似git 提交的title,一眼就能看出这个变更的大体内容)

step3 执行

仅需要 键入 /opsx-apply, 剩下的事情交给AI!

course4-openspec-apply.png

注意,因部分task环境、资源依赖的原因,可能有部分需要人工验证;验证ok后,可以知会AI,task xxx已验证!
另外,人工验收也是必要;过程如果发现问题,让AI迭代修改。

step4 归档

验收完成后,通过 /opsx-archve 归档该任务。
通常,归档完成后,在进行git 提交。

写在最后

openspec 通过预先澄清目标和设计,并以spec规格文档,通过项目级记忆的方式保存了项目的演化过程;当你再提及 “昨天添加的导出功能时”,AI能够通过spec记录找到对应的变更。

因此,openspec赋予了项目完整的演化记忆!

但openspec 每一次闭环局限在一个change中,因此,要求每一个change不能太复杂,必须保证在一个会话过程中能够闭环。

故而,openspec模式适合于项目渐进式迭代开发的过程,而不太适合复杂项目的初始构建。

下一章,我们会介绍另外一个 工程化实践SKILL, superpower: 一个基于流程驱动的开发SKILL。

superpower会带来哪些新东西? 我们下回分解。

0条评论
0 / 1000
huskar
28文章数
3粉丝数
huskar
28 文章 | 3 粉丝
原创

玩转 AI Coding(四):OpenSpec 工程化实践

2026-05-08 16:26:20
118
0

AI Coding的困境

AI 编码助手已经成为了很多开发者的标配工具。你能够通过人类语言告诉它你想要什么,它就能给你一个可运行的成品,感觉效率拉满!

但 AI 给出的代码真的是你想要的吗?

答案却是: That depends! (看情况)

  • “帮我实现一个网页版象棋游戏”, 这类任务AI通常能够很好的执行, 因为它足够独立。
  • “后端API访问需要添加鉴权管理,每一个API都需要和用户角色关联,确保用户角色取得访问权限后才可以执行”,然后它给我重构了半个项目:添加了新的数据表,实现新接口和鉴权逻辑。 而这些原本是存在的,仅需要补充字段,添加关联映射即可。
  • “之前网页通知模式采用js 的websocket存在连接不稳定情况,请撤销重做,并修改为基于后端请求的轮询模式",然后它重新实现了一套基于轮询的通知机制,并且之前ws 模式下的代码依然遗留在系统中,调用的API也为完全切换。
  • ...

以上种种,您是否似曾相识?

问题不在于 AI 不够聪明,而在于 AI 的记忆是会话级别的(Seesion/Context)。
你今天在 Cursor 里讲好的架构决策,明天新开一个对话它全不记得了;你在聊天框里给 AI 讲了二十分钟的上下文,它在第 21 条消息时就开始"忘事";事先约定了很多细节,在上下文压缩时已经 被 summary 了。

更要命的是:当你的需求稍微复杂一点——比如同时涉及数据库 Schema 变更、接口改动和前端组件重构——AI 在没有明确规格约束的情况下,很可能:

过度实现:你要的是加个按钮,它给你重构了整个状态管理

欠拟合:你要的是完整功能,它给你实现了一半然后说"其余你自己补吧"

需求漂移:做到第三步发现已经偏离原始设计十万八千里

这就是开发者们熟悉的"AI 乱猜" 或 “AI幻觉” 状态。

总结而言,传统AI coding 最大的困境是: 因contex上下文限制,而呈现出来的记忆缺失 和过程不可预期!

这些问题的原因,我们在上一章中,已经讨论过了。

传统解法

当然,有经验的开发者会说:把需求写清楚嘛!在 prompt 里把上下文交代清楚!用agent.md readme.md 记录

确实,这能缓解问题,但不能根治。因为:

  • Context 是一次性的:写在聊天框里的需求,换个会话就消失了
  • 同步成本高:团队协作时,每个人告诉 AI 的上下文不一致
  • 不可追溯:代码里看不出当初做这个决策的理由是什么
  • 难以复查:没有结构化的"变更说明",代码评审只能靠猜

SDD新思路

‌规格驱动开发(Spec-Driven Development, SDD)‌ 是一种以规范文档为核心的软件工程方法论:主张"规范先行,代码自动",将规格说明作为人、团队与 AI 之间的动态契约和唯一事实来源。把" 我们要做什么、为什么做、怎么做"写成结构化的 Markdown 文件,和代码一起存进 Git 仓库。AI 助手不再依赖你在聊天框里的临时描述,而是从仓库里读取持久化的规格文档,然后照单执行。

而 OpenSpec,就是把 SDD 落地的那把利器。

OpenSpec 介绍

OpenSpec 是一个轻量级、开源的规格驱动开发框架,通过结构化的 Markdown 文件帮助人类和 AI 编码助手在写代码之前就达成一致。

它本质上是一套工作流规范 + CLI 工具,让你的 AI 助手能够:

  • 读懂你真正想要什么(proposal.md)
  • 理解具体的需求约束(specs/)
  • 知道技术怎么实现(design.md)
  • 按步骤系统地执行(tasks.md)

整套文档住在你的项目仓库里,持久存在,永不遗忘。

核心概念速览

在深入使用方法之前,先认识几个关键词,别让它们在后面绊倒你:

术语 描述
Change(变更) 一个独立的功能开发或修改任务,是 OpenSpec 的最小工作单元
proposal.md "我们为什么要做这件事,做什么,不做什么"的说明书
specs/ 具体需求场景,用 Given/When/Then 格式写清楚验收条件
design.md 技术方案文档,怎么做,用什么技术,关键决策是什么
tasks.md AI 实现时的步骤清单,打勾制度,做一步标一步
AGENTS.md 给 AI 助手看的项目级说明书,告诉它这个项目怎么运转
Fast-Forward(ff) 一键生成全套规划文档的快捷操作,懒人必备
Archive(归档) 变更完成后,将变更文件夹归档,并将规格合并到主文档

OpenSpec 的文件夹结构

初始化后,你的项目会多出这样的目录:

openspec-dirtory.png

其中:
changes: 就是你的进行中队列,一目了然看到有哪些功能在开发(任务专注);
archive: 是历史记录;
specs: 是反映当前系统真实状态的活文档——每次 archive 操作都会自动把变更同步进来(工程级记忆的关键)。

OpenSpec 的核心四阶段工作流

step 1: 需求探索(Explore)

产品功能描述 转化为 需求规格的关键。通过多轮次的对话,将需求目标、范围、边界进行定义和决策,技术方案选型,细节对齐。

step 2: 定义变更 (Propose)

将需求定义为一个独立的变更,并形成提案(proposal.md);
基于提案,梳理规格,形成规格说明(spec.md);
基于规格说明,进行方案设计,形成设计说明(design.md)
基于设计说明,进行任务拆解,形成任务计划(tasks.md)

step 3: 实施(Apply)

该步骤时AI真正执行实施的过程, 按照tasks.md 逐条实现,并进行确认,每完成一条对该条目进行打钩。包含部分测试验证条目。
注意,部分条目需要人工进行验证(比如涉及到生产环境上的一些验证)。
所有tasks完成后,本任务完成。

step 4: 归档(archive)

当所有tasks均完成后, 该任务完成。
注意,这一步最后人工验收(编译、构建、安装、关键功能验证等)。
验收通过后, 对当前变更进行归档:将 changes 内容移动到archive 中,同时合并到主specs中。
后续的变更,可以参考主specs中的记录,让AI理清整个项目的演化(全局记忆), 编译前后关联。

为什么要分四阶段?

因为这四个阶段对应着四种种不同的思维模式:

  • 探索阶段: 是"发散思维",核心是想清楚要做什么,允许反复推敲
  • 规划阶段: 是"正规化",核心是确认方案和边界,是需求 转换为实现 的关键映射
  • 实现阶段: 是"收敛执行",核心是严格按照规格,保障计划任务完成,不做规格之外的事
  • 归档阶段: 是"沉淀知识",核心是让完成的工作成为持久的项目知识

OpenCode + penSpec 工程化实践

注意:当前验证是基于linux 环境验证和记录,windows 类似,但需要注意默认配置路径等需要对应调整!

安装

通过npm 直接安装 OpenSpec

# 需要 Node.js 20.19.0 或更高版本

# 安装openspec

npm install -g @fission-ai/openspec@latest

# 验证安装

openspec --version

注意:openspec 本身是一套skill规范,需要搭配AI 编程工具使用(Claude-cli,Codex-cli,opencode,cursor等等),因此openspec 本身并不需要配置大模型!

核心工作流实战演示

这里我们选择opencode。
如果还没有安装、配置opencode, 请参考上一篇 《玩转 AI Coding(二):基于opencode 的AI编程初体验》。

接下来,我将结合一个实际场景:
“为操作系统AI智能组手(ctsh-asst)新增息壤大模型接入能力”

为大家演示OpenCode + OpenSpec 的工程化过程。

开始之前,先对ctsh项目执行 openspec init,初始化工程配置,并指定AI 工具为opencode:

完成后,在当前目录运行opencode,进入交互式终端,进入正题!

step1 需求探索

首先,将我们的需求通过 opencode 内置命令 /opsx-explore (通过openspec init 注入skill实现) 发起需求探索。

course4-openspec-explore.png
之后opencode 会依据openspec 定义的explore 探索方式,展开对代码的分析和历史spec的检索,以确认方案;过程中,通常会识别到一些不同的实现方式,需要开发人员交互式的进行确认(方案选择、边界确认、需求细化的过程)

course4-openspec-explore-check.png

该过程可以持续多轮,直到AI能够明确设计:

course4-openspec-explore-verify.png

step2 创建变更

探索阶段,AI没有修改任何工程文件,它仅是梳理和明确了本次变更的顶层目标、范围、和大体方案。
然后需要通过 /opsx-propose 将需求进行明确、设计,并拆解为可执行的多个任务。

course4-openspec-propose.png

同样,在该过程中,您需要关注proposal.md 文件内容,确保与真实需求是匹配的;也可以与AI进行多轮次对话,确保设计方案与预期相符。
最终, 变更创建完成,并记录到change目录下

course4-openspec-check.png

注意: 变更名字尽量自命名,并保证 见文知意(类似git 提交的title,一眼就能看出这个变更的大体内容)

step3 执行

仅需要 键入 /opsx-apply, 剩下的事情交给AI!

course4-openspec-apply.png

注意,因部分task环境、资源依赖的原因,可能有部分需要人工验证;验证ok后,可以知会AI,task xxx已验证!
另外,人工验收也是必要;过程如果发现问题,让AI迭代修改。

step4 归档

验收完成后,通过 /opsx-archve 归档该任务。
通常,归档完成后,在进行git 提交。

写在最后

openspec 通过预先澄清目标和设计,并以spec规格文档,通过项目级记忆的方式保存了项目的演化过程;当你再提及 “昨天添加的导出功能时”,AI能够通过spec记录找到对应的变更。

因此,openspec赋予了项目完整的演化记忆!

但openspec 每一次闭环局限在一个change中,因此,要求每一个change不能太复杂,必须保证在一个会话过程中能够闭环。

故而,openspec模式适合于项目渐进式迭代开发的过程,而不太适合复杂项目的初始构建。

下一章,我们会介绍另外一个 工程化实践SKILL, superpower: 一个基于流程驱动的开发SKILL。

superpower会带来哪些新东西? 我们下回分解。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0