完整工作流
通过实际案例,学习 OpenSpec 从提案到归档的完整工作流。
案例:添加用户评论功能
背景
你正在开发一个博客系统,需要添加文章评论功能:
- 用户可以发表评论
- 支持回复评论
- 需要分页显示
- 需要权限控制
Step 1:创建提案
bash
/opsx:propose "添加用户评论功能,支持发表评论、回复评论、分页显示"AI 生成以下文档:
proposal.md
markdown
## Why
用户反馈希望能对文章进行评论互动,增强社区活跃度。
## What
添加用户评论功能:
1. 用户可以对文章发表评论
2. 支持回复其他评论(二级评论)
3. 评论列表分页显示(每页 20 条)
4. 支持删除自己的评论
## Capabilities
- 评论管理
- 评论显示
## Impact
- 文章模块
- 用户模块
- 数据库(新增 comment 表)
- API 接口
## Non-Goals
- 不支持评论编辑(暂只支持删除重发)
- 不支持评论审核(后续迭代)
- 不支持富文本(纯文本)design.md
数据模型
Comment
├── id: UUID
├── articleId: UUID (外键)
├── authorId: UUID (外键)
├── content: string (max 1000)
├── parentId: UUID? (外键,null 表示顶级评论)
├── createdAt: DateTime
└── deletedAt: DateTime?API 设计
POST /api/v1/articles/{articleId}/comments
GET /api/v1/articles/{articleId}/comments?page={page}
DELETE /api/v1/comments/{commentId}权限
- 任何人可以查看评论
- 登录用户可以发表评论
- 只能删除自己的评论
**specs/comment/spec.md**
```markdown
## ADDED Requirements
### Requirement: 用户可以发表评论
用户 SHALL 能够对文章发表评论。
#### Scenario: 成功发表评论
- **GIVEN** 用户已登录
- **WHEN** 用户提交评论内容
- **THEN** 评论被保存
- **AND** 返回评论详情
#### Scenario: 未登录用户发表评论
- **GIVEN** 用户未登录
- **WHEN** 用户提交评论内容
- **THEN** 返回 401 未授权错误tasks.md
markdown
## 1. 数据库
- [ ] 1.1 创建 Comment 表
- [ ] 1.2 添加索引(articleId, createdAt)
## 2. 后端 API
- [ ] 2.1 POST /api/v1/articles/{articleId}/comments
- [ ] 2.2 GET /api/v1/articles/{articleId}/comments
- [ ] 2.3 DELETE /api/v1/comments/{commentId}
- [ ] 2.4 编写单元测试
## 3. 前端
- [ ] 3.1 创建评论组件
- [ ] 3.2 集成到文章页面
- [ ] 3.3 实现分页Step 2:审查确认
你审查文档后,发现问题:
"design.md 里缺少分页的具体实现方案,需要说明:
1. 分页参数(page, limit)
2. 返回格式(列表 + 总数)
3. 排序规则(按时间倒序)"AI 更新 design.md:
markdown
## 分页设计
### 请求参数
- page: number (default: 1)
- limit: number (default: 20, max: 100)
### 响应格式
```json
{
"data": [/* 评论列表 */],
"meta": {
"total": 100,
"page": 1,
"limit": 20,
"totalPages": 5
}
}排序规则
- 顶级评论:按 createdAt 倒序
- 回复评论:按 createdAt 正序(显示在父评论下方)
### Step 3:开始实现
确认无误后:
```bash
/opsx:applyAI 开始执行任务:
开始实现任务...
✓ 1.1 创建 Comment 表
生成迁移文件: migrations/20250315_create_comment_table.sql
✓ 1.2 添加索引
创建复合索引: (articleId, createdAt)
⟳ 2.1 POST /api/v1/articles/{articleId}/comments
实现中...
- 验证用户登录
- 验证文章内容
- 保存评论
- 返回结果Step 4:调整规范
实现到一半,你发现漏了一个需求:
"等等,我忘了考虑评论内容的长度限制和敏感词过滤。
需要在 specs/ 中添加这些需求。"更新 spec.md:
markdown
### Requirement: 评论内容验证
系统 SHALL 验证评论内容的合法性。
#### Scenario: 内容过长
- **WHEN** 用户提交超过 1000 字的评论
- **THEN** 返回 400 错误,提示"评论内容不能超过 1000 字"
#### Scenario: 包含敏感词
- **WHEN** 用户提交包含敏感词的评论
- **THEN** 返回 400 错误,提示"评论内容包含敏感词"让 AI 继续:
bash
/opsx:applyAI 读取更新后的规范,添加验证逻辑。
Step 5:验证实现
实现完成后:
bash
/opsx:verifyAI 验证结果:
验证结果:
✓ 用户可以发表评论
✓ 支持回复评论
✓ 分页显示
✓ 内容长度验证
✓ 敏感词过滤
✓ 权限控制
✗ 单元测试覆盖率不足(当前 60%,目标 80%)
tasks.md 2.4 未完成
建议:补充单元测试后再归档Step 6:补充测试
bash
/opsx:apply task 2.4AI 补充单元测试:
✓ 添加 CommentController 单元测试
✓ 添加 CommentService 单元测试
✓ 添加权限验证测试
✓ 当前测试覆盖率:85%再次验证:
bash
/opsx:verify验证结果:
✓ 所有需求已实现
✓ 测试覆盖率 85%
可以归档!Step 7:归档
bash
/opsx:archiveAI 执行归档:
归档变更:
- 移动 openspec/changes/add-comment-feature/
- 到 openspec/archive/2025-03-16-add-comment-feature/
- 生成 summary.md
归档完成!生成的 summary.md:
markdown
# 变更摘要:添加用户评论功能
## 实现内容
- 用户评论功能(CRUD)
- 支持二级评论(回复)
- 分页显示(每页 20 条)
- 内容验证(长度、敏感词)
- 权限控制
## 技术方案
- 新增 Comment 表
- 3 个 API 接口
- React 评论组件
- 单元测试覆盖率 85%
## 变更文件
- migrations/20250315_create_comment_table.sql
- src/controllers/CommentController.ts
- src/services/CommentService.ts
- src/components/CommentSection.tsx
- tests/comment.test.ts
## 耗时
- 提案阶段:30 分钟
- 实现阶段:2 小时
- 总计:2.5 小时时间线回顾
T+0:00 /opsx:propose "添加用户评论功能"
AI 生成文档
T+0:30 人工审查,发现问题
更新 design.md(分页方案)
T+0:45 /opsx:apply
AI 开始实现
T+1:30 发现遗漏需求(内容验证)
更新 spec.md
T+1:45 /opsx:apply
AI 继续实现
T+2:30 /opsx:verify
发现测试不足
T+2:45 /opsx:apply task 2.4
补充测试
T+3:00 /opsx:verify
全部通过
T+3:15 /opsx:archive
归档完成关键要点
1. 迭代调整是正常的
不是一次就完美,发现遗漏及时更新规范。
2. 规范是活的
实现过程中可以修改 proposal、design、specs。
3. 验证很重要
/opsx:verify 确保实现符合规范。
4. 归档沉淀知识
归档后的记录可供未来参考。
常见流程变体
变体 1:简单功能
bash
/opsx:propose "修复登录按钮样式"
/opsx:apply
/opsx:archive简单功能可以跳过复杂审查。
变体 2:手动实现部分
bash
/opsx:propose "添加复杂算法"
/opsx:apply from 2.3 # AI 只实现部分
# 手动实现核心算法
/opsx:continue # AI 继续剩余任务
/opsx:archive变体 3:分阶段实现
bash
/opsx:propose "添加支付功能"
/opsx:apply phase 1 # 只实现第一阶段(基础功能)
# 测试上线
/opsx:apply phase 2 # 实现第二阶段(高级功能)
/opsx:archive下一步
学习如何编写高质量的规范: