# Prd Evolution

> PRD 文档树状版本管理，处理需求变更、功能扩展和覆盖逻辑。触发词：更新 PRD、修改 PRD、PRD 版本管理、PRD 树、扩展功能、覆盖需求。

- Skill: `throokie/prd-evolution` (Agent Skill)
- Install (CLI): `npx skillmds@latest add throokie/prd-evolution`
- Raw SKILL.md: https://api.skillmd.com/api/skills/throokie/prd-evolution/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Product & Planning
- Author: Throokie (https://skillmd.com/u/throokie)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/throokie/prd-evolution

---


# PRD Evolution - PRD 树状版本管理器

> **角色**：PRD 版本管理专家
>
> **核心价值**：管理 PRD 的完整生命周期，处理需求变更时的覆盖/扩展逻辑，维护清晰的版本树

---

## 🎯 核心概念：PRD 树

```
prd-root (初始 PRD)
├── prd-v1.0 (已实现)
│   ├── feature-A (已实现)
│   └── feature-B (已实现)
├── prd-v1.1 (扩展)
│   └── feature-C (新功能，待实现)
└── prd-v2.0 (覆盖)
    ├── feature-A-v2 (覆盖 feature-A)
    └── feature-D (新功能)
```

### 节点状态

| 状态 | 图标 | 含义 |
|------|------|------|
| 草稿 | 🟡 | 刚创建，待确认 |
| 已确认 | 🟢 | 需求已确认，待实现 |
| 已实现 | 🔵 | 代码已完成 |
| 测试中 | 🟣 | 实现完成，测试中 |
| 已废弃 | ⚪ | 被新版本覆盖 |
| 已合并 | ✅ | 已合并到主线 |

---

## 🌳 树状结构规则

### 规则 1：功能描述不清楚 → 扩展

**场景**：功能 A 已实现，但发现描述不够详细，需要补充细节

**操作**：
```
feature-A (已实现)
└── feature-A-detailed (扩展，待实现)
    └── 继承 feature-A 的实现，添加新细节
```

**实现策略**：
- 保留原有功能
- 在新分支上添加细节
- 完成后合并或并存

### 规则 2：功能未实现 → 直接覆盖

**场景**：功能 B 还未实现（🟡/🟢），用户修改了需求

**操作**：
```
feature-B-v1 (🟡 草稿) ──→ feature-B-v2 (🟡 草稿)
     ↓                           ↓
   [废弃]                      [新需求]
```

**实现策略**：
- 废弃旧版本
- 新版本继承 ID 和位置
- 直接按新版本实现

### 规则 3：功能已实现但需求变更 → 扩展新版本

**场景**：功能 C 已实现（🔵），但用户要求修改

**操作**：
```
feature-C-v1 (🔵 已实现)
└── feature-C-v2 (🟡 草稿，待实现)
    └── 基于 v1 修改
```

**实现策略**：
- 保留 v1 实现（可能回滚）
- v2 基于 v1 代码修改
- 完成后 v1 标记为废弃

---

## 📋 工作流程

### 场景 1：更新已有 PRD

```
用户：更新 PRD prd-20260323-143022-a3f7，添加搜索功能

AI：
1. 读取原 PRD
2. 判断原 PRD 状态
3. 根据状态决定策略
4. 创建新版本或扩展节点
5. 更新树状结构
6. 返回新版本 PRD ID
```

### 场景 2：修改功能需求

```
用户：修改功能"任务创建"，添加优先级字段

AI：
1. 找到功能节点
2. 检查功能状态
3. 状态=🔵已实现 → 创建扩展节点
4. 状态=🟡草稿 → 直接覆盖
5. 更新 PRD 文档
6. 更新树结构图
```

### 场景 3：废弃功能

```
用户：废弃功能"邮件通知"

AI：
1. 找到功能节点
2. 标记为 ⚪ 已废弃
3. 添加废弃原因
4. 更新树结构
5. 如果有代码，标记为待删除
```

---

## 🗂️ 存储结构

### PRD 树文件

**位置**: `~/src/docs/prd/tree.md`

```markdown
# PRD 版本树

## 项目：任务管理系统

### 根节点
- **ID**: prd-20260323-143022-a3f7
- **名称**: 任务管理系统 v1.0
- **状态**: 🟢 已确认
- **文件**: [prd-20260323-143022-a3f7.md](./prd-20260323-143022-a3f7.md)

### 版本树

```
prd-20260323-143022-a3f7
├── feature-task-create (🔵 已实现)
│   └── prd-20260323-143022-a3f7-task-create-priority (🟡 草稿)
│       └── [添加优先级功能]
├── feature-task-list (🔵 已实现)
├── feature-search (🟡 草稿)
└── feature-email-notify (⚪ 已废弃)
    └── 废弃原因：改为站内通知
```

### 变更历史

| 时间 | 操作 | 节点 | 说明 |
|------|------|------|------|
| 2026-03-23 14:30 | 创建 | prd-20260323-143022-a3f7 | 初始版本 |
| 2026-03-23 15:45 | 扩展 | feature-task-create-priority | 添加优先级字段 |
| 2026-03-23 16:20 | 废弃 | feature-email-notify | 改为站内通知 |
```

### PRD 元数据

**位置**: `~/src/docs/prd/meta.json`

```json
{
  "trees": {
    "prd-20260323-143022-a3f7": {
      "name": "任务管理系统",
      "root_id": "prd-20260323-143022-a3f7",
      "current_version": "1.1",
      "nodes": {
        "prd-20260323-143022-a3f7": {
          "parent": null,
          "children": [
            "feature-task-create",
            "feature-task-list"
          ],
          "status": "confirmed",
          "file": "prd-20260323-143022-a3f7.md",
          "created_at": "2026-03-23T14:30:00Z",
          "updated_at": "2026-03-23T14:30:00Z"
        },
        "feature-task-create": {
          "parent": "prd-20260323-143022-a3f7",
          "children": ["feature-task-create-priority"],
          "status": "implemented",
          "file": null,
          "created_at": "2026-03-23T14:30:00Z",
          "updated_at": "2026-03-23T14:30:00Z"
        }
      }
    }
  }
}
```

---

## 🔧 核心操作

### 操作 1：创建新版本

**输入**: 原 PRD ID + 变更内容
**输出**: 新 PRD ID

```python
def create_version(parent_id, changes, strategy="extend"):
    """
    strategy: "extend" | "override" | "fork"
    - extend: 扩展（保留父版本，创建子版本）
    - override: 覆盖（废弃父版本，创建新版本）
    - fork: 分支（并行版本，后续可能合并）
    """
    pass
```

### 操作 2：更新节点状态

**输入**: 节点 ID + 新状态
**输出**: 更新确认

```python
def update_status(node_id, new_status):
    """
    状态流转：
    draft -> confirmed -> implemented -> tested -> merged
       ↓         ↓           ↓            ↓
    abandoned  abandoned   abandoned   abandoned
    """
    pass
```

### 操作 3：查询版本树

**输入**: PRD ID
**输出**: 完整树状结构

```python
def get_tree(root_id):
    """返回树状结构，包含所有节点和状态"""
    pass
```

### 操作 4：合并节点

**输入**: 源节点 ID + 目标节点 ID
**输出**: 合并后的节点

```python
def merge_nodes(source_id, target_id):
    """将源节点合并到目标节点"""
    pass
```

---

## 🎬 使用示例

### 示例 1：扩展已实现功能

**用户输入**:
```
扩展任务创建功能，添加：
1. 优先级选择（高/中/低）
2. 截止日期时间选择（原本只有日期）
3. 任务标签
```

**AI 执行**:
1. 找到 `feature-task-create` 节点
2. 状态 = 🔵 已实现
3. 策略 = 扩展（创建子节点）
4. 创建 `feature-task-create-v2`
5. 复制原 PRD 内容
6. 添加新功能描述
7. 更新 tree.md
8. 更新 meta.json
9. 返回新 PRD ID

**输出**:
```markdown
✅ 已创建扩展版本

- **父节点**: feature-task-create (🔵 已实现)
- **新节点**: feature-task-create-v2 (🟡 草稿)
- **变更**: 添加优先级、时间选择、标签
- **策略**: 扩展（保留 v1，v2 待实现）
- **文件**: prd-20260323-143022-a3f7-task-create-v2.md
```

### 示例 2：覆盖未实现功能

**用户输入**:
```
修改搜索功能，原本要求支持全文搜索，现在改为只支持标题搜索
```

**AI 执行**:
1. 找到 `feature-search` 节点
2. 状态 = 🟡 草稿（未实现）
3. 策略 = 覆盖（直接修改）
4. 更新 PRD 内容
5. 记录变更历史
6. 返回确认

**输出**:
```markdown
✅ 已覆盖需求

- **节点**: feature-search (🟡 草稿)
- **变更**: 全文搜索 → 标题搜索
- **策略**: 直接覆盖（未实现，无需保留旧版本）
- **说明**: 由于功能未实现，直接修改原 PRD
```

### 示例 3：废弃功能

**用户输入**:
```
废弃邮件通知功能，改为站内通知
```

**AI 执行**:
1. 找到 `feature-email-notify` 节点
2. 状态 = 🔵 已实现
3. 标记为 ⚪ 已废弃
4. 添加废弃原因
5. 创建新节点 `feature-inapp-notify`
6. 更新树结构
7. 返回确认

**输出**:
```markdown
✅ 已废弃并替换

- **废弃节点**: feature-email-notify (⚪ 已废弃)
- **原因**: 改为站内通知
- **新节点**: feature-inapp-notify (🟡 草稿)
- **说明**: 如已有代码，建议保留但标记为 deprecated
```

---

## 🔗 与其他技能协作

```
decision-record (需求决策)
    ↓
requirement-to-prd (生成初始 PRD)
    ↓
prd-evolution (管理版本树)
    ├─ 处理需求变更
    ├─ 管理覆盖/扩展逻辑
    └─ 维护版本树
    ↓
prd-to-code (根据 PRD 实现代码)
    ↓
prd-evolution (更新实现状态)
```

---

## 📊 决策矩阵

| 当前状态 | 用户操作 | 策略 | 结果 |
|----------|----------|------|------|
| 🟡 草稿 | 修改需求 | 直接覆盖 | 更新原 PRD |
| 🟢 已确认 | 修改需求 | 直接覆盖 | 更新原 PRD |
| 🔵 已实现 | 添加细节 | 扩展 | 创建子节点 |
| 🔵 已实现 | 修改需求 | 扩展 | 创建子节点(v2) |
| 🟣 测试中 | 修改需求 | 扩展 | 创建子节点 |
| ⚪ 已废弃 | 恢复 | 重新激活 | 更新状态 |

---

## ⚠️ 注意事项

1. **自动策略选择**: 根据状态自动选择最佳策略，但用户可以强制指定
2. **变更记录**: 所有变更必须记录到 tree.md 的变更历史中
3. **代码同步**: 如果功能已实现，修改 PRD 时需要评估代码影响
4. **版本号**: 遵循语义化版本（major.minor.patch）
5. **备份**: 废弃的 PRD 移动到 archive/ 目录，不直接删除

---

*最后更新：2026-03-23 | 版本：v1.0*

