AI编程提速:用SDD、OpenSpec与SuperPowers构建规范驱动开发工作流
2026/9/7 20:45:26 网站建设 项目流程

去年我在一个中大型项目里被AI生成的代码坑了几次——不是功能不对,而是代码风格、边界处理、模块划分和团队规范完全脱节。后来我琢磨出一套组合拳:用SDD(规范驱动开发)的思路,把OpenSpec当作规范管理框架,再让SuperPowers给AI助手补上执行技能。这套方式让我从“反复改prompt”切换到“先定规范、再让AI照着做”,整体效率提升非常明显。这篇文章就把这套工作流完整拆开聊聊,想尝试规范驱动开发的开发者,尤其是每天和AI编码助手打交道的人,应该能直接拿走用。

1. 规范驱动开发(SDD)的核心思路

1.1 SDD、OpenSpec、SuperPowers三者到底是什么关系

很多人第一次看到SDD会联想到TDD(测试驱动开发)或者BDD(行为驱动开发),它们的确同属“先定义、后实现”的流派,但SDD的覆盖面要更宽。SDD强调把需求、接口设计、验收标准这些“规范”作为开发流程的源头,代码只是规范的落地结果。在AI辅助编程的场景下,这个源头尤其重要,因为大模型生成代码时如果没有明确的约束,很容易“自由发挥”。

OpenSpec和SuperPowers在这套工作流里的分工很清晰:OpenSpec负责管理规范文件,让规范的创建、变更、版本追踪都变得结构化;SuperPowers则是一组预定义的AI技能库,相当于给AI助手装了“行业标准操作手册”。两者配合起来,OpenSpec解决“我们到底要做什么”的问题,SuperPowers解决“AI该怎么高效地把事情做出来”的问题。

如果用一句话概括:SDD是方法论,OpenSpec是规范层,SuperPowers是执行层。你不需要三样都用,但组合起来才能最大限度地减少AI编程中的“偏移风险”。

1.2 为什么SDD能提升AI编程的准确性

直接让AI写代码,哪怕你给了一段很详细的描述,也经常会出现“看起来对、实际有坑”的结果。原因很简单:描述是线性的,而软件系统是状态化的。比如你让AI“实现用户注册接口”,它可能只写了简单的字段校验和数据库插入,却漏掉了邮箱格式验证、重复用户名处理、密码加密策略这些关键约束。

SDD的思路是把这些约束前置到规范里,用结构化的方式写清楚:输入输出是什么、异常情况怎么处理、验证规则有哪些。AI在生成代码时,其实是在“翻译”一份完整的规格说明书,而不是在“猜测”需求。OpenSpec的价值在于,它给了这份规格说明书一个标准格式,让AI能稳定地定位到每一类约束。

我实测下来,规范写得越具体,AI生成代码的一次通过率越高。以前可能要来回改五六轮prompt,现在只需要在规范文件里把验收标准写清楚,AI生成后跑测试,通过率能到八成以上。这不是玄学,而是因为大模型本身很擅长“按图索骥”,问题是你要先画出一张足够精确的图。

1.3 SDD与传统开发方式的对比

传统开发流程里,需求文档、架构设计、编码实现往往是三拨人在三个时间段里完成的,信息丢失严重。SDD则尝试把三者压缩到一个统一的规范层,而且这个规范层必须是机器可读、AI可理解的。相比TDD关注“测试先行”,SDD更关注“全面约束先行”,测试只是约束中的一类。

拿我自己的项目举例:以前我习惯先写接口代码,再补测试,最后写文档。代码跟文档经常对不上,测试也覆盖不到全部边界。用SDD之后,我要求自己先写OpenSpec规范,把需求、设计、任务都定义清楚,再让AI按规范生成代码。虽然前期写规范多花了一两个小时,但后续省下的是几天的返工和沟通成本。

2. OpenSpec:规范文件的管理框架

2.1 OpenSpec的设计理念

OpenSpec并不是一个复杂的企业级平台,它更像一个“规范和AI之间的翻译层”。它要求你把项目拆成一个个模块,每个模块下都有独立的规范文档,包含需求、设计、任务、验收标准等部分。这些文档都是纯Markdown,方便人看,也方便AI读取。

它的核心理念是“变更驱动”:每次功能开发或修复都对应一个变更集(change set),变更集里描述改动范围,并且有清晰的验收条件。这种设计让AI在生成代码时有了明确的上下文边界,不会把整个项目的代码都推翻重写。

