Skip to content

5.2 OpenSpec 核心概念详解

概述

本章深入讲解 OpenSpec 的核心概念,帮助你理解其设计哲学和工作原理。掌握这些概念后,你将能够高效地使用 OpenSpec 进行规格驱动开发。

1. 双文件夹模型

OpenSpec 的核心创新是双文件夹模型,它清晰地分离了"当前状态"和"提案变更"。

目录结构

openspec/
├── AGENTS.md           # AI 助手工作流指令
├── project.md          # 项目约定和上下文
├── specs/              # 📁 当前真相(Source of Truth)
│   ├── auth/
│   │   ├── spec.md     # 认证规格
│   │   └── design.md   # 技术设计(可选)
│   ├── user-profile/
│   │   └── spec.md     # 用户资料规格
│   └── payment/
│       └── spec.md     # 支付规格

└── changes/            # 📁 提案变更
    ├── add-2fa/        # 变更提案:添加双因素认证
    │   ├── proposal.md
    │   ├── tasks.md
    │   ├── design.md   # 可选
    │   └── specs/
    │       └── auth/
    │           └── spec.md  # 增量规格

    ├── update-profile-api/  # 另一个变更提案
    │   └── ...

    └── archive/        # 📁 已归档的变更
        └── 2024-12-01-add-oauth/
            └── ...

specs/ 文件夹

用途:存储系统当前已实现的功能规格。

特点

  • 反映生产环境中的实际行为
  • 每个能力(capability)一个子目录
  • 规格文件是事实来源(source of truth)
  • 只有通过归档流程才会更新

示例规格文件 specs/auth/spec.md

markdown
# Auth Specification

## Purpose
Handle user authentication and session management.

## Requirements

### Requirement: User Login
The system SHALL authenticate users with email and password.

#### Scenario: Valid credentials
- **WHEN** user submits valid email and password
- **THEN** system returns JWT token
- **AND** token expires in 24 hours

#### Scenario: Invalid credentials
- **WHEN** user submits incorrect credentials
- **THEN** system returns 401 Unauthorized
- **AND** login attempt is logged

### Requirement: Session Management
The system SHALL maintain user sessions via JWT tokens.

#### Scenario: Valid token
- **WHEN** request includes valid JWT
- **THEN** request is authenticated
- **AND** user context is available

#### Scenario: Expired token
- **WHEN** request includes expired JWT
- **THEN** system returns 401 Unauthorized
- **AND** client should refresh token

changes/ 文件夹

用途:存储待实现的变更提案。

特点

  • 每个变更一个独立目录
  • 包含完整的提案、任务和增量规格
  • 支持并行开发多个功能
  • 实现后归档到 archive/

变更目录结构

changes/add-2fa/
├── proposal.md     # 变更原因和影响
├── tasks.md        # 实现任务清单
├── design.md       # 技术决策(可选)
└── specs/          # 增量规格
    └── auth/
        └── spec.md # 对 auth 规格的变更

双文件夹的优势

传统方式:
┌─────────────────────────────────────┐
│  规格和变更混在一起                    │
│  难以区分什么是已实现的                 │
│  代码审查时不清楚变更范围               │
└─────────────────────────────────────┘

OpenSpec 方式:
┌─────────────────────────────────────┐
│  specs/  = 已实现(生产环境)          │
│  changes/= 待实现(开发中)            │
│  archive/= 已完成(历史记录)          │
│                                     │
│  清晰的状态边界,易于追踪和审计          │
└─────────────────────────────────────┘

2. 变更生命周期

每个变更都经历完整的生命周期,从提案到归档:

┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐
│  Draft   │ ──▶ │  Review  │ ──▶ │  Approve │ ──▶ │ Implement│ ──▶ │  Archive │
│ 起草提案  │     │ 审核对齐  │     │ 批准计划  │     │ 实现任务  │     │ 归档更新  │
└──────────┘     └──────────┘     └──────────┘     └──────────┘     └──────────┘
     │               │                │                │                │
     ▼               ▼                ▼                ▼                ▼
 proposal.md    反馈迭代          确认范围         编写代码        合并到 specs/
 tasks.md       修改规格          冻结变更         运行测试        移至 archive/
 specs/*.md

阶段 1:起草提案(Draft)

触发条件

  • 添加新功能
  • 修改现有行为
  • 架构变更
  • 性能优化(改变行为时)

创建的文件

  1. proposal.md - 变更原因和影响
markdown
## Why
用户反馈表明需要更强的账户安全性。双因素认证是行业标准。

## What Changes
- 添加 OTP(一次性密码)生成和验证
- 修改登录流程,要求第二因素
- 添加备用恢复码机制

## Impact
- Affected specs: auth
- Affected code: src/auth/, src/middleware/
- Breaking changes: 登录 API 响应格式变化(需要 OTP 步骤)
  1. tasks.md - 实现任务清单
markdown
## 1. Database Setup
- [ ] 1.1 Add `otp_secret` column to users table
- [ ] 1.2 Create `recovery_codes` table

## 2. Backend Implementation
- [ ] 2.1 Implement OTP generation service
- [ ] 2.2 Add OTP verification endpoint POST /api/auth/verify-otp
- [ ] 2.3 Modify login flow to require OTP step
- [ ] 2.4 Implement recovery code generation

## 3. Frontend Updates
- [ ] 3.1 Create OTP input component
- [ ] 3.2 Update login flow UI
- [ ] 3.3 Add 2FA settings page

## 4. Testing
- [ ] 4.1 Unit tests for OTP service
- [ ] 4.2 Integration tests for login flow
- [ ] 4.3 E2E tests for 2FA setup
  1. specs/auth/spec.md - 增量规格
markdown
# Delta for Auth

## ADDED Requirements

### Requirement: Two-Factor Authentication
The system MUST support TOTP-based two-factor authentication.

#### Scenario: Enable 2FA
- **WHEN** user requests to enable 2FA
- **THEN** system generates OTP secret
- **AND** displays QR code for authenticator app
- **AND** provides 10 recovery codes

#### Scenario: Login with 2FA enabled
- **WHEN** user has 2FA enabled
- **AND** submits valid credentials
- **THEN** system prompts for OTP
- **AND** completes login after valid OTP

### Requirement: Recovery Codes
The system SHALL provide recovery codes for 2FA bypass.

#### Scenario: Use recovery code
- **WHEN** user cannot access authenticator
- **AND** provides valid recovery code
- **THEN** login is allowed
- **AND** recovery code is invalidated

阶段 2:审核对齐(Review)

目标:确保规格准确、完整、可实现。

活动

  • AI 助手和人类审核规格
  • 讨论边界情况和异常场景
  • 补充缺失的场景
  • 调整任务优先级

示例对话

Human: 请审核 add-2fa 提案,检查是否有遗漏的场景

AI: 我审核了提案,发现几个需要补充的场景:

1. 2FA 禁用流程:用户如何关闭 2FA?
2. OTP 过期处理:OTP 的有效时间是多久?
3. 错误尝试限制:连续错误输入 OTP 是否锁定?

建议添加以下场景...

阶段 3:批准计划(Approve)

标志

  • 所有利益相关者同意规格
  • 任务清单完整且可执行
  • 没有未解决的问题

最佳实践

  • 在 proposal.md 中记录批准状态
  • 可以使用 Git 标签标记批准点

阶段 4:实现任务(Implement)

流程

  1. AI 助手读取 proposal.md 理解背景
  2. 读取 design.md(如有)理解技术决策
  3. 按顺序执行 tasks.md 中的任务
  4. 完成一个任务后标记为 [x]

示例

Human: /openspec:apply add-2fa

AI: 我将实现 add-2fa 变更。

首先读取提案...
理解到需要添加 TOTP 双因素认证。

开始执行任务 1.1:添加 otp_secret 列到 users 表...
[创建数据库迁移]

任务 1.1 完成 ✓

开始执行任务 1.2:创建 recovery_codes 表...

阶段 5:归档更新(Archive)

触发条件

  • 所有任务完成
  • 代码已部署到生产环境

执行命令

bash
openspec archive add-2fa --yes

归档操作

  1. 将增量规格合并到 specs/
  2. 将变更目录移动到 changes/archive/YYYY-MM-DD-add-2fa/
  3. 更新 specs/ 中的规格文件

3. 增量规格(Delta Specs)

增量规格是 OpenSpec 的核心概念,它描述了对现有规格的变更。

增量操作类型

操作用途示例
## ADDED Requirements添加新需求新功能、新能力
## MODIFIED Requirements修改现有需求改变行为、更新逻辑
## REMOVED Requirements删除需求废弃功能、迁移
## RENAMED Requirements重命名需求术语变化、重构

ADDED - 添加新需求

用于引入全新的、独立的能力:

markdown
## ADDED Requirements

### Requirement: Email Notifications
The system SHALL send email notifications for important events.

#### Scenario: Password changed
- **WHEN** user changes password
- **THEN** system sends confirmation email
- **AND** email includes timestamp and IP address

MODIFIED - 修改现有需求

用于改变现有需求的行为。重要:必须包含完整的修改后内容!

错误示例(只写变化部分,会丢失原有内容):

markdown
## MODIFIED Requirements

### Requirement: User Login
- Add rate limiting  ❌ 错误!缺少完整需求

正确示例(包含完整的修改后需求):

markdown
## MODIFIED Requirements

### Requirement: User Login
The system SHALL authenticate users with email and password.
The system MUST apply rate limiting: max 5 attempts per 15 minutes.

#### Scenario: Valid credentials
- **WHEN** user submits valid email and password
- **AND** rate limit not exceeded
- **THEN** system returns JWT token
- **AND** token expires in 24 hours

#### Scenario: Rate limit exceeded
- **WHEN** user exceeds 5 login attempts in 15 minutes
- **THEN** system returns 429 Too Many Requests
- **AND** includes retry-after header

REMOVED - 删除需求

用于废弃或迁移功能:

markdown
## REMOVED Requirements

### Requirement: Legacy Basic Auth
**Reason**: 已被 JWT 认证取代,不再维护
**Migration**: 所有 API 客户端需在 2024-06-01 前迁移到 JWT

RENAMED - 重命名需求

用于术语变化或重构:

markdown
## RENAMED Requirements

- FROM: `### Requirement: Login`
- TO: `### Requirement: User Authentication`

如果同时修改内容,需要同时使用 RENAMED 和 MODIFIED。

4. 规格文件格式

结构化需求

每个规格文件遵循固定格式:

markdown
# [Capability] Specification

## Purpose
[一句话描述这个能力的目的]

## Requirements

### Requirement: [Name]
[需求描述,使用 SHALL/MUST 关键词]

#### Scenario: [场景名称]
- **WHEN** [触发条件]
- **AND** [附加条件]
- **THEN** [预期结果]
- **AND** [附加结果]

关键词规范

关键词含义用法
SHALL必须(规范性)核心功能需求
MUST必须(强制性)安全或合规需求
SHOULD应该(推荐)最佳实践
MAY可以(可选)可选功能

场景格式

场景使用 BDD(行为驱动开发)风格:

markdown
#### Scenario: [描述性名称]
- **GIVEN** [前置条件 - 可选]
- **WHEN** [触发动作]
- **AND** [附加条件 - 可选]
- **THEN** [预期结果]
- **AND** [附加结果 - 可选]

重要格式要求

  • 场景标题必须使用 ####(4 个井号)
  • 条件使用 - **KEYWORD** 格式
  • 每个需求至少一个场景

完整示例

markdown
# Payment Specification

## Purpose
Handle payment processing and transaction management.

## Requirements

### Requirement: Payment Processing
The system SHALL process credit card payments via Stripe.

#### Scenario: Successful payment
- **GIVEN** user has valid payment method on file
- **WHEN** user submits payment for $50.00
- **AND** card has sufficient funds
- **THEN** payment is processed
- **AND** transaction ID is returned
- **AND** receipt email is sent

#### Scenario: Insufficient funds
- **GIVEN** user has valid payment method
- **WHEN** user submits payment
- **AND** card has insufficient funds
- **THEN** payment is declined
- **AND** error message is displayed
- **AND** no charge is made

### Requirement: Refund Processing
The system SHALL support full and partial refunds within 30 days.

#### Scenario: Full refund
- **WHEN** admin initiates full refund
- **AND** transaction is within 30 days
- **THEN** original amount is refunded
- **AND** customer receives notification

#### Scenario: Partial refund
- **WHEN** admin initiates partial refund for $20.00
- **AND** original transaction was $50.00
- **THEN** $20.00 is refunded
- **AND** transaction shows partial refund status

5. CLI 命令详解

核心命令

bash
# 列出活跃变更
openspec list

# 列出已有规格
openspec list --specs

# 显示变更详情
openspec show <change-id>

# 显示规格详情
openspec show <spec-id> --type spec

# 验证变更
openspec validate <change-id> --strict

# 归档变更
openspec archive <change-id> --yes

# 交互式仪表盘
openspec view

命令参数

参数说明
--jsonJSON 格式输出,便于脚本处理
--strict严格验证模式
--type change|spec指定类型(当名称冲突时)
--yes / -y跳过确认提示
--no-interactive禁用交互模式
--skip-specs归档时跳过规格更新

调试命令

bash
# 查看增量规格解析结果
openspec show <change-id> --json --deltas-only

# 查看特定需求
openspec show <spec-id> --json -r 1

# 全文搜索规格
rg -n "Requirement:|Scenario:" openspec/specs

6. 变更命名约定

change-id 命名规则

[动词]-[描述]
add-user-auth
update-payment-flow
remove-legacy-api
refactor-database-layer

常用动词前缀

  • add-:添加新功能
  • update-:更新现有功能
  • remove-:删除功能
  • refactor-:重构代码
  • fix-:修复问题(通常不需要 OpenSpec)
  • migrate-:数据或架构迁移

能力(Capability)命名

[名词]-[名词]
user-auth
payment-processing
notification-service
file-storage

命名原则

  • 使用 kebab-case(短横线分隔)
  • 单一职责(如果需要"和",应该拆分)
  • 10 分钟可理解规则

本章小结

本章详细介绍了 OpenSpec 的五大核心概念:

  1. 双文件夹模型specs/(当前真相)+ changes/(提案变更)
  2. 变更生命周期:Draft → Review → Approve → Implement → Archive
  3. 增量规格:ADDED、MODIFIED、REMOVED、RENAMED 四种操作
  4. 规格文件格式:结构化的需求和场景描述
  5. CLI 命令:管理规格和变更的命令行工具

理解这些概念后,你就具备了使用 OpenSpec 的基础知识。下一章我们将学习如何将 OpenSpec 与 Claude Code 结合使用。


完整示例代码

以下是一个完整的 OpenSpec 变更创建和管理脚本:

bash
#!/bin/bash
# OpenSpec 变更管理脚本
# 演示完整的变更生命周期

set -e

# 颜色定义
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'

log() { echo -e "${BLUE}[OpenSpec]${NC} $1"; }
success() { echo -e "${GREEN}[✓]${NC} $1"; }
warn() { echo -e "${YELLOW}[!]${NC} $1"; }

# 检查 OpenSpec
if ! command -v openspec &> /dev/null; then
    echo "请先安装 OpenSpec: npm install -g @fission-ai/openspec@latest"
    exit 1
fi

# 创建示例项目
PROJECT_DIR="openspec-lifecycle-demo"
log "创建示例项目: $PROJECT_DIR"
mkdir -p "$PROJECT_DIR"
cd "$PROJECT_DIR"

# 初始化
if [ ! -d "openspec" ]; then
    log "初始化 OpenSpec..."
    openspec init --non-interactive 2>/dev/null || openspec init
fi

# ============================================
# 1. 创建初始规格(模拟已有系统)
# ============================================
log "创建初始规格..."

mkdir -p openspec/specs/auth
cat > openspec/specs/auth/spec.md << 'EOF'
# Auth Specification

## Purpose
Handle user authentication and session management.

## Requirements

### Requirement: User Login
The system SHALL authenticate users with email and password.

#### Scenario: Valid credentials
- **WHEN** user submits valid email and password
- **THEN** system returns JWT token
- **AND** token expires in 24 hours

#### Scenario: Invalid credentials
- **WHEN** user submits incorrect credentials
- **THEN** system returns 401 Unauthorized
- **AND** login attempt is logged
EOF

success "创建了 specs/auth/spec.md"

# ============================================
# 2. 创建变更提案
# ============================================
CHANGE_ID="add-two-factor-auth"
log "创建变更提案: $CHANGE_ID"

mkdir -p "openspec/changes/$CHANGE_ID/specs/auth"

# proposal.md
cat > "openspec/changes/$CHANGE_ID/proposal.md" << 'EOF'
## Why
用户反馈需要更强的账户安全保护。
双因素认证(2FA)是提升账户安全的行业标准做法。

## What Changes
- 添加 TOTP(基于时间的一次性密码)支持
- 修改登录流程,增加 2FA 验证步骤
- 添加恢复码机制,防止用户锁定

## Impact
- **Affected specs**: auth
- **Affected code**:
  - `src/auth/` - 认证服务
  - `src/middleware/` - JWT 中间件
  - `src/routes/` - API 路由
- **Breaking changes**:
  - 登录 API 响应格式变化
  - 需要前端配合更新登录流程

## Timeline
- 提案评审: 2024-12-01
- 开发开始: 2024-12-05
- 预计完成: 2024-12-15
EOF
success "创建了 proposal.md"

# tasks.md
cat > "openspec/changes/$CHANGE_ID/tasks.md" << 'EOF'
# Tasks for add-two-factor-auth

## 1. Database Setup
- [ ] 1.1 Add `otp_secret` column to users table (VARCHAR(32), nullable)
- [ ] 1.2 Add `otp_enabled` column to users table (BOOLEAN, default false)
- [ ] 1.3 Create `recovery_codes` table (user_id, code, used, created_at)
- [ ] 1.4 Create database migration script

## 2. Backend Implementation
- [ ] 2.1 Implement TOTP service
  - Generate secret
  - Verify OTP
  - Generate QR code URL
- [ ] 2.2 Add 2FA enable endpoint `POST /api/auth/2fa/enable`
- [ ] 2.3 Add 2FA verify endpoint `POST /api/auth/2fa/verify`
- [ ] 2.4 Add 2FA disable endpoint `POST /api/auth/2fa/disable`
- [ ] 2.5 Modify login endpoint to check 2FA status
- [ ] 2.6 Implement recovery code generation (10 codes per user)
- [ ] 2.7 Add recovery code verification endpoint

## 3. Frontend Updates
- [ ] 3.1 Create OTP input component
- [ ] 3.2 Update login flow to handle 2FA challenge
- [ ] 3.3 Create 2FA setup page with QR code display
- [ ] 3.4 Create recovery codes display modal
- [ ] 3.5 Add 2FA toggle in security settings

## 4. Testing
- [ ] 4.1 Unit tests for TOTP service
- [ ] 4.2 Integration tests for 2FA endpoints
- [ ] 4.3 E2E tests for complete 2FA flow
- [ ] 4.4 Test recovery code flow

## 5. Documentation
- [ ] 5.1 Update API documentation
- [ ] 5.2 Add 2FA setup guide for users
- [ ] 5.3 Update security best practices doc
EOF
success "创建了 tasks.md"

# design.md (可选,当变更复杂时推荐)
cat > "openspec/changes/$CHANGE_ID/design.md" << 'EOF'
# Technical Design: Two-Factor Authentication

## Context
当前系统仅使用用户名/密码认证。为提高安全性,需要添加第二因素。

## Goals
- 实现 TOTP 标准(RFC 6238)
- 兼容 Google Authenticator、Authy 等主流应用
- 提供恢复机制防止用户锁定

## Non-Goals
- 短信验证(成本和安全考虑)
- 硬件 Key 支持(后续迭代)

## Decisions

### Decision 1: TOTP 算法选择
**选择**: 使用 TOTP(RFC 6238)
**理由**:
- 行业标准,广泛支持
- 无需服务器存储 OTP 值
- 用户无需网络即可生成

**替代方案**:
- HOTP: 基于计数器,不如 TOTP 安全
- 短信: 成本高,SS7 攻击风险

### Decision 2: Secret 存储
**选择**: 使用 AES-256 加密存储 OTP secret
**理由**: 即使数据库泄露,攻击者无法直接使用 secret

### Decision 3: Recovery Codes
**选择**: 每用户 10 个一次性恢复码
**理由**:
- 足够应对大多数恢复场景
- 一次性使用提高安全性

## Implementation Notes

### OTP Secret Generation
```javascript
// 使用 speakeasy 库
const speakeasy = require('speakeasy');
const secret = speakeasy.generateSecret({ length: 20 });
```

### Database Schema
```sql
ALTER TABLE users ADD COLUMN otp_secret VARCHAR(255);
ALTER TABLE users ADD COLUMN otp_enabled BOOLEAN DEFAULT false;

CREATE TABLE recovery_codes (
    id SERIAL PRIMARY KEY,
    user_id INTEGER REFERENCES users(id),
    code VARCHAR(16) NOT NULL,
    used BOOLEAN DEFAULT false,
    created_at TIMESTAMP DEFAULT NOW()
);
```

### API Flow
```
1. Enable 2FA:
   POST /api/auth/2fa/enable
   Response: { secret, qr_url, recovery_codes }

2. Verify Setup:
   POST /api/auth/2fa/verify
   Body: { otp }
   Response: { success, enabled }

3. Login with 2FA:
   POST /api/auth/login
   Response: { requires_2fa: true, challenge_token }

   POST /api/auth/2fa/challenge
   Body: { challenge_token, otp }
   Response: { access_token }
```

## Risks & Mitigations
| Risk | Probability | Impact | Mitigation |
|------|-------------|--------|------------|
| 用户丢失手机 | Medium | High | Recovery codes |
| Secret 泄露 | Low | Critical | AES 加密存储 |
| Brute force OTP | Low | Medium | Rate limiting |

## Open Questions
- [ ] 是否需要支持备用邮箱验证?
- [ ] 恢复码是否需要设置过期时间?
EOF
success "创建了 design.md"

# spec delta
cat > "openspec/changes/$CHANGE_ID/specs/auth/spec.md" << 'EOF'
# Delta for Auth Specification

## ADDED Requirements

### Requirement: Two-Factor Authentication
The system MUST support TOTP-based two-factor authentication for enhanced security.

#### Scenario: Enable 2FA
- **GIVEN** user is logged in
- **WHEN** user requests to enable 2FA
- **THEN** system generates new OTP secret
- **AND** returns QR code URL for authenticator app
- **AND** generates 10 recovery codes
- **AND** requires OTP verification before activation

#### Scenario: Login with 2FA enabled
- **GIVEN** user has 2FA enabled
- **WHEN** user submits valid credentials
- **THEN** system returns 2FA challenge token
- **AND** prompts for OTP code
- **AND** issues JWT only after valid OTP

#### Scenario: Invalid OTP attempt
- **GIVEN** user is in 2FA challenge
- **WHEN** user submits invalid OTP
- **THEN** system returns error
- **AND** allows retry
- **AND** locks account after 5 consecutive failures

### Requirement: Recovery Codes
The system SHALL provide recovery codes as backup 2FA method.

#### Scenario: Use recovery code
- **GIVEN** user has 2FA enabled
- **AND** cannot access authenticator app
- **WHEN** user submits valid recovery code
- **THEN** login is allowed
- **AND** recovery code is marked as used
- **AND** user is warned about remaining codes

#### Scenario: Regenerate recovery codes
- **GIVEN** user is logged in with 2FA
- **WHEN** user requests new recovery codes
- **THEN** all existing codes are invalidated
- **AND** 10 new codes are generated

## MODIFIED Requirements

### Requirement: User Login
The system SHALL authenticate users with email and password.
The system MUST check 2FA status after credential verification.

#### Scenario: Valid credentials without 2FA
- **WHEN** user submits valid email and password
- **AND** user does not have 2FA enabled
- **THEN** system returns JWT token
- **AND** token expires in 24 hours

#### Scenario: Valid credentials with 2FA
- **WHEN** user submits valid email and password
- **AND** user has 2FA enabled
- **THEN** system returns 2FA challenge
- **AND** does NOT issue JWT yet

#### Scenario: Invalid credentials
- **WHEN** user submits incorrect credentials
- **THEN** system returns 401 Unauthorized
- **AND** login attempt is logged
EOF
success "创建了 specs/auth/spec.md (delta)"

# ============================================
# 3. 验证变更
# ============================================
echo ""
log "验证变更..."
openspec validate "$CHANGE_ID" --strict || warn "验证有警告"

# ============================================
# 4. 显示变更信息
# ============================================
echo ""
log "变更列表:"
openspec list

echo ""
log "变更详情:"
openspec show "$CHANGE_ID" 2>/dev/null || cat "openspec/changes/$CHANGE_ID/proposal.md"

# ============================================
# 5. 模拟实现完成
# ============================================
echo ""
log "模拟实现完成(标记所有任务为完成)..."

# 更新 tasks.md 标记任务完成
sed -i.bak 's/\[ \]/[x]/g' "openspec/changes/$CHANGE_ID/tasks.md"
rm "openspec/changes/$CHANGE_ID/tasks.md.bak"

success "所有任务已标记为完成"

# ============================================
# 6. 归档变更
# ============================================
echo ""
log "归档变更..."
openspec archive "$CHANGE_ID" --yes || warn "归档可能需要手动处理"

# ============================================
# 7. 验证最终状态
# ============================================
echo ""
log "最终状态:"
echo ""
echo "=== 活跃变更 ==="
openspec list

echo ""
echo "=== 规格列表 ==="
openspec list --specs

echo ""
echo "=== 目录结构 ==="
find openspec -name "*.md" | head -20

# ============================================
# 输出总结
# ============================================
echo ""
echo "======================================"
echo "  OpenSpec 变更生命周期演示完成"
echo "======================================"
echo ""
echo "演示了以下流程:"
echo "1. 创建初始规格 (specs/auth/spec.md)"
echo "2. 创建变更提案 (changes/$CHANGE_ID/)"
echo "   - proposal.md: 变更原因和影响"
echo "   - tasks.md: 实现任务清单"
echo "   - design.md: 技术决策"
echo "   - specs/: 增量规格"
echo "3. 验证变更 (openspec validate)"
echo "4. 实现任务 (标记完成)"
echo "5. 归档变更 (openspec archive)"
echo ""
echo "项目目录: $(pwd)"

将此脚本保存为 openspec-lifecycle-demo.sh,然后执行:

bash
chmod +x openspec-lifecycle-demo.sh
./openspec-lifecycle-demo.sh

这个脚本完整演示了:

  1. 创建初始规格(模拟现有系统)
  2. 创建完整的变更提案(包含 proposal、tasks、design、delta specs)
  3. 验证变更格式
  4. 模拟实现完成
  5. 归档变更到 archive/
  6. 展示最终项目状态

基于 MIT 许可证发布。内容版权归作者所有。