Files
gh-dwsy-ai-runtime-codecons…/skills/commands/runtime.plan.md
2025-11-29 18:24:40 +08:00

24 KiB
Raw Blame History

description
description
需求规划拆解:将复杂需求转化为结构化任务树,生成执行计划

/runtime.plan - 需求规划与任务拆解

核心目标

我们不是执行者,我们是规划者

当面对复杂需求时,我们像经验丰富的架构师一样:

  1. 理解需求本质 - 用户真正想要的是什么?
  2. 功能分解 - 将大问题拆解为小任务
  3. 识别依赖 - 哪些必须先做,哪些可以并行?
  4. 估算工时 - 需要多少时间?风险在哪里?
  5. 生成执行路径 - 最优的实施顺序
用户需求 → 需求分析 → 功能拆解 → 依赖识别 → 任务树 → 执行计划
                                                              ↓
                                                    /runtime.iterate

何时使用 /runtime.plan

必须使用场景

  • 用户需求模糊"我想加个电商功能" → 需要拆解为具体任务
  • 技术方案不确定:需要分析多种实现路径
  • 项目范围大:功能复杂,需要系统性规划
  • 团队协作:需要清晰的任务分配和依赖关系
  • 估算和排期:需要工作量估算和时间线

使用流程

用户: "实现用户认证系统注册、登录、密码重置、JWT"

AI:
/runtime.plan "用户认证系统"
  ↓ 自动执行...

[阶段1: 需求分析]
- 识别需求类型: 新功能开发
- 提取约束: JWT有效期7天、并发1000
- 分析技术栈: Express + PostgreSQL
- 识别范围: API、DB、安全、邮件

[阶段2: 功能拆解]
- 功能点: 注册、登录、密码重置、JWT管理、登出
- 任务数: 17个任务
- 分层: 基础设施 → 服务层 → API → 安全 → 测试

[阶段3: 依赖分析]
- 构建依赖图
- 计算关键路径
- 识别可并行任务

[阶段4: 估算与风险]
- 总工时: 17.75小时
- 关键路径: 9小时
- 风险: 密码重置流程复杂

[输出: 交付给用户]
- 可视化任务树 (ASCII/MD格式)
- JSON格式的机器可读计划
- 甘特图时间线
- 风险评估报告

# 然后进入迭代执行
/runtime.iterate --plan=plan-2025xx.json
  ↓ 自动执行...

规划过程详解

阶段1: 需求分析 (Understanding)

1.1 需求类型识别

def identify_requirement_type(text: str) -> RequirementType:
    """识别需求类型"""
    if any(word in text for word in ["添加", "实现", "开发", "新功能"]):
        return RequirementType.NEW_FEATURE

    if any(word in text for word in ["修复", "bug", "错误", "问题"]):
        return RequirementType.BUG_FIX

    if any(word in text for word in ["重构", "优化", "改进", "清理"]):
        return RequirementType.REFACTORING

    if any(word in text for word in ["学习", "理解", "调研", "研究"]):
        return RequirementType.RESEARCH

    return RequirementType.UNKNOWN

1.2 约束提取

从需求中提取隐含约束:

def extract_constraints(demand: str) -> Constraints:
    """提取约束条件"""

    constraints = {
        "time": None,      # 时间约束
        "budget": None,    # 资源约束
        "tech_stack": [],  # 技术栈约束
        "performance": {}, # 性能约束
        "security": {},    # 安全约束
    }

    # 性能约束
    if "并发" in demand:
        # "支持并发1000用户"
        match = re.search(r"并发(\d+)", demand)
        if match:
            constraints["performance"]["concurrency"] = int(match.group(1))

    # 时间约束
    if "JWT" in demand and "天" in demand:
        # "JWT有效期7天"
        match = re.search(r"有效期(\d+)天", demand)
        if match:
            constraints["security"]["tokenExpiry"] = int(match.group(1))

    # 安全约束
    if "加密" in demand:
        constraints["security"]["encryption"] = True

    return constraints

1.3 知识缺口识别

def identify_knowledge_gaps(demand: str, context: Memory) -> List[str]:
    """
    识别规划需要但当前缺乏的知识
    """
    gaps = []

    # 检查技术栈
    if "JWT" in demand and not context.has_pattern("jwt"):
        gaps.append("JWT实现模式")

    if "密码" in demand and not context.has_pattern("bcrypt"):
        gaps.append("密码哈希模式")

    # 检查架构
    if "认证" in demand and not context.has_pattern("auth"):
        gaps.append("认证架构模式")

    # 检查项目上下文
    if not context.has_key("tech_stack"):
        gaps.append("项目技术栈")

    return gaps

阶段2: 功能分解 (Decomposition)

2.1 洋葱模型分解法

                [用户可见功能]
                      ↑
            ╔═════════════════════╗
            ║   API层 (REST/GraphQL) ║
            ╚═══════════╦═══════════╝
                        ↓
            ╔═════════════════════╗
            ║  服务层 (业务逻辑)    ║
            ╚═══════════╦═══════════╝
                        ↓
            ╔═════════════════════╗
            ║  数据层 (DB/Cache)   ║
            ╚═══════════╦═══════════╝
                        ↓
            ╔═════════════════════╗
            ║  基础设施 (安全/监控) ║
            ╚═════════════════════╝

分解规则:

  • 每一层都可以独立分解
  • 上层依赖下层
  • 同层任务尽量解耦

2.2 认证系统分解示例

# 顶层: 用户故事
stories = [
    "作为新用户,我可以注册账号",
    "作为用户,我可以登录系统",
    "作为忘记密码的用户,我可以重置密码",
    "作为登录用户,我可以安全退出"
]

# 第二层: 功能点
features = {
    "注册": {
        "输入": ["email", "password"],
        "验证": ["邮箱格式", "密码强度", "邮箱唯一性"],
        "副作用": ["密码哈希", "生成验证Token", "发送邮件"]
    },
    "登录": {
        "输入": ["email", "password"],
        "验证": ["账号存在", "密码匹配", "账号已验证"],
        "输出": ["JWT Token", "Refresh Token"]
    }
}

# 第三层: 技术任务
tasks = {
    "注册": [
        "创建User表",
        "实现密码bcrypt哈希",
        "实现邮箱验证逻辑",
        "实现Register API",
        "集成邮件服务",
        "写单元测试"
    ]
}

2.3 MECE原则Mutually Exclusive, Collectively Exhaustive

# 好的分解符合MECE

✅ 认证系统
├─ 注册(独立功能)
├─ 登录(独立功能)
├─ 密码重置(独立功能)
└─ Token管理独立功能

# 坏的分解不符合MECE

❌ 认证系统
├─ 注册(独立)
├─ 登录(独立)
├─ 发送邮件(重复:注册和密码重置都发送邮件)  ← 不互斥
└─ ...缺少Token刷新、登出 ← 不穷尽

阶段3: 依赖关系分析

3.1 依赖类型

class DependencyType(Enum):
    # 必须先完成A才能开始B
    SEQUENTIAL = "sequential"  # 串行

    # A和B可以同时进行
    PARALLEL = "parallel"      # 并行

    # A完成后B才能开始但C不需要A
    PARTIAL = "partial"        # 部分依赖

    # A和B互相依赖需要重构设计
    CIRCULAR = "circular"      # 循环依赖(坏味道)

3.2 构建依赖图

def build_dependency_graph(tasks: List[Task]) -> nx.DiGraph:
    """
    构建任务依赖关系图
    """
    G = nx.DiGraph()

    # 添加节点
    for task in tasks:
        G.add_node(task.id,
                  name=task.name,
                  effort=task.effort,
                  priority=task.priority,
                  risk=task.risk_level)

    # 添加边(依赖关系)
    for task in tasks:
        for dep_id in task.dependencies:
            G.add_edge(dep_id, task.id, type="depends_on")

    return G