另外一个让OpenSpec加分的设计是,它可以生成结构化的任务列表。你不需要自己在prompt里罗列“第一步做什么、第二步做什么”,OpenSpec已经帮你拆好了,AI只需要按顺序执行。这极大减少了AI生成代码时的“跳跃式”问题。

2.2 规范文件结构解析

一个典型的OpenSpec项目目录大概是这样的:

openspec/ ├── project.md ├── modules/ │ └── auth/ │ ├── requirements/ │ │ ├── 001_user_registration.md │ │ └── 002_login.md │ ├── design/ │ │ ├── 001_registration_api.md │ │ └── 002_session_management.md │ ├── tasks/ │ │ ├── 001_implement_registration_endpoint.md │ │ └── 002_add_psssword_hash_util.md │ └── changes/ │ └── 20240515_add_registration_api.md
  • project.md描述整体项目背景和全局约束。
  • modules/下面按功能模块组织,每个模块有自己的requirements(需求)、design(设计)、tasks(任务)。
  • changes/目录存放变更集,每个变更集是一个独立的规范快照,描述本次改动要解决什么问题、验收标准是什么。

这种结构的好处是,AI在生成代码时可以把注意力集中在一个变更集上,而不是被整个项目的复杂性压垮。同时,所有规范都纳入版本控制,每次改动都有迹可循。

2.3 安装与基础配置

OpenSpec的安装方式很直接,官方提供了CLI工具。以Node.js环境为例,一般是这样:

npm install -g @openspec/cli openspec init

init命令会在当前目录生成一个基础的openspec/结构。你需要做的是在project.md里填写项目背景,然后创建模块和对应的规范文件。

如果你用的是Cursor或者OpenCode这类AI编码工具,通常不需要额外配置,AI会自动扫描openspec/目录下的Markdown文件。如果你希望AI每次启动时都主动加载规范,可以在项目根目录的AI指令文件里加一句话,例如“开始任何任务前,请先阅读openspec/project.md和相关的模块规范”。

我在配置时踩过一个坑:OpenSpec默认只会识别openspec/目录下的规范,如果你把规范放在了别的位置,AI很容易忽略。所以建议严格按照默认目录结构来,不要自作聪明调整路径。

2.4 从规范到任务清单

OpenSpec最让我喜欢的一点是,它能将规范自动解析成任务清单。比如你在tasks/001_implement_registration_endpoint.md里写清楚“实现注册接口,包含邮箱、密码、用户名三个必填字段,密码需要BCrypt加密”,OpenSpec会把它标记为一个待办任务,AI看到后会按顺序执行。

这个能力看起来简单,但在AI编程里非常关键。很多AI生成的代码质量差,是因为它们试图一次性完成太多事情,导致上下文窗口被填满,中后段逻辑开始偷工减料。而任务清单强制AI“一次只做一件事”,质量自然稳定。

实际操作中,我会在tasks/目录下给每个任务文件加上依赖关系,例如“001必须在002之前完成”。OpenSpec支持简单的依赖描述,AI在执行时会读到这里,就不会乱序。

3. SuperPowers:为AI助手补齐执行技能

3.1 SuperPowers到底是什么

SuperPowers可以理解成一个“技能插件包”。它最初的设计目标,是让AI助手具备一些“元能力”,比如代码审查、重构、写文档、调试定位等。每一个能力都是一个Markdown文件,里面详细描述了AI应该按照什么步骤执行这项任务,以及有哪些最佳实践和禁忌。

举个例子,一个“code-review”技能可能会告诉AI:先检查单测覆盖率,再检查异常处理,最后检查代码风格。如果AI没有加载这个技能,它可能只会凭直觉审查。而加载了技能后,AI的行为会更接近一个有经验的开发者在做code review。

SuperPowers和OpenSpec的天然契合点在于:OpenSpec告诉你“要做什么”,SuperPowers告诉你“怎么把这件事做得专业”。如果只有OpenSpec,AI可能生成能跑的代码,但不够优雅。如果只有SuperPowers,AI很专业却可能跑偏方向。两者结合才是完整的SDD工作流。

3.2 与OpenSpec的搭配逻辑

我实际使用时的流程是这样的:先通过OpenSpec定义好变更集和任务,然后在AI助手的系统提示词里指定“请加载SuperPowers中的xxx技能”,最后才开始生成代码。技能文件里的指导会直接影响AI的代码风格和边界处理方式。

比如在实现注册接口时,我会要求AI加载“backend-api-design”技能,这个技能通常包含接口版本管理、错误码规范、参数校验最佳实践等。加载后,AI生成的代码就不会只是“能跑”,而是从一开始就符合团队规范。

