--- description: "需求规划拆解:将复杂需求转化为结构化任务树,生成执行计划" --- # /runtime.plan - 需求规划与任务拆解 ## 核心目标 **我们不是执行者,我们是规划者**。 当面对复杂需求时,我们像经验丰富的架构师一样: 1. **理解需求本质** - 用户真正想要的是什么? 2. **功能分解** - 将大问题拆解为小任务 3. **识别依赖** - 哪些必须先做,哪些可以并行? 4. **估算工时** - 需要多少时间?风险在哪里? 5. **生成执行路径** - 最优的实施顺序 ``` 用户需求 → 需求分析 → 功能拆解 → 依赖识别 → 任务树 → 执行计划 ↓ /runtime.iterate ``` --- ## 何时使用 /runtime.plan ### 必须使用场景 - ✅ **用户需求模糊**:"我想加个电商功能" → 需要拆解为具体任务 - ✅ **技术方案不确定**:需要分析多种实现路径 - ✅ **项目范围大**:功能复杂,需要系统性规划 - ✅ **团队协作**:需要清晰的任务分配和依赖关系 - ✅ **估算和排期**:需要工作量估算和时间线 ### 使用流程 ```bash 用户: "实现用户认证系统(注册、登录、密码重置、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 需求类型识别 ```python 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 约束提取 从需求中提取隐含约束: ```python 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 知识缺口识别 ```python 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 认证系统分解示例 ```python # 顶层: 用户故事 stories = [ "作为新用户,我可以注册账号", "作为用户,我可以登录系统", "作为忘记密码的用户,我可以重置密码", "作为登录用户,我可以安全退出" ] # 第二层: 功能点 features = { "注册": { "输入": ["email", "password"], "验证": ["邮箱格式", "密码强度", "邮箱唯一性"], "副作用": ["密码哈希", "生成验证Token", "发送邮件"] }, "登录": { "输入": ["email", "password"], "验证": ["账号存在", "密码匹配", "账号已验证"], "输出": ["JWT Token", "Refresh Token"] } } # 第三层: 技术任务 tasks = { "注册": [ "创建User表", "实现密码bcrypt哈希", "实现邮箱验证逻辑", "实现Register API", "集成邮件服务", "写单元测试" ] } ``` #### 2.3 MECE原则(Mutually Exclusive, Collectively Exhaustive) ```markdown # 好的分解(符合MECE) ✅ 认证系统 ├─ 注册(独立功能) ├─ 登录(独立功能) ├─ 密码重置(独立功能) └─ Token管理(独立功能) # 坏的分解(不符合MECE) ❌ 认证系统 ├─ 注册(独立) ├─ 登录(独立) ├─ 发送邮件(重复:注册和密码重置都发送邮件) ← 不互斥 └─ ...(缺少Token刷新、登出) ← 不穷尽 ``` --- ### 阶段3: 依赖关系分析 #### 3.1 依赖类型 ```python class DependencyType(Enum): # 必须先完成A,才能开始B SEQUENTIAL = "sequential" # 串行 # A和B可以同时进行 PARALLEL = "parallel" # 并行 # A完成后,B才能开始,但C不需要A PARTIAL = "partial" # 部分依赖 # A和B互相依赖(需要重构设计) CIRCULAR = "circular" # 循环依赖(坏味道) ``` #### 3.2 构建依赖图 ```python 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 识别关键路径 ```python 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) ```python 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格式的任务树 ```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 甘特图生成 ```python 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 识别风险 ```python 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 风险矩阵 ```markdown ## 风险评估矩阵 | 任务 | 风险类型 | 可能性 | 影响 | 等级 | 应对策略 | |------|---------|--------|------|------|---------| | 密码重置流程 | 复杂度 | 中 | 高 | 🔴 高 | 进一步分解,先做Spike | | Token刷新 | 知识缺口 | 高 | 中 | 🟡 中 | 查阅资料,咨询专家 | | Email服务 | 外部依赖 | 低 | 中 | 🟢 低 | 设计降级方案 | ``` --- ## 命令定义 ### 语法 ```bash /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: 完整规划 ```bash /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` ```json { "project": "用户认证系统", "requirement": "实现用户认证系统,包括注册...", "total_tasks": 17, "total_effort": "17.75h", "critical_path": ["①","②","⑤","⑧","⑮","⑯"], "tasks": [...], "risks": [...] } ``` **Markdown输出**: `cognition/plans/plan-20251114-1045.md` ```markdown # 用户认证系统 - 实施计划 ## 需求概述 实现用户认证系统... ## 任务树 ### 阶段1: 基础设施 - ① 创建User表 (0.5h) - P0 - ② 创建Token表 (0.5h) - P0 - 依赖:① - ③ 配置JWT (0.25h) - P0 ... ## 甘特图 ```gantt ... ``` ## 风险评估 ... ``` #### 示例2: MVP规划 ```bash /runtime.plan "构建图片分享社交平台" --strategy=mvp ``` **特点**: - 只规划核心功能(上传图片、浏览、点赞、评论) - 非核心功能(滤镜、故事、推荐算法)推迟到后续迭代 - 快速交付可演示版本 #### 示例3: 风险驱动规划 ```bash /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直接使用 --- ## 任务规格模板 每个任务使用统一模板: ```markdown ## 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 ```python #!/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(如果不确定) ```bash # 不确定现有架构 ❌ /runtime.plan "实现新功能X" # 可能规划不切实际 # 先学习,再规划 ✅ /runtime.learn "理解现有架构" → 置信度>0.8 ✅ /runtime.plan "实现新功能X" ``` ### 实践2: 用小需求练习 ```bash # 复杂需求(不建议首次尝试) ❌ /runtime.plan "重构整个微服务架构" # 从小需求开始 ✅ /runtime.plan "添加密码重置功能" # 3-5个任务 ✅ /runtime.plan "实现用户注册" # 2-3个任务 ``` ### 实践3: 定期重新规划 ```python # 需求变更时 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: 保存并复用模式 ```bash # 规划完成后 /runtime.plan "实现OAuth2.0认证" # 固化成功模式 /runtime.remember "OAuth2.0认证的任务树模板" # 下次类似需求 /runtime.plan "实现SAML认证" → AI从记忆中提取OAuth2.0模式作为参考 → 生成类似结构的任务树 ``` --- ## 输出规范 ### JSON Schema ```json { "$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