ai-robot-core/docs/spec-product-zh.md

378 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: spec-product-zh
version: 1.3.0
description: "基于 Kiro Spec-Driven Development 与 API-First 思想的‘规范驱动+接口先行协同开发方法论。通过结构化文档Requirements/OpenAPI/Design/Tasks实现 AI 开发的全链路可控与高效协作。"
license: MIT
compatibility: opencode
metadata:
audience: "开发者, 架构师, AI 智能体"
workflow: specification
language: zh-CN
methodology:
- "Kiro Spec-Driven Development"
- "API-First (接口先行)"
artifacts:
- requirements.md
- openapi.provider.yaml
- openapi.deps.yaml
- design.md
- tasks.md
---
# 规范驱动 + 接口先行Spec-Driven + API-First开发方法论
本方法论旨在通过结构化规范文档作为人类与 AI 的“共同语言”,并以接口契约作为协作锚点,实现多角色 AI 的并行、有序、高质量开发。
> 职责边界:
> - 本文档专注于**生成规范文档**requirements/design/tasks/openapi
> - AI 在编码阶段的行为准则、门禁、引用规则等执行规范:遵循项目根目录 `agents.md`。
> - 契约成熟度与门禁的硬规则(给 AI见 `spec/contracting.md`。
> - hooks/构建检查等落地细则(给人):见 `docs/contracting-guide.md`。
---
## 0. 前置步骤模块拆分与依赖接口盘点Module & Dependency Scoping
在进入“某个模块的 Spec 生成”之前,必须先做一次轻量的边界澄清,否则后续文档会不可控、也无法高效并行。
### 0.1 产出物
建议在本模块的 Spec 目录下新增一个轻量清单(可写在 `requirements.md` 中的 Scope/Dependencies 小节,或单独写在 `scope.md`
- **模块边界说明Module Scope**:本次 Spec 只覆盖哪个模块/子域?不覆盖什么?
- **依赖清单Dependencies**:本模块会调用哪些外部模块/第三方?
- **依赖接口清单Dependency Contracts**:对每个依赖,列出“需要的接口能力”(先不管实现在哪)。
### 0.2 判定标准(进入第 1 阶段的准入条件)
- 能明确回答:
- “这是哪个模块的需求?”
- “本模块对外提供什么能力?”
- “本模块依赖谁?依赖哪些接口?”
- 若依赖不明确:先补齐依赖接口清单(哪怕先是草案),再进入需求与接口建模。
---
## 1. 核心流程:三阶段协同(每次只做一个模块/一个领域边界)
### 第一阶段需求定义与接口建模Requirements & API Design
- **目标**明确“做什么”以及“如何交互”建立单一可信源SSOT
- **模块化原则**:对于庞大系统,一个 Spec 上下文应**仅聚焦于一个功能模块或领域边界**(如 `ruoyi-forum`),避免跨模块需求混杂导致 AI 上下文过载。
- **依赖先行Dependency-First**
- 如果本模块依赖其他模块(或第三方服务),必须在此阶段先完成**外部依赖接口契约**(哪怕只有最小集合)。
- **调用方**:基于依赖契约生成 Mock 并直接进入开发逻辑,无需等待被调用方实现。
- **实现方**:后续根据该依赖契约补全真实实现,并通过契约一致性验证。
- **产出**(默认建议放在 `spec/<module>/` 目录下,例如 `spec/ruoyi-forum/requirements.md`
- `requirements.md`(本模块需求)
- `openapi.provider.yaml`(本模块对外提供的 API
- `openapi.deps.yaml`(本模块依赖的外部 API 契约,供 Mock/SDK 生成)
### 第二阶段技术设计与方案评审Technical Design
- **目标**:细化“怎么实现”,解决技术实现路径与数据模型问题。
- **产出**`design.md`(技术蓝图)。
- **规范**
- 设计方案必须引用需求 ID。
- 若涉及跨模块调用,应明确定义:依赖 API 的 Mock 策略、超时/重试/熔断/降级、错误映射。
### 第三阶段任务分解与并行开发Task Decomposition & Implementation
- **目标**:将设计转化为可执行的原子任务。
- **并行编程协作(多窗口并行)**
- **前端/调用方 AI**:基于 `openapi.provider.yaml` + `openapi.deps.yaml` 生成 SDK + Mock优先完成页面与业务流程。
- **后端/提供方 AI**:实现 `openapi.provider.yaml` 对应接口,并持续导出 OpenAPI 工件供校验。
- **依赖实现方 AI**:对照 `openapi.deps.yaml`(或其子集)补齐真实实现。
- **产出**`tasks.md`(执行清单)。
---
## 2. 关键文档规范
### 2.1 requirements.md需求规范
requirements 的目标是把“自然语言需求”固化为**可追踪、可校验、可版本化**的规范。
必须包含以下结构:
- **Frontmatter**:包含 `feature_id`, `title`, `status`, `version`(可按团队需要扩展)。
- **用户故事**:使用统一句式“作为…我希望…以便…”。
- **验收标准EARS 语法)**:每条验收标准必须带稳定 ID推荐 `AC-<FEATURE>-NN`)。
- **追踪映射Traceability**:验收标准到接口端点(以及可选 operationId的映射。
#### 2.1.1 requirements.md 标准模板(可直接复制)
```markdown
---
feature_id: "REG" # 功能短 ID用于拼接 US/AC/NFR 编号)
title: "用户注册"
status: "draft" # draft | review | approved | implemented
version: "0.1.0"
owners:
- "product"
- "backend"
- "frontend"
last_updated: "2026-02-23"
source:
type: "conversation" # conversation | issue | doc | meeting
ref: ""
---
# 用户注册REG
## 1. 背景与目标
- 背景:
- 目标:
- 非目标Out of Scope
## 2. 模块边界Scope
- 覆盖:
- 不覆盖:
## 3. 依赖盘点Dependencies
- 依赖模块/第三方:
- 依赖 A用途说明
- 依赖 B用途说明
## 4. 用户故事User Stories
- [US-REG-01] 作为访客,我希望使用邮箱注册账号,以便获得会员权益。
## 5. 验收标准Acceptance Criteria, EARS
- [AC-REG-01] WHEN 访客提交有效的邮箱与密码 THEN 系统 SHALL 创建用户并返回 201。
- [AC-REG-02] WHEN 访客提交的邮箱不合法 THEN 系统 SHALL 返回 400并给出字段级错误信息。
- [AC-REG-03] WHEN 邮箱已被注册 THEN 系统 SHALL 返回 400并提示“邮箱已注册”。
## 6. 追踪映射Traceability
| AC ID | Endpoint | 方法 | operationId可选 | 备注 |
|------|----------|------|---------------------|------|
| AC-REG-01 | /users/register | POST | registerUser | 创建用户 |
| AC-REG-02 | /users/register | POST | registerUser | 参数校验 |
| AC-REG-03 | /users/register | POST | registerUser | 唯一性约束 |
```
### 2.2 OpenAPI 契约openapi.provider.yaml / openapi.deps.yaml
为支持“大系统多模块 + 多窗口并行”,推荐将 OpenAPI **拆成两份**
- `openapi.provider.yaml`**本模块对外提供**的 API本模块是 Provider
- `openapi.deps.yaml`**本模块依赖**的外部 API 契约(本模块是 Consumer便于 Mock/SDK 生成)。
约定:
- 两份文件都必须可被 Mock/SDK/测试工具消费。
- Provider 文件建议带 `x-requirements: [AC-xxx]` 追踪需求。
- Deps 文件应定义你“需要对方提供什么能力”,不以对方当前实现为准(可以先草案,后续对齐)。
---
#### 2.2.1 契约成熟度Contract Refinement Levels
为减少“边实现边改契约”导致的需求偏移,本方法论引入契约成熟度等级,并要求在 OpenAPI 的 `info` 下进行**全局标记**
- `info.x-contract-level: L0 | L1 | L2 | L3`
> 约定:
> - `openapi.deps.yaml` 与 `openapi.provider.yaml` 都必须标记该字段。
> - L0/L1 用于并行启动Provider 在进入可合并的实现阶段前应提升到 L2。
**L0占位/可 Mock**
- 目标:调用方可快速生成 Mock跑通主流程happy path
- 必须:最小 path/method/2xx 响应骨架;统一错误响应骨架(可粗)。
- 允许schema 粗粒度、校验缺失、错误码不细。
**L1可调用/可生成 SDK**
- 目标:调用方可基于契约生成 SDK并开发主要业务流程。
- 必须:关键请求/响应字段(必填/可选、基本状态码集合、operationId、描述。
**L2可验收/可契约测试)**
- 目标:提供者可运行 Provider-driven 契约校验schema/错误语义/边界)。
- 必须关键校验规则format/minLength/enum/range 等)、结构化错误模型、核心异常分支。
**L3可演进/可兼容治理)**
- 目标:长期维护与兼容演进,减少 breaking change。
- 必须deprecated/兼容策略、示例examples、变更记录changelog 或版本策略)。
#### 2.2.2 从轻量切分到可验收契约:细化路径
- 在第 0 节Scoping阶段输出依赖能力清单自然语言即可并将其转写为 `openapi.deps.yaml`**L0** 草案。
- 在第 1 阶段(需求与接口建模)阶段:
- 新增/完善 ACEARS会驱动契约从 L0 → L1补齐核心字段、状态码与映射
- 每个新增字段/错误语义/校验规则,应能追溯到某条 `AC-*`(否则属于“潜在需求漂移”)。
- 在进入“提供者实现可合并”之前:必须将 `openapi.provider.yaml` 提升到 **L2**(达到可契约测试的程度)。
- 在产品稳定期:逐步推动关键接口达到 **L3**(兼容治理与示例完善)。
> 门禁落点(实现细节):成熟度等级与合并策略、校验规则应由 `agents.md` 中的执行规则 + Git hooks/构建检查共同约束。
### 2.3 design.md技术设计
- **内容**系统架构、数据模型ER 图)、核心流程、异常与重试、鉴权与审计。
- **跨模块调用要求**:必须描述依赖 API 的失败策略(超时/重试/熔断/降级)以及错误映射。
### 2.4 tasks.md任务清单
- **结构**:带状态的 Markdown 任务列表。
- **要求**:任务按“本模块提供能力”与“本模块消费依赖”拆分;每个任务需标注关联 `AC-ID`
---
## 3. 自动化协同增强Hooks/门禁)
本方法论要求在流程中引入自动化门禁,以确保文档与交付一致。
-`requirements.md` / OpenAPI 文件变更时应触发OpenAPI Lint、Diff兼容性检查、契约一致性测试。
-`tasks.md` 任务完成时,应同步更新进度与相关说明。
> 说明关于“AI 编码行为准则、阶段闸门、引用规则、变更策略”等执行层规范,见项目根目录 `agents.md`;关于 hooks/构建检查等落地细则,见 `docs/contracting-guide.md`。
---
## 4. 版本化迭代规则Version Iteration Protocol
### 4.1 问题背景
在多次迭代后,规范文档(尤其是 `requirements.md`)会因 AC 不断累积导致文档膨胀,进而引发:
- AI 上下文快速占满(单个文档可能 500+ 行)
- 历史需求干扰当前迭代的理解
- 难以快速定位当前活跃的 AC 范围
### 4.2 解决方案:单文档内版本分区
采用 **单文档内版本分区 + 历史折叠** 策略:
- 保留最近 1-2 个版本为”活跃版本”(展开)
- 将更早的版本折叠为 `<details>` 标签AI 默认跳过)
- 在 frontmatter 中标记 `active_version``version_history`
### 4.3 requirements.md 版本化模板
```markdown
---
feature_id: “MOD” # 模块短 ID
title: “模块需求规范”
status: “in-progress”
version: “0.3.0” # 当前最新版本
active_version: “0.2.0-0.3.0” # 活跃版本范围(展开显示)
version_history: # 版本历史索引
- version: “0.3.0”
ac_range: “AC-MOD-21~30”
description: “功能增强 C”
- version: “0.2.0”
ac_range: “AC-MOD-11~20”
description: “功能扩展 B”
- version: “0.1.0”
ac_range: “AC-MOD-01~10”
description: “基础功能 A已折叠
last_updated: “2026-02-27”
---
# 模块需求规范MOD
## 1. 背景与目标
[保持不变,描述整体背景]
## 2. 模块边界Scope
[保持不变]
## 3. 依赖盘点Dependencies
[保持不变]
## 4. 用户故事User Stories
[仅保留活跃版本的 US历史 US 折叠]
## 5. 验收标准Acceptance Criteria, EARS
### 📌 当前活跃版本v0.2.0 - v0.3.0
#### 5.2 功能扩展 Bv0.2.0
- [AC-MOD-11] WHEN 用户执行操作 X THEN 系统 SHALL 返回结果 Y
- [AC-MOD-12] WHEN 参数无效 THEN 系统 SHALL 返回 400 错误
[展开显示 v0.2.0 的所有 AC]
#### 5.3 功能增强 Cv0.3.0
- [AC-MOD-21] WHEN 用户触发事件 Z THEN 系统 SHALL 执行流程 W
- [AC-MOD-22] WHEN 条件满足 THEN 系统 SHALL 更新状态
[展开显示 v0.3.0 的所有 AC]
---
### 📦 历史版本(已归档)
<details>
<summary>v0.1.0:基础功能 AAC-MOD-01~10</summary>
#### 5.1 基础功能 Av0.1.0
- [AC-MOD-01] WHEN 用户提交请求 THEN 系统 SHALL 处理并返回
- [AC-MOD-02] WHEN 请求格式错误 THEN 系统 SHALL 返回错误信息
[折叠的历史 AC]
</details>
## 6. 追踪映射Traceability
[仅保留活跃版本的映射表]
| AC ID | Endpoint | 方法 | operationId | 备注 |
|------|----------|------|-------------|------|
| AC-MOD-11 | /api/resource | GET | getResource | v0.2.0 |
| AC-MOD-21 | /api/resource | POST | createResource | v0.3.0 |
```
### 4.4 AI 执行规则(新增迭代需求时)
当用户提出新迭代需求时AI 必须:
1. **读取 frontmatter**:识别 `version``active_version`
2. **确定新版本号**:按语义化版本递增(如 `0.6.0``0.7.0`
3. **判断是否需要折叠**
- 若活跃版本已有 2 个(如 `0.5.0-0.6.0`),则将最旧的版本(`0.5.0`)折叠
- 若活跃版本仅 1 个,则保留并追加新版本
4. **追加新需求**
- 在”当前活跃版本”区域末尾追加新章节(如 `#### 5.7 新功能v0.7.0`
- 新 AC 编号延续上一版本(如上一版本最大为 `AC-AISVC-90`,则新版本从 `AC-AISVC-91` 开始)
5. **更新 frontmatter**
- `version: “0.7.0”`
- `active_version: “0.6.0-0.7.0”`
-`version_history` 中追加新版本记录
6. **更新追踪映射表**:仅保留活跃版本的映射
### 4.5 折叠策略
- **保留活跃版本数**:最多 2 个版本展开(当前版本 + 上一版本)
- **折叠粒度**:按大版本折叠(如 `v0.1.0-0.4.0` 合并为一个折叠块)
- **折叠标记**:使用 `<details><summary>` 标签AI 读取时会自动跳过折叠内容
- **AC 编号连续性**:折叠不影响 AC 编号的全局唯一性,新 AC 始终递增
### 4.6 示例:从 v0.2.0 迭代到 v0.3.0
**用户需求**:新增”功能增强 C”
**AI 执行步骤**
1. 读取 `requirements.md`,识别当前 `version: “0.2.0”``active_version: “0.1.0-0.2.0”`
2. 确定新版本号为 `0.3.0`
3.`v0.1.0` 的内容移入 `<details>` 折叠块
4. 在”当前活跃版本”区域追加 `#### 5.3 功能增强 Cv0.3.0`
5. 新 AC 从 `AC-MOD-21` 开始编号(上一版本最大为 `AC-MOD-20`
6. 更新 frontmatter
```yaml
version: “0.3.0”
active_version: “0.2.0-0.3.0”
version_history:
- version: “0.3.0”
ac_range: “AC-MOD-21~30”
description: “功能增强 C”
- version: “0.2.0”
ac_range: “AC-MOD-11~20”
description: “功能扩展 B”
- version: “0.1.0”
ac_range: “AC-MOD-01~10”
description: “基础功能 A已折叠
```
---
## 5. 如何执行
1. **前置步骤**:完成模块拆分与依赖接口盘点(第 0 节)。
2. **发起需求**:仅针对”一个模块”,生成初始 `requirements.md`v0.1.0)。
3. **定义契约**:输出 `openapi.provider.yaml``openapi.deps.yaml`,并进行接口走查。
4. **架构设计**:生成 `design.md`,明确模块内边界、数据流与依赖策略。
5. **任务执行**:生成并执行 `tasks.md`;调用方优先基于 deps 契约 Mock 并行推进。
6. **迭代需求**:按”版本化迭代规则”(第 4 节)追加新版本需求,保持文档精简。