OpenSpec 入门指北


什么是 OpenSpec

  • 核心概念
  • 工作流详解
  • 工件(Artifacts)系统
  • Schema 模式
  • 命令接口
  • Delta Spec 增量规格
  • 归档机制
  • 与 Claude Code 的集成
  • 完整生命周期示例
  • 最佳实践
  • 常见问题

什么是 OpenSpec

OpenSpec 是一个文档驱动的工作流系统,它将复杂项目分解为结构化的阶段,通过工件(artifact)之间的依赖关系来管理项目进度。

核心理念

传统方式: 想法 → 直接写代码 → 补文档(经常跳过)
OpenSpec: 想法 → 为什么做 → 怎么做 → 做什么 → 实施步骤 → 写代码

OpenSpec 的核心哲学是:文档不是代码的副产品,而是开发的起点

解决的问题

问题 OpenSpec 的解决方案
需求不清晰就开始编码 强制先写 proposal 和 specs
设计决策没有记录 design.md 记录所有技术决策
任务进度无法追踪 tasks.md 的复选框系统
变更历史无法追溯 归档机制保留完整上下文
团队协作缺乏共识 结构化文档作为沟通基础

核心概念

1. 变更(Change)

OpenSpec 将所有工作组织为"变更"。每个变更是一个独立的目录,包含完成该工作所需的所有文档:

openspec/changes/<change-name>/
├── .openspec.yaml          # 变更配置(schema、状态)
├── proposal.md             # 为什么做(Why)
├── design.md               # 怎么做(How)
├── specs/                  # 做什么(What)
│   ├── capability-1/
│   │   └── spec.md
│   └── capability-2/
│       └── spec.md
└── tasks.md                # 实施清单

2. 工件(Artifact)

工件是工作流中的基本单元,每个工件有:

  • 唯一 ID:如 proposaldesignspecstasks
  • 输出路径:文件在变更目录中的位置
  • 状态ready(可创建)、blocked(等待依赖)、done(已完成)
  • 依赖关系:哪些工件必须先完成

3. Schema(模式)

Schema 定义了工作流的结构——哪些工件存在、它们之间的依赖关系、实施前需要完成哪些工件。

OpenSpec 内置的 spec-driven schema 定义如下:

┌─────────────────────────────────────────────────────┐
│                  spec-driven Schema                  │
├─────────────────────────────────────────────────────┤
│                                                     │
│  proposal (无依赖)                                   │
│      │                                              │
│      ├──────────────────┐                           │
│      ▼                  ▼                           │
│  design              specs                          │
│  (依赖 proposal)    (依赖 proposal)                  │
│      │                  │                           │
│      └────────┬─────────┘                           │
│               ▼                                     │
│             tasks                                   │
│        (依赖 design + specs)                        │
│               │                                     │
│               ▼                                     │
│             apply                                   │
│        (需要 tasks 完成)                             │
│                                                     │
└─────────────────────────────────────────────────────┘

4. 状态机

每个工件在生命周期中经历以下状态转换:

                    ┌─────────┐
                    │  ready  │ ← 依赖已满足,可以创建
                    └────┬────┘
                         │ 开始创建
                         ▼
                    ┌─────────┐
                    │ creating│ ← 正在创建中
                    └────┬────┘
                         │ 创建完成
                         ▼
                    ┌─────────┐
                    │  done   │ ← 已完成
                    └─────────┘

     ┌──────────┐
     │ blocked  │ ← 依赖未满足,等待中
     └────┬─────┘
          │ 依赖完成
          ▼
     ┌──────────┐
     │  ready   │
     └──────────┘

工作流详解

OpenSpec 工作流由五个核心命令组成,每个命令对应一个阶段:

阶段总览

┌────────────────────────────────────────────────────────────────┐
│                      OpenSpec 工作流                            │
├────────────────────────────────────────────────────────────────┤
│                                                                │
│  ┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐ │
│  │ EXPLORE  │───▶│ PROPOSE  │───▶│  APPLY   │───▶│ ARCHIVE  │ │
│  │  探索    │    │  提案    │    │  实施    │    │  归档    │ │
│  └──────────┘    └──────────┘    └──────────┘    └──────────┘ │
│       │               │               │               │       │
│       ▼               ▼               ▼               ▼       │
│    思考讨论        创建工件        执行任务        保存记录     │
│    澄清需求        定义范围        编写代码        同步规格     │
│    比较方案        设计架构        更新进度        归档历史     │
│                                                                │
└────────────────────────────────────────────────────────────────┘

