强烈推荐:AI编程巴士网站:稳定纯净的ClaudeCode套餐供应 (https://code.ai80.vip/home)
前言
在《SDD规范驱动开发:AI时代的软件工程新范式》一文中,我们详细介绍了SDD(Spec-Driven Development,规范驱动开发)的设计思想:以规范为核心驱动代码生成,在编写任何代码之前先让人与AI达成明确共识,从根本上解决AI编程中的上下文漂移、决策不透明、知识无法沉淀等工程痛点。
OpenSpec是一款将SDD方法论工程化落地的开源工具。它不是另一套复杂的项目管理系统,而是一个轻量级的规范层:通过简洁的目录结构和斜杠命令,将每次特性开发组织为包含提案、规范、设计、任务清单的结构化变更单元,配合20+种主流AI助手开箱即用,帮助开发者在保持工程纪律的同时不增加额外的流程负担。
什么是OpenSpec
OpenSpec的官方定义是:
The most loved spec framework.
其设计哲学可以概括为五条原则:
→ fluid not rigid(流动而非刚性)→ iterative not waterfall(迭代而非瀑布)→ easy not complex(简单而非复杂)→ builtforbrownfield(面向存量系统而非只支持新项目)→ scalable(从个人项目到企业级均可适用)OpenSpec通过在项目中引入一个openspec/目录,将每次特性开发或变更组织为包含提案、规范、设计、任务清单的结构化文件夹。配合AI助手的斜杠命令,开发者可以在几秒内启动一次规范化的变更流程,而不是直接让AI开始写代码。
与同类工具的对比
| 工具 | 定位 | 核心差异 |
|---|---|---|
OpenSpec | 轻量级规范层,多工具支持 | 流程灵活、支持20+种AI助手、开箱即用 |
Spec-kit(GitHub) | 重量级SDD工具包 | 功能完整但流程较重,需要更多配置 |
Kiro(AWS) | 专属IDE集成 | 功能强大但锁定IDE和Claude模型 |
| 无规范 | 直接Vibe Coding | 快速启动但结果不可预测 |
核心概念
理解OpenSpec的工作原理,需要掌握以下几个核心概念。
Specs(规范,系统的事实来源)
specs/目录是整个项目的"行为事实来源"(source of truth),描述系统当前的行为方式。它按领域组织:
openspec/specs/ ├── auth/ │ └── spec.md# Authentication behavior├── payments/ │ └── spec.md# Payment processing└── ui/ └── spec.md# UI behavior规范文件采用结构化的需求格式,使用SHALL/MUST/SHOULD等RFC 2119关键字表达需求强度,并通过Given/When/Then场景使需求可验证。
Changes(变更,每个特性独立管理)
每一次特性开发或变更都对应changes/下的一个独立文件夹,包含该变更所需的全部上下文信息:
openspec/changes/add-dark-mode/ ├── proposal.md# Why and what├── design.md# How (technical approach)├── tasks.md# Implementation checklist└── specs/# Delta specs (what's changing)└── user-http-service/ └── spec.md这种"变更即文件夹"的设计带来了几个工程优势:多个变更可以并行进行而不互相污染;归档后的变更保留完整上下文,支持历史追溯;变更文件夹也是天然的代码审查单元。
Delta Specs(增量规范)
想象一下,你和一个工程师对接需求时,不会让他读完整个系统文档,而是直接告诉他"这次迭代新增了什么、改了什么、去掉了什么"。增量规范的作用就是这样——它是每次变更专属的行为变更清单,存放在变更文件夹的specs/<domain>/spec.md中,只描述本次变更对系统行为的增量影响,而非重写整份规范。
增量规范使用三个标记描述变更类型:
ADDED:本次新增的行为需求MODIFIED:本次修改的既有行为(标注旧值)REMOVED:本次移除的行为(标注移除原因)
每条需求以Given/When/Then场景格式表达,确保需求是可验证的而非模糊的描述。以用户服务为例:
## ADDED Requirements### Requirement: Create UserThe system SHALL create a new user record when provided with valid registration data.#### Scenario: Successful user creation- WHEN a POST request is sent to /api/v1/users with valid username, email and password - THEN the system SHALLreturnHTTP200with the new user'sid- AND the user record SHALL be persistedinthe database#### Scenario: Duplicate email- WHEN a POST request is sent with an email alreadyinuse - THEN the system SHALLreturnHTTP400增量规范在工作流中扮演"行为合同"的角色,贯穿整个变更生命周期的三个环节:
驱动实现:
/opsx:apply执行时,AI以增量规范为基准,确保生成的代码满足每条场景定义的行为约束驱动验证:
/opsx:verify执行时,AI逐条核查代码实现是否与增量规范中的Given/When/Then场景一致沉淀为永久规范:
/opsx:archive执行时,ADDED需求追加到主规范,MODIFIED需求替换旧版本,REMOVED需求从主规范中移除,确保openspec/specs/始终反映系统的当前行为
这种设计的核心价值在于:AI不是凭感觉猜测你想要什么,而是按照明确的行为合同来实现和验证——需求、实现、验证三者形成闭环。
Artifacts(工件,驱动实现的文档体系)
变更文件夹中的文档(工件)构成了一个相互依赖的信息体系,引导AI从意图到实现:
proposal ──► specs ──► design ──► tasks ──► implement(why)(what)(how)(steps)| 工件 | 文件 | 作用 |
|---|---|---|
| 提案 | proposal.md | 记录变更动机、范围边界、整体思路 |
| 增量规范 | specs/<domain>/spec.md | 描述行为层面的变化(不涉及实现细节) |
| 设计 | design.md | 技术方案、架构决策、数据流设计 |
| 任务清单 | tasks.md | 具体实现步骤,支持逐条执行和验证 |
支持的AI工具
OpenSpec支持20+种主流AI编程助手,通过openspec init即可自动为所选工具生成对应的斜杠命令文件:
| AI助手 | 命令文件路径 |
|---|---|
Claude Code | .claude/commands/opsx/<id>.md |
GitHub Copilot | .github/prompts/opsx-<id>.prompt.md |
Cursor | .cursor/commands/opsx-<id>.md |
Windsurf | .windsurf/workflows/opsx-<id>.md |
Gemini CLI | .gemini/commands/opsx/<id>.toml |
Amazon Q | .amazonq/prompts/opsx-<id>.md |
Continue | .continue/prompts/opsx-<id>.prompt |
Qwen Code | .qwen/commands/opsx-<id>.toml |
核心工作流命令
OpenSpec通过Profile(配置模式)控制安装哪些斜杠命令,共有两种Profile。
:::warning 注意 由于不同AI工具对斜杠命令的命名规范有所差异,在VSCode Github Copilot中的斜杠命令名称与Claude Code下的略有不同。
:::
默认快捷路径(core profile)
openspec init默认安装core profile,只生成以下4个命令,适合大多数日常开发场景:
/opsx:explore ──► /opsx:propose ──► /opsx:apply ──► /opsx:archive| 命令 | 作用 |
|---|---|
/opsx:explore [topic] | 探索性思考,不创建变更文件夹 |
/opsx:propose <name> | 一步生成变更文件夹及全部规划工件 |
/opsx:apply | 按tasks.md逐条实现 |
/opsx:archive | 归档变更,合并增量规范到主规范 |
扩展工作流(expanded profile)
如需更细粒度的控制,可以切换到custom profile,从全部11个命令中按需选择安装:
# 切换到 custom profile 后重新初始化openspec config profile custom openspec initcustom profile在core的基础上新增了以下命令:
/opsx:new ──► /opsx:ff(或 /opsx:continue)──► /opsx:apply ──► /opsx:verify ──► /opsx:archive| 命令 | 作用 |
|---|---|
/opsx:new <name> | 创建变更文件夹脚手架(不自动生成工件内容) |
/opsx:continue | 按依赖关系逐步生成下一个工件 |
/opsx:ff | 快进:一次性生成所有规划工件 |
/opsx:verify | 验证实现是否与增量规范一致 |
/opsx:sync | 将增量规范合并到主规范(不归档变更文件夹) |
/opsx:bulk-archive | 批量归档多个已完成的变更 |
/opsx:onboard | 交互式教程,引导完整工作流 |
Profile配置保存在全局配置~/.config/openspec/config.json中,切换后执行openspec init即可重新生成对应的斜杠命令文件。
安装与初始化
安装OpenSpec CLI
OpenSpec通过npm发布,需要Node.js 20.19.0或更高版本:
# 全局安装npminstall-g@fission-ai/openspec@latest# 也支持 pnpm / yarn / bunpnpmadd-g@fission-ai/openspec@latest在项目中初始化
进入项目目录,运行初始化命令:
cdyour-project openspec init初始化过程是交互式的,会询问:
选择要配置的
AI工具(可多选)选择工作流配置(
core默认快捷路径,或custom扩展工作流)
以选择Claude Code为例,初始化完成后项目新增以下结构:
your-project/ ├── .claude/# Claude Code 集成目录│ ├── commands/ │ │ └── opsx/# OpenSpec 斜杠命令│ │ ├── apply.md# /opsx:apply 命令定义│ │ ├── archive.md# /opsx:archive 命令定义│ │ ├── explore.md# /opsx:explore 命令定义│ │ └── propose.md# /opsx:propose 命令定义│ └── skills/ │ ├── openspec-apply-change/# apply 工作流的行为指导技能│ ├── openspec-archive-change/# archive 工作流的行为指导技能│ ├── openspec-explore/# explore 工作流的行为指导技能│ └── openspec-propose/# propose 工作流的行为指导技能└── openspec/# OpenSpec 核心规范目录├── changes/# 进行中的变更(每个变更一个子目录)│ └── archive/# 已归档的历史变更记录├── specs/# 系统行为规范(事实来源,初始为空)└── config.yaml# OpenSpec 项目配置如果是选择了其他工具(如GitHub Copilot、Cursor等),相应的命令定义和技能文件会被生成到对应的集成目录中,使用方式与上述类似。
项目配置文件(config.yaml)
openspec/config.yaml是OpenSpec的项目级配置文件,在初始化时自动生成。它控制工作流行为和AI 行为约束,是项目个性化的核心入口。
配置文件支持三个字段:
| 字段 | 类型 | 必填 | 作用 |
|---|---|---|---|
schema | string | 是 | 指定工作流Schema,默认spec-driven |
context | string | 否 | 项目背景信息,注入所有工件生成的指令中,上限50KB。该内容会作为隐性约束注入到每次AI生成工件时的系统提示词中,但不会出现在工件文件里。适合放技术栈、编码规范、领域背景等跨变更通用的信息 |
rules | map | 否 | 按工件ID设置约束规则,仅对指定工件(proposal/specs/design/tasks)生效 |
context和rules的内容是给AI看的约束,不是写入文件的内容——AI在生成工件时会参照它们,但永远不会把这两个字段的内容原文复制进工件文件中。
配置示例:
schema: spec-driven context:|Tech stack: Go, GoFrame v2, SQLite(dev)/ MySQL(prod)API style: RESTful, JSON responses wrappedin{code, message, data}Error codes: follow internal error code specindocs/error-codes.md All new APIs must include pagination support Domain: multi-tenant SaaS platform rules: proposal: - Keep proposals under500words - Always include a"Non-goals"section - Reference the related issue numberinWhy section specs: - All scenarios must include both success and error cases - HTTP status codes must follow RFC7231tasks: - Break tasks into chunks completableinone session - Each task group must have a corresponding spec requirement实战演示
下面通过一个完整的实例,演示如何使用OpenSpec进行AI工程管理实践:用GoFrame框架从头构建一个用户服务,提供以下RESTful接口:
| 方法 | 路径 | 说明 |
|---|---|---|
POST | /api/v1/users | 创建用户 |
GET | /api/v1/users | 查询用户列表(支持分页) |
GET | /api/v1/users/{id} | 按ID查询用户 |
PUT | /api/v1/users/{id} | 更新用户(支持部分更新) |
DELETE | /api/v1/users/{id} | 删除用户 |
第一步:探索需求
在开始正式规划之前,先用/opsx:explore澄清技术选型和边界,执行以下指令开始:
/opsx:explore随后给AI自己的需求:
我要用 GoFrame 框架构建一个用户服务,提供 RESTful CRUD 接口。数据库还没确定,SQLite 还是 MySQL?随后根据和AI的多次交互逐步澄清需求和技术选型。探索阶段不会创建任何文件,纯粹是对齐认知的过程。所有的信息都存于对话的上下文里,因此在这个阶段你可以随时切换到其他话题,等到需求清晰了再回来继续规划,AI会记得之前的上下文,不会丢失。
:::warning 特别提醒 但如果探索的上下文过长,可能会引起上下文漂移,这时可以直接进入下一步,AI会根据当前的对话上下文和探索阶段的内容生成提案和规范工件。总之,探索阶段的核心价值在于让你和AI在正式进入规划和实现之前先达成共识,而不是追求一次性把所有细节都说清楚。 :::
第二步:提案与规划
需求清晰后,可以手动使用/opsx:propose一步生成完整的变更规划工件:
/opsx:propose user-http-service:::info 提示 其中的变更名称必须遵循kebab-case命名规范:只能包含小写字母、数字和连字符,以小写字母开头,不能以连字符开头或结尾,不能包含连续连字符。以下是一些合法的命名示例:
| 示例名称 | 说明 |
|---|---|
user-http-service | 功能描述,推荐格式 |
add-user-auth | 动宾结构 |
fix-login-timeout | 问题修复 |
v001-user-crud | 带版本前缀(点号.不合法,用数字代替) |
v20260304-user-crud | 带日期前缀(推荐) |
refactor-db-layer | 重构类变更 |
| ::: |
生成的4个工件及其作用如下:
| 工件 | 作用 |
|---|---|
proposal.md | 记录本次变更的动机(为什么做)、范围边界(做什么、不做什么)和整体思路,是后续工件的出发点 |
specs/user-crud/spec.md | 增量规范(行为合同):使用ADDED/MODIFIED/REMOVED标记描述本次变更对系统行为的增量影响,以Given/When/Then场景定义可验证的需求条件。它是整个变更的核心基准 -/opsx:apply按它驱动代码实现,/opsx:verify按它核查实现是否达标,/opsx:archive按它更新主规范 |
design.md | 技术实现方案,包含架构决策、技术选型理由、数据流设计等,是任务拆解的依据 |
tasks.md | 将设计方案拆解为可逐条执行的实现清单,/opsx:apply将按此清单驱动AI逐步完成实现 |
在进入实现之前,你可以直接编辑这些工件进行调整,AI的实现将完全以修改后的工件为准。这是OpenSpec规范先行理念的核心体现。
第三步:实现
工件确认无误后,运行/opsx:apply驱动AI按任务清单逐步实现:
/opsx:apply实现过程中如果发现设计需要调整,可以随时暂停,在更新工件中的任意内容后,再继续执行,AI会根据更新后的工件继续工作。
第四步:验证(扩展工作流)
如果启用了扩展工作流,可以在归档前使用/opsx:verify验证实现是否与规范一致,如果使用的是默认的core profile,那么该步骤将在/opsx:apply过程中自动进行。
/opsx:verify以下是对五个接口的实际验证示例:
# 创建用户curl-s-XPOST http://127.0.0.1:8080/api/v1/users\-H"Content-Type: application/json"\-d'{"username":"alice","email":"alice@example.com","password":"secret123"}'# {"code":0,"message":"","data":{"id":1}}# 查询用户列表curl-s"http://127.0.0.1:8080/api/v1/users?page=1&pageSize=10"# {"code":0,"message":"","data":{"list":[{"id":1,"username":"alice","email":"alice@example.com",...}],"total":1}}# 按 ID 查询(password 字段不出现)curl-shttp://127.0.0.1:8080/api/v1/users/1# {"code":0,"message":"","data":{"id":1,"username":"alice","email":"alice@example.com",...}}# 部分更新curl-s-XPUT http://127.0.0.1:8080/api/v1/users/1\-H"Content-Type: application/json"\-d'{"username":"alice2"}'# {"code":0,"message":"","data":{}}# 删除用户curl-s-XDELETE http://127.0.0.1:8080/api/v1/users/1# {"code":0,"message":"","data":{}}第五步:归档
验证通过后,运行/opsx:archive斜杠指令完成整个变更周期:
/opsx:archive归档操作会依次完成两件事:
合并增量规范到主规范:将
changes/user-http-service/specs/下的增量规范按ADDED/MODIFIED/REMOVED规则合并到openspec/specs/,使主规范与代码的当前行为保持一致移动变更文件夹:将
changes/user-http-service/整体移入changes/archive/,从活跃变更列表中清除,同时完整保留本次变更的提案、设计、任务清单等所有上下文,支持日后追溯
归档后,openspec/specs/user-crud/spec.md就成为了用户服务行为的永久记录。下次任何人——无论是新成员还是AI——都可以通过读取specs/来理解系统当前的行为,而不需要翻历史聊天记录。
需要注意的是,归档是一个纯文档操作,不涉及任何代码文件,跳过这一步不会影响程序运行。但如果长期不执行归档,openspec/specs/会与代码实际行为产生偏差,openspec list中也会堆积大量已完成但未归档的"活跃变更",最终导致OpenSpec的规范管理价值逐渐失效。
CLI管理命令
除了斜杠命令,OpenSpec还提供了一套CLI命令用于日常管理:
# 列出所有活跃变更openspec list# 查看某个变更的详情openspec show user-http-service# 验证规范格式openspec validate user-http-service# 启动交互式仪表盘openspec view# 更新项目中的 AI 工具配置openspec updateCLI命令速查表
| 命令 | 作用 |
|---|---|
openspec init | 初始化项目,配置AI工具集成 |
openspec update | 刷新AI工具配置,同步最新斜杠命令 |
openspec list | 列出活跃变更和规范 |
openspec show <name> | 查看变更或规范的详细内容 |
openspec validate <name> | 检查规范格式和结构问题 |
openspec view | 打开交互式仪表盘 |
openspec archive <name> | 从终端归档已完成的变更 |
openspec status | 查看当前变更的工件进度 |
openspec config profile | 切换工作流配置(core/custom) |
常见问题
为什么安装后只有 4 个命令?
openspec init默认使用core profile,只生成/opsx:explore、/opsx:propose、/opsx:apply、/opsx:archive这4个命令。这是有意为之的设计——对大多数日常开发场景,这4个命令已经足够完成完整的变更周期。
如果需要/opsx:verify、/opsx:new、/opsx:ff等更细粒度的控制命令,切换到custom profile后重新初始化即可:
openspec config profile custom openspec init跳过/opsx:archive归档会有什么影响?
归档是一个纯文档操作,不涉及任何代码文件,跳过它不会影响程序运行。但长期不归档会带来两个问题:
openspec/specs/(系统行为的事实来源)不会更新,与代码实际行为的偏差会随着未归档变更的堆积而越来越大,最终失去参考价值openspec list会一直把已完成的变更列为"活跃状态",难以区分真正进行中的变更
项目中同时存在多个需求时,AI 如何知道执行哪一个?
这由/opsx:apply等命令的定义文件来约束,AI的行为分三种情况:
只有一个活跃变更:自动选择并告知用户,例如:Using change: user-http-service。
多个活跃变更,对话上下文中已提到变更名:从上下文推断,直接使用。
多个活跃变更,上下文不明确:AI被强制要求先执行openspec list --json获取变更列表,然后通过交互提问让用户手动选择,而不是自行猜测。
也可以在命令中直接指定变更名,跳过上述判断:
/opsx:apply user-http-service项目积累了大量变更后,specs 会不会撑爆 AI 的上下文?
这是一个合理的担忧,但OpenSpec的设计从架构层面规避了这个问题——**AI每次工作时读取的是当前变更文件夹,而不是整个openspec/specs/目录**。
以/opsx:apply为例,命令定义文件明确规定AI只读取以下contextFiles:
openspec/changes/<name>/proposal.md# 本次变更动机openspec/changes/<name>/specs/# 本次增量规范(通常只有几百行)openspec/changes/<name>/design.md# 本次技术方案openspec/changes/<name>/tasks.md# 本次任务清单无论openspec/specs/主规范积累了多少历史内容,/opsx:apply执行时一行也不会自动载入。AI始终工作在一个范围明确的"变更沙盒"里,上下文大小只与本次变更的复杂度正相关,与项目历史规模无关。
/opsx:propose命令在规划生成增量规范时,若需要了解已有行为,会自动通过openspec instructions命令按需读取对应领域的主规范文件(如openspec/specs/user-crud/spec.md),而不是把所有领域的规范一次性全部载入。
所以openspec/specs/即便长到几万行也不会影响日常使用——它主要是给人查阅的档案,不是每次都注入给AI的上下文。
本质上,OpenSpec的"增量规范"设计本身就是对上下文的一种天然分片——每次AI只需要理解"这次变更了什么",而不需要理解"系统的一切"。
生成的工件文件语言混乱,如何统一为中文?
OpenSpec内置的工件模板(proposal.md、spec.md、design.md、tasks.md)本身是英文的,模板中的标题和占位符会直接影响AI生成内容时的语言倾向。此外,AI会倾向于跟随对话语言生成内容,如果你的需求描述或对话是中文,内容体通常会是中文,但标题结构往往保留英文,导致中英混杂。这对于需要人工审查AI生成的内容时不是很友好(如果不需要人工审查内容,那么该问题则没那么重要)。
OpenSpec没有内置的语言开关,但可以通过config.yaml的context字段添加一条语言约束,统一对所有工件的生成生效(/opsx:propose、/opsx:continue、/opsx:ff等生成工件的命令均会注入此约束):
schema: spec-driven context:|Output language: All artifact content must be writteninSimplified Chinese, including section titles, descriptions, scenario text, and task items. The only exceptions are: code identifiers, API paths, technical terms with no standard Chinese translation, and RFC keyword markers(SHALL/MUST/SHOULD/GIVEN/WHEN/THEN).注意:
context约束仅在生成工件文件时生效(即/opsx:propose等调用openspec instructions <artifact-id>的命令)。/opsx:apply执行实现代码时不会读取context字段,但这通常不影响工件文件本身的语言一致性,因为工件在apply阶段已经生成完毕。
总结
OpenSpec提供了一种轻量而实用的方式来解决AI编程中最棘手的工程管理问题:如何在飞速的代码生成中保持工程纪律,如何让需求、设计、实现三者保持一致,如何让每一次技术决策都有迹可循。
它的核心价值不是增加流程负担,而是通过结构化的规范层,让人和AI在动手写代码之前先达成共识——先对齐,再实现。
对于正在构建AI辅助开发工作流的团队,OpenSpec是一个值得纳入工程工具箱的选择:安装简单、工具兼容性强、工作流灵活,并且完全开源(MIT协议)。
参考资料
- OpenSpec GitHub 仓库
强烈推荐:AI编程巴士网站:稳定纯净的ClaudeCode套餐供应 (https://code.ai80.vip/home)