3.3 识别关键路径

def find_critical_path(G: nx.DiGraph) -> List[str]:
    """
    计算关键路径(最长工时路径)
    """
    # 计算每个节点到终点的最长路径
    critical_path = nx.dag_longest_path(G, weight="effort")

    return critical_path

认证系统关键路径示例: User表 → Token表 → Token服务 → Login API → 集成测试

总工时: 9小时最短可能完成时间


阶段4: 任务树生成

4.1 可视化任务树 (ASCII)

def generate_ascii_tree(tasks: List[Task]) -> str:
    """
    生成ASCII格式的任务树
    """
    lines = []
    lines.append("实现用户认证系统 (目标)")
    lines.append("│")

    # 按层级分组
    layers = {
        "基础设施": ["①", "②", "③"],
        "服务层": ["④", "⑤", "⑥"],
        "API层": ["⑦", "⑧", "⑨", "⑩", "⑪"],
        "安全层": ["⑫", "⑬", "⑭"],
        "测试": ["⑮", "⑯", "⑰"]
    }

    for i, (layer_name, task_ids) in enumerate(layers.items()):
        lines.append(f"├─ {layer_name}")

        for j, task_id in enumerate(task_ids):
            task = get_task(task_id)
            prefix = "└─" if j == len(task_ids) - 1 else "├─"
            lines.append(f"│   {prefix} {task_id}: {task.name} ({task.effort}h)")

    return "\n".join(lines)

输出示例: .ai-runtime/commands/runtime.plan.md中包含完整示例

4.2 JSON格式的任务树

{
  "project": "用户认证系统",
  "total_tasks": 17,
  "total_effort": "17.75h",
  "critical_path": ["①","②","⑤","⑧","⑮","⑯"],
  "critical_path_effort": "9h",
  "tasks": [
    {
      "id": "①",
      "name": "创建User表",
      "layer": "基础设施",
      "effort": 0.5,
      "priority": "P0",
      "dependencies": [],
      "risk": "low",
      "acceptance_criteria": [
        "表结构符合User模型",
        "已添加email唯一索引",
        "created_at自动填充"
      ]
    },
    {
      "id": "②",
      "name": "创建Token表",
      "layer": "基础设施",
      "effort": 0.5,
      "priority": "P0",
      "dependencies": ["①"],
      "risk": "low"
    }
  ],
  "phases": [
    {
      "phase": 1,
      "name": "基础设施",
      "tasks": ["①","②","③"],
      "parallelizable": true
    },
    {
      "phase": 2,
      "name": "服务层",
      "tasks": ["④","⑤","⑥"]
    }
  ]
}

4.3 甘特图生成

def generate_gantt(tasks: List[Task]) -> str:
    """
    生成简单的甘特图Markdown格式
    """
    lines = []
    lines.append("```gantt")
    lines.append("title 认证系统实施计划")
    lines.append("dateFormat  YYYY-MM-DD")
    lines.append("")

    # 按阶段分组
    for phase in ["基础设施", "服务层", "API层", "安全层", "测试"]:
        phase_tasks = [t for t in tasks if t.layer == phase]
        if phase_tasks:
            lines.append(f"section {phase}")
            for task in phase_tasks:
                start = task.start_date.strftime('%Y-%m-%d')
                end = task.end_date.strftime('%Y-%m-%d')
                lines.append(f"{task.name} :a{task.id}, {start}, {end}")

    lines.append("```")

    return "\n".join(lines)

阶段5: 风险评估

5.1 识别风险