阶段 1: Explore(探索)

命令/opsx:explore [change-name]

目的: 在正式创建变更之前,深入思考问题空间。

探索模式的行为准则

准则 说明
好奇,不预设 自然提问,不遵循脚本
开放话题 同时探索多个方向,让用户选择感兴趣的
可视化 大量使用 ASCII 图表帮助理解
适应性 跟随有趣的话题,新信息出现时转向
耐心 不急于下结论,让问题自然浮现
基于实际 探索真实代码库,不只空谈理论

探索模式可以做什么

  • ✅ 阅读文件、搜索代码、调查代码库
  • ✅ 创建 OpenSpec 工件(记录思考成果)
  • ❌ 编写应用代码或实现功能

探索模式何时结束

  • 想法足够清晰,可以创建提案
  • 用户获得了需要的信息,自行离开
  • 决定继续深入探索

阶段 2: Propose(提案)

命令/opsx:propose <description>

目的: 创建变更并生成所有必需的工件。

执行步骤

步骤 1: 创建变更目录
    openspec new change "<name>"
    → 创建 openspec/changes/<name>/.openspec.yaml

步骤 2: 获取工件构建顺序
    openspec status --change "<name>" --json
    → 解析依赖图,确定创建顺序

步骤 3: 按依赖顺序创建工件
    ┌─────────────────────────────────────────┐
    │ 3a. 获取工件指令                         │
    │     openspec instructions <id> --json    │
    │     → 获取 template, instruction, rules  │
    │                                         │
    │ 3b. 读取依赖工件(如果存在)              │
    │     → 获取上下文信息                     │
    │                                         │
    │ 3c. 创建工件文件                         │
    │     → 使用 template 作为结构             │
    │     → 遵循 instruction 的指导            │
    │     → 应用 rules 作为约束                │
    │     → context/rules 不写入输出文件       │
    │                                         │
    │ 3d. 验证工件创建成功                     │
    │     → 检查文件是否存在                   │
    └─────────────────────────────────────────┘

步骤 4: 检查是否满足 apply 条件
    → 所有 applyRequires 中的工件状态为 done

步骤 5: 显示最终状态
    → 报告变更名称、位置、已创建的工件

工件创建的关键规则

┌─────────────────────────────────────────────────────────────┐
│                    工件创建黄金法则                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ✅ template → 用作文件结构骨架                              │
│  ✅ instruction → 遵循其指导填充内容                         │
│  ✅ context/rules → 作为写作约束(不写入文件)               │
│  ✅ dependencies → 先读取,获取上下文后再创建                │
│                                                             │
│  ❌ 不要复制 context 块到输出文件                            │
│  ❌ 不要复制 rules 块到输出文件                              │
│  ❌ 不要在依赖完成前创建工件                                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

阶段 3: Apply(实施)

命令/opsx:apply [change-name]

目的: 执行 tasks.md 中的任务清单,逐步实现变更。

执行流程

步骤 1: 选择变更
    → 从参数推断 / 从上下文推断 / 列出可选项让用户选择

步骤 2: 检查状态
    openspec status --change "<name>" --json
    → 确认 schemaName 和工件状态

步骤 3: 获取实施指令
    openspec instructions apply --change "<name>" --json
    → 获取 contextFiles、进度、任务列表

步骤 4: 读取上下文文件
    → 读取 proposal、specs、design、tasks

步骤 5: 循环执行任务
    ┌─────────────────────────────────────────┐
    │ FOR EACH pending task:                  │
    │                                         │
    │   5a. 显示当前任务                       │
    │       "Working on task 3/7: ..."        │
    │                                         │
    │   5b. 执行代码变更                       │
    │       → 保持变更最小化、聚焦             │
    │       → 一次只做一个任务                 │
    │                                         │
    │   5c. 标记任务完成                       │
    │       - [ ] → - [x]                     │
    │                                         │
    │   5d. 继续下一个任务                     │
    │                                         │
    │ PAUSE IF:                               │
    │   → 任务不清晰:请求澄清                 │
    │   → 发现设计问题:建议更新工件           │
    │   → 遇到错误:报告并等待指导             │
    │   → 用户中断:暂停                       │
    └─────────────────────────────────────────┘