这里有个小技巧:SuperPowers的每个技能文件最好也放在版本控制里。因为技能本身会随着项目经验积累而优化,你后来总结的“避坑指南”完全可以写进技能文件,让AI每次都能享受你的最新经验。

3.3 常用技能示例

SuperPowers技能库里有不少现成的技能,但也可以自己写。我常用的几个:

技能名称用途关键提示词
error-handling规范异常处理逻辑,避免吞异常“所有外部调用都必须捕获并包装为业务异常”
logging统一日志格式,方便排查“关键业务节点必须输出结构化日志”
migration数据库迁移脚本生成与回滚“每个迁移脚本必须提供可回滚的down方法”
security-check检查输入校验、权限控制“所有入口参数必须经过白名单校验”

当然,这些技能并不是死板的。你完全可以为你的项目定制一个“项目专属技能”,把团队约定、代码风格、常用依赖版本都写进去。我把这些技能文件都放在项目根目录的powerups/文件夹下,和openspec/并列,AI能同时感知到规范和技能。

4. 实操:构建一条完整的SDD工作流

4.1 场景设定:为Python服务新增用户注册

为了让你能直观看到这套工作流怎么落地,我模拟一个常见的开发场景:给一个FastAPI服务添加用户注册功能。假设技术栈是Python 3.11、FastAPI、SQLAlchemy、PostgreSQL。

按照SDD的节奏,我不会直接打开编辑器写代码,而是先进入OpenSpec的规范流程。

4.2 第一步:定义项目规范和模块

先检查openspec/project.md,里面写清楚这个项目是做什么的,有哪些全局约定。没有的话就先补上:

# 项目名称:User Service ## 项目背景 提供用户注册、登录、个人信息管理功能。 ## 全局约束 - 代码风格遵循PEP8 - 所有接口返回格式统一为`{"code": 0, "message": "ok", "data": ...}` - 数据库表名使用snake_case - 密码必须使用bcrypt加密后存储

接着为auth模块创建需求文件openspec/modules/auth/requirements/001_user_registration.md

# 需求:用户注册 ## 功能描述 允许用户通过邮箱和密码注册账号。 ## 验收标准 - 输入:email, password, username - email格式必须合法 - username长度在2~32个字符之间 - password长度至少8位 - 重复注册同一邮箱时返回业务错误码1001 - 成功后返回用户ID和创建时间

这步是整个工作流中最需要花心思的地方。验收标准一定要可测试、无歧义。比如“密码长度至少8位”就比“密码不能太短”好得多。AI在生成代码时,会直接把这些标准转成条件判断。

4.3 第二步:将规范导入OpenSpec并生成任务

需求写好后,再补设计和任务文件。如果是比较简单的新增接口,设计文件可以简短一点,描述接口路径、请求体、响应体即可。任务文件则要更细。

# 任务:实现用户注册接口 ## 参考规范 - requirements/001_user_registration.md - design/001_registration_api.md ## 子任务 1. 创建User模型,包含email、password_hash、username、created_at字段 2. 创建注册接口`POST /api/v1/auth/register` 3. 实现email格式校验和重复检查 4. 实现密码bcrypt加密存储 5. 返回统一格式响应

OpenSpec会把这些子任务作为AI执行的蓝图。如果你用的是支持OpenSpec的AI编码工具,它会自动读取这些任务并按顺序执行。如果你的AI工具没有直接集成,也可以手动把任务内容粘贴到对话里作为上下文。

4.4 第三步:加载SuperPowers并生成代码

在生成代码前,我会在项目根目录的powerups/下放好两个技能文件:api-boundary.mddatabase-access.md。前者告诉AI接口层应该如何校验参数、如何处理异常;后者告诉AI数据库操作要用ORM、查询要加索引意识等。

然后在AI助手的配置里增加全局指令:

在实现任何OpenSpec任务前,请先读取`powerups/api-boundary.md`和`powerups/database-access.md`,并严格遵循其中的规范。

接下来就让AI从第一个子任务开始逐个实现。实际效果往往不错:AI生成的User模型会包含唯一的email约束,注册接口会先校验参数再查重复,密码也会用bcrypt处理。相比没有技能时的“裸写”,代码质量高一大截。

4.5 第四步:验证与迭代

代码生成后,我会立刻运行测试和静态检查。OpenSpec的验收标准本身就是很好的测试用例,比如验证“重复邮箱返回错误码1001”是否成立。发现不符合规范的地方,我会回到OpenSpec任务文件里补充说明,然后让AI重新执行该子任务。

