File size: 1,589 Bytes
a9561a2
9f54862
ee30fd7
 
9f54862
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a9561a2
 
9f54862
a9561a2
 
 
 
 
9f54862
a9561a2
9f54862
a9561a2
9f54862
a9561a2
9f54862
a9561a2
 
 
 
9f54862
a9561a2
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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),
    }