/** * mission_init tool * * Creates a new mission run directory with run.json and updates state.json. * Called when user clicks "Init new mission" button. * * This is a command-only tool (not exposed to agents). */ import { generateRunId, createInitialRun, createRunStructure, writeRun, updateState, readState, writeText, getRunDir, isScaffolded } from "../state.js"; export interface InitOptions { runId?: string; phase?: string; statusMessage?: string; } export interface InitResult { success: boolean; message: string; runId: string | null; runDir: string | null; errors: string[]; } /** * Initialize a new mission run * * Creates: * - run directory: .pi/mission-control/runs// * - run.json with initial structure * - empty artifact files (00-requirements.md, etc.) * - tasks directory * * Updates: * - state.json with active_run_id */ export function missionInit(options: InitOptions = {}): InitResult { const result: InitResult = { success: false, message: "", runId: null, runDir: null, errors: [] }; try { // Check if scaffolding exists if (!isScaffolded()) { result.errors.push("Mission Control not scaffolded. Run scaffold first."); result.message = "Initialization failed: scaffolding required"; return result; } // Check if there's already an active run const currentState = readState(); if (currentState.active_run_id) { result.errors.push(`Active run exists: ${currentState.active_run_id}. Complete or resume it first.`); result.message = "Initialization failed: another run is active"; return result; } // Generate run ID const runId = options.runId || generateRunId(); result.runId = runId; // Create run structure createRunStructure(runId); result.runDir = getRunDir(runId); // Create initial run.json const run = createInitialRun(runId); writeRun(run); // Create empty artifact files const runDir = getRunDir(runId); writeText(`${runDir}/00-requirements.md`, `# Requirements\n\nRun ID: ${runId}\nCreated: ${run.started_at}\n\n\n`); writeText(`${runDir}/01-architecture.md`, `# Architecture\n\nRun ID: ${runId}\n\n\n`); writeText(`${runDir}/02-validation.md`, `# Validation Contract\n\nRun ID: ${runId}\n\n\n`); writeText(`${runDir}/short_term_memory.md`, `# Short-term Memory\n\nRun ID: ${runId}\n\n\n`); // Update state.json updateState({ active_run_id: runId, current_phase: options.phase || "research", current_status_message: options.statusMessage || "Mission initialized - waiting for requirements" }); result.success = true; result.message = `Mission initialized: ${runId}`; } catch (error) { result.success = false; result.message = `Initialization error: ${error instanceof Error ? error.message : String(error)}`; result.errors.push(String(error)); } return result; }