from multi_agent_sdlc.agents.planner.model import planner_llm from multi_agent_sdlc.agents.planner.prompt import PLANNER_SYSTEM_RULES from multi_agent_sdlc.agents.planner.exporter import export_plan_to_pdf from multi_agent_sdlc.agents.planner.formatter import format_plan from multi_agent_sdlc.state import DevState from multi_agent_sdlc.config import SANDBOX_ROOT from re import fullmatch from langchain_core.messages import HumanMessage, SystemMessage from pathlib import Path def create_project_directory(project_id: str) -> Path: "Create project folder inside 'sandbox', e.g: terminal-calculator" if not fullmatch(r"[a-z0-9]+(?:-[a-z0-9]+)*", project_id): raise ValueError("project_id must use lowercase kebab-case.") project_directory = Path(SANDBOX_ROOT) / project_id project_directory.mkdir(parents=True, exist_ok=True) return project_directory def planner_node(state: DevState) -> DevState: """Define the planner node, which is responsible for planning the application requested by the user.""" user_request = state["request"] messages = [ SystemMessage(content=PLANNER_SYSTEM_RULES), HumanMessage(content=user_request), ] plan = planner_llm.invoke(messages) project_directory = create_project_directory(plan.project_id) plan_text = format_plan(plan) export_plan_to_pdf( text=plan_text, output_path=project_directory / "development-plan.pdf", ) return { "request": user_request, "plan": plan, "project_directory": str(project_directory), }