def identify_risks(tasks: List[Task]) -> List[Risk]:
    """
    基于任务特征识别风险
    """
    risks = []

    for task in tasks:
        # 复杂度过高风险
        if task.effort > 4:
            risks.append(Risk(
                task=task.id,
                level="medium",
                category="complexity",
                description="任务过大,可能隐藏未知问题",
                mitigation="进一步分解成子任务"
            ))

        # 依赖过多风险
        if len(task.dependencies) > 3:
            risks.append(Risk(
                task=task.id,
                level="high",
                category="dependency",
                description="强依赖多个任务,成为阻塞点",
                mitigation="尽早开始,或与下游任务同步进行"
            ))

        # 新知识风险
        if task.confidence < 0.6:
            risks.append(Risk(
                task=task.id,
                level="high",
                category="knowledge",
                description="不熟悉的技术/模式,容易出错",
                mitigation="先进行小的Spike或请求专家帮助"
            ))

    return risks

5.2 风险矩阵

## 风险评估矩阵

| 任务 | 风险类型 | 可能性 | 影响 | 等级 | 应对策略 |
|------|---------|--------|------|------|---------|
| 密码重置流程 | 复杂度 | 中 | 高 | 🔴 高 | 进一步分解先做Spike |
| Token刷新 | 知识缺口 | 高 | 中 | 🟡 中 | 查阅资料,咨询专家 |
| Email服务 | 外部依赖 | 低 | 中 | 🟢 低 | 设计降级方案 |

命令定义

语法

/runtime.plan "[需求描述]" \
  --strategy=[full|mvp|risk-driven] \
  --estimate=[true|false] \
  --detail=[high|medium|low] \
  --output=[json|md|both]

参数说明

参数 说明 默认值
strategy 规划策略
- full: 完整规划所有细节
- mvp: 只规划MVP核心功能
- risk-driven: 优先规划高风险部分
full
estimate 是否包含工时估算 true
detail 任务详细程度 medium
output 输出格式 both

使用示例

示例1: 完整规划

/runtime.plan "实现用户认证系统包括注册、登录、密码重置、JWT管理使用bcrypt加密JWT有效期7天"

输出:

console:

📋 需求规划: 用户认证系统
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

需求类型: 新功能开发
技术栈: Node.js + Express + PostgreSQL + JWT
约束: JWT有效期7天bcrypt加密

[功能拆解]
├─ 注册
├─ 登录
├─ 密码重置
└─ JWT管理

[任务统计]
总任务数: 17个
总工时: 17.75小时
关键路径: 9小时

[风险]
⚠️  密码重置流程复杂度高建议Spike
⚠️  Token刷新机制不熟悉建议先调研

输出文件:
✓ cognition/plans/plan-20251114-1045.json
✓ cognition/plans/plan-20251114-1045.md
✓ cognition/graphs/task-tree-20251114-1045.svg

JSON输出: cognition/plans/plan-20251114-1045.json

{
  "project": "用户认证系统",
  "requirement": "实现用户认证系统,包括注册...",
  "total_tasks": 17,
  "total_effort": "17.75h",
  "critical_path": ["①","②","⑤","⑧","⑮","⑯"],
  "tasks": [...],
  "risks": [...]
}

Markdown输出: cognition/plans/plan-20251114-1045.md

# 用户认证系统 - 实施计划

## 需求概述
实现用户认证系统...

## 任务树

### 阶段1: 基础设施
- ① 创建User表 (0.5h) - P0
- ② 创建Token表 (0.5h) - P0 - 依赖:①
- ③ 配置JWT (0.25h) - P0

...

## 甘特图
```gantt
...

风险评估

...


#### 示例2: MVP规划

```bash
/runtime.plan "构建图片分享社交平台" --strategy=mvp

特点:

  • 只规划核心功能(上传图片、浏览、点赞、评论)
  • 非核心功能(滤镜、故事、推荐算法)推迟到后续迭代
  • 快速交付可演示版本

示例3: 风险驱动规划

/runtime.plan "实现微服务架构的电商平台" --strategy=risk-driven

特点:

  • 优先识别高风险任务(服务拆分、数据一致性、分布式事务)
  • 建议先Spike降低不确定性
  • 生成风险评估报告

