26725286d5
This commit adds a new phase configuration module that manages model and thinking level settings for different execution phases. It reads configurations from `task_metadata.json` and provides resolved model IDs for various phases, including spec creation, planning, coding, and QA. Key changes include: - New `phase_config.py` file to handle model ID mappings and thinking budgets. - Updates to agent files (`coder.py`, `planner.py`, `loop.py`) to utilize phase-specific models and thinking levels. - Modifications to the CLI and UI components to support per-phase configuration, enhancing the user experience for task creation and editing. The new structure allows for optimized model selection and thinking depth based on the phase, improving overall task execution efficiency. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
173 lines
5.4 KiB
Python
173 lines
5.4 KiB
Python
"""
|
|
Planner Agent Module
|
|
====================
|
|
|
|
Handles follow-up planner sessions for adding new subtasks to completed specs.
|
|
"""
|
|
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
from core.client import create_client
|
|
from task_logger import (
|
|
LogPhase,
|
|
get_task_logger,
|
|
)
|
|
from ui import (
|
|
BuildState,
|
|
Icons,
|
|
StatusManager,
|
|
bold,
|
|
box,
|
|
highlight,
|
|
icon,
|
|
muted,
|
|
print_status,
|
|
)
|
|
|
|
from .session import run_agent_session
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def run_followup_planner(
|
|
project_dir: Path,
|
|
spec_dir: Path,
|
|
model: str,
|
|
verbose: bool = False,
|
|
) -> bool:
|
|
"""
|
|
Run the follow-up planner to add new subtasks to a completed spec.
|
|
|
|
This is a simplified version of run_autonomous_agent that:
|
|
1. Creates a client
|
|
2. Loads the followup planner prompt
|
|
3. Runs a single planning session
|
|
4. Returns after the plan is updated (doesn't enter coding loop)
|
|
|
|
The planner agent will:
|
|
- Read FOLLOWUP_REQUEST.md for the new task
|
|
- Read the existing implementation_plan.json
|
|
- Add new phase(s) with pending subtasks
|
|
- Update the plan status back to in_progress
|
|
|
|
Args:
|
|
project_dir: Root directory for the project
|
|
spec_dir: Directory containing the completed spec
|
|
model: Claude model to use
|
|
verbose: Whether to show detailed output
|
|
|
|
Returns:
|
|
bool: True if planning completed successfully
|
|
"""
|
|
from implementation_plan import ImplementationPlan
|
|
from prompts import get_followup_planner_prompt
|
|
|
|
# Initialize status manager for ccstatusline
|
|
status_manager = StatusManager(project_dir)
|
|
status_manager.set_active(spec_dir.name, BuildState.PLANNING)
|
|
|
|
# Initialize task logger for persistent logging
|
|
task_logger = get_task_logger(spec_dir)
|
|
|
|
# Show header
|
|
content = [
|
|
bold(f"{icon(Icons.GEAR)} FOLLOW-UP PLANNER SESSION"),
|
|
"",
|
|
f"Spec: {highlight(spec_dir.name)}",
|
|
muted("Adding follow-up work to completed spec."),
|
|
"",
|
|
muted("The agent will read your FOLLOWUP_REQUEST.md and add new subtasks."),
|
|
]
|
|
print()
|
|
print(box(content, width=70, style="heavy"))
|
|
print()
|
|
|
|
# Start planning phase in task logger
|
|
if task_logger:
|
|
task_logger.start_phase(LogPhase.PLANNING, "Starting follow-up planning...")
|
|
task_logger.set_session(1)
|
|
|
|
# Create client (fresh context)
|
|
client = create_client(project_dir, spec_dir, model)
|
|
|
|
# Generate follow-up planner prompt
|
|
prompt = get_followup_planner_prompt(spec_dir)
|
|
|
|
print_status("Running follow-up planner...", "progress")
|
|
print()
|
|
|
|
try:
|
|
# Run single planning session
|
|
async with client:
|
|
status, response = await run_agent_session(
|
|
client, prompt, spec_dir, verbose, phase=LogPhase.PLANNING
|
|
)
|
|
|
|
# End planning phase in task logger
|
|
if task_logger:
|
|
task_logger.end_phase(
|
|
LogPhase.PLANNING,
|
|
success=(status != "error"),
|
|
message="Follow-up planning session completed",
|
|
)
|
|
|
|
if status == "error":
|
|
print()
|
|
print_status("Follow-up planning failed", "error")
|
|
status_manager.update(state=BuildState.ERROR)
|
|
return False
|
|
|
|
# Verify the plan was updated (should have pending subtasks now)
|
|
plan_file = spec_dir / "implementation_plan.json"
|
|
if plan_file.exists():
|
|
plan = ImplementationPlan.load(plan_file)
|
|
|
|
# Check if there are any pending subtasks
|
|
all_subtasks = [c for p in plan.phases for c in p.subtasks]
|
|
pending_subtasks = [c for c in all_subtasks if c.status.value == "pending"]
|
|
|
|
if pending_subtasks:
|
|
# Reset the plan status to in_progress (in case planner didn't)
|
|
plan.reset_for_followup()
|
|
plan.save(plan_file)
|
|
|
|
print()
|
|
content = [
|
|
bold(f"{icon(Icons.SUCCESS)} FOLLOW-UP PLANNING COMPLETE"),
|
|
"",
|
|
f"New pending subtasks: {highlight(str(len(pending_subtasks)))}",
|
|
f"Total subtasks: {len(all_subtasks)}",
|
|
"",
|
|
muted("Next steps:"),
|
|
f" Run: {highlight(f'python auto-claude/run.py --spec {spec_dir.name}')}",
|
|
]
|
|
print(box(content, width=70, style="heavy"))
|
|
print()
|
|
status_manager.update(state=BuildState.PAUSED)
|
|
return True
|
|
else:
|
|
print()
|
|
print_status(
|
|
"Warning: No pending subtasks found after planning", "warning"
|
|
)
|
|
print(muted("The planner may not have added new subtasks."))
|
|
print(muted("Check implementation_plan.json manually."))
|
|
status_manager.update(state=BuildState.PAUSED)
|
|
return False
|
|
else:
|
|
print()
|
|
print_status(
|
|
"Error: implementation_plan.json not found after planning", "error"
|
|
)
|
|
status_manager.update(state=BuildState.ERROR)
|
|
return False
|
|
|
|
except Exception as e:
|
|
print()
|
|
print_status(f"Follow-up planning error: {e}", "error")
|
|
if task_logger:
|
|
task_logger.log_error(f"Follow-up planning error: {e}", LogPhase.PLANNING)
|
|
status_manager.update(state=BuildState.ERROR)
|
|
return False
|