306 lines
12 KiB
Python
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()
|