This repository has been archived on 2026-08-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
kb-skills/dev-workflow/orchestrator.py
T
starmen1265 8cc6fa2354 feat(dev-workflow): Phase 2-9 prompt templates + orchestrator
Phase 2 头脑风暴:
- prompts/brainstorming.md - 问答策略和需求收集模板

Phase 3 方案设计:
- prompts/solution-design.md - 3个子代理启动配置

Phase 4 方案审核:
- prompts/solution-review.md - 交叉审核和综合方案生成

Phase 5 方案汇报:
- prompts/solution-report.md - 用户决策处理

Phase 6 Spec编排:
- prompts/spec-planning.md - 依赖分析和分波计划

Phase 7 并行开发:
- prompts/parallel-development.md - 波次执行逻辑

Phase 8 测试:
- prompts/testing.md - 测试框架检测和重试逻辑

Phase 9 代码审查:
- prompts/code-review.md - 3个子代理独立审查

Phase 10 修复验证:
- prompts/fix-verification.md - 修复循环和最终汇报

主编排器:
- orchestrator.py - 9阶段协调逻辑
- 状态管理和恢复机制
2026-03-09 19:04:22 +08:00

306 lines
12 KiB
Python

#!/usr/bin/env python3
"""
dev-workflow 主编排器
负责协调整个9阶段开发流程。
Usage:
python3 orchestrator.py --init "开始开发一个用户登录功能"
python3 orchestrator.py --resume
python3 orchestrator.py --status
"""
import argparse
import json
import subprocess
import sys
from datetime import datetime
from pathlib import Path
from typing import Any, Optional
# 添加 prompts 目录到路径
sys.path.insert(0, str(Path(__file__).parent))
from state_manager import (
load_state,
save_state,
init_state,
get_status,
set_phase,
complete_phase,
update_phase_data,
increment_retry,
reset_retry
)
class DevWorkflowOrchestrator:
"""dev-workflow 主编排器"""
def __init__(self, project_root: Path = None):
self.project_root = project_root or Path.cwd()
self.planning_dir = self.project_root / ".planning" / "dev-workflow"
self.state = None
def initialize(self, trigger_message: str, project_name: str = None):
"""初始化工作流"""
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► 初始化")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
# 创建目录结构
self.planning_dir.mkdir(parents=True, exist_ok=True)
(self.planning_dir / "solutions").mkdir(exist_ok=True)
(self.planning_dir / "reviews").mkdir(exist_ok=True)
(self.planning_dir / "development").mkdir(exist_ok=True)
(self.planning_dir / "code-review").mkdir(exist_ok=True)
# 初始化状态
self.state = init_state(project_name, trigger_message)
print(f"✅ 工作流已初始化")
print(f" 触发消息: {trigger_message}")
print(f" 工作目录: {self.planning_dir}")
return self.state
def load_state(self) -> dict:
"""加载当前状态"""
self.state = load_state()
return self.state
def run_phase_1(self):
"""阶段1: 头脑风暴"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 1: 头脑风暴")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(1)
print("\n开始需求收集问答...")
print("提示: 您可以随时说'够了'结束问答\n")
# 这里应该启动交互式问答
# 由于这是编排器,实际问答由主Agent执行
# 这里只记录状态
questions = [
"请描述您想要开发什么?",
"这个项目解决什么问题?",
"核心功能有哪些?",
"技术栈偏好?",
"有什么约束条件?"
]
requirements = {
"questions_asked": questions,
"collected": False
}
update_phase_data(1, requirements)
print("\n等待主Agent完成问答...")
return {"phase": 1, "status": "waiting_for_input"}
def run_phase_2(self, requirements_summary: str):
"""阶段2: 方案设计"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 2: 方案设计")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(2)
print("\n◆ 启动3个方案设计子代理...")
agents = [
{"id": "A", "type": "general", "focus": "完整通用方案"},
{"id": "B", "type": "practical", "focus": "实用快速方案"},
{"id": "C", "type": "creative", "focus": "创新探索方案"}
]
# 这里应该实际启动子代理
# 由于编排器只负责协调,实际子代理由主Agent启动
results = {
"agents": agents,
"output_files": [
"solutions/solution-A.md",
"solutions/solution-B.md",
"solutions/solution-C.md"
],
"status": "waiting_for_agents"
}
update_phase_data(2, results)
print(" → Agent A: 通用型方案")
print(" → Agent B: 实用型方案")
print(" → Agent C: 创新型方案")
return {"phase": 2, "status": "waiting_for_agents", "agents": agents}
def run_phase_3(self):
"""阶段3: 方案审核"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 3: 方案审核")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(3)
print("\n◆ 启动交叉审核...")
print(" → Agent A 审核 B, C 的方案")
print(" → Agent B 审核 A, C 的方案")
print(" → Agent C 审核 A, B 的方案")
results = {
"review_files": [
"reviews/review-A.md",
"reviews/review-B.md",
"reviews/review-C.md"
],
"final_solution": "final-solution.md",
"status": "waiting_for_agents"
}
update_phase_data(3, results)
return {"phase": 3, "status": "waiting_for_agents"}
def run_phase_4(self):
"""阶段4: 方案汇报"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 4: 方案汇报")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(4)
print("\n等待用户决策...")
print(" A. 批准方案 - 进入开发阶段")
print(" B. 需要修改 - 调整方案")
print(" C. 重新设计 - 重新方案")
return {"phase": 4, "status": "waiting_for_user_decision"}
def run_phase_5(self):
"""阶段5: Spec编排"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 5: Spec编排")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(5)
print("\n◆ 生成开发规格...")
print("◆ 分析任务依赖...")
print("◆ 生成分波计划...")
return {"phase": 5, "status": "processing"}
def run_phase_6(self):
"""阶段6: 并行开发"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 6: 并行开发")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(6)
print("\n◆ 按波次启动开发子代理...")
return {"phase": 6, "status": "waiting_for_agents"}
def run_phase_7(self):
"""阶段7: 测试"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 7: 测试")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(7)
print("\n◆ 运行测试...")
return {"phase": 7, "status": "running_tests"}
def run_phase_8(self):
"""阶段8: 代码审查"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 8: 代码审查")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(8)
print("\n◆ 启动3个代码审查子代理...")
return {"phase": 8, "status": "waiting_for_agents"}
def run_phase_9(self):
"""阶段9: 修复验证"""
print("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
print(" DEV-WORKFLOW ► Phase 9: 修复验证")
print("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")
set_phase(9)
print("\n◆ 汇总问题...")
print("◆ 安排修复...")
print("◆ 验证完成...")
return {"phase": 9, "status": "processing"}
def get_status(self) -> str:
"""获取当前状态"""
return get_status()
def resume(self):
"""从当前状态恢复"""
state = self.load_state()
phase = state.get("current_phase", 1)
print(f"\n恢复到阶段 {phase}: {state.get('current_stage', '未知')}")
# 根据当前阶段调用对应方法
method_name = f"run_phase_{phase}"
if hasattr(self, method_name):
return getattr(self, method_name)()
else:
print(f"❌ 未知阶段: {phase}")
return None
def main():
parser = argparse.ArgumentParser(description="dev-workflow 主编排器")
parser.add_argument("--init", type=str, metavar="MESSAGE",
help="初始化工作流,提供触发消息")
parser.add_argument("--resume", action="store_true",
help="从上次状态恢复")
parser.add_argument("--status", action="store_true",
help="显示当前状态")
parser.add_argument("--project-name", type=str,
help="项目名称")
parser.add_argument("--phase", type=int, metavar="N",
help="执行指定阶段")
args = parser.parse_args()
orchestrator = DevWorkflowOrchestrator()
if args.init:
orchestrator.initialize(args.init, args.project_name)
orchestrator.run_phase_1()
elif args.resume:
orchestrator.resume()
elif args.status:
print(orchestrator.get_status())
elif args.phase:
method_name = f"run_phase_{args.phase}"
if hasattr(orchestrator, method_name):
getattr(orchestrator, method_name)()
else:
print(f"❌ 无效的阶段: {args.phase}")
else:
parser.print_help()
if __name__ == "__main__":
main()