规划策略

策略1: Full完整规划

适用: 项目需求明确,技术方案清晰,有足够时间

特点:
- 规划所有细节
- 包括测试、文档、监控
- 精确到小时的估算

输出: 完整项目计划类似PRD + 技术方案)

策略2: MVP最小可行产品

适用: 需求探索期,需要快速验证,时间紧张

特点:
- 只规划核心价值功能
- 砍掉所有"锦上添花"的功能
- 估算粗略(只到天)

输出: MVP功能清单 + 最小任务集

示例: 社交应用MVP

  • 用户注册/登录
  • 发帖
  • 浏览帖子
  • 点赞

推迟到迭代2:

  • 评论回复
  • 私信
  • 推荐算法
  • 图片滤镜

策略3: Risk-Driven风险驱动规划

适用: 技术不确定性强,有高风险模块

特点:
- 优先分析高风险任务
- 建议先做技术调研Spike
- 生成风险缓解计划

输出: 风险矩阵 + 应对策略 + 调整后任务树

示例: 微服务架构

高风险任务:

  1. 服务拆分策略 → 先做Spike
  2. 分布式事务 → 调研Saga模式
  3. 数据一致性 → 评估最终一致性影响

低风险任务(可以推迟):

  • API网关 → 成熟技术,直接使用
  • 服务发现 → Consul/Nacos直接使用
  • 配置中心 → Apollo/Nacos直接使用

任务规格模板

每个任务使用统一模板:

## Task {ID}: {任务名称}

**ID**: TASK-{ID}
**类型**: [feature|bug|refactor|doc|test]
**优先级**: [P0|P1|P2]
**预计工时**: X小时
**置信度**: 0.X (0-1)
**依赖**: [依赖的任务ID列表]

### 目标
[清晰描述任务的目标]

### 验收标准DoD
- [ ] 代码实现完成
- [ ] 单元测试覆盖率 > 80%
- [ ] 手动测试通过
- [ ] 代码审查通过
- [ ] 文档更新
- [ ] 无回归错误

### 实现大纲
1. [步骤1]
2. [步骤2]
3. [步骤3]

### 潜在风险
- ⚠️ [风险1]
- ⚠️ [风险2]

### 如果卡住Escalation
- [求助谁/查阅什么]

### 相关文件
- [文件路径]

与 /runtime.learn 的区别

维度 /runtime.learn /runtime.plan 为什么分开?
目标 理解未知问题 规划已知需求 认知阶段不同
输入 问题(需要探索) 需求(相对明确) 前提条件不同
核心 知识缺口识别 功能拆解与依赖分析 方法论不同
输出 学习报告 + 新知识 任务树 + 执行计划 产物不同
下一步 通常接 /runtime.plan 接 /runtime.iterate 工作流分工

典型工作流:

情况A: 完全未知的问题
/runtime.learn "为什么服务会崩溃?"
  ↓ 理解后,发现问题: "需要添加限流"
/runtime.plan "实现限流功能"  # 生成实施计划
  ↓
/runtime.iterate --plan=plan-xx.json  # 执行计划

情况B: 明确的需求
/runtime.plan "实现用户认证系统"  # 直接规划
  ↓
/runtime.iterate --plan=plan-xx.json  # 执行计划

工具与脚本

辅助脚本: task-analyzer.py

#!/usr/bin/env python3
"""
任务分析器 - 从需求文本提取结构化信息
"""

import re
import json

