
基于项目的实践经验总结。
相关文章:
基于 SPEC 的 AI 编程 - OpenSpec 实战指南
OpenSpec 实战指南:AI 辅助软件工程全流程深度复盘
OpenSpec 是一个规范驱动开发(Spec-Driven Development, SDD)框架,专为 AI 编程助手设计。它通过在编写代码之前先定义规范,确保人与 AI 对需求达成一致。
传统开发流程通常是:需求 → 直接编码 → 测试 → 交付。
规范驱动开发的流程是:需求 → 编写规范 → 验证规范 → 编码实现。
这种方式的优势在于:
理念 | 含义 |
|---|---|
流动而非僵化 | 文档可以随时更新,没有严格的阶段门槛 |
迭代而非瀑布 | 支持增量添加需求,逐步完善 |
简单而非复杂 | 只需要 Markdown 文件,无复杂工具链 |
兼顾存量与新建项目 | 既适用于已有代码库(Brownfield),也适用于全新项目(Greenfield) |
术语解释:
检查 Node.js 版本:
node --version如果版本过低,建议使用 nvm 或 fnm 管理 Node.js 版本。
使用 npm 安装:
npm install -g @fission-ai/openspec@latest使用其他包管理器:
# pnpm(推荐,速度更快)
pnpm add -g @fission-ai/openspec@latest
# yarn
yarn global add @fission-ai/openspec@latest
# bun
bun install -g @fission-ai/openspec@latest# 查看版本号
openspec --version
# 查看帮助信息
openspec --help安装成功后,你将看到类似输出:
OpenSpec v0.x.x
Spec-Driven Development for AI Coding Assistants在项目根目录执行初始化命令:
cd your-project
openspec init执行后,OpenSpec 会创建必要的目录结构和配置文件。
openspec init 默认是交互式的,会询问你要配置哪些 AI 工具:
? Which AI tools do you want to configure? (Press <space> to select)
❯◉ Claude Code
◯ Cursor
◯ GitHub Copilot
◯ Cline
◯ Windsurf
...使用空格键选择,回车键确认。
Qoder 用户提示:如果你使用的是 Qoder IDE,请选择 Claude Code。这是因为 Qoder 基于 Claude 架构构建,与 Claude Code 使用相同的配置。
如果需要在脚本或 CI/CD 环境中使用,可以跳过交互式配置:
# 跳过所有工具配置
openspec init --tools none
# 配置所有支持的 AI 工具
openspec init --tools all
# 只配置特定工具(逗号分隔)
openspec init --tools claude,cursoryour-project/
├── .openspec/ # OpenSpec 内部配置目录(自动生成)
├── openspec/ # OpenSpec 工作目录
│ ├── agent-instructions.md # AI 代理指导文件(告诉 AI 如何使用 OpenSpec)
│ ├── project-context.md # 项目上下文(项目背景、技术栈等)
│ ├── changes/ # 变更提案目录(每个功能/变更一个文件夹)
│ └── specs/ # 主规范目录(已归档的规范)
└── ... (项目其他文件)文件/目录 | 用途 | 是否必需 |
|---|---|---|
agent-instructions.md | 指导 AI 如何遵循 OpenSpec 工作流 | 推荐保留 |
project-context.md | 项目背景、技术栈、约束条件 | 推荐填写 |
changes/ | 存放活跃的变更提案 | 必需 |
specs/ | 存放已归档的规范 | 可选 |
在 OpenSpec 中,所有的功能开发、Bug 修复、架构变更都以"变更提案(Change)"为单位进行管理。
openspec new change <change-name>命名建议:使用 kebab-case(短横线分隔),名称应简洁明了地描述变更内容。
# 好的命名示例
openspec new change user-authentication
openspec new change add-payment-module
openspec new change fix-login-timeout
# 不好的命名示例
openspec new change feature1 # 太模糊
openspec new change addUserAuth # 应使用 kebab-caseopenspec new change ai-infra-cmdb-core输出示例:
✓ Created change directory: openspec/changes/ai-infra-cmdb-core
✓ Created proposal.md
✓ Created design.md
✓ Created tasks.md
✓ Created specs/ directory
✓ Created .openspec.yaml
Change 'ai-infra-cmdb-core' created successfully!openspec/changes/<change-name>/
├── .openspec.yaml # 变更元数据(ID、状态、创建时间等,由 CLI 自动管理)
├── proposal.md # 提案文档【必填】描述 Why 和 What
├── design.md # 技术设计文档(架构、数据模型、API 设计等)
├── tasks.md # 实现任务清单(按里程碑组织的待办事项)
└── specs/ # 规范目录(存放能力规范文件)
├── <capability-1>/
│ └── spec.md # 能力规范(使用 Requirement + Scenario 格式)
├── <capability-2>/
│ └── spec.md
└── schemas/ # 模式定义(可选,存放 .proto 文件等)
└── *.proto文件 | 作用 | 是否必需 | 格式要求 |
|---|---|---|---|
proposal.md | 说明"为什么做"和"做什么" | 必需 | 必须包含 ## Why 和 ## What Changes |
specs/<capability>/spec.md | 详细的需求和验收场景 | 必需 | 必须使用 Delta Header + Requirement + Scenario 格式 |
design.md | 技术实现方案 | 推荐 | 无严格格式要求 |
tasks.md | 实现任务清单 | 推荐 | 无严格格式要求 |
schemas/*.proto | 数据结构定义 | 可选 | Protocol Buffers 格式 |
创建 (new) → 编写规范 → 验证 (validate) → 实现 → 归档 (archive)openspec new change <name>openspec validate <name>openspec archive <name>本节详细介绍 proposal.md 和 spec.md 的格式要求。请务必遵循这些格式,否则 openspec validate 会失败。
模板文件:所有模板文件位于
docs/templates/目录下,可直接复制使用。
核心要求: proposal.md 必须包含 ## Why 和 ## What Changes 两个章节,否则验证会失败。
OpenSpec 的设计理念是"先想清楚为什么做,再决定做什么":
## Why - 说明变更的背景、问题和动机## What Changes - 说明具体要添加、修改或删除什么模板文件:proposal-template.md
必需章节结构:
proposal.md 结构:
├── ## Summary(摘要,可选)
├── ## Why 【必需】
│ ├── ### Background(背景)
│ ├── ### Problem Statement(问题描述)
│ └── ### Alternatives Considered(备选方案)
├── ## What Changes 【必需】
│ ├── ### New Resources Added(新增资源)
│ └── ### New Capabilities(新增能力)
├── ## Success Criteria(成功标准,可选)
├── ## Scope(范围,可选)
├── ## Timeline(时间线,可选)
└── ## References(参考链接,可选)注意:章节标题必须完全匹配 ## Why 和 ## What Changes(区分大小写)。
核心要求: specs/ 必须使用能力文件夹(capability folders),每个能力一个文件夹。
specs/
├── accelerator-management/ # 能力一:加速器管理
│ └── spec.md
├── training-job-lifecycle/ # 能力二:训练任务生命周期
│ └── spec.md
├── inference-service/ # 能力三:推理服务
│ └── spec.md
└── relationship-management/ # 能力四:关系管理
└── spec.md重要规则:
核心要求: 必须使用 Delta Header + Requirement + Scenario 格式。
元素 | 格式 | 示例 |
|---|---|---|
Delta Header | ## ADDED/MODIFIED/REMOVED Requirements | ## ADDED Requirements |
需求标题 | ### Requirement: <标题> | ### Requirement: GPU 自动发现 |
场景标题 | #### Scenario: <标题> | #### Scenario: NVIDIA GPU 发现 |
场景内容 | Gherkin 格式 | Given/When/Then |
模板文件:spec-template.md
必需格式结构:
spec.md 结构:
├── # 能力名称
├── ## Overview(概述,推荐)
│ - 能力简介
│ - 解决的问题
└── ## ADDED/MODIFIED/REMOVED Requirements 【必需】
├── ### Requirement: <标题>
│ ├── **Priority**: P0/P1/P2
│ ├── **Rationale**: ...
│ └── #### Scenario: <标题>
│ └── Given/When/Then示例文件:spec-example.md
## ADDED Requirements
### Requirement: GPU 自动发现
系统应通过 DaemonSet 部署的代理自动发现集群节点上的 GPU/NPU 设备。
**Priority**: P0 (Critical)
**Rationale**: 自动发现是 CMDB 的核心能力,没有它就无法管理 AI 基础设施资源。
#### Scenario: NVIDIA GPU 发现
Given 一个包含 NVIDIA GPU 节点的 Kubernetes 集群
When 发现代理以 DaemonSet 方式部署到集群
Then 所有 NVIDIA GPU 通过 NVML/DCGM 被枚举
And 每个 GPU 的型号、显存、驱动版本被记录到 CMDB❌ 错误示例:
## ADDED Requirements
### REQ-001: GPU Discovery # 错误:使用了自定义编号
System SHALL discover GPUs.
#### Scenario: Discovery # 错误:场景标题太模糊✅ 正确写法:
## ADDED Requirements
### Requirement: GPU 自动发现 # 正确:使用标准格式
系统应自动发现集群中的 GPU 设备。
**Priority**: P0 (Critical)
**Rationale**: 核心功能需求。
#### Scenario: NVIDIA GPU 发现 # 正确:场景标题具体
Given 一个包含 NVIDIA GPU 节点的 Kubernetes 集群
When 发现代理部署到集群
Then 所有 NVIDIA GPU 被枚举并记录到 CMDB技术设计文档没有严格的格式要求,但建议包含以下章节。
模板文件:design-template.md
建议章节结构:
任务清单建议按里程碑组织,使用 GitHub 风格的 Markdown 任务列表。
模板文件:tasks-template.md
建议章节结构:
proposal.md 必需章节:
├── ## Why 【必需】
│ ├── ### Background
│ ├── ### Problem Statement
│ └── ### Alternatives Considered
└── ## What Changes 【必需】
├── ### New Resources Added
└── ### New Capabilities**specs/
/spec.md 必需格式**:
├── # 能力名称
├── ## Overview(推荐)
└── ## ADDED/MODIFIED/REMOVED Requirements 【必需】
├── ### Requirement: <标题>
│ ├── **Priority**: P0/P1/P2
│ ├── **Rationale**: ...
│ └── #### Scenario: <标题>
│ └── Given/When/Then模板 | 路径 | 用途 |
|---|---|---|
proposal.md 模板 | docs/templates/proposal-template.md | 提案文档模板 |
spec.md 模板 | docs/templates/spec-template.md | 能力规范模板 |
design.md 模板 | docs/templates/design-template.md | 技术设计模板 |
tasks.md 模板 | docs/templates/tasks-template.md | 任务清单模板 |
spec.md 示例 | docs/templates/spec-example.md | 能力规范示例 |
完成文档编写后,使用验证命令检查格式是否正确:
openspec validate <change-name>验证成功时显示:
✓ Change '<change-name>' is valid验证失败时会显示具体错误信息。
错误信息:
✗ [ERROR] Change must have a Why section. Missing required sections.
Expected headers: "## Why" and "## What Changes"原因:proposal.md 中缺少 ## Why 或 ## What Changes 章节。
解决方案:确保 proposal.md 包含这两个章节,可参考 proposal-template.md。
错误信息:
✗ [ERROR] file: Change must have at least one delta. No deltas found.
Ensure your change has a specs/ directory with capability folders原因:specs/ 目录结构不正确。
解决方案:
1. 确保 specs/ 下有能力文件夹:
specs/
└── your-capability/ # 能力文件夹
└── spec.md # 规范文件2. 确保 spec.md 中有 Delta Header:
## ADDED Requirements
### Requirement: 某个需求
...常见错误:
specs/
└── spec.md # ❌ 错误:直接放在 specs/ 根目录错误信息:
✗ [ERROR] Delta sections ## ADDED Requirements were found,
but no requirement entries parsed. Ensure each section includes
at least one "### Requirement:" block原因:需求标题格式不正确。
错误示例:
## ADDED Requirements
### REQ-001: GPU Discovery # ❌ 错误:使用了自定义编号
### GPU Discovery # ❌ 错误:缺少 "Requirement:" 前缀
### requirement: GPU Discovery # ❌ 错误:"requirement" 应首字母大写正确格式:
## ADDED Requirements
### Requirement: GPU 自动发现 # ✓ 正确格式错误信息:
✗ [ERROR] Each requirement MUST include at least one #### Scenario: block原因:每个需求必须至少有一个场景。
错误示例:
### Requirement: GPU 自动发现
系统应自动发现 GPU 设备。
# ❌ 没有场景块正确格式:
### Requirement: GPU 自动发现
系统应自动发现 GPU 设备。
**Priority**: P0 (Critical)
**Rationale**: 核心功能需求。
#### Scenario: NVIDIA GPU 发现
Given 一个包含 NVIDIA GPU 节点的 Kubernetes 集群
When 发现代理部署到集群
Then 所有 NVIDIA GPU 被枚举并记录到 CMDB如果验证失败但不确定原因,可以查看解析后的结构:
openspec change show <change-id> --json --deltas-only这会输出 JSON 格式的解析结果,帮助你了解 OpenSpec 是如何解析你的文档的。
openspec status --change <change-name>输出示例:
Change: ai-infra-cmdb-core
Status: active
Artifacts:
✓ proposal.md - Valid
✓ design.md - Present
✓ tasks.md - Present
✓ specs/accelerator-management/spec.md - Valid (2 requirements, 3 scenarios)
✓ specs/training-job-lifecycle/spec.md - Valid (2 requirements, 4 scenarios)
✗ specs/inference-service/spec.md - Invalid (missing scenarios)在运行 openspec validate 之前,请确认:
## Why 章节## What Changes 章节## ADDED/MODIFIED/REMOVED Requirements)### Requirement: <标题> 格式#### Scenario: <标题> 块命令 | 说明 | 示例 |
|---|---|---|
openspec init | 初始化 OpenSpec 项目 | openspec init --tools none |
openspec new change <name> | 创建新变更提案 | openspec new change user-auth |
命令 | 说明 | 示例 |
|---|---|---|
openspec view | 打开交互式 Web 仪表盘 | openspec view |
openspec status --change <name> | 查看变更状态 | openspec status --change user-auth |
openspec validate <name> | 验证变更文档格式 | openspec validate user-auth |
openspec list --changes | 列出所有变更 | openspec list --changes |
openspec list --specs | 列出所有规范 | openspec list --specs |
openspec show <name> | 显示变更详情 | openspec show user-auth |
命令 | 说明 | 示例 |
|---|---|---|
openspec archive <name> | 归档已完成的变更 | openspec archive user-auth |
openspec update | 更新 AI 指导文件 | openspec update |
命令 | 说明 | 示例 |
|---|---|---|
openspec config | 查看和修改配置 | openspec config |
openspec change show <id> | 查看变更解析结果 | openspec change show user-auth --json --deltas-only |
openspec --version | 查看版本号 | openspec --version |
openspec --help | 查看帮助信息 | openspec --help |
openspec [options] <command>
选项:
-v, --version 显示版本号
-h, --help 显示帮助信息
--no-color 禁用彩色输出
--json 以 JSON 格式输出常用命令快速参考:
# 初始化项目
openspec init --tools none
# 创建变更
openspec new change <name>
# 验证变更
openspec validate <name>
# 查看状态
openspec status --change <name>
# 归档变更
openspec archive <name>❌ 不好的 Why 章节:
## Why
我们需要添加用户认证功能。✅ 好的 Why 章节:
## Why
### Background
当前系统没有用户认证功能,任何人都可以访问所有数据和功能。
这导致:
- 无法追踪操作日志的责任人
- 敏感数据缺乏保护
- 无法实现细粒度的权限控制
### Problem Statement
系统需要一个安全可靠的用户认证机制,支持:
- 用户名密码登录
- 第三方 OAuth 登录(GitHub、Google)
- 会话管理和安全退出
### Alternatives Considered
1. **自建认证系统**:完全控制,但开发维护成本高
2. **使用 Auth0**:功能完善,但费用较高
3. **使用 Keycloak**:开源免费,支持多种协议 ✓ 已选择此方案关键字 | 用途 | 示例 |
|---|---|---|
Given | 前置条件,描述系统初始状态 | Given 用户已登录系统 |
When | 触发动作 | When 用户点击"提交订单"按钮 |
Then | 预期结果 | Then 订单状态变为"待支付" |
And | 连接多个条件或结果 | And 用户收到订单确认邮件 |
Scenario: 使用信用卡支付订单
Given 用户已登录系统
And 购物车中有 2 件商品,总价 299 元
And 用户已绑定信用卡
When 用户选择"信用卡支付"并确认
Then 订单创建成功
And 从信用卡扣除 299 元
And 用户收到支付成功通知
And 库存减少 2 件Scenario: 支付
Given 系统
When 支付
Then 成功问题:
openspec validate 确保格式正确openspec archive 归档变更OpenSpec 提供了专门的 slash commands:
命令 | 用途 |
|---|---|
/opsx:new | 创建新的变更提案 |
/opsx:continue | 继续未完成的变更 |
/opsx:apply | 应用变更规范到代码实现 |
在 PR 审查时,检查 OpenSpec 文档:
OpenSpec 支持 20+ AI 编程助手,以下是常用工具:
工具 | 类型 | 支持程度 |
|---|---|---|
Claude Code | CLI + IDE | 完全支持 |
Qoder | IDE | 完全支持(选择 Claude Code 配置) |
Cursor | IDE | 完全支持 |
GitHub Copilot | IDE 插件 | 完全支持 |
Cline | VS Code 插件 | 完全支持 |
Windsurf | IDE | 完全支持 |
Amazon Q Developer | IDE 插件 | 完全支持 |
Gemini CLI | CLI | 完全支持 |
Continue | IDE 插件 | 完全支持 |
Aider | CLI | 完全支持 |
Roo Code | VS Code 插件 | 完全支持 |
OpenSpec 收集匿名使用统计数据,用于改进产品。如需禁用:
# 方法一:设置环境变量
export OPENSPEC_TELEMETRY=0
# 方法二:使用通用遥测禁用标志
export DO_NOT_TRACK=1
# 方法三:在 shell 配置文件中永久设置
echo 'export OPENSPEC_TELEMETRY=0' >> ~/.zshrc # Zsh
echo 'export OPENSPEC_TELEMETRY=0' >> ~/.bashrc # Bash特性 | OpenSpec | OpenAPI/Swagger |
|---|---|---|
主要用途 | 需求规范驱动开发 | API 接口文档 |
文档类型 | Markdown | YAML/JSON |
验证方式 | CLI 验证 + AI 理解 | 语法验证 |
适用阶段 | 开发前期(需求定义) | 开发中期(接口定义) |
目标用户 | 产品经理 + 开发者 + AI | 开发者 + 前端 |
两者可以配合使用:先用 OpenSpec 定义需求和场景,再用 OpenAPI 定义接口细节。
openspec init --tools noneagent-instructions.md 文件存在请遵循 openspec/changes/<name>/ 目录下的规范文档可以。每个变更都是独立的文件夹,可以并行开发。但建议:
资源 | 链接 |
|---|---|
官方仓库 | https://github.com/Fission-AI/OpenSpec |
快速入门 | https://openspec.pro/getting-started/ |
官方文档 | https://github.com/Fission-AI/OpenSpec/tree/main/docs |
npm 包 | https://www.npmjs.com/package/@fission-ai/openspec |
欢迎关注 亨利笔记, 👍 点赞 | ⭐ 收藏 | ↗️ 转发。