步骤 6: 显示完成状态
    → 报告本次完成的任务数
    → 如果全部完成:建议归档

实施模式的关键原则

原则 说明
持续推进 一直执行任务直到完成或阻塞
先读后做 始终先读取上下文文件再开始
最小变更 每次只做一个任务,保持变更聚焦
即时标记 完成任务后立即更新复选框
遇阻即停 不猜测,遇到不清晰的要求就暂停

阶段 4: Archive(归档)

命令/opsx:archive [change-name]

目的: 将完成的变更移入归档目录,保留完整历史记录。

归档流程

步骤 1: 选择变更(如果未指定)
    → 列出活跃变更供用户选择

步骤 2: 检查工件完成状态
    → 如果有未完成的工件,显示警告
    → 用户确认后继续

步骤 3: 检查任务完成状态
    → 统计 [ ] 和 [x] 的数量
    → 如果有未完成任务,显示警告
    → 用户确认后继续

步骤 4: 评估 Delta Spec 同步状态
    → 检查是否存在 delta specs
    → 如果存在,比较与主规格的差异
    → 提示用户是否同步

步骤 5: 执行归档
    mkdir -p openspec/changes/archive
    mv openspec/changes/<name> 
       → openspec/changes/archive/YYYY-MM-DD-<name>/

步骤 6: 显示归档摘要

归档目录结构

openspec/changes/archive/
├── 2024-12-01-generate-project-documentation/
│   ├── .openspec.yaml
│   ├── proposal.md
│   ├── design.md
│   ├── specs/
│   │   ├── installation-guide/spec.md
│   │   ├── project-structure/spec.md
│   │   └── ...
│   └── tasks.md
├── 2024-12-15-add-user-auth/
│   └── ...
└── ...

工件(Artifacts)系统

Proposal(提案)

文件proposal.md

目的: 回答"为什么做这个变更?"

## Why
<!-- 1-2 句话说明问题或机会 -->

## What Changes
<!-- 变更列表,具体说明新增、修改、删除的内容 -->
<!-- 破坏性变更标记为 **BREAKING** -->

## Capabilities
### New Capabilities
<!-- 新增能力,每个对应 specs/<name>/spec.md -->
-`<kebab-case-name>`: <简要描述>

### Modified Capabilities
<!-- 需求发生变更的现有能力 -->

## Impact
<!-- 影响的代码、API、依赖、系统 -->

关键要素

  • Why: 变更的动机和价值
  • What Changes: 具体的变更范围
  • Capabilities: 新增/修改的能力列表(驱动 specs 创建)
  • Impact: 影响范围分析

Design(设计)

文件design.md

目的: 回答"如何实现这个变更?"

## Context
<!-- 背景、当前状态、约束、利益相关者 -->

## Goals / Non-Goals
**Goals:**
<!-- 本设计要实现的目标 -->
**Non-Goals:**
<!-- 明确排除的范围 -->

## Decisions
<!-- 关键技术选择及理由,包含被否决的替代方案 -->

## Risks / Trade-offs
<!-- 已知限制和风险 -->
<!-- 格式: [Risk] → Mitigation -->

## Migration Plan
<!-- 部署步骤、回滚策略 -->

## Open Questions
<!-- 待解决的决策或未知项 -->

关键要素

  • Context: 当前状态和约束条件
  • Goals / Non-Goals: 明确包含和排除的范围
  • Decisions: 技术决策及理由(为什么选 A 不选 B)
  • Risks: 已知风险和缓解措施

Specs(规格)

文件specs/<capability>/spec.md

目的: 回答"系统应该做什么?"

## ADDED Requirements

### Requirement: <需求名称>
<!-- 需求描述:系统 SHALL/MUST ... -->

#### Scenario: <场景名称>
-**WHEN** <!-- 条件 -->
-**THEN** <!-- 预期结果 -->

## MODIFIED Requirements

### Requirement: <需求名称>
<!-- 完整更新后的内容 -->

## REMOVED Requirements

### Requirement: <需求名称>
**Reason**: <!-- 移除原因 -->
**Migration**: <!-- 迁移方案 -->

规格编写规则

规则 说明
SHALL/MUST 使用规范性语言,避免 should/may
4 个井号 Scenario 必须用 ####,不能用 3 个或列表
可测试性 每个场景都是潜在的测试用例
完整性 MODIFIED 必须包含完整更新后的内容

Tasks(任务)

文件tasks.md

目的: 将实施工作分解为可追踪的小任务

## 1. 任务组名称

- [ ] 1.1 任务描述
- [ ] 1.2 任务描述

## 2. 任务组名称

- [ ] 2.1 任务描述
- [x] 2.2 已完成的任务

任务编写规则

  • 使用 - [ ] 格式(OpenSpec 解析此格式追踪进度)
  • 任务粒度要小,一个会话内可完成
  • 按依赖关系排序(先做的在前)
  • 完成后立即标记 - [x]

Schema 模式

spec-driven Schema

这是 OpenSpec 最常用的模式,定义了四个核心工件:

# .openspec.yaml
schema:spec-driven
artifacts:
-id:proposal
output:proposal.md
dependencies: []

-id:design
output:design.md
dependencies: [proposal]

-id:specs
output:specs/**/*.md
dependencies: [proposal]

-id:tasks
output:tasks.md
dependencies: [design, specs]

apply:
requires: [tasks]

依赖图解析算法

function resolveBuildOrder(artifacts):
    ready = [a for a in artifacts if a.dependencies is empty]
    blocked = [a for a in artifacts if a.dependencies not all done]

    for artifact in ready:
        createArtifact(artifact)
        markDone(artifact)
        # 重新检查 blocked 列表
        updateBlockedStatus()

状态检查算法

function getArtifactStatus(artifact):
    missingDeps = [d for d in artifact.dependencies if not isDone(d)]

    if missingDeps is empty:
        return 'ready'
    else:
        return { status: 'blocked', missingDeps }

命令接口

CLI 命令一览

命令 用途 示例
openspec new change 创建新变更 openspec new change "add-auth"
openspec status 查看变更状态 openspec status --change "add-auth" --json
openspec instructions 获取工件创建指令 openspec instructions proposal --change "add-auth" --json
openspec list 列出所有变更 openspec list --json

指令 JSON 结构

openspec instructions 返回的 JSON 包含:

{
"artifactId":"proposal",
"outputPath":"proposal.md",
"template":"## Why\n\n<!-- ... -->\n## What Changes\n...",
"instruction":"创建提案文档,说明变更原因...",
"context":"项目背景信息(约束条件,不写入文件)",
"rules":"工件特定规则(约束条件,不写入文件)",
"dependencies":[],
"description":"初始提案文档"
}

关键字段说明

字段 用途 是否写入文件
template 文件结构骨架 ✅ 是
instruction 内容编写指导 ❌ 否(仅指导写作)
context 项目背景约束 ❌ 否(仅约束写作)
rules 工件特定规则 ❌ 否(仅约束写作)
dependencies 需先读的工件 ❌ 否(仅指示顺序)

Delta Spec 增量规格

Delta Spec 是 OpenSpec 实现增量变更管理的核心机制。

概念

Delta Spec 记录的是变更的增量部分,而非完整规格。它描述了:

  • ADDED: 新增的需求
  • MODIFIED: 修改的需求(包含完整更新后的内容)
  • REMOVED: 移除的需求
  • RENAMED: 重命名的需求

结构示例

## ADDED Requirements

### Requirement: 用户可以通过邮箱注册
系统 SHALL 允许用户使用邮箱地址注册新账户。

#### Scenario: 成功注册
-**WHEN** 用户提交有效的邮箱和密码
-**THEN** 系统创建账户并发送验证邮件

#### Scenario: 邮箱已存在
-**WHEN** 用户提交已注册的邮箱
-**THEN** 系统返回错误提示"该邮箱已被注册"

## MODIFIED Requirements

### Requirement: 用户登录
系统 SHALL 支持多种登录方式,包括密码登录和验证码登录。