这里有个重要心得:不要直接在对话里让AI改“某一行代码”,而是回到规范层面,把缺失的约束补到验收标准里,再让AI重新生成。这样做的目的是让规范成为最终的“唯一事实来源”。AI可能会忘记你曾经说过什么,但它不会遗漏规范文件里的内容。

我的迭代流程一般是这样的:跑测试 → 发现问题 → 更新规范验收标准 → 让AI重新实现 → 再跑测试。通常两三轮之后,接口就能稳定通过所有验收标准。

5. 常见问题与避坑指南

5.1 规范文件粒度怎么拿捏

很多人在第一次写OpenSpec时会走极端:要么只写一句话需求,要么把代码逻辑也写进规范里。这两种都不好。规范文件应该描述“做什么”和“怎么验收”,而不是“怎么实现”。实现细节交给AI根据技能和常识去发挥。

我的经验是:一个需求的验收标准控制在5~10条,每条都是可观察的行为或约束。如果你发现需求文件快要超过一屏了,大概率是粒度太细,可以考虑拆分模块或者把设计细节移到design文件里。

5.2 AI不按规范执行怎么办

这是最让人头疼的问题。明明规范里写了密码要用bcrypt,AI还是用了MD5。我排查后发现,绝大多数情况是因为AI的上下文窗口太大了,它读取的规范文件被“淹没”在大量对话历史里。

解决办法有几个:一是每次新开会话时,先让AI阅读规范,而不是在长对话里反复使用;二是把关键的、容易违反的约束在任务文件的子任务里再强调一次;三是利用OpenSpec的“变更集”机制,让AI只关注当前变更涉及的文件,减少无关内容干扰。

我还会在prompt里加一句类似“如果你发现当前任务与已有规范冲突,先停下来问我”的话。虽然不能完全避免AI自作主张,但至少能减少静默偏移。

5.3 OpenSpec与IDE插件/CLI的协同

如果你不用Cursor这类有OpenSpec集成的工具,也可以直接用CLI手动操作。比如在终端里执行openspec task list查看当前所有待办任务,用openspec change create "description"创建变更集。CLI的好处是纯文本、可脚本化,可以和CI流程集成。

我之前把OpenSpec命令接入了pre-commit钩子,每次提交前检查是否存在未标记为“完成”的任务,如果有就拦截提交。这能有效避免“规范还写着没做,代码却进了仓库”的情况。

另外,如果你用的是OpenCode这类命令行AI助手,可以直接在配置里指定OpenSpec路径,让AI每次启动时自动加载相关文件。这比复制粘贴规范内容省事得多,而且不会因为复制截断导致信息丢失。

5.4 规范变更时的维护成本

SDD有个常见质疑:维护规范不是额外增加工作量吗?我的经验是,规范文件本身不需要频繁重写,但每次需求变更时必须同步更新。如果你只改代码而不改规范,逐渐地规范就会失效,AI之后生成的代码也会偏离。

为了降低维护成本,我建议把规范当成代码的一部分来管理。每次变更都走同一个流程:更新需求 → 更新设计 → 更新任务 → 生成代码 → 跑测试。虽然看起来步骤多了,但每一步都很轻量。

还有个实用技巧:让AI反向生成规范。如果你已经有一份实现代码,可以让AI总结它的行为,生成一份初始规范。之后再基于这份规范修改和扩展,比自己从零写规范省力太多。

最后再分享一个小技巧

我实践SDD一年多,发现最容易被忽略的不是工具本身,而是“把规范当成契约”的心态。很多开发者在写规范时,潜意识里觉得“反正AI会读,写得太粗糙也没关系”,结果AI生成的代码自然也不可靠。如果你能像对待接口文档一样对待OpenSpec规范,把每条验收标准都写得像测试断言那样精确,整套工作流会顺畅很多。

另外一个让我很受用的习惯是:在SuperPowers技能文件里记录“失败经验”。比如我曾在日志规范上吃过亏,后来就在日志技能里加了“禁止使用print调试,必须使用结构化logger”。这样每次AI生成日志代码时都会自动避开这个坑。技能库会随着时间沉淀,越来越像你的“个人首席工程师”。

如果你正在尝试让AI更可靠地参与到项目里,我建议你从今天开始,选一个小功能,用OpenSpec写一份最小规范,挂上SuperPowers技能,让AI完整走一遍流程。真正试过之后,你就会理解为什么很多团队开始把“规范优先”当作AI协作的第一原则。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询