/** * add_task tool * * Agent tool to add a new task to a phase. * Auto-generates task_id from phase prefix ("phase1-task1", "phase1-task2", ...). * Sets status to "pending". * * Used by: mission-pm skill */ import { readState, readRun, writeRun, findPhase, generateTaskId, createTask, addTaskToRun, ensureDir, getTaskDir } from "../state.js"; export interface AddTaskParams { phase_id: string; name: string; file: string; } export interface AddTaskResult { success: boolean; message: string; taskId: string | null; errors: string[]; } /** * Add a task to a phase in the active mission run * * @param params.phase_id - ID of the phase to add task to (e.g., "phase1") * @param params.name - Human-readable task name (e.g., "Setup DB Schema") * @param params.file - Path to task contract file * @returns Result with generated task_id */ export function addTask(params: AddTaskParams): AddTaskResult { const result: AddTaskResult = { success: false, message: "", taskId: null, errors: [] }; try { // Validate parameters if (!params.phase_id || params.phase_id.trim() === "") { result.errors.push("Phase ID is required"); result.message = "Failed to add task: phase_id is required"; return result; } if (!params.name || params.name.trim() === "") { result.errors.push("Task name is required"); result.message = "Failed to add task: name is required"; return result; } if (!params.file || params.file.trim() === "") { result.errors.push("Task file is required"); result.message = "Failed to add task: file is required"; return result; } // Get active run const state = readState(); if (!state.active_run_id) { result.errors.push("No active run"); result.message = "Failed to add task: no active mission run"; return result; } // Read run.json const run = readRun(state.active_run_id); if (!run) { result.errors.push(`Run not found: ${state.active_run_id}`); result.message = "Failed to add task: run not found"; return result; } // Find phase const phase = findPhase(run, params.phase_id.trim()); if (!phase) { result.errors.push(`Phase not found: ${params.phase_id}`); result.message = "Failed to add task: phase not found"; return result; } // Generate task ID const taskId = generateTaskId(phase); // Create task const task = createTask(taskId, params.name.trim(), params.file.trim()); // Add to run const updatedRun = addTaskToRun(run, params.phase_id.trim(), task); writeRun(updatedRun); // Create task directory const taskDir = getTaskDir(state.active_run_id, taskId); ensureDir(taskDir); result.success = true; result.taskId = taskId; result.message = `Task added: ${taskId} - ${params.name}`; } catch (error) { result.success = false; result.message = `Error adding task: ${error instanceof Error ? error.message : String(error)}`; result.errors.push(String(error)); } return result; }