#### Scenario: 密码登录
-**WHEN** 用户提交正确的邮箱和密码
-**THEN** 系统创建会话并返回访问令牌

#### Scenario: 验证码登录
-**WHEN** 用户提交邮箱和正确的验证码
-**THEN** 系统创建会话并返回访问令牌

## REMOVED Requirements

### Requirement: 用户名登录
**Reason**: 统一使用邮箱作为唯一标识,简化系统
**Migration**: 用户需要使用邮箱重新注册

同步机制

Delta Spec 最终会合并到主规格中:

openspec/changes/<name>/specs/capability/spec.md  (Delta)
                    │
                    │ sync
                    ▼
openspec/specs/capability/spec.md  (Main)

合并算法

function mergeDeltaSpecs(mainSpec, deltaSpec):
    for each operation in deltaSpec:
        if ADDED:
            mainSpec.addRequirement(operation.requirement)
        if MODIFIED:
            mainSpec.replaceRequirement(operation.name, operation.content)
        if REMOVED:
            mainSpec.removeRequirement(operation.name)
        if RENAMED:
            mainSpec.renameRequirement(operation.from, operation.to)
    return mainSpec

MODIFIED 的完整性要求

⚠️ 关键规则: MODIFIED 需求必须包含完整更新后的内容,不是差异片段。

❌ 错误做法(部分内容):
### Requirement: 用户登录
系统 SHALL 支持验证码登录。

✅ 正确做法(完整内容):
### Requirement: 用户登录
系统 SHALL 支持多种登录方式,包括密码登录和验证码登录。

#### Scenario: 密码登录
- **WHEN** 用户提交正确的邮箱和密码
- **THEN** 系统创建会话并返回访问令牌

#### Scenario: 验证码登录
- **WHEN** 用户提交邮箱和正确的验证码
- **THEN** 系统创建会话并返回访问令牌

归档机制

归档流程

完成的变更
    │
    ▼
检查工件完成状态 ──→ 不完整?──→ 警告用户 ──→ 确认后继续
    │
    ▼
检查任务完成状态 ──→ 有未完成任务?──→ 警告用户 ──→ 确认后继续
    │
    ▼
评估 Delta Spec 同步 ──→ 有 Delta?──→ 提示同步 ──→ 用户选择
    │
    ▼
执行归档
    mv openspec/changes/<name>
       → openspec/changes/archive/YYYY-MM-DD-<name>/
    │
    ▼
显示归档摘要

归档目录结构

openspec/changes/archive/
├── 2024-12-01-generate-project-documentation/
│   ├── .openspec.yaml
│   ├── proposal.md
│   ├── design.md
│   ├── specs/
│   │   ├── api-documentation/spec.md
│   │   ├── deployment-guide/spec.md
│   │   ├── docker-deployment/spec.md
│   │   ├── installation-guide/spec.md
│   │   ├── project-structure/spec.md
│   │   └── troubleshooting-guide/spec.md
│   └── tasks.md
└── 2024-12-15-add-user-auth/
    └── ...

归档命名规则

  • 格式: YYYY-MM-DD-<change-name>
  • 示例: 2024-12-01-generate-project-documentation
  • 如果目标已存在:报错,建议重命名或使用不同日期

与 Claude Code 的集成

Skill 系统

OpenSpec 通过 Claude Code 的 Skill 系统与 AI 助手深度集成:

.claude/
├── skills/
│   ├── openspec-propose/SKILL.md      # 创建提案
│   ├── openspec-apply-change/SKILL.md # 实施任务
│   ├── openspec-archive-change/SKILL.md # 归档变更
│   └── openspec-explore/SKILL.md      # 探索模式
└── commands/
    └── opsx/
        ├── propose.md                  # /opsx:propose
        ├── apply.md                    # /opsx:apply
        ├── archive.md                  # /opsx:archive
        └── explore.md                  # /opsx:explore

命令映射

用户命令 Skill 文件 功能
/opsx:propose <desc> openspec-propose 创建变更 + 生成所有工件
/opsx:apply [name] openspec-apply-change 执行任务清单
/opsx:archive [name] openspec-archive-change 归档完成的变更
/opsx:explore [name] openspec-explore 进入探索模式

