from __future__ import annotations from datetime import date from pathlib import Path import re from .tasks import read_tasks def project_stage(root: Path) -> str: if not (root / "context" / "discovery-log.md").exists(): return "NOT_INITIALISED" tasks = read_tasks(root) if not tasks: return "DISCOVERY" if any(task.status.lower() == "in progress" for task in tasks): return "BUILDING" if any(task.status.lower() == "todo" for task in tasks): return "TASKS_READY" return "REVIEW_READY" def task_counts(root: Path) -> dict[str, int]: counts: dict[str, int] = {} for task in read_tasks(root): counts[task.status] = counts.get(task.status, 0) + 1 return counts _CURRENT_TASK_RE = re.compile(r"^(Current Task): .+$", re.MULTILINE) _UPDATED_RE = re.compile(r"^(Last Updated): .+$", re.MULTILINE) def update_project_state(root: Path, task_id: str = "None") -> bool: """Update PROJECT_STATE.md current task and timestamp.""" path = root / "PROJECT_STATE.md" if not path.exists(): return False text = path.read_text(encoding="utf-8") text = _CURRENT_TASK_RE.sub(f"Current Task: {task_id}", text, count=1) text = _UPDATED_RE.sub(f"Last Updated: {date.today().isoformat()}", text, count=1) path.write_text(text, encoding="utf-8") return True _STAGE_RE = re.compile(r"(## Current Stage\n\n)[\s\S]+?(?=\n)", re.MULTILINE | re.DOTALL) _TASK_RE = re.compile(r"(## Current Task\n\n)[\s\S]+?(?=\n)", re.MULTILINE | re.DOTALL) def update_agent_handoff(root: Path, task_id: str = "None") -> bool: """Update AGENT_HANDOFF.md current stage and task.""" path = root / "AGENT_HANDOFF.md" if not path.exists(): return False text = path.read_text(encoding="utf-8") stage = project_stage(root) text = _STAGE_RE.sub(f"## Current Stage\n\n{stage}", text, count=1) text = _TASK_RE.sub(f"## Current Task\n\n{task_id}", text, count=1) path.write_text(text, encoding="utf-8") return True