class TaskAnalyzer:
    def __init__(self):
        self.patterns = {
            "action": r"(实现|添加|修改|删除|重构|修复)",
            "object": r"(用户|认证|JWT|密码|邮件|Token|API)",
            "constraint": r"\[(.*?)\]",
            "time": r"(\d+天|\d+小时|\d+h)"
        }

    def analyze(self, requirement_text):
        """分析需求文本"""
        result = {
            "actions": [],
            "objects": [],
            "constraints": [],
            "time_keywords": []
        }

        for key, pattern in self.patterns.items():
            matches = re.findall(pattern, requirement_text)
            result[f"{key}s"] = matches

        return result

    def suggest_tasks(self, analysis):
        """基于分析建议任务"""
        tasks = []

        # 如果发现"认证"和"用户"
        if "认证" in analysis["objects"] and "用户" in analysis["objects"]:
            tasks.extend([
                "创建User表",
                "实现密码哈希",
                "实现注册API",
                "实现登录API"
            ])

        # 如果发现"JWT"
        if "JWT" in analysis["objects"]:
            tasks.extend([
                "配置JWT",
                "实现Token生成",
                "实现Token验证",
                "实现Token刷新"
            ])

        return list(set(tasks))

# 使用示例
analyzer = TaskAnalyzer()
result = analyzer.analyze("实现用户认证系统包括JWT和bcrypt加密")
print(json.dumps(result, indent=2, ensure_ascii=False))

最佳实践

实践1: 规划前先用Learn如果不确定

# 不确定现有架构
❌ /runtime.plan "实现新功能X"  # 可能规划不切实际

# 先学习,再规划
✅ /runtime.learn "理解现有架构" → 置信度>0.8
✅ /runtime.plan "实现新功能X"

实践2: 用小需求练习

# 复杂需求(不建议首次尝试)
❌ /runtime.plan "重构整个微服务架构"

# 从小需求开始
✅ /runtime.plan "添加密码重置功能"  # 3-5个任务
✅ /runtime.plan "实现用户注册"      # 2-3个任务

实践3: 定期重新规划

# 需求变更时
if requirement_changed:
    # 不是继续执行旧计划
    old_plan = load_old_plan()

    # 而是重新规划
    new_plan = runtime.plan(new_requirement)

    # 比较差异
    diff = compare_plans(old_plan, new_plan)

    # 适应新计划
    runtime.iterate(plan=new_plan)

实践4: 保存并复用模式

# 规划完成后
/runtime.plan "实现OAuth2.0认证"

# 固化成功模式
/runtime.remember "OAuth2.0认证的任务树模板"

# 下次类似需求
/runtime.plan "实现SAML认证"
  → AI从记忆中提取OAuth2.0模式作为参考
  → 生成类似结构的任务树

输出规范

JSON Schema

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "properties": {
    "version": {"type": "string"},
    "project": {"type": "string"},
    "requirement": {"type": "string"},
    "created_at": {"type": "string"},
    "total_tasks": {"type": "integer"},
    "total_effort": {"type": "string"},
    "critical_path": {
      "type": "array",
      "items": {"type": "string"}
    },
    "tasks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {"type": "string"},
          "name": {"type": "string"},
          "layer": {"type": "string"},
          "effort": {"type": "number"},
          "priority": {"type": "string"},
          "dependencies": {
            "type": "array",
            "items": {"type": "string"}
          },
          "acceptance_criteria": {
            "type": "array",
            "items": {"type": "string"}
          }
        }
      }
    },
    "risks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "task": {"type": "string"},
          "level": {"type": "string"},
          "category": {"type": "string"},
          "description": {"type": "string"},
          "mitigation": {"type": "string"}
        }
      }
    }
  }
}

宪法遵循

遵循原则:

  • ✓ 1.2 类脑思维: 将需求拆解为可管理的模块
  • ✓ 2.1 代码即知识: 任务树是代码结构的心智模型
  • ✓ 4.4 规划透明: 规划过程清晰可见(新增)
  • ✓ 1.3 谦逊与不确定: 明确标注置信度和风险
  • ✓ 2.2 渐进式实施: 支持MVP和风险驱动策略

命令定义: .ai-runtime/commands/runtime.plan.md 脚本: .ai-runtime/scripts/task-analyzer.py (辅助分析) 输出: cognition/plans/plan-{timestamp}.{json|md} 版本: 1.0.0