AI 助手的角色

在 OpenSpec 工作流中,AI 助手扮演以下角色:

┌─────────────────────────────────────────────────────────────┐
│                   AI 在 OpenSpec 中的角色                    │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  Explore 阶段    → 思考伙伴:提问、探索、比较、可视化    │
│  Propose 阶段    → 文档工程师:按模板生成结构化文档      │
│  Apply 阶段      → 实施者:执行任务、编写代码、更新进度   │
│  Archive 阶段    → 管理员:验证完成度、同步规格、归档     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

上下文感知

AI 助手在 OpenSpec 工作流中具有上下文感知能力:

┌─────────────────────────────────────────────────────────────┐
│                    上下文感知机制                             │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 读取现有工件作为上下文                                   │
│     → proposal.md 了解变更动机                              │
│     → design.md 了解技术决策                                │
│     → specs/ 了解需求规格                                   │
│     → tasks.md 了解当前进度                                 │
│                                                             │
│  2. 遵循 Schema 定义的约束                                  │
│     → 按依赖顺序创建工件                                    │
│     → 使用 template 作为结构                                │
│     → 应用 rules 作为写作约束                               │
│                                                             │
│  3. 维护工件一致性                                          │
│     → proposal 的 Capabilities 驱动 specs 创建              │
│     → design 的 Decisions 指导 tasks 分解                   │
│     → specs 的 Requirements 映射到 tasks 的实现             │
│                                                             │
└─────────────────────────────────────────────────────────────┘

完整生命周期示例

以 "添加用户认证功能" 为例,展示完整的 OpenSpec 生命周期:

1. 探索阶段

用户: /opsx:explore 我想添加用户认证功能

AI: 用户认证是个大领域,让我帮你理清思路...

     ┌─────────────────────────────────────────────────┐
     │              认证方式光谱                         │
     ├─────────────────────────────────────────────────┤
     │                                                 │
     │   简单 ◀──────────────────────────────▶ 复杂    │
     │                                                 │
     │   ┌────────┐  ┌────────┐  ┌────────┐  ┌──────┐ │
     │   │ Session│  │  JWT   │  │ OAuth  │  │ SSO  │ │
     │   └────────┘  └────────┘  └────────┘  └──────┘ │
     │       │           │           │           │     │
     │    有状态       无状态      第三方      企业级   │
     │                                                 │
     └─────────────────────────────────────────────────┘

     你们的系统目前是怎么处理用户身份的?
     预期用户规模多大?
     是否需要支持第三方登录?

2. 提案阶段

用户: /opsx:propose 添加基于 JWT 的用户认证系统

AI: 正在创建变更 "add-jwt-auth"...

     ✅ 创建变更目录: openspec/changes/add-jwt-auth/
     ✅ 创建 proposal.md
     ✅ 创建 design.md
     ✅ 创建 specs/jwt-auth/spec.md
     ✅ 创建 specs/user-management/spec.md
     ✅ 创建 tasks.md

     所有工件已创建!准备实施。
     运行 /opsx:apply add-jwt-auth 开始实施。

3. 实施阶段

用户: /opsx:apply add-jwt-auth

AI: 正在实施: add-jwt-auth (schema: spec-driven)
     Progress: 0/12 tasks complete

     Working on task 1/12: 添加 JWT 依赖到 pom.xml
     ✓ Task complete

     Working on task 2/12: 创建 JwtTokenProvider 工具类
     ✓ Task complete

     Working on task 3/12: 创建 JwtAuthenticationFilter
     ✓ Task complete

     ...

     Progress: 12/12 tasks complete ✓

     所有任务完成!可以归档此变更。
     运行 /opsx:archive add-jwt-auth 归档。

4. 归档阶段

用户: /opsx:archive add-jwt-auth

AI: 正在归档: add-jwt-auth

     ✅ 工件状态: 4/4 完成
     ✅ 任务状态: 12/12 完成
     ✅ Delta Spec: 2 个能力需要同步
     ✅ 同步到主规格完成

     ─────────────────────────────────────
     ## Archive Complete

     **Change:** add-jwt-auth
     **Schema:** spec-driven
     **Archived to:** openspec/changes/archive/2024-12-01-add-jwt-auth/
     **Specs:** ✓ Synced to main specs

     所有工件完成。所有任务完成。
     ─────────────────────────────────────

最佳实践

工件编写

实践 说明
保持简洁 proposal 控制在 1-2 页,聚焦"为什么"
记录决策 design.md 必须包含被否决的替代方案
可测试性 每个 spec 场景都是潜在测试用例
小任务 每个 task 应该在一个会话内完成
即时更新 完成任务后立即标记 [x]

变更管理

实践 说明
一次一个变更 避免同时推进多个不相关的变更
小步快跑 大变更拆分为多个小变更
及时归档 完成后立即归档,保持工作区整洁
命名规范 使用 kebab-case,描述性命名

命名规范

变更命名(kebab-case):
  ✅ add-user-auth
  ✅ fix-cart-calculation
  ✅ refactor-payment-service
  ❌ AddUserAuth
  ❌ fix bug
  ❌ refactor

能力命名(kebab-case):
  ✅ user-authentication
  ✅ cart-management
  ❌ UserAuth
  ❌ cartMgmt

团队协作

┌─────────────────────────────────────────────────────────────┐
│                    团队协作最佳实践                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  1. 变更即文档                                              │
│     → 每个变更都是自解释的文档单元                           │
│     → 新成员可以通过阅读变更了解项目历史                     │
│                                                             │
│  2. 代码审查 + 文档审查                                     │
│     → 审查代码时同时审查对应的 specs 和 design              │
│     → 确保实现符合设计意图                                   │
│                                                             │
│  3. 归档即知识库                                            │
│     → 归档的变更是项目的知识积累                             │
│     → 遇到类似问题时可以参考历史变更                         │
│                                                             │
│  4. 主规格同步                                              │
│     → 定期将 delta specs 同步到主规格                       │
│     → 保持主规格与实际实现一致                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

常见问题

Q: 可以跳过某个阶段吗?

A: 技术上可以,但不推荐。每个阶段都有其价值:

  • 跳过 Explore → 可能遗漏重要需求
  • 跳过 Propose → 缺乏范围定义,容易蔓延
  • 跳过 Design → 技术决策没有记录
  • 跳过 Specs → 需求不清晰,测试困难
  • 跳过 Tasks → 实施缺乏计划

Q: 一个变更可以包含多个能力吗?

A: 可以。在 proposal 的 Capabilities 部分列出所有新能力,每个能力对应一个 specs/<name>/spec.md 文件。

Q: 如何修改已有的变更?

A:

  1. 如果变更还未归档:直接编辑对应的工件文件
  2. 如果变更已归档:创建新变更来修改现有能力(使用 MODIFIED/REMOVED)

Q: Delta Spec 和主规格有什么区别?

A:

  • Delta Spec: 记录变更的增量部分,存在于变更目录中
  • 主规格: 当前系统的完整规格,存在于 openspec/specs/ 中
  • 归档时,Delta Spec 会合并到主规格

Q: 任务可以并行执行吗?

A: 可以。只要任务之间没有依赖关系,可以同时进行。但在 AI 助手的实施模式下,通常是顺序执行的。

Q: 如何处理变更中的阻塞?

A:

  1. 记录阻塞原因(在 tasks.md 中注释)
  2. 如果需要更新设计或规格,先更新对应工件
  3. 解决阻塞后继续执行
  4. 如果阻塞无法解决,考虑拆分变更

Q: 归档后还能修改吗?

A: 归档的变更是只读的历史记录。如果需要修改已归档变更涉及的功能,应该创建新的变更。

参考资源

  • OpenSpec 规范: 参见 .claude/skills/ 目录下的 SKILL.md 文件
  • 项目示例: 参见 openspec/changes/archive/ 目录下的归档变更
  • 命令速查:
/opsx:explore [name]     → 进入探索模式
/opsx:propose <desc>     → 创建变更提案
/opsx:apply [name]       → 实施变更任务
/opsx:archive [name]     → 归档完成的变更

Github 开源:https://github.com/Fission-AI/OpenSpec

转自:https://mp.weixin.qq.com/s/bevsuhfcrJ-O4X6AxlNMxg