@riotprompt/riotplan 0.0.4 β†’ 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/types.ts","../src/index.ts"],"sourcesContent":["/**\n * RiotPlan Type Definitions\n *\n * Types for long-lived, stateful AI workflows (plans).\n *\n * A plan consists of:\n * - A directory (the plan code/name)\n * - A meta-prompt (prompt-of-prompts)\n * - Numbered step files (01-STEP.md, 02-STEP.md, etc.)\n * - Status tracking (STATUS.md)\n * - Execution strategy (EXECUTION_PLAN.md)\n * - Summary (SUMMARY.md)\n * - Optional analysis directory\n */\n\n// ===== TASK STATUS =====\n\n/**\n * Status of a task, phase, or step\n */\nexport type TaskStatus =\n | \"pending\" // Not started (⬜)\n | \"in_progress\" // Currently active (πŸ”„)\n | \"completed\" // Done (βœ…)\n | \"failed\" // Failed with error (❌)\n | \"blocked\" // Waiting on dependency (⏸️)\n | \"skipped\"; // Intentionally skipped (⏭️)\n\n/**\n * Priority level\n */\nexport type Priority = \"high\" | \"medium\" | \"low\";\n\n// ===== PLAN STRUCTURE =====\n\n/**\n * A single step in a plan (corresponds to a numbered file like 01-STEP.md)\n */\nexport interface PlanStep {\n /** Step number (1, 2, 3...) */\n number: number;\n\n /** Step code/slug (extracted from filename, e.g., \"execution-interfaces\") */\n code: string;\n\n /** Full filename (e.g., \"01-execution-interfaces.md\") */\n filename: string;\n\n /** Human-readable title */\n title: string;\n\n /** Step description */\n description?: string;\n\n /** Current status */\n status: TaskStatus;\n\n /** Dependencies on other steps (by number) */\n dependencies?: number[];\n\n /** When this step was started */\n startedAt?: Date;\n\n /** When this step was completed */\n completedAt?: Date;\n\n /** Duration in milliseconds */\n duration?: number;\n\n /** Notes or issues encountered */\n notes?: string;\n\n /** Path to the step file */\n filePath: string;\n}\n\n/**\n * A phase grouping multiple steps\n */\nexport interface PlanPhase {\n /** Phase number */\n number: number;\n\n /** Phase name */\n name: string;\n\n /** Description */\n description?: string;\n\n /** Steps in this phase */\n steps: number[]; // Step numbers\n\n /** Phase status (derived from step statuses) */\n status: TaskStatus;\n\n /** Estimated duration */\n estimatedDuration?: string;\n\n /** Actual duration */\n actualDuration?: string;\n}\n\n/**\n * Blocker preventing progress\n */\nexport interface Blocker {\n /** Unique identifier */\n id: string;\n\n /** Description of the blocker */\n description: string;\n\n /** Severity */\n severity: Priority;\n\n /** Affected steps */\n affectedSteps: number[];\n\n /** When created */\n createdAt: Date;\n\n /** When resolved */\n resolvedAt?: Date;\n\n /** Resolution notes */\n resolution?: string;\n}\n\n/**\n * Issue encountered during execution\n */\nexport interface Issue {\n /** Unique identifier */\n id: string;\n\n /** Issue title */\n title: string;\n\n /** Description */\n description: string;\n\n /** Severity */\n severity: Priority;\n\n /** Related step */\n step?: number;\n\n /** When encountered */\n createdAt: Date;\n\n /** When resolved */\n resolvedAt?: Date;\n\n /** How it was resolved */\n resolution?: string;\n}\n\n// ===== PLAN METADATA =====\n\n/**\n * Plan metadata from the directory and files\n */\nexport interface PlanMetadata {\n /** Plan code (directory name, e.g., \"big-splitup\") */\n code: string;\n\n /** Human-readable name */\n name: string;\n\n /** Description from SUMMARY.md or meta-prompt */\n description?: string;\n\n /** Version (for tracking changes to the plan itself) */\n version?: string;\n\n /** Author */\n author?: string;\n\n /** Tags for categorization */\n tags?: string[];\n\n /** When the plan was created */\n createdAt?: Date;\n\n /** Path to the plan directory */\n path: string;\n}\n\n// ===== PLAN FILES =====\n\n/**\n * Standard plan files\n */\nexport interface PlanFiles {\n /** Meta-prompt file (e.g., \"big-splitup-prompt.md\" or \"prompt-of-prompts.md\") */\n metaPrompt?: string;\n\n /** Summary file */\n summary?: string;\n\n /** Status file */\n status?: string;\n\n /** Execution plan file */\n executionPlan?: string;\n\n /** README file */\n readme?: string;\n\n /** Step files in order */\n steps: string[];\n\n /** Analysis directory */\n analysisDir?: string;\n\n /** Other directories (architecture/, implementation/, testing/) */\n subdirectories: string[];\n}\n\n// ===== PLAN STATE =====\n\n/**\n * Current state of plan execution\n */\nexport interface PlanState {\n /** Overall plan status */\n status: TaskStatus;\n\n /** Current step being executed */\n currentStep?: number;\n\n /** Last completed step */\n lastCompletedStep?: number;\n\n /** When execution started */\n startedAt?: Date;\n\n /** When last updated */\n lastUpdatedAt: Date;\n\n /** When completed */\n completedAt?: Date;\n\n /** Active blockers */\n blockers: Blocker[];\n\n /** Issues encountered */\n issues: Issue[];\n\n /** Progress percentage (0-100) */\n progress: number;\n}\n\n// ===== COMPLETE PLAN =====\n\n/**\n * Complete plan definition\n */\nexport interface Plan {\n /** Plan metadata */\n metadata: PlanMetadata;\n\n /** Plan files */\n files: PlanFiles;\n\n /** Plan steps */\n steps: PlanStep[];\n\n /** Plan phases (optional grouping) */\n phases?: PlanPhase[];\n\n /** Current state */\n state: PlanState;\n}\n\n// ===== EXECUTION =====\n\n/**\n * Context for plan execution\n */\nexport interface PlanContext {\n /** Working directory */\n workingDirectory: string;\n\n /** The plan being executed */\n plan: Plan;\n\n /** Logger instance */\n logger?: any;\n\n /** Storage for artifacts */\n storage?: any;\n\n /** Environment variables */\n env?: Record<string, string>;\n}\n\n/**\n * Result of executing a step\n */\nexport interface StepResult {\n /** Whether the step succeeded */\n success: boolean;\n\n /** Step number */\n step: number;\n\n /** Output from execution */\n output?: string;\n\n /** Error if failed */\n error?: Error;\n\n /** Duration in milliseconds */\n duration: number;\n\n /** Artifacts produced */\n artifacts?: string[];\n}\n\n/**\n * Result of executing a plan\n */\nexport interface PlanResult {\n /** Whether the plan completed successfully */\n success: boolean;\n\n /** Steps that were executed */\n executedSteps: number[];\n\n /** Steps that succeeded */\n completedSteps: number[];\n\n /** Steps that failed */\n failedSteps: number[];\n\n /** Steps that were skipped */\n skippedSteps: number[];\n\n /** Total duration */\n duration: number;\n\n /** Final plan state */\n finalState: PlanState;\n}\n\n// ===== SERIALIZATION =====\n\n/**\n * STATUS.md schema for parsing/generating\n */\nexport interface StatusDocument {\n /** Document title */\n title: string;\n\n /** Current state summary */\n currentState: {\n status: TaskStatus;\n currentStep?: string;\n lastCompleted?: string;\n startedAt?: string;\n lastUpdated?: string;\n };\n\n /** Step progress table */\n stepProgress: Array<{\n step: string;\n name: string;\n status: TaskStatus;\n started?: string;\n completed?: string;\n notes?: string;\n }>;\n\n /** Blockers section */\n blockers: string[];\n\n /** Issues section */\n issues: string[];\n\n /** Notes section */\n notes?: string;\n}\n\n/**\n * EXECUTION_PLAN.md schema\n */\nexport interface ExecutionPlanDocument {\n /** Strategy description */\n strategy: string;\n\n /** Prerequisites */\n prerequisites: string[];\n\n /** Phases with their steps */\n phases: Array<{\n name: string;\n description: string;\n steps: string[];\n }>;\n\n /** Quality gates */\n qualityGates?: string[];\n\n /** Rollback instructions */\n rollback?: string;\n}\n\n// ===== PLAN CONVENTIONS =====\n\n/**\n * File naming conventions\n */\nexport const PLAN_CONVENTIONS = {\n /** Meta-prompt file patterns */\n metaPromptPatterns: [\n \"{code}-prompt.md\",\n \"prompt-of-prompts.md\",\n \"{code}.md\",\n ],\n\n /** Step file pattern */\n stepPattern: /^(\\d{2})-(.+)\\.md$/,\n\n /** Standard files */\n standardFiles: {\n summary: \"SUMMARY.md\",\n status: \"STATUS.md\",\n executionPlan: \"EXECUTION_PLAN.md\",\n readme: \"README.md\",\n },\n\n /** Standard directories */\n standardDirs: {\n plan: \"plan\",\n analysis: \"analysis\",\n architecture: \"architecture\",\n implementation: \"implementation\",\n testing: \"testing\",\n },\n\n /** Status emoji mapping */\n statusEmoji: {\n pending: \"⬜\",\n in_progress: \"πŸ”„\",\n completed: \"βœ…\",\n failed: \"❌\",\n blocked: \"⏸️\",\n skipped: \"⏭️\",\n } as Record<TaskStatus, string>,\n} as const;\n\n","/**\n * RiotPlan - Framework for long-lived, stateful AI workflows\n *\n * A plan is a structured way to manage multi-step AI-assisted tasks that:\n * - Span multiple sessions/days\n * - Have persistent state (STATUS.md)\n * - Are organized into numbered steps\n * - Can be interrupted and resumed\n * - Track progress with checkboxes and statuses\n *\n * @example Plan directory structure:\n * ```\n * my-plan/\n * β”œβ”€β”€ my-plan-prompt.md # Meta-prompt (prompt-of-prompts)\n * β”œβ”€β”€ SUMMARY.md # Overview of the approach\n * β”œβ”€β”€ EXECUTION_PLAN.md # Step-by-step strategy\n * β”œβ”€β”€ STATUS.md # Current state (auto-updated)\n * β”œβ”€β”€ plan/ # Step files (optional subdirectory)\n * β”‚ β”œβ”€β”€ 01-first-step.md\n * β”‚ β”œβ”€β”€ 02-second-step.md\n * β”‚ └── ...\n * └── analysis/ # Analysis output (optional)\n * ```\n */\n\n// ===== EXPORTS =====\n\n// Types\nexport type {\n TaskStatus,\n Priority,\n PlanStep,\n PlanPhase,\n Blocker,\n Issue,\n PlanMetadata,\n PlanFiles,\n PlanState,\n Plan,\n PlanContext,\n StepResult,\n PlanResult,\n StatusDocument,\n ExecutionPlanDocument,\n} from \"./types.js\";\n\n// Constants\nexport { PLAN_CONVENTIONS } from \"./types.js\";\n\n// Version\nexport const VERSION = \"0.0.1\";\n\n// ===== STUB IMPLEMENTATIONS =====\n// These will be implemented as the project develops\n\n/**\n * Load a plan from a directory\n *\n * @param path - Path to the plan directory\n * @returns The loaded plan\n *\n * @example\n * ```typescript\n * const plan = await loadPlan('./prompts/big-splitup');\n * console.log(plan.metadata.code); // 'big-splitup'\n * console.log(plan.steps.length); // 11\n * ```\n *\n * @stub Not yet implemented\n */\nexport async function loadPlan(_path: string): Promise<never> {\n throw new Error(\n \"riotplan.loadPlan is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n/**\n * Create a new plan\n *\n * @param config - Plan configuration\n * @returns The created plan\n *\n * @example\n * ```typescript\n * const plan = await createPlan({\n * code: 'my-feature',\n * name: 'My Feature Implementation',\n * path: './prompts/my-feature',\n * steps: [\n * { title: 'Setup', description: 'Initial setup' },\n * { title: 'Implementation', description: 'Core work' },\n * { title: 'Testing', description: 'Verify it works' },\n * ]\n * });\n * ```\n *\n * @stub Not yet implemented\n */\nexport async function createPlan(_config: {\n code: string;\n name: string;\n path: string;\n description?: string;\n steps?: Array<{ title: string; description?: string }>;\n}): Promise<never> {\n throw new Error(\n \"riotplan.createPlan is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n/**\n * Parse a STATUS.md file\n *\n * @param content - The STATUS.md content\n * @returns Parsed status document\n *\n * @stub Not yet implemented\n */\nexport function parseStatus(_content: string): never {\n throw new Error(\n \"riotplan.parseStatus is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n/**\n * Generate a STATUS.md file\n *\n * @param plan - The plan to generate status for\n * @returns STATUS.md content\n *\n * @stub Not yet implemented\n */\nexport function generateStatus(_plan: unknown): never {\n throw new Error(\n \"riotplan.generateStatus is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n/**\n * Execute a plan step\n *\n * @param plan - The plan\n * @param stepNumber - Step to execute\n * @param context - Execution context\n * @returns Step result\n *\n * @stub Not yet implemented\n */\nexport async function executeStep(\n _plan: unknown,\n _stepNumber: number,\n _context?: unknown\n): Promise<never> {\n throw new Error(\n \"riotplan.executeStep is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n/**\n * Resume a plan from its current state\n *\n * @param plan - The plan to resume\n * @param context - Execution context\n * @returns Plan result\n *\n * @stub Not yet implemented\n */\nexport async function resumePlan(\n _plan: unknown,\n _context?: unknown\n): Promise<never> {\n throw new Error(\n \"riotplan.resumePlan is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n/**\n * Update plan state after step completion\n *\n * @param plan - The plan\n * @param stepNumber - Completed step\n * @param result - Step result\n * @returns Updated plan\n *\n * @stub Not yet implemented\n */\nexport function updatePlanState(\n _plan: unknown,\n _stepNumber: number,\n _result: unknown\n): never {\n throw new Error(\n \"riotplan.updatePlanState is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n"],"names":[],"mappings":"AA6ZO,MAAM,mBAAmB;AAAA;AAAA,EAE5B,oBAAoB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA;AAAA,EAIJ,aAAa;AAAA;AAAA,EAGb,eAAe;AAAA,IACX,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,eAAe;AAAA,IACf,QAAQ;AAAA,EAAA;AAAA;AAAA,EAIZ,cAAc;AAAA,IACV,MAAM;AAAA,IACN,UAAU;AAAA,IACV,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,SAAS;AAAA,EAAA;AAAA;AAAA,EAIb,aAAa;AAAA,IACT,SAAS;AAAA,IACT,aAAa;AAAA,IACb,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,EAAA;AAEjB;AChZO,MAAM,UAAU;AAoBvB,eAAsB,SAAS,OAA+B;AAC1D,QAAM,IAAI;AAAA,IACN;AAAA,EAAA;AAER;AAwBA,eAAsB,WAAW,SAMd;AACf,QAAM,IAAI;AAAA,IACN;AAAA,EAAA;AAER;AAUO,SAAS,YAAY,UAAyB;AACjD,QAAM,IAAI;AAAA,IACN;AAAA,EAAA;AAER;AAUO,SAAS,eAAe,OAAuB;AAClD,QAAM,IAAI;AAAA,IACN;AAAA,EAAA;AAER;AAYA,eAAsB,YAClB,OACA,aACA,UACc;AACd,QAAM,IAAI;AAAA,IACN;AAAA,EAAA;AAER;AAWA,eAAsB,WAClB,OACA,UACc;AACd,QAAM,IAAI;AAAA,IACN;AAAA,EAAA;AAER;AAYO,SAAS,gBACZ,OACA,aACA,SACK;AACL,QAAM,IAAI;AAAA,IACN;AAAA,EAAA;AAER;"}
1
+ {"version":3,"file":"index.js","sources":["../src/status/parser.ts","../src/relationships/index.ts","../src/registry/index.ts","../src/retrospective/index.ts","../src/history/manager.ts","../src/history/revisions.ts","../src/history/milestones.ts","../src/renderer/render.ts","../src/execution/index.ts","../src/cli/utils/output.ts","../src/cli/utils/errors.ts","../src/index.ts"],"sourcesContent":["/**\n * STATUS.md Parser Module\n *\n * Parses STATUS.md files into structured PlanState and StatusDocument objects.\n * Handles various format variations and provides warnings for parsing issues.\n */\n\nimport type {\n PlanState,\n StatusDocument,\n TaskStatus,\n Blocker,\n Issue,\n PlanStep,\n} from \"../types.js\";\nimport { PLAN_CONVENTIONS } from \"../types.js\";\n\n// ===== TYPES =====\n\n/**\n * Options for parsing STATUS.md\n */\nexport interface ParseStatusOptions {\n /** Steps to cross-reference for status updates */\n steps?: PlanStep[];\n}\n\n/**\n * Result of parsing STATUS.md\n */\nexport interface ParseStatusResult {\n /** Parsed status document */\n document: StatusDocument;\n\n /** Derived plan state */\n state: PlanState;\n\n /** Parsing warnings */\n warnings: string[];\n}\n\n// ===== MAIN EXPORT =====\n\n/**\n * Parse STATUS.md content into structured data\n *\n * @param content - The STATUS.md file content\n * @param options - Parsing options\n * @returns Parsed document, state, and any warnings\n *\n * @example\n * ```typescript\n * const content = await readFile('STATUS.md', 'utf-8');\n * const result = parseStatus(content);\n * console.log(result.state.progress); // 40\n * console.log(result.document.stepProgress.length); // 5\n * ```\n */\nexport function parseStatus(\n content: string,\n options: ParseStatusOptions = {}\n): ParseStatusResult {\n const warnings: string[] = [];\n\n // Extract title\n const titleMatch = content.match(/^#\\s+(.+)$/m);\n const title = titleMatch ? titleMatch[1].trim() : \"Unknown Plan\";\n\n // Parse sections\n const currentState = parseCurrentState(content);\n const stepProgress = parseStepProgress(content);\n const blockers = parseBlockers(content);\n const issues = parseIssues(content);\n const notes = parseNotes(content);\n\n // Build document\n const document: StatusDocument = {\n title,\n currentState,\n stepProgress,\n blockers,\n issues,\n notes,\n };\n\n // Calculate progress\n const completedSteps = stepProgress.filter(\n (s) => s.status === \"completed\"\n ).length;\n const progress =\n stepProgress.length > 0\n ? Math.round((completedSteps / stepProgress.length) * 100)\n : 0;\n\n // Build state\n const state: PlanState = {\n status: currentState.status,\n lastUpdatedAt: currentState.lastUpdated\n ? new Date(currentState.lastUpdated)\n : new Date(),\n blockers: blockers.map(\n (desc, i): Blocker => ({\n id: `blocker-${i + 1}`,\n description: desc,\n severity: \"medium\",\n affectedSteps: [],\n createdAt: new Date(),\n })\n ),\n issues: issues.map(\n (desc, i): Issue => ({\n id: `issue-${i + 1}`,\n title: desc.substring(0, 50),\n description: desc,\n severity: \"medium\",\n createdAt: new Date(),\n })\n ),\n progress,\n };\n\n // Set started date if available\n if (currentState.startedAt) {\n state.startedAt = new Date(currentState.startedAt);\n }\n\n // Cross-reference with steps if provided\n if (options.steps) {\n const currentStepNum = extractStepNumber(currentState.currentStep);\n if (currentStepNum) state.currentStep = currentStepNum;\n\n const lastStepNum = extractStepNumber(currentState.lastCompleted);\n if (lastStepNum) state.lastCompletedStep = lastStepNum;\n\n // Validate step count\n if (\n stepProgress.length > 0 &&\n stepProgress.length !== options.steps.length\n ) {\n warnings.push(\n `Step count mismatch: STATUS.md has ${stepProgress.length}, ` +\n `plan has ${options.steps.length}`\n );\n }\n }\n\n return { document, state, warnings };\n}\n\n// ===== CURRENT STATE PARSING =====\n\n/**\n * Parse the Current State section\n */\nfunction parseCurrentState(content: string): StatusDocument[\"currentState\"] {\n const state: StatusDocument[\"currentState\"] = {\n status: \"pending\",\n };\n\n // Extract status from table format\n const statusMatch = content.match(\n /\\|\\s*\\*\\*Status\\*\\*\\s*\\|\\s*([^|]+)/i\n );\n if (statusMatch) {\n const statusText = statusMatch[1].trim();\n const emoji = findStatusEmoji(statusText);\n if (emoji) {\n state.status = parseStatusEmoji(emoji);\n } else {\n state.status = parseStatusText(statusText);\n }\n }\n\n // Current step\n const currentMatch = content.match(\n /\\|\\s*\\*\\*Current Step\\*\\*\\s*\\|\\s*([^|]+)/i\n );\n if (currentMatch && currentMatch[1].trim() !== \"-\") {\n state.currentStep = currentMatch[1].trim();\n }\n\n // Last completed\n const lastMatch = content.match(\n /\\|\\s*\\*\\*Last Completed\\*\\*\\s*\\|\\s*([^|]+)/i\n );\n if (lastMatch && lastMatch[1].trim() !== \"-\") {\n state.lastCompleted = lastMatch[1].trim();\n }\n\n // Started date\n const startedMatch = content.match(\n /\\|\\s*\\*\\*Started\\*\\*\\s*\\|\\s*([^|]+)/i\n );\n if (startedMatch && startedMatch[1].trim() !== \"-\") {\n state.startedAt = startedMatch[1].trim();\n }\n\n // Last updated\n const updatedMatch = content.match(\n /\\|\\s*\\*\\*Last Updated\\*\\*\\s*\\|\\s*([^|]+)/i\n );\n if (updatedMatch && updatedMatch[1].trim() !== \"-\") {\n state.lastUpdated = updatedMatch[1].trim();\n }\n\n return state;\n}\n\n// Status emoji strings for matching\nconst STATUS_EMOJIS = [\"⬜\", \"πŸ”„\", \"βœ…\", \"❌\", \"⏸️\", \"⏭️\"];\n\n/**\n * Find a status emoji in text\n */\nfunction findStatusEmoji(text: string): string | null {\n for (const emoji of STATUS_EMOJIS) {\n if (text.includes(emoji)) {\n return emoji;\n }\n }\n return null;\n}\n\n/**\n * Parse status from emoji\n */\nfunction parseStatusEmoji(emoji: string): TaskStatus {\n return (\n PLAN_CONVENTIONS.emojiToStatus[\n emoji as keyof typeof PLAN_CONVENTIONS.emojiToStatus\n ] || \"pending\"\n );\n}\n\n/**\n * Parse status from text\n */\nfunction parseStatusText(text: string): TaskStatus {\n const normalized = text.toLowerCase().replace(/[^a-z_]/g, \"\");\n const valid: TaskStatus[] = [\n \"pending\",\n \"in_progress\",\n \"completed\",\n \"failed\",\n \"blocked\",\n \"skipped\",\n ];\n\n if (valid.includes(normalized as TaskStatus)) {\n return normalized as TaskStatus;\n }\n\n // Handle variations\n if (normalized.includes(\"progress\") || normalized.includes(\"inprogress\")) {\n return \"in_progress\";\n }\n if (normalized.includes(\"complete\") || normalized.includes(\"done\")) {\n return \"completed\";\n }\n if (normalized.includes(\"block\")) {\n return \"blocked\";\n }\n if (normalized.includes(\"skip\")) {\n return \"skipped\";\n }\n if (normalized.includes(\"fail\") || normalized.includes(\"error\")) {\n return \"failed\";\n }\n\n return \"pending\";\n}\n\n// ===== STEP PROGRESS PARSING =====\n\n/**\n * Parse the Step Progress table\n */\nfunction parseStepProgress(content: string): StatusDocument[\"stepProgress\"] {\n const steps: StatusDocument[\"stepProgress\"] = [];\n\n // Find the step progress table - look for table header with Step and Name columns\n const tableMatch = content.match(\n /\\|\\s*Step\\s*\\|\\s*Name\\s*\\|[^\\n]*\\n\\|[-\\s|]+\\n([\\s\\S]*?)(?=\\n\\n|\\n##|$)/i\n );\n\n if (!tableMatch) return steps;\n\n const tableRows = tableMatch[1].split(\"\\n\").filter((row) => row.trim());\n\n for (const row of tableRows) {\n // Skip separator rows\n if (row.match(/^\\|[-\\s|]+\\|$/)) continue;\n\n const cells = row\n .split(\"|\")\n .map((c) => c.trim())\n .filter((c) => c);\n\n if (cells.length >= 3) {\n const step = cells[0];\n const name = cells[1];\n const statusStr = cells[2];\n const started = cells[3] || undefined;\n const completed = cells[4] || undefined;\n const notes = cells[5] || undefined;\n\n // Parse status from emoji or text\n const emoji = findStatusEmoji(statusStr);\n const status = emoji\n ? parseStatusEmoji(emoji)\n : parseStatusText(statusStr);\n\n steps.push({\n step,\n name,\n status,\n started: started && started !== \"-\" ? started : undefined,\n completed:\n completed && completed !== \"-\" ? completed : undefined,\n notes: notes && notes !== \"-\" ? notes : undefined,\n });\n }\n }\n\n return steps;\n}\n\n// ===== BLOCKERS/ISSUES PARSING =====\n\n/**\n * Parse the Blockers section\n */\nfunction parseBlockers(content: string): string[] {\n const blockers: string[] = [];\n\n const section = extractSection(content, \"Blockers\");\n if (!section) return blockers;\n\n // Check for \"None\" indicator\n if (section.toLowerCase().includes(\"none\")) {\n return blockers;\n }\n\n // Parse as list items\n const listItems = section.match(/^[-*]\\s+(.+)$/gm);\n if (listItems) {\n for (const item of listItems) {\n const text = item.replace(/^[-*]\\s+/, \"\").trim();\n if (text && !text.toLowerCase().includes(\"none\")) {\n blockers.push(text);\n }\n }\n }\n\n return blockers;\n}\n\n/**\n * Parse the Issues section\n */\nfunction parseIssues(content: string): string[] {\n const issues: string[] = [];\n\n const section = extractSection(content, \"Issues\");\n if (!section) return issues;\n\n // Check for \"None\" indicator\n if (section.toLowerCase().includes(\"none\")) {\n return issues;\n }\n\n // Parse as list items\n const listItems = section.match(/^[-*]\\s+(.+)$/gm);\n if (listItems) {\n for (const item of listItems) {\n const text = item.replace(/^[-*]\\s+/, \"\").trim();\n if (text && !text.toLowerCase().includes(\"none\")) {\n issues.push(text);\n }\n }\n }\n\n return issues;\n}\n\n/**\n * Parse the Notes section\n */\nfunction parseNotes(content: string): string | undefined {\n const section = extractSection(content, \"Notes\");\n if (!section || section.trim() === \"\") return undefined;\n\n // Filter out common empty indicators\n const trimmed = section.trim();\n if (\n trimmed === \"-\" ||\n trimmed.toLowerCase() === \"none\" ||\n trimmed.toLowerCase() === \"none currently.\"\n ) {\n return undefined;\n }\n\n return trimmed;\n}\n\n/**\n * Extract a section from markdown content\n */\nfunction extractSection(content: string, name: string): string | undefined {\n const regex = new RegExp(\n `##\\\\s*${name}[^\\\\n]*\\\\n([\\\\s\\\\S]*?)(?=\\\\n##|\\\\n---|$)`,\n \"i\"\n );\n const match = content.match(regex);\n return match ? match[1].trim() : undefined;\n}\n\n// ===== UTILITIES =====\n\n/**\n * Extract step number from a step reference\n */\nfunction extractStepNumber(stepRef?: string): number | undefined {\n if (!stepRef) return undefined;\n const match = stepRef.match(/(\\d+)/);\n return match ? parseInt(match[1]) : undefined;\n}\n\n","/**\n * Relationships Module\n *\n * Manages cross-plan relationships:\n * - Link plans across directories and repositories\n * - Track spawned, blocking, and related plans\n * - Parse relationship declarations from plan files\n * - Validate relationship targets\n */\n\nimport { readFile, access, writeFile } from \"node:fs/promises\";\nimport { join, resolve, relative, isAbsolute } from \"node:path\";\nimport type { Plan, PlanRelationship, RelationshipType } from \"../types.js\";\nimport { loadPlan } from \"../plan/loader.js\";\n\n// ===== TYPES =====\n\n/**\n * Options for adding a relationship\n */\nexport interface AddRelationshipOptions {\n /** Type of relationship */\n type: RelationshipType;\n\n /** Path to the related plan (absolute or relative to current plan) */\n targetPath: string;\n\n /** Specific steps involved in the relationship */\n steps?: number[];\n\n /** Reason/description for the relationship */\n reason?: string;\n}\n\n/**\n * Result of adding a relationship\n */\nexport interface AddRelationshipResult {\n /** The created relationship */\n relationship: PlanRelationship;\n\n /** Whether the target plan was found and valid */\n targetValid: boolean;\n\n /** Target plan metadata if found */\n targetPlan?: {\n code: string;\n name: string;\n path: string;\n };\n}\n\n/**\n * Relationship validation result\n */\nexport interface RelationshipValidation {\n /** All relationships valid */\n valid: boolean;\n\n /** Invalid relationships */\n invalid: InvalidRelationship[];\n\n /** Valid relationships */\n validRelationships: PlanRelationship[];\n}\n\n/**\n * An invalid relationship\n */\nexport interface InvalidRelationship {\n relationship: PlanRelationship;\n reason: string;\n}\n\n/**\n * Parsed relationship from file content\n */\nexport interface ParsedRelationship {\n type: RelationshipType;\n targetPath: string;\n steps?: number[];\n reason?: string;\n}\n\n// ===== PARSING =====\n\n/**\n * Parse relationships from plan content\n *\n * Looks for relationship declarations in markdown:\n * - `## Related Plans` section with formatted links\n * - `spawned-from: path/to/plan` in frontmatter\n * - `blocks: path/to/plan` in frontmatter\n *\n * Supported formats in ## Related Plans:\n * - `- **spawned-from**: path/to/plan - reason`\n * - `- [plan-name](path/to/plan) - blocks Step 3`\n * - `- path/to/plan (related)`\n *\n * @param content - Plan file content (typically SUMMARY.md or meta-prompt)\n * @returns Array of parsed relationships\n */\nexport function parseRelationshipsFromContent(content: string): ParsedRelationship[] {\n const relationships: ParsedRelationship[] = [];\n\n // Parse frontmatter relationships\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (frontmatterMatch) {\n const frontmatter = frontmatterMatch[1];\n\n // spawned-from: path\n const spawnedFrom = frontmatter.match(/spawned-from:\\s*(.+)/);\n if (spawnedFrom) {\n relationships.push({\n type: \"spawned-from\",\n targetPath: spawnedFrom[1].trim(),\n });\n }\n\n // blocks: path1, path2\n const blocksMatch = frontmatter.match(/blocks:\\s*(.+)/);\n if (blocksMatch) {\n const paths = blocksMatch[1].split(\",\").map((p) => p.trim());\n for (const path of paths) {\n relationships.push({\n type: \"blocks\",\n targetPath: path,\n });\n }\n }\n\n // blocked-by: path\n const blockedBy = frontmatter.match(/blocked-by:\\s*(.+)/);\n if (blockedBy) {\n const paths = blockedBy[1].split(\",\").map((p) => p.trim());\n for (const path of paths) {\n relationships.push({\n type: \"blocked-by\",\n targetPath: path,\n });\n }\n }\n\n // related: path1, path2\n const relatedMatch = frontmatter.match(/related:\\s*(.+)/);\n if (relatedMatch) {\n const paths = relatedMatch[1].split(\",\").map((p) => p.trim());\n for (const path of paths) {\n relationships.push({\n type: \"related\",\n targetPath: path,\n });\n }\n }\n }\n\n // Parse ## Related Plans section\n const sectionMatch = content.match(\n /##\\s+Related\\s+Plans?\\s*\\n([\\s\\S]*?)(?=\\n##|\\n#\\s|$)/i\n );\n if (sectionMatch) {\n const section = sectionMatch[1];\n const lines = section.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"-\")) continue;\n\n const itemContent = trimmed.slice(1).trim();\n\n // Parse: **type**: path - reason\n // The path can contain hyphens and slashes, so we need a better regex\n const typePathMatch = itemContent.match(\n /\\*\\*(\\w+(?:-\\w+)?)\\*\\*:\\s*([^\\s]+)(?:\\s+-\\s+(.+))?/\n );\n if (typePathMatch) {\n const [, typeStr, path, reason] = typePathMatch;\n const type = normalizeRelationType(typeStr);\n if (type) {\n relationships.push({\n type,\n targetPath: path,\n reason: reason?.trim(),\n });\n continue;\n }\n }\n\n // Parse: [name](path) - description (type)\n const linkMatch = itemContent.match(\n /\\[([^\\]]+)\\]\\(([^)]+)\\)(?:\\s*-\\s*(.+))?/\n );\n if (linkMatch) {\n const [, , path, desc] = linkMatch;\n let type: RelationshipType = \"related\";\n let reason = desc?.trim();\n\n // Try to extract type from description\n if (desc) {\n const typeInDesc = desc.match(\n /\\((spawned-from|spawned|blocks|blocked-by|related)\\)/i\n );\n if (typeInDesc) {\n type = normalizeRelationType(typeInDesc[1]) || \"related\";\n reason = desc.replace(typeInDesc[0], \"\").trim();\n } else if (desc.toLowerCase().includes(\"blocks\")) {\n type = \"blocks\";\n } else if (desc.toLowerCase().includes(\"blocked\")) {\n type = \"blocked-by\";\n } else if (desc.toLowerCase().includes(\"spawned from\")) {\n type = \"spawned-from\";\n }\n }\n\n relationships.push({\n type,\n targetPath: path,\n reason: reason || undefined,\n });\n continue;\n }\n\n // Parse: path (type) - reason\n const simpleMatch = itemContent.match(\n /([^\\s(]+)\\s*(?:\\((\\w+(?:-\\w+)?)\\))?(?:\\s*-\\s*(.+))?/\n );\n if (simpleMatch) {\n const [, path, typeStr, reason] = simpleMatch;\n const type = typeStr\n ? normalizeRelationType(typeStr) || \"related\"\n : \"related\";\n relationships.push({\n type,\n targetPath: path,\n reason: reason?.trim(),\n });\n }\n }\n }\n\n // Deduplicate within the same content\n const seen = new Set<string>();\n return relationships.filter((r) => {\n const key = `${r.type}:${r.targetPath}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n/**\n * Normalize a relationship type string\n */\nfunction normalizeRelationType(str: string): RelationshipType | null {\n const normalized = str.toLowerCase().replace(/_/g, \"-\");\n const validTypes: RelationshipType[] = [\n \"spawned-from\",\n \"spawned\",\n \"blocks\",\n \"blocked-by\",\n \"related\",\n ];\n return validTypes.find((t) => t === normalized) || null;\n}\n\n/**\n * Parse relationships from a plan's SUMMARY.md or meta-prompt\n *\n * @param planPath - Path to the plan directory\n * @returns Array of parsed relationships\n */\nexport async function parseRelationshipsFromPlan(\n planPath: string\n): Promise<ParsedRelationship[]> {\n const absolutePath = resolve(planPath);\n const relationships: ParsedRelationship[] = [];\n\n // Try SUMMARY.md first\n try {\n const summaryPath = join(absolutePath, \"SUMMARY.md\");\n const content = await readFile(summaryPath, \"utf-8\");\n relationships.push(...parseRelationshipsFromContent(content));\n } catch {\n // No SUMMARY.md\n }\n\n // Also check meta-prompt\n try {\n const files = [\"prompt-of-prompts.md\"];\n // Add plan-code-prompt.md pattern\n const planCode = absolutePath.split(\"/\").pop();\n if (planCode) {\n files.push(`${planCode}-prompt.md`, `${planCode}.md`);\n }\n\n for (const file of files) {\n try {\n const filePath = join(absolutePath, file);\n const content = await readFile(filePath, \"utf-8\");\n relationships.push(...parseRelationshipsFromContent(content));\n } catch {\n // File doesn't exist\n }\n }\n } catch {\n // Error reading files\n }\n\n // Deduplicate\n const seen = new Set<string>();\n return relationships.filter((r) => {\n const key = `${r.type}:${r.targetPath}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n// ===== RELATIONSHIP MANAGEMENT =====\n\n/**\n * Add a relationship to a plan\n *\n * @param plan - The source plan\n * @param options - Relationship options\n * @returns Result with the created relationship\n */\nexport async function addRelationship(\n plan: Plan,\n options: AddRelationshipOptions\n): Promise<AddRelationshipResult> {\n const { type, targetPath, steps, reason } = options;\n\n // Resolve target path\n const resolvedTarget = isAbsolute(targetPath)\n ? targetPath\n : resolve(plan.metadata.path, targetPath);\n\n // Check if target exists\n let targetValid = false;\n let targetPlan: AddRelationshipResult[\"targetPlan\"];\n\n try {\n await access(resolvedTarget);\n const target = await loadPlan(resolvedTarget);\n targetValid = true;\n targetPlan = {\n code: target.metadata.code,\n name: target.metadata.name,\n path: resolvedTarget,\n };\n } catch {\n // Target doesn't exist or isn't a valid plan\n }\n\n const relationship: PlanRelationship = {\n type,\n planPath: targetPath, // Store original path\n steps,\n reason,\n createdAt: new Date(),\n };\n\n // Add to plan (in memory)\n if (!plan.relationships) {\n plan.relationships = [];\n }\n plan.relationships.push(relationship);\n\n return {\n relationship,\n targetValid,\n targetPlan,\n };\n}\n\n/**\n * Remove a relationship from a plan\n *\n * @param plan - The source plan\n * @param targetPath - Path to the related plan to remove\n * @param type - Optional type to match (removes all types if not specified)\n * @returns Removed relationships\n */\nexport function removeRelationship(\n plan: Plan,\n targetPath: string,\n type?: RelationshipType\n): PlanRelationship[] {\n if (!plan.relationships) return [];\n\n const removed: PlanRelationship[] = [];\n plan.relationships = plan.relationships.filter((r) => {\n const matches =\n r.planPath === targetPath && (type === undefined || r.type === type);\n if (matches) removed.push(r);\n return !matches;\n });\n\n return removed;\n}\n\n/**\n * Get all relationships of a specific type\n *\n * @param plan - The plan to query\n * @param type - Relationship type to filter by\n * @returns Matching relationships\n */\nexport function getRelationshipsByType(\n plan: Plan,\n type: RelationshipType\n): PlanRelationship[] {\n return (plan.relationships || []).filter((r) => r.type === type);\n}\n\n/**\n * Get the inverse relationship type\n */\nexport function getInverseRelationType(\n type: RelationshipType\n): RelationshipType {\n switch (type) {\n case \"spawned-from\":\n return \"spawned\";\n case \"spawned\":\n return \"spawned-from\";\n case \"blocks\":\n return \"blocked-by\";\n case \"blocked-by\":\n return \"blocks\";\n case \"related\":\n return \"related\";\n }\n}\n\n/**\n * Create a bidirectional relationship between two plans\n *\n * @param sourcePlan - The source plan\n * @param targetPlan - The target plan\n * @param type - Relationship type from source's perspective\n * @param reason - Optional reason\n */\nexport function createBidirectionalRelationship(\n sourcePlan: Plan,\n targetPlan: Plan,\n type: RelationshipType,\n reason?: string\n): void {\n // Add forward relationship\n if (!sourcePlan.relationships) {\n sourcePlan.relationships = [];\n }\n sourcePlan.relationships.push({\n type,\n planPath: relative(sourcePlan.metadata.path, targetPlan.metadata.path),\n reason,\n createdAt: new Date(),\n });\n\n // Add inverse relationship\n if (!targetPlan.relationships) {\n targetPlan.relationships = [];\n }\n targetPlan.relationships.push({\n type: getInverseRelationType(type),\n planPath: relative(targetPlan.metadata.path, sourcePlan.metadata.path),\n reason,\n createdAt: new Date(),\n });\n}\n\n// ===== VALIDATION =====\n\n/**\n * Validate all relationships in a plan\n *\n * @param plan - The plan to validate\n * @returns Validation result\n */\nexport async function validateRelationships(\n plan: Plan\n): Promise<RelationshipValidation> {\n const invalid: InvalidRelationship[] = [];\n const validRelationships: PlanRelationship[] = [];\n\n if (!plan.relationships) {\n return { valid: true, invalid: [], validRelationships: [] };\n }\n\n for (const rel of plan.relationships) {\n // Resolve path\n const resolvedPath = isAbsolute(rel.planPath)\n ? rel.planPath\n : resolve(plan.metadata.path, rel.planPath);\n\n // Check if target exists\n try {\n await access(resolvedPath);\n // Try to load as plan\n await loadPlan(resolvedPath);\n validRelationships.push(rel);\n } catch {\n invalid.push({\n relationship: rel,\n reason: `Target plan not found: ${rel.planPath}`,\n });\n }\n }\n\n return {\n valid: invalid.length === 0,\n invalid,\n validRelationships,\n };\n}\n\n// ===== QUERY FUNCTIONS =====\n\n/**\n * Find all plans that block this plan\n *\n * @param plan - The plan to check\n * @returns Paths to blocking plans\n */\nexport function getBlockingPlans(plan: Plan): string[] {\n return getRelationshipsByType(plan, \"blocked-by\").map((r) => r.planPath);\n}\n\n/**\n * Find all plans that this plan blocks\n *\n * @param plan - The plan to check\n * @returns Paths to blocked plans\n */\nexport function getBlockedPlans(plan: Plan): string[] {\n return getRelationshipsByType(plan, \"blocks\").map((r) => r.planPath);\n}\n\n/**\n * Find the parent plan (if this plan was spawned from another)\n *\n * @param plan - The plan to check\n * @returns Path to parent plan or null\n */\nexport function getParentPlan(plan: Plan): string | null {\n const spawnedFrom = getRelationshipsByType(plan, \"spawned-from\");\n return spawnedFrom.length > 0 ? spawnedFrom[0].planPath : null;\n}\n\n/**\n * Find all child plans (plans spawned from this one)\n *\n * @param plan - The plan to check\n * @returns Paths to child plans\n */\nexport function getChildPlans(plan: Plan): string[] {\n return getRelationshipsByType(plan, \"spawned\").map((r) => r.planPath);\n}\n\n/**\n * Find all related plans (general relationships)\n *\n * @param plan - The plan to check\n * @returns Paths to related plans\n */\nexport function getRelatedPlans(plan: Plan): string[] {\n return getRelationshipsByType(plan, \"related\").map((r) => r.planPath);\n}\n\n// ===== SERIALIZATION =====\n\n/**\n * Generate markdown for a plan's relationships section\n *\n * @param plan - The plan with relationships\n * @returns Markdown string for ## Related Plans section\n */\nexport function generateRelationshipsMarkdown(plan: Plan): string {\n if (!plan.relationships || plan.relationships.length === 0) {\n return \"\";\n }\n\n const lines: string[] = [\"## Related Plans\", \"\"];\n\n // Group by type\n const byType = new Map<RelationshipType, PlanRelationship[]>();\n for (const rel of plan.relationships) {\n const list = byType.get(rel.type) || [];\n list.push(rel);\n byType.set(rel.type, list);\n }\n\n const typeLabels: Record<RelationshipType, string> = {\n \"spawned-from\": \"Spawned From\",\n spawned: \"Spawned\",\n blocks: \"Blocks\",\n \"blocked-by\": \"Blocked By\",\n related: \"Related\",\n };\n\n for (const [type, rels] of byType) {\n lines.push(`### ${typeLabels[type]}`);\n lines.push(\"\");\n for (const rel of rels) {\n let line = `- **${type}**: ${rel.planPath}`;\n if (rel.reason) {\n line += ` - ${rel.reason}`;\n }\n if (rel.steps && rel.steps.length > 0) {\n line += ` (Steps: ${rel.steps.join(\", \")})`;\n }\n lines.push(line);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Update a plan's SUMMARY.md with relationships\n *\n * @param plan - The plan to update\n */\nexport async function updatePlanRelationships(plan: Plan): Promise<void> {\n const summaryPath = join(plan.metadata.path, \"SUMMARY.md\");\n\n let content: string;\n try {\n content = await readFile(summaryPath, \"utf-8\");\n } catch {\n // Create new SUMMARY.md\n content = `# ${plan.metadata.name}\\n\\n${plan.metadata.description || \"Plan summary.\"}\\n\\n`;\n }\n\n // Remove existing Related Plans section\n content = content.replace(/\\n##\\s+Related\\s+Plans?\\s*\\n[\\s\\S]*?(?=\\n##|\\n#\\s|$)/i, \"\");\n\n // Add new section\n const relSection = generateRelationshipsMarkdown(plan);\n if (relSection) {\n content = content.trimEnd() + \"\\n\\n\" + relSection;\n }\n\n await writeFile(summaryPath, content);\n}\n\n","/**\n * Plan Registry Module\n *\n * Tracks and discovers plans across directories and repositories:\n * - Scan directories for plans\n * - Index plan metadata for quick lookups\n * - Track plan relationships globally\n * - Support multiple search paths\n */\n\nimport { readdir, readFile, writeFile, access } from \"node:fs/promises\";\nimport { join, resolve, basename } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport type { TaskStatus } from \"../types.js\";\nimport { PLAN_CONVENTIONS } from \"../types.js\";\nimport { loadPlan } from \"../plan/loader.js\";\n\n// ===== TYPES =====\n\n/**\n * A registered plan entry\n */\nexport interface RegisteredPlan {\n /** Plan code (directory name) */\n code: string;\n\n /** Human-readable name */\n name: string;\n\n /** Absolute path to plan directory */\n path: string;\n\n /** Overall status */\n status: TaskStatus;\n\n /** Progress percentage */\n progress: number;\n\n /** Number of steps */\n stepCount: number;\n\n /** Number of completed steps */\n completedSteps: number;\n\n /** When discovered/registered */\n registeredAt: Date;\n\n /** When last scanned */\n lastScannedAt: Date;\n\n /** Tags (if any) */\n tags?: string[];\n\n /** Description snippet */\n description?: string;\n\n /** Parent plan path (if spawned from another) */\n parentPlan?: string;\n}\n\n/**\n * Plan registry containing all discovered plans\n */\nexport interface PlanRegistry {\n /** Version of the registry format */\n version: string;\n\n /** When last updated */\n lastUpdatedAt: Date;\n\n /** Search paths for plan discovery */\n searchPaths: string[];\n\n /** All registered plans indexed by path */\n plans: Map<string, RegisteredPlan>;\n\n /** Index by code for quick lookup */\n byCode: Map<string, string[]>; // code -> paths[]\n\n /** Index by status */\n byStatus: Map<TaskStatus, string[]>; // status -> paths[]\n}\n\n/**\n * Options for creating/loading a registry\n */\nexport interface RegistryOptions {\n /** Search paths to scan for plans */\n searchPaths?: string[];\n\n /** Maximum depth to scan (default: 3) */\n maxDepth?: number;\n\n /** Include hidden directories (default: false) */\n includeHidden?: boolean;\n\n /** Directories to skip */\n excludeDirs?: string[];\n}\n\n/**\n * Result of a plan search\n */\nexport interface SearchResult {\n /** Matching plans */\n plans: RegisteredPlan[];\n\n /** Total matches */\n total: number;\n}\n\n/**\n * Options for searching plans\n */\nexport interface SearchOptions {\n /** Filter by status */\n status?: TaskStatus | TaskStatus[];\n\n /** Filter by code pattern (glob or regex) */\n codePattern?: string;\n\n /** Filter by name pattern */\n namePattern?: string;\n\n /** Filter by tag */\n tags?: string[];\n\n /** Minimum progress */\n minProgress?: number;\n\n /** Maximum progress */\n maxProgress?: number;\n\n /** Sort by field */\n sortBy?: \"name\" | \"code\" | \"progress\" | \"status\" | \"registeredAt\";\n\n /** Sort direction */\n sortDir?: \"asc\" | \"desc\";\n\n /** Limit results */\n limit?: number;\n\n /** Offset for pagination */\n offset?: number;\n}\n\n// ===== REGISTRY FILE =====\n\nconst REGISTRY_FILENAME = \".riotplan-registry.json\";\nconst REGISTRY_VERSION = \"1.0\";\n\n/**\n * Get the default registry path\n */\nexport function getDefaultRegistryPath(): string {\n return join(homedir(), REGISTRY_FILENAME);\n}\n\n// ===== REGISTRY CREATION =====\n\n/**\n * Create a new empty registry\n */\nexport function createRegistry(searchPaths: string[] = []): PlanRegistry {\n return {\n version: REGISTRY_VERSION,\n lastUpdatedAt: new Date(),\n searchPaths: searchPaths.map((p) => resolve(p)),\n plans: new Map(),\n byCode: new Map(),\n byStatus: new Map(),\n };\n}\n\n/**\n * Load registry from file\n *\n * @param path - Path to registry file (defaults to home directory)\n */\nexport async function loadRegistry(\n path?: string\n): Promise<PlanRegistry | null> {\n const registryPath = path || getDefaultRegistryPath();\n\n try {\n await access(registryPath);\n const content = await readFile(registryPath, \"utf-8\");\n const data = JSON.parse(content);\n\n // Convert JSON back to registry structure\n const registry = createRegistry(data.searchPaths || []);\n registry.version = data.version || REGISTRY_VERSION;\n registry.lastUpdatedAt = new Date(data.lastUpdatedAt);\n\n // Restore plans\n if (data.plans && Array.isArray(data.plans)) {\n for (const plan of data.plans) {\n const entry: RegisteredPlan = {\n ...plan,\n registeredAt: new Date(plan.registeredAt),\n lastScannedAt: new Date(plan.lastScannedAt),\n };\n registry.plans.set(entry.path, entry);\n indexPlan(registry, entry);\n }\n }\n\n return registry;\n } catch {\n return null;\n }\n}\n\n/**\n * Save registry to file\n *\n * @param registry - The registry to save\n * @param path - Path to save to (defaults to home directory)\n */\nexport async function saveRegistry(\n registry: PlanRegistry,\n path?: string\n): Promise<void> {\n const registryPath = path || getDefaultRegistryPath();\n\n registry.lastUpdatedAt = new Date();\n\n const data = {\n version: registry.version,\n lastUpdatedAt: registry.lastUpdatedAt.toISOString(),\n searchPaths: registry.searchPaths,\n plans: Array.from(registry.plans.values()).map((plan) => ({\n ...plan,\n registeredAt: plan.registeredAt.toISOString(),\n lastScannedAt: plan.lastScannedAt.toISOString(),\n })),\n };\n\n await writeFile(registryPath, JSON.stringify(data, null, 2));\n}\n\n// ===== PLAN DISCOVERY =====\n\n/**\n * Scan directories for plans and add them to registry\n *\n * @param registry - The registry to update\n * @param options - Scan options\n */\nexport async function scanForPlans(\n registry: PlanRegistry,\n options: RegistryOptions = {}\n): Promise<number> {\n const {\n searchPaths = registry.searchPaths,\n maxDepth = 3,\n includeHidden = false,\n excludeDirs = [\"node_modules\", \".git\", \"dist\", \"coverage\"],\n } = options;\n\n let discovered = 0;\n\n for (const searchPath of searchPaths) {\n const absolutePath = resolve(searchPath);\n\n try {\n discovered += await scanDirectory(\n registry,\n absolutePath,\n 0,\n maxDepth,\n includeHidden,\n excludeDirs\n );\n } catch {\n // Skip inaccessible paths\n }\n }\n\n // Update search paths\n for (const path of searchPaths) {\n const absolutePath = resolve(path);\n if (!registry.searchPaths.includes(absolutePath)) {\n registry.searchPaths.push(absolutePath);\n }\n }\n\n registry.lastUpdatedAt = new Date();\n return discovered;\n}\n\n/**\n * Recursively scan a directory for plans\n */\nasync function scanDirectory(\n registry: PlanRegistry,\n dirPath: string,\n depth: number,\n maxDepth: number,\n includeHidden: boolean,\n excludeDirs: string[]\n): Promise<number> {\n if (depth > maxDepth) return 0;\n\n let discovered = 0;\n const dirName = basename(dirPath);\n\n // Skip excluded directories\n if (excludeDirs.includes(dirName)) return 0;\n if (!includeHidden && dirName.startsWith(\".\")) return 0;\n\n // Check if this directory is a plan\n if (await isPlanDirectory(dirPath)) {\n try {\n const entry = await createPlanEntry(dirPath);\n registerPlan(registry, entry);\n discovered++;\n } catch {\n // Skip plans that can't be loaded\n }\n // Don't recurse into plan directories\n return discovered;\n }\n\n // Recurse into subdirectories\n try {\n const entries = await readdir(dirPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const subPath = join(dirPath, entry.name);\n discovered += await scanDirectory(\n registry,\n subPath,\n depth + 1,\n maxDepth,\n includeHidden,\n excludeDirs\n );\n }\n }\n } catch {\n // Can't read directory\n }\n\n return discovered;\n}\n\n/**\n * Check if a directory looks like a plan\n */\nasync function isPlanDirectory(dirPath: string): Promise<boolean> {\n // Check for common plan indicators\n const indicators = [\n \"SUMMARY.md\",\n \"STATUS.md\",\n \"EXECUTION_PLAN.md\",\n \"plan/\", // plan subdirectory\n ];\n\n let matches = 0;\n\n for (const indicator of indicators) {\n try {\n const checkPath = join(dirPath, indicator);\n await access(checkPath);\n matches++;\n } catch {\n // File/dir doesn't exist\n }\n }\n\n // At least 2 indicators or check for step files\n if (matches >= 2) return true;\n\n // Check for step files in root\n try {\n const files = await readdir(dirPath);\n const hasSteps = files.some((f) => PLAN_CONVENTIONS.stepPattern.test(f));\n if (hasSteps) return true;\n } catch {\n // Can't read\n }\n\n // Check for plan/ subdirectory with step files\n try {\n const planDir = join(dirPath, \"plan\");\n const files = await readdir(planDir);\n const hasSteps = files.some((f) => PLAN_CONVENTIONS.stepPattern.test(f));\n if (hasSteps) return true;\n } catch {\n // No plan subdir\n }\n\n return false;\n}\n\n/**\n * Create a registry entry from a plan directory\n */\nasync function createPlanEntry(planPath: string): Promise<RegisteredPlan> {\n const plan = await loadPlan(planPath);\n const now = new Date();\n\n return {\n code: plan.metadata.code,\n name: plan.metadata.name,\n path: planPath,\n status: plan.state.status,\n progress: plan.state.progress,\n stepCount: plan.steps.length,\n completedSteps: plan.steps.filter((s) => s.status === \"completed\")\n .length,\n registeredAt: now,\n lastScannedAt: now,\n tags: plan.metadata.tags,\n description: plan.metadata.description?.slice(0, 200),\n parentPlan: plan.relationships?.find((r) => r.type === \"spawned-from\")\n ?.planPath,\n };\n}\n\n// ===== PLAN REGISTRATION =====\n\n/**\n * Register a plan in the registry\n */\nexport function registerPlan(\n registry: PlanRegistry,\n entry: RegisteredPlan\n): void {\n // Remove old entry if exists\n const existing = registry.plans.get(entry.path);\n if (existing) {\n removeFromIndex(registry, existing);\n }\n\n // Add new entry\n registry.plans.set(entry.path, entry);\n indexPlan(registry, entry);\n}\n\n/**\n * Unregister a plan from the registry\n */\nexport function unregisterPlan(registry: PlanRegistry, path: string): boolean {\n const entry = registry.plans.get(path);\n if (!entry) return false;\n\n removeFromIndex(registry, entry);\n registry.plans.delete(path);\n return true;\n}\n\n/**\n * Add plan to indexes\n */\nfunction indexPlan(registry: PlanRegistry, entry: RegisteredPlan): void {\n // Index by code\n const codePaths = registry.byCode.get(entry.code) || [];\n if (!codePaths.includes(entry.path)) {\n codePaths.push(entry.path);\n registry.byCode.set(entry.code, codePaths);\n }\n\n // Index by status\n const statusPaths = registry.byStatus.get(entry.status) || [];\n if (!statusPaths.includes(entry.path)) {\n statusPaths.push(entry.path);\n registry.byStatus.set(entry.status, statusPaths);\n }\n}\n\n/**\n * Remove plan from indexes\n */\nfunction removeFromIndex(registry: PlanRegistry, entry: RegisteredPlan): void {\n // Remove from code index\n const codePaths = registry.byCode.get(entry.code);\n if (codePaths) {\n const idx = codePaths.indexOf(entry.path);\n if (idx !== -1) {\n codePaths.splice(idx, 1);\n if (codePaths.length === 0) {\n registry.byCode.delete(entry.code);\n }\n }\n }\n\n // Remove from status index\n const statusPaths = registry.byStatus.get(entry.status);\n if (statusPaths) {\n const idx = statusPaths.indexOf(entry.path);\n if (idx !== -1) {\n statusPaths.splice(idx, 1);\n if (statusPaths.length === 0) {\n registry.byStatus.delete(entry.status);\n }\n }\n }\n}\n\n// ===== PLAN REFRESH =====\n\n/**\n * Refresh a single plan's entry\n *\n * @param registry - The registry\n * @param path - Path to the plan\n * @returns Updated entry or null if plan no longer exists\n */\nexport async function refreshPlan(\n registry: PlanRegistry,\n path: string\n): Promise<RegisteredPlan | null> {\n const existing = registry.plans.get(path);\n\n try {\n const entry = await createPlanEntry(path);\n\n // Preserve original registration date\n if (existing) {\n entry.registeredAt = existing.registeredAt;\n }\n\n registerPlan(registry, entry);\n return entry;\n } catch {\n // Plan no longer valid\n if (existing) {\n unregisterPlan(registry, path);\n }\n return null;\n }\n}\n\n/**\n * Refresh all plans in the registry\n */\nexport async function refreshAllPlans(\n registry: PlanRegistry\n): Promise<{ updated: number; removed: number }> {\n let updated = 0;\n let removed = 0;\n\n const paths = Array.from(registry.plans.keys());\n\n for (const path of paths) {\n const result = await refreshPlan(registry, path);\n if (result) {\n updated++;\n } else {\n removed++;\n }\n }\n\n registry.lastUpdatedAt = new Date();\n return { updated, removed };\n}\n\n// ===== SEARCH AND QUERY =====\n\n/**\n * Search for plans in the registry\n */\nexport function searchPlans(\n registry: PlanRegistry,\n options: SearchOptions = {}\n): SearchResult {\n let results = Array.from(registry.plans.values());\n\n // Filter by status\n if (options.status) {\n const statuses = Array.isArray(options.status)\n ? options.status\n : [options.status];\n results = results.filter((p) => statuses.includes(p.status));\n }\n\n // Filter by code pattern\n if (options.codePattern) {\n const pattern = new RegExp(options.codePattern, \"i\");\n results = results.filter((p) => pattern.test(p.code));\n }\n\n // Filter by name pattern\n if (options.namePattern) {\n const pattern = new RegExp(options.namePattern, \"i\");\n results = results.filter((p) => pattern.test(p.name));\n }\n\n // Filter by tags\n if (options.tags && options.tags.length > 0) {\n results = results.filter((p) =>\n options.tags!.some((tag) => p.tags?.includes(tag))\n );\n }\n\n // Filter by progress range\n if (options.minProgress !== undefined) {\n results = results.filter((p) => p.progress >= options.minProgress!);\n }\n if (options.maxProgress !== undefined) {\n results = results.filter((p) => p.progress <= options.maxProgress!);\n }\n\n // Sort\n if (options.sortBy) {\n const dir = options.sortDir === \"desc\" ? -1 : 1;\n results.sort((a, b) => {\n const aVal = a[options.sortBy as keyof RegisteredPlan];\n const bVal = b[options.sortBy as keyof RegisteredPlan];\n\n if (aVal === undefined || aVal === null) return 1 * dir;\n if (bVal === undefined || bVal === null) return -1 * dir;\n\n if (typeof aVal === \"string\" && typeof bVal === \"string\") {\n return aVal.localeCompare(bVal) * dir;\n }\n if (typeof aVal === \"number\" && typeof bVal === \"number\") {\n return (aVal - bVal) * dir;\n }\n if (aVal instanceof Date && bVal instanceof Date) {\n return (aVal.getTime() - bVal.getTime()) * dir;\n }\n\n return 0;\n });\n }\n\n const total = results.length;\n\n // Pagination\n if (options.offset !== undefined) {\n results = results.slice(options.offset);\n }\n if (options.limit !== undefined) {\n results = results.slice(0, options.limit);\n }\n\n return { plans: results, total };\n}\n\n/**\n * Get a plan by code\n */\nexport function getPlanByCode(\n registry: PlanRegistry,\n code: string\n): RegisteredPlan | null {\n const paths = registry.byCode.get(code);\n if (!paths || paths.length === 0) return null;\n\n return registry.plans.get(paths[0]) || null;\n}\n\n/**\n * Get a plan by path\n */\nexport function getPlanByPath(\n registry: PlanRegistry,\n path: string\n): RegisteredPlan | null {\n return registry.plans.get(resolve(path)) || null;\n}\n\n/**\n * Get all plans with a specific status\n */\nexport function getPlansByStatus(\n registry: PlanRegistry,\n status: TaskStatus\n): RegisteredPlan[] {\n const paths = registry.byStatus.get(status) || [];\n return paths\n .map((p) => registry.plans.get(p))\n .filter((p): p is RegisteredPlan => p !== undefined);\n}\n\n// ===== STATISTICS =====\n\n/**\n * Get registry statistics\n */\nexport interface RegistryStats {\n totalPlans: number;\n byStatus: Record<TaskStatus, number>;\n averageProgress: number;\n oldestPlan?: RegisteredPlan;\n newestPlan?: RegisteredPlan;\n searchPathCount: number;\n}\n\n/**\n * Get statistics about the registry\n */\nexport function getRegistryStats(registry: PlanRegistry): RegistryStats {\n const plans = Array.from(registry.plans.values());\n\n const byStatus: Record<TaskStatus, number> = {\n pending: 0,\n in_progress: 0,\n completed: 0,\n failed: 0,\n blocked: 0,\n skipped: 0,\n };\n\n for (const plan of plans) {\n byStatus[plan.status]++;\n }\n\n const totalProgress = plans.reduce((sum, p) => sum + p.progress, 0);\n const averageProgress =\n plans.length > 0 ? Math.round(totalProgress / plans.length) : 0;\n\n const sortedByDate = [...plans].sort(\n (a, b) => a.registeredAt.getTime() - b.registeredAt.getTime()\n );\n\n return {\n totalPlans: plans.length,\n byStatus,\n averageProgress,\n oldestPlan: sortedByDate[0],\n newestPlan: sortedByDate[sortedByDate.length - 1],\n searchPathCount: registry.searchPaths.length,\n };\n}\n\n","/**\n * Retrospective Generation\n *\n * Generate RETROSPECTIVE.md files for completed plans.\n */\n\nimport { writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Plan } from \"../types.js\";\n\n/**\n * Retrospective data structure\n */\nexport interface Retrospective {\n /** Plan name */\n planName: string;\n\n /** Plan code */\n planCode: string;\n\n /** When the plan started */\n startedAt?: Date;\n\n /** When the plan completed */\n completedAt?: Date;\n\n /** Total duration in milliseconds */\n duration?: number;\n\n /** Total steps */\n totalSteps: number;\n\n /** Completed steps */\n completedSteps: number;\n\n /** Skipped steps */\n skippedSteps: number;\n\n /** What went well */\n whatWentWell: string[];\n\n /** What could improve */\n whatCouldImprove: string[];\n\n /** Key learnings */\n keyLearnings: string[];\n\n /** Action items for future */\n actionItems: string[];\n\n /** Steps summary */\n stepsSummary: Array<{\n number: number;\n title: string;\n status: string;\n duration?: number;\n notes?: string;\n }>;\n}\n\n/**\n * Options for generating a retrospective\n */\nexport interface GenerateRetrospectiveOptions {\n /** Custom \"what went well\" entries */\n whatWentWell?: string[];\n\n /** Custom \"what could improve\" entries */\n whatCouldImprove?: string[];\n\n /** Custom key learnings */\n keyLearnings?: string[];\n\n /** Custom action items */\n actionItems?: string[];\n\n /** Author */\n author?: string;\n}\n\n/**\n * Generate retrospective data from a plan\n */\nexport function generateRetrospective(\n plan: Plan,\n options?: GenerateRetrospectiveOptions\n): Retrospective {\n const steps = plan.steps || [];\n const completedSteps = steps.filter((s) => s.status === \"completed\");\n const skippedSteps = steps.filter((s) => s.status === \"skipped\");\n\n // Calculate duration if dates available\n let duration: number | undefined;\n if (plan.state.startedAt && plan.state.completedAt) {\n const start =\n plan.state.startedAt instanceof Date\n ? plan.state.startedAt.getTime()\n : new Date(plan.state.startedAt).getTime();\n const end =\n plan.state.completedAt instanceof Date\n ? plan.state.completedAt.getTime()\n : new Date(plan.state.completedAt).getTime();\n duration = end - start;\n }\n\n // Auto-generate insights from plan data\n const whatWentWell = options?.whatWentWell || generateWhatWentWell(plan);\n const whatCouldImprove =\n options?.whatCouldImprove || generateWhatCouldImprove(plan);\n const keyLearnings = options?.keyLearnings || [];\n const actionItems = options?.actionItems || [];\n\n return {\n planName: plan.metadata.name,\n planCode: plan.metadata.code,\n startedAt: plan.state.startedAt,\n completedAt: plan.state.completedAt,\n duration,\n totalSteps: steps.length,\n completedSteps: completedSteps.length,\n skippedSteps: skippedSteps.length,\n whatWentWell,\n whatCouldImprove,\n keyLearnings,\n actionItems,\n stepsSummary: steps.map((s) => ({\n number: s.number,\n title: s.title,\n status: s.status,\n duration: s.duration,\n notes: s.notes,\n })),\n };\n}\n\n/**\n * Auto-generate \"what went well\" based on plan data\n */\nfunction generateWhatWentWell(plan: Plan): string[] {\n const items: string[] = [];\n const steps = plan.steps || [];\n\n // Check completion rate\n const completed = steps.filter((s) => s.status === \"completed\").length;\n const rate = steps.length > 0 ? (completed / steps.length) * 100 : 0;\n\n if (rate === 100) {\n items.push(\"All steps completed successfully\");\n } else if (rate >= 90) {\n items.push(`High completion rate (${rate.toFixed(0)}%)`);\n }\n\n // Check for no blockers\n if (plan.state.blockers.length === 0) {\n items.push(\"No blockers encountered\");\n }\n\n // Check for feedback integration\n if (plan.feedback && plan.feedback.length > 0) {\n items.push(`Successfully incorporated ${plan.feedback.length} feedback item(s)`);\n }\n\n return items;\n}\n\n/**\n * Auto-generate \"what could improve\" based on plan data\n */\nfunction generateWhatCouldImprove(plan: Plan): string[] {\n const items: string[] = [];\n const steps = plan.steps || [];\n\n // Check for skipped steps\n const skipped = steps.filter((s) => s.status === \"skipped\");\n if (skipped.length > 0) {\n items.push(`${skipped.length} step(s) were skipped - review if necessary`);\n }\n\n // Check for blockers\n if (plan.state.blockers.length > 0) {\n items.push(\n `Address recurring blockers: ${plan.state.blockers.map((b) => b.description).join(\", \")}`\n );\n }\n\n // Check for issues\n if (plan.state.issues.length > 0) {\n items.push(`Resolve outstanding issues before next iteration`);\n }\n\n return items;\n}\n\n/**\n * Generate RETROSPECTIVE.md content\n */\nexport function generateRetrospectiveMarkdown(retro: Retrospective): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`# Retrospective: ${retro.planName}\\n`);\n lines.push(`**Plan Code:** ${retro.planCode}\\n`);\n\n // Dates\n if (retro.startedAt) {\n lines.push(`**Started:** ${formatDate(retro.startedAt)}`);\n }\n if (retro.completedAt) {\n lines.push(`**Completed:** ${formatDate(retro.completedAt)}`);\n }\n if (retro.duration) {\n lines.push(`**Duration:** ${formatDuration(retro.duration)}`);\n }\n lines.push(\"\");\n\n // Summary\n lines.push(\"## Summary\\n\");\n lines.push(`| Metric | Value |`);\n lines.push(`|--------|-------|`);\n lines.push(`| Total Steps | ${retro.totalSteps} |`);\n lines.push(`| Completed | ${retro.completedSteps} |`);\n lines.push(`| Skipped | ${retro.skippedSteps} |`);\n lines.push(\n `| Completion Rate | ${((retro.completedSteps / retro.totalSteps) * 100).toFixed(0)}% |`\n );\n lines.push(\"\");\n\n // What Went Well\n lines.push(\"## What Went Well\\n\");\n if (retro.whatWentWell.length > 0) {\n for (const item of retro.whatWentWell) {\n lines.push(`- βœ… ${item}`);\n }\n } else {\n lines.push(\"*No entries yet. Add your insights here.*\");\n }\n lines.push(\"\");\n\n // What Could Improve\n lines.push(\"## What Could Improve\\n\");\n if (retro.whatCouldImprove.length > 0) {\n for (const item of retro.whatCouldImprove) {\n lines.push(`- πŸ”„ ${item}`);\n }\n } else {\n lines.push(\"*No entries yet. Add your insights here.*\");\n }\n lines.push(\"\");\n\n // Key Learnings\n lines.push(\"## Key Learnings\\n\");\n if (retro.keyLearnings.length > 0) {\n for (const item of retro.keyLearnings) {\n lines.push(`- πŸ’‘ ${item}`);\n }\n } else {\n lines.push(\"*What did you learn? Document it here.*\");\n }\n lines.push(\"\");\n\n // Action Items\n lines.push(\"## Action Items\\n\");\n if (retro.actionItems.length > 0) {\n for (const item of retro.actionItems) {\n lines.push(`- [ ] ${item}`);\n }\n } else {\n lines.push(\"*Any follow-up tasks? Add them here.*\");\n }\n lines.push(\"\");\n\n // Steps Summary\n lines.push(\"## Steps Summary\\n\");\n lines.push(`| # | Title | Status | Notes |`);\n lines.push(`|---|-------|--------|-------|`);\n for (const step of retro.stepsSummary) {\n const status = formatStepStatus(step.status);\n const notes = step.notes || \"-\";\n lines.push(`| ${step.number} | ${step.title} | ${status} | ${notes} |`);\n }\n lines.push(\"\");\n\n // Footer\n lines.push(\"---\");\n lines.push(`*Generated on ${new Date().toISOString().split(\"T\")[0]}*`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Create and save a RETROSPECTIVE.md file\n */\nexport async function createRetrospective(\n plan: Plan,\n options?: GenerateRetrospectiveOptions\n): Promise<string> {\n const retro = generateRetrospective(plan, options);\n const content = generateRetrospectiveMarkdown(retro);\n\n const retroPath = join(plan.metadata.path, \"RETROSPECTIVE.md\");\n await writeFile(retroPath, content, \"utf-8\");\n\n return retroPath;\n}\n\n/**\n * Format a date for display\n */\nfunction formatDate(date: Date | string): string {\n if (typeof date === \"string\") return date;\n return date.toISOString().split(\"T\")[0];\n}\n\n/**\n * Format duration in human-readable form\n */\nfunction formatDuration(ms: number): string {\n const hours = Math.floor(ms / (1000 * 60 * 60));\n const minutes = Math.floor((ms % (1000 * 60 * 60)) / (1000 * 60));\n const days = Math.floor(hours / 24);\n\n if (days > 0) {\n return `${days} day(s), ${hours % 24} hour(s)`;\n }\n if (hours > 0) {\n return `${hours} hour(s), ${minutes} minute(s)`;\n }\n return `${minutes} minute(s)`;\n}\n\n/**\n * Format step status with emoji\n */\nfunction formatStepStatus(status: string): string {\n const emojis: Record<string, string> = {\n completed: \"βœ…\",\n skipped: \"⏭️\",\n pending: \"⬜\",\n in_progress: \"πŸ”„\",\n blocked: \"⏸️\",\n };\n return `${emojis[status] || \"\"} ${status}`;\n}\n\n","/**\n * History Manager\n *\n * Manage plan history storage.\n */\n\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport type { PlanHistory } from \"../types.js\";\n\n/**\n * History manager interface\n */\nexport interface HistoryManager {\n /** History data */\n history: PlanHistory;\n\n /** Path to history file */\n path: string;\n\n /** Save history to disk */\n save(): Promise<void>;\n\n /** Reload history from disk */\n reload(): Promise<void>;\n}\n\n/**\n * Default history file name\n */\nconst HISTORY_FILE = \".history/HISTORY.json\";\n\n/**\n * Initialize a new history for a plan\n */\nexport function initHistory(initialVersion = \"0.1\"): PlanHistory {\n return {\n revisions: [\n {\n version: initialVersion,\n createdAt: new Date(),\n message: \"Initial version\",\n },\n ],\n currentVersion: initialVersion,\n milestones: [],\n };\n}\n\n/**\n * Load history from disk\n */\nexport async function loadHistory(planPath: string): Promise<HistoryManager> {\n const historyPath = join(planPath, HISTORY_FILE);\n\n let history: PlanHistory;\n\n try {\n const content = await readFile(historyPath, \"utf-8\");\n const data = JSON.parse(content);\n\n // Parse dates\n history = {\n ...data,\n revisions: data.revisions.map((r: Record<string, unknown>) => ({\n ...r,\n createdAt: new Date(r.createdAt as string),\n })),\n milestones: data.milestones?.map((m: Record<string, unknown>) => ({\n ...m,\n createdAt: new Date(m.createdAt as string),\n })),\n };\n } catch {\n // Initialize new history if file doesn't exist\n history = initHistory();\n }\n\n return createHistoryManager(history, historyPath);\n}\n\n/**\n * Save history to disk\n */\nexport async function saveHistory(\n history: PlanHistory,\n planPath: string,\n): Promise<void> {\n const historyPath = join(planPath, HISTORY_FILE);\n\n // Ensure directory exists\n await mkdir(dirname(historyPath), { recursive: true });\n\n // Serialize with date conversion\n const data = {\n ...history,\n revisions: history.revisions.map((r) => ({\n ...r,\n createdAt:\n r.createdAt instanceof Date ? r.createdAt.toISOString() : r.createdAt,\n })),\n milestones: history.milestones?.map((m) => ({\n ...m,\n createdAt:\n m.createdAt instanceof Date ? m.createdAt.toISOString() : m.createdAt,\n })),\n };\n\n await writeFile(historyPath, JSON.stringify(data, null, 2), \"utf-8\");\n}\n\n/**\n * Create a history manager instance\n */\nfunction createHistoryManager(\n history: PlanHistory,\n path: string,\n): HistoryManager {\n return {\n history,\n path,\n async save() {\n const planPath = dirname(dirname(path));\n await saveHistory(history, planPath);\n },\n async reload() {\n const planPath = dirname(dirname(path));\n const reloaded = await loadHistory(planPath);\n Object.assign(history, reloaded.history);\n },\n };\n}\n","/**\n * Revision Management\n *\n * Create and manage plan revisions.\n */\n\nimport type { PlanHistory, PlanRevision } from \"../types.js\";\n\n/**\n * Extended revision info with computed fields\n */\nexport interface RevisionInfo extends PlanRevision {\n /** Revision index in history */\n index: number;\n\n /** Whether this is the current revision */\n isCurrent: boolean;\n}\n\n/**\n * Create a new revision\n */\nexport function createRevision(\n history: PlanHistory,\n message: string,\n options?: {\n author?: string;\n feedbackId?: string;\n },\n): PlanRevision {\n const currentVersion = history.currentVersion;\n const [major, minor] = currentVersion.split(\".\").map(Number);\n const newVersion = `${major}.${minor + 1}`;\n\n const revision: PlanRevision = {\n version: newVersion,\n createdAt: new Date(),\n message,\n author: options?.author,\n feedbackId: options?.feedbackId,\n };\n\n history.revisions.push(revision);\n history.currentVersion = newVersion;\n\n return revision;\n}\n\n/**\n * Get a specific revision by version\n */\nexport function getRevision(\n history: PlanHistory,\n version: string,\n): RevisionInfo | undefined {\n const index = history.revisions.findIndex((r) => r.version === version);\n if (index === -1) return undefined;\n\n const revision = history.revisions[index];\n return {\n ...revision,\n index,\n isCurrent: revision.version === history.currentVersion,\n };\n}\n\n/**\n * List all revisions\n */\nexport function listRevisions(history: PlanHistory): RevisionInfo[] {\n return history.revisions.map((r, index) => ({\n ...r,\n index,\n isCurrent: r.version === history.currentVersion,\n }));\n}\n\n/**\n * Comparison result between revisions\n */\nexport interface RevisionComparison {\n /** Earlier revision */\n from: RevisionInfo;\n\n /** Later revision */\n to: RevisionInfo;\n\n /** Time difference in milliseconds */\n timeDiff: number;\n\n /** Number of revisions between */\n revisionCount: number;\n}\n\n/**\n * Compare two revisions\n */\nexport function compareRevisions(\n history: PlanHistory,\n fromVersion: string,\n toVersion: string,\n): RevisionComparison | undefined {\n const from = getRevision(history, fromVersion);\n const to = getRevision(history, toVersion);\n\n if (!from || !to) return undefined;\n\n const fromTime =\n from.createdAt instanceof Date\n ? from.createdAt.getTime()\n : new Date(from.createdAt).getTime();\n const toTime =\n to.createdAt instanceof Date\n ? to.createdAt.getTime()\n : new Date(to.createdAt).getTime();\n\n return {\n from,\n to,\n timeDiff: toTime - fromTime,\n revisionCount: Math.abs(to.index - from.index),\n };\n}\n\n/**\n * Get the latest revision\n */\nexport function getLatestRevision(\n history: PlanHistory,\n): RevisionInfo | undefined {\n if (history.revisions.length === 0) return undefined;\n\n const index = history.revisions.length - 1;\n const revision = history.revisions[index];\n\n return {\n ...revision,\n index,\n isCurrent: true,\n };\n}\n\n/**\n * Generate a new version number\n */\nexport function nextVersion(currentVersion: string): string {\n const [major, minor] = currentVersion.split(\".\").map(Number);\n return `${major}.${minor + 1}`;\n}\n","/**\n * Milestone Management\n *\n * Create and manage plan milestones.\n */\n\nimport type { PlanHistory, PlanMilestone } from \"../types.js\";\n\n/**\n * Extended milestone info\n */\nexport interface MilestoneInfo extends PlanMilestone {\n /** Milestone index */\n index: number;\n}\n\n/**\n * Create a new milestone\n */\nexport function createMilestone(\n history: PlanHistory,\n name: string,\n description?: string,\n): PlanMilestone {\n const milestone: PlanMilestone = {\n name,\n version: history.currentVersion,\n createdAt: new Date(),\n description,\n };\n\n if (!history.milestones) {\n history.milestones = [];\n }\n\n history.milestones.push(milestone);\n\n return milestone;\n}\n\n/**\n * Get a milestone by name\n */\nexport function getMilestone(\n history: PlanHistory,\n name: string,\n): MilestoneInfo | undefined {\n if (!history.milestones) return undefined;\n\n const index = history.milestones.findIndex((m) => m.name === name);\n if (index === -1) return undefined;\n\n return {\n ...history.milestones[index],\n index,\n };\n}\n\n/**\n * List all milestones\n */\nexport function listMilestones(history: PlanHistory): MilestoneInfo[] {\n if (!history.milestones) return [];\n\n return history.milestones.map((m, index) => ({\n ...m,\n index,\n }));\n}\n\n/**\n * Rollback result\n */\nexport interface RollbackResult {\n /** Whether rollback succeeded */\n success: boolean;\n\n /** Target milestone */\n milestone?: MilestoneInfo;\n\n /** New current version */\n newVersion?: string;\n\n /** Revisions rolled back */\n revisionsRolledBack?: number;\n\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Rollback to a milestone\n *\n * This resets the current version to the milestone's version.\n * Revisions after the milestone are kept but no longer current.\n */\nexport function rollbackToMilestone(\n history: PlanHistory,\n milestoneName: string,\n): RollbackResult {\n const milestone = getMilestone(history, milestoneName);\n\n if (!milestone) {\n return {\n success: false,\n error: `Milestone not found: ${milestoneName}`,\n };\n }\n\n // Count how many revisions we're rolling back\n const currentIndex = history.revisions.findIndex(\n (r) => r.version === history.currentVersion,\n );\n const targetIndex = history.revisions.findIndex(\n (r) => r.version === milestone.version,\n );\n\n if (targetIndex === -1) {\n return {\n success: false,\n error: `Revision not found for milestone: ${milestone.version}`,\n };\n }\n\n const revisionsRolledBack = currentIndex - targetIndex;\n\n // Update current version\n history.currentVersion = milestone.version;\n\n return {\n success: true,\n milestone,\n newVersion: milestone.version,\n revisionsRolledBack,\n };\n}\n\n/**\n * Get the latest milestone\n */\nexport function getLatestMilestone(\n history: PlanHistory,\n): MilestoneInfo | undefined {\n if (!history.milestones || history.milestones.length === 0) {\n return undefined;\n }\n\n const index = history.milestones.length - 1;\n return {\n ...history.milestones[index],\n index,\n };\n}\n","/**\n * Main render function\n *\n * Render a plan to different formats.\n */\n\nimport type { Plan } from \"../types.js\";\nimport {\n renderToMarkdown,\n type MarkdownRenderOptions,\n} from \"./renderers/markdown.js\";\nimport { renderToJson, type JsonRenderOptions } from \"./renderers/json.js\";\nimport { renderToHtml, type HtmlRenderOptions } from \"./renderers/html.js\";\n\n/**\n * Supported render formats\n */\nexport type RenderFormat = \"markdown\" | \"json\" | \"html\";\n\n/**\n * Render options (union of all format-specific options)\n */\nexport type RenderOptions = {\n /** Output format */\n format: RenderFormat;\n} & Partial<MarkdownRenderOptions & JsonRenderOptions & HtmlRenderOptions>;\n\n/**\n * Result of rendering a plan\n */\nexport interface RenderResult {\n /** Whether rendering succeeded */\n success: boolean;\n\n /** Rendered output content */\n content?: string;\n\n /** Output format */\n format?: RenderFormat;\n\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Render a plan to the specified format\n */\nexport function renderPlan(plan: Plan, options: RenderOptions): RenderResult {\n try {\n let content: string;\n\n switch (options.format) {\n case \"markdown\":\n content = renderToMarkdown(plan, options);\n break;\n\n case \"json\":\n content = renderToJson(plan, options);\n break;\n\n case \"html\":\n content = renderToHtml(plan, options);\n break;\n\n default:\n return {\n success: false,\n error: `Unknown format: ${options.format}`,\n };\n }\n\n return {\n success: true,\n content,\n format: options.format,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown render error\",\n };\n }\n}\n","/**\n * Execution Module\n *\n * Provides integration with LLM execution providers for automated step execution.\n * This module wraps @riotprompt/execution and provider-specific packages.\n */\n\nimport type { Plan, PlanStep, StepResult } from \"../types.js\";\n\n/**\n * Available execution providers\n */\nexport type ExecutionProviderType = \"anthropic\" | \"openai\" | \"gemini\" | \"mock\";\n\n/**\n * Configuration for an execution provider\n */\nexport interface ProviderConfig {\n /** Provider type */\n type: ExecutionProviderType;\n\n /** API key (if required) */\n apiKey?: string;\n\n /** Model to use */\n model?: string;\n\n /** Maximum tokens */\n maxTokens?: number;\n\n /** Temperature */\n temperature?: number;\n}\n\n/**\n * Execution context passed to step execution\n */\nexport interface ExecutionContext {\n /** The plan being executed */\n plan: Plan;\n\n /** Current step being executed */\n step: PlanStep;\n\n /** Provider configuration */\n provider: ProviderConfig;\n\n /** Environment variables */\n env?: Record<string, string>;\n\n /** Working directory */\n workingDirectory?: string;\n\n /** Callback for progress updates */\n onProgress?: (message: string) => void;\n\n /** Callback for step completion */\n onComplete?: (result: StepResult) => void;\n}\n\n/**\n * Step executor interface\n */\nexport interface StepExecutor {\n /** Execute a single step */\n execute(context: ExecutionContext): Promise<StepResult>;\n}\n\n/**\n * Mock step executor for testing\n */\nexport class MockStepExecutor implements StepExecutor {\n private delay: number;\n private shouldFail: boolean;\n\n constructor(options?: { delay?: number; shouldFail?: boolean }) {\n this.delay = options?.delay ?? 100;\n this.shouldFail = options?.shouldFail ?? false;\n }\n\n async execute(context: ExecutionContext): Promise<StepResult> {\n // Simulate execution time\n await new Promise((resolve) => setTimeout(resolve, this.delay));\n\n context.onProgress?.(`Executing step ${context.step.number}...`);\n\n if (this.shouldFail) {\n return {\n success: false,\n step: context.step.number,\n error: new Error(\"Mock execution failed\"),\n duration: 0,\n };\n }\n\n return {\n success: true,\n step: context.step.number,\n output: `Completed step ${context.step.number}: ${context.step.title}`,\n duration: 0,\n };\n }\n}\n\n/**\n * Create a step executor for the given provider\n *\n * Note: This currently only supports mock execution.\n * Full provider integration requires importing @riotprompt/execution-* packages.\n */\nexport function createExecutor(config: ProviderConfig): StepExecutor {\n switch (config.type) {\n case \"mock\":\n return new MockStepExecutor();\n\n case \"anthropic\":\n case \"openai\":\n case \"gemini\":\n // For real providers, users should import the specific execution package\n throw new Error(\n `Provider '${config.type}' requires @riotprompt/execution-${config.type} package. ` +\n `Import and configure it directly for LLM-powered execution.`\n );\n\n default:\n throw new Error(`Unknown provider: ${config.type}`);\n }\n}\n\n/**\n * Execute a step with the given executor\n */\nexport async function executeStep(\n executor: StepExecutor,\n plan: Plan,\n stepNumber: number,\n options?: {\n provider?: ProviderConfig;\n workingDirectory?: string;\n env?: Record<string, string>;\n onProgress?: (message: string) => void;\n onComplete?: (result: StepResult) => void;\n }\n): Promise<StepResult> {\n const step = plan.steps?.find((s) => s.number === stepNumber);\n\n if (!step) {\n return {\n success: false,\n step: stepNumber,\n error: new Error(`Step ${stepNumber} not found`),\n duration: 0,\n };\n }\n\n const context: ExecutionContext = {\n plan,\n step,\n provider: options?.provider ?? { type: \"mock\" },\n workingDirectory: options?.workingDirectory,\n env: options?.env,\n onProgress: options?.onProgress,\n onComplete: options?.onComplete,\n };\n\n const result = await executor.execute(context);\n\n options?.onComplete?.(result);\n\n return result;\n}\n\n/**\n * Execute all pending steps in a plan\n */\nexport async function executePendingSteps(\n executor: StepExecutor,\n plan: Plan,\n options?: {\n provider?: ProviderConfig;\n stopOnError?: boolean;\n onProgress?: (step: number, message: string) => void;\n onStepComplete?: (step: number, result: StepResult) => void;\n }\n): Promise<StepResult[]> {\n const results: StepResult[] = [];\n const pendingSteps =\n plan.steps?.filter((s) => s.status === \"pending\") ??\n [];\n\n for (const step of pendingSteps) {\n const result = await executeStep(executor, plan, step.number, {\n provider: options?.provider,\n onProgress: (msg) => options?.onProgress?.(step.number, msg),\n onComplete: (res) => options?.onStepComplete?.(step.number, res),\n });\n\n results.push(result);\n\n if (!result.success && options?.stopOnError) {\n break;\n }\n }\n\n return results;\n}\n\n/**\n * Provider-specific executor factory type\n *\n * External provider packages should export functions matching this signature.\n */\nexport type ExecutorFactory = (config: ProviderConfig) => StepExecutor;\n\n","/**\n * Output Utilities\n *\n * Consistent formatting for CLI output.\n */\n\nimport chalk from \"chalk\";\nimport type { Plan, PlanStep, TaskStatus } from \"../../types.js\";\n\n/**\n * Output a success message\n */\nexport function outputSuccess(message: string): void {\n console.log(chalk.green(\"βœ“\") + \" \" + message);\n}\n\n/**\n * Output an error message\n */\nexport function outputError(message: string): void {\n console.error(chalk.red(\"βœ—\") + \" \" + message);\n}\n\n/**\n * Output a warning message\n */\nexport function outputWarning(message: string): void {\n console.log(chalk.yellow(\"⚠\") + \" \" + message);\n}\n\n/**\n * Output an info message\n */\nexport function outputInfo(message: string): void {\n console.log(chalk.blue(\"β„Ή\") + \" \" + message);\n}\n\n/**\n * Get emoji icon for status\n */\nexport function getStatusIcon(status: TaskStatus): string {\n const icons: Record<TaskStatus, string> = {\n pending: \"⬜\",\n in_progress: \"πŸ”„\",\n completed: \"βœ…\",\n failed: \"❌\",\n blocked: \"⏸️\",\n skipped: \"⏭️\",\n };\n return icons[status] || \"⬜\";\n}\n\n/**\n * Format status with color\n */\nexport function formatStatus(status: TaskStatus): string {\n const colors: Record<TaskStatus, (s: string) => string> = {\n pending: chalk.dim,\n in_progress: chalk.yellow,\n completed: chalk.green,\n failed: chalk.red,\n blocked: chalk.magenta,\n skipped: chalk.gray,\n };\n const color = colors[status] || chalk.white;\n return color(status.replace(\"_\", \" \"));\n}\n\n/**\n * Output a list of steps\n */\nexport function outputStepList(steps: PlanStep[]): void {\n for (const step of steps) {\n const num = String(step.number).padStart(2, \"0\");\n const icon = getStatusIcon(step.status);\n const status = formatStatus(step.status);\n console.log(\n ` ${icon} ${chalk.bold(num)} ${step.title} ${chalk.dim(`[${status}]`)}`\n );\n }\n}\n\n/**\n * Output a plan summary\n */\nexport function outputPlanSummary(plan: Plan): void {\n const { metadata, state, steps } = plan;\n const completedCount = steps.filter((s) => s.status === \"completed\").length;\n\n console.log();\n console.log(chalk.bold(metadata.name));\n console.log(chalk.dim(`Code: ${metadata.code}`));\n console.log();\n console.log(\n `Status: ${getStatusIcon(state.status)} ${formatStatus(state.status)}`\n );\n console.log(\n `Progress: ${state.progress}% (${completedCount}/${steps.length} steps)`\n );\n\n if (state.currentStep) {\n const currentStep = steps.find((s) => s.number === state.currentStep);\n if (currentStep) {\n console.log(\n `Current: Step ${state.currentStep} - ${currentStep.title}`\n );\n }\n }\n\n if (state.blockers.length > 0) {\n console.log();\n console.log(chalk.yellow(`Blockers: ${state.blockers.length}`));\n for (const blocker of state.blockers) {\n console.log(chalk.dim(` - ${blocker.description}`));\n }\n }\n}\n\n/**\n * Output data as JSON\n */\nexport function outputJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n\n","/**\n * Error Handling Utilities\n */\n\nimport chalk from \"chalk\";\n\n/**\n * CLI-specific error with code and exit code\n */\nexport class CliError extends Error {\n constructor(\n message: string,\n public code: string,\n public exitCode: number = 1\n ) {\n super(message);\n this.name = \"CliError\";\n }\n}\n\n/**\n * Handle errors and exit appropriately\n */\nexport function handleError(error: unknown): never {\n if (error instanceof CliError) {\n console.error(chalk.red(`Error [${error.code}]: ${error.message}`));\n process.exit(error.exitCode);\n }\n\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n if (process.env.DEBUG) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n\n console.error(chalk.red(\"An unknown error occurred\"));\n process.exit(1);\n}\n\n/**\n * Show \"not implemented\" message for future features\n */\nexport function notImplemented(feature: string): never {\n console.log(chalk.yellow(`⚠ ${feature} is not yet implemented.`));\n console.log(chalk.dim(\"Check back in a future version!\"));\n process.exit(0);\n}\n\n","/**\n * RiotPlan - Framework for long-lived, stateful AI workflows\n *\n * A plan is a structured way to manage multi-step AI-assisted tasks that:\n * - Span multiple sessions/days\n * - Have persistent state (STATUS.md)\n * - Are organized into numbered steps\n * - Can be interrupted and resumed\n * - Track progress with checkboxes and statuses\n *\n * @example Plan directory structure:\n * ```\n * my-plan/\n * β”œβ”€β”€ my-plan-prompt.md # Meta-prompt (prompt-of-prompts)\n * β”œβ”€β”€ SUMMARY.md # Overview of the approach\n * β”œβ”€β”€ EXECUTION_PLAN.md # Step-by-step strategy\n * β”œβ”€β”€ STATUS.md # Current state (auto-updated)\n * β”œβ”€β”€ plan/ # Step files (optional subdirectory)\n * β”‚ β”œβ”€β”€ 01-first-step.md\n * β”‚ β”œβ”€β”€ 02-second-step.md\n * β”‚ └── ...\n * └── analysis/ # Analysis output (optional)\n * ```\n */\n\n// ===== EXPORTS =====\n\n// Types\nexport type {\n TaskStatus,\n Priority,\n // Feedback types\n FeedbackPlatform,\n FeedbackParticipant,\n FeedbackContext,\n FeedbackRecord,\n // Evidence types\n EvidenceType,\n EvidenceRecord,\n // Revision/History types\n PlanRevision,\n PlanMilestone,\n PlanHistory,\n // Context types\n ContextId,\n PlanContextDefinition,\n // Cross-plan relationship types\n RelationshipType,\n PlanRelationship,\n // Plan structure types\n PlanStep,\n PlanPhase,\n Blocker,\n Issue,\n PlanMetadata,\n PlanFiles,\n PlanState,\n Plan,\n PlanContext,\n StepResult,\n PlanResult,\n StatusDocument,\n ExecutionPlanDocument,\n} from \"./types.js\";\n\n// Constants\nexport { PLAN_CONVENTIONS } from \"./types.js\";\n\n// Plan Operations\nexport { loadPlan, type LoadPlanOptions } from \"./plan/loader.js\";\nexport {\n createPlan,\n type CreatePlanConfig,\n type CreatePlanResult,\n} from \"./plan/creator.js\";\n\nexport {\n validatePlan,\n type ValidationResult,\n type ValidationError,\n type ValidationWarning,\n type ValidationInfo,\n type FixableIssue,\n type ValidateOptions,\n} from \"./plan/validator.js\";\n\n// Prompt Storage\nexport {\n saveInitialPrompt,\n saveElaborationPrompt,\n saveAmendmentPrompt,\n loadElaborationPrompts,\n loadAmendmentPrompts,\n type SavedPrompt,\n} from \"./plan/prompts.js\";\n\n// Analysis Operations\nexport {\n createAnalysisDirectory,\n loadAnalysis,\n hasAnalysis,\n type Analysis,\n type ElaborationRecord,\n type AnalysisMetadata,\n type CreateAnalysisOptions,\n} from \"./analysis/index.js\";\n\n// Feedback Operations\nexport {\n createFeedback,\n listFeedback,\n getFeedback,\n type CreateFeedbackOptions,\n type CreateFeedbackResult,\n} from \"./feedback/index.js\";\n\n// Status Operations\nexport {\n parseStatus,\n type ParseStatusOptions,\n type ParseStatusResult,\n} from \"./status/parser.js\";\n\nexport {\n generateStatus,\n updateStatus,\n type GenerateStatusOptions,\n type UpdateStatusOptions,\n} from \"./status/generator.js\";\n\n// Step Operations\nexport {\n insertStep,\n removeStep,\n moveStep,\n blockStep,\n unblockStep,\n completeStep,\n startStep,\n skipStep,\n failStep,\n type InsertStepOptions,\n type InsertStepResult,\n type RemoveStepResult,\n type MoveStepResult,\n} from \"./steps/operations.js\";\n\n// Dependency Operations\nexport {\n // Parsing\n parseDependenciesFromContent,\n parseDependenciesFromFile,\n parseAllDependencies,\n // Graph Building\n buildDependencyGraph,\n buildDependencyGraphFromMap,\n // Validation\n validateDependencies,\n // Critical Path\n findCriticalPath,\n // Execution Order\n computeExecutionOrder,\n // Helpers\n getReadySteps,\n getBlockedSteps,\n getDependencyChain,\n updateStepDependencies,\n // Types\n type StepDependency,\n type DependencyGraph,\n type DependencyValidation,\n type DependencyError,\n type DependencyWarning,\n type CriticalPath,\n type ExecutionOrder,\n} from \"./dependencies/index.js\";\n\n// Relationship Operations (Cross-Plan Dependencies)\nexport {\n // Parsing\n parseRelationshipsFromContent,\n parseRelationshipsFromPlan,\n // Management\n addRelationship,\n removeRelationship,\n createBidirectionalRelationship,\n // Validation\n validateRelationships,\n // Queries\n getRelationshipsByType,\n getInverseRelationType,\n getBlockingPlans,\n getBlockedPlans,\n getParentPlan,\n getChildPlans,\n getRelatedPlans,\n // Serialization\n generateRelationshipsMarkdown,\n updatePlanRelationships,\n // Types\n type AddRelationshipOptions,\n type AddRelationshipResult,\n type RelationshipValidation,\n type InvalidRelationship,\n type ParsedRelationship,\n} from \"./relationships/index.js\";\n\n// Plan Registry Operations\nexport {\n // Registry Management\n createRegistry,\n loadRegistry,\n saveRegistry,\n getDefaultRegistryPath,\n // Plan Discovery\n scanForPlans,\n // Plan Registration\n registerPlan,\n unregisterPlan,\n refreshPlan,\n refreshAllPlans,\n // Search and Query\n searchPlans,\n getPlanByCode,\n getPlanByPath,\n getPlansByStatus,\n // Statistics\n getRegistryStats,\n // Types\n type RegisteredPlan,\n type PlanRegistry,\n type RegistryOptions,\n type SearchResult,\n type SearchOptions,\n type RegistryStats,\n} from \"./registry/index.js\";\n\n// Retrospective Operations\nexport {\n generateRetrospective,\n generateRetrospectiveMarkdown,\n createRetrospective,\n type Retrospective,\n type GenerateRetrospectiveOptions,\n} from \"./retrospective/index.js\";\n\n// History Operations\nexport {\n initHistory,\n loadHistory,\n saveHistory,\n type HistoryManager,\n} from \"./history/manager.js\";\n\nexport {\n createRevision,\n getRevision,\n listRevisions,\n compareRevisions,\n getLatestRevision,\n nextVersion,\n type RevisionInfo,\n type RevisionComparison,\n} from \"./history/revisions.js\";\n\nexport {\n createMilestone,\n getMilestone,\n listMilestones,\n rollbackToMilestone,\n getLatestMilestone,\n type MilestoneInfo,\n type RollbackResult,\n} from \"./history/milestones.js\";\n\n// Renderer Operations\nexport {\n renderPlan,\n renderToMarkdown,\n renderToJson,\n renderToHtml,\n type RenderFormat,\n type RenderOptions,\n type RenderResult,\n type MarkdownRenderOptions,\n type JsonRenderOptions,\n type HtmlRenderOptions,\n} from \"./renderer/index.js\";\n\n// Template Operations\nexport {\n listTemplates,\n getTemplate,\n registerTemplate,\n listTemplatesByCategory,\n searchTemplatesByTag,\n type PlanTemplate,\n type TemplateStep,\n} from \"./templates/registry.js\";\n\nexport {\n applyTemplate,\n type ApplyTemplateOptions,\n type ApplyTemplateResult,\n} from \"./templates/apply.js\";\n\nexport {\n BasicTemplate,\n FeatureTemplate,\n RefactoringTemplate,\n MigrationTemplate,\n SprintTemplate,\n} from \"./templates/templates/index.js\";\n\n// Execution Operations\nexport {\n createExecutor,\n executeStep as executeStepWithExecutor,\n executePendingSteps,\n MockStepExecutor,\n type ExecutionProviderType,\n type ProviderConfig,\n type ExecutionContext,\n type StepExecutor,\n type ExecutorFactory,\n} from \"./execution/index.js\";\n\n// CLI Utilities\nexport {\n outputSuccess,\n outputError,\n outputWarning,\n outputInfo,\n getStatusIcon,\n formatStatus,\n outputStepList,\n outputPlanSummary,\n outputJson,\n CliError,\n handleError,\n notImplemented,\n} from \"./cli/utils/index.js\";\n\nexport { createProgram } from \"./cli/cli.js\";\n\n// Plan Commands\nexport {\n registerPlanCommands,\n initCommand,\n validateCommand,\n archiveCommand,\n templateCommand,\n templateListCommand,\n templateShowCommand,\n templateUseCommand,\n} from \"./commands/plan/index.js\";\n\n// Render Commands\nexport {\n registerRenderCommands,\n renderCommand,\n} from \"./commands/render/index.js\";\n\n// Verification Types and Constants\nexport type {\n CriteriaPriority,\n CriteriaStatus,\n VerificationCriterion,\n CriterionResult,\n CoverageReport,\n StepCompletionStatus,\n AcceptanceCriterion,\n StepCompletionResult,\n CompletionReport,\n VerificationReport,\n} from \"./verification/index.js\";\n\nexport {\n PRIORITY_WEIGHTS,\n CRITERIA_PATTERNS,\n HEALTH_THRESHOLDS,\n} from \"./verification/index.js\";\n\n// Verification Criteria Parser\nexport type { ParsedCriteria } from \"./verification/index.js\";\n\nexport {\n parseCriteria,\n parseCriteriaFromContent,\n getCriteriaSummary,\n} from \"./verification/index.js\";\n\n// Verification Coverage Checker\nexport type { CoverageOptions } from \"./verification/index.js\";\n\nexport { checkCoverage } from \"./verification/index.js\";\n\n// Verification Completion Checker\nexport { checkCompletion } from \"./verification/index.js\";\n\n// Version\nexport const VERSION = \"0.0.1\";\n\n// ===== STUB IMPLEMENTATIONS =====\n// These will be implemented as the project develops\n\n/**\n * Execute a plan step\n *\n * @param plan - The plan\n * @param stepNumber - Step to execute\n * @param context - Execution context\n * @returns Step result\n *\n * @stub Not yet implemented\n */\nexport async function executeStep(\n _plan: unknown,\n _stepNumber: number,\n _context?: unknown\n): Promise<never> {\n throw new Error(\n \"riotplan.executeStep is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n/**\n * Resume a plan from its current state\n *\n * @param plan - The plan to resume\n * @param context - Execution context\n * @returns Plan result\n *\n * @stub Not yet implemented\n */\nexport async function resumePlan(\n _plan: unknown,\n _context?: unknown\n): Promise<never> {\n throw new Error(\n \"riotplan.resumePlan is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n/**\n * Update plan state after step completion\n *\n * @param plan - The plan\n * @param stepNumber - Completed step\n * @param result - Step result\n * @returns Updated plan\n *\n * @stub Not yet implemented\n */\nexport function updatePlanState(\n _plan: unknown,\n _stepNumber: number,\n _result: unknown\n): never {\n throw new Error(\n \"riotplan.updatePlanState is not yet implemented. Coming in v0.1.0!\"\n );\n}\n\n"],"names":["s","i","c","p","t","f","m","resolve","executeStep"],"mappings":"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"}
package/package.json CHANGED
@@ -1,10 +1,13 @@
1
1
  {
2
2
  "name": "@riotprompt/riotplan",
3
- "version": "0.0.4",
3
+ "version": "1.0.0",
4
4
  "description": "Framework for long-lived, stateful AI workflows (plans)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "riotplan": "./dist/bin.js"
10
+ },
8
11
  "exports": {
9
12
  ".": {
10
13
  "types": "./dist/index.d.ts",
@@ -20,7 +23,7 @@
20
23
  "test": "vitest run --coverage",
21
24
  "test:coverage": "vitest run --coverage",
22
25
  "lint": "eslint src",
23
- "precommit": "npm run lint && npm run test",
26
+ "precommit": "npm run build && npm run lint && npm run test",
24
27
  "prepublishOnly": "npm run clean && npm run build"
25
28
  },
26
29
  "keywords": [
@@ -39,13 +42,18 @@
39
42
  "url": "https://github.com/kjerneverk/riotplan"
40
43
  },
41
44
  "dependencies": {
45
+ "@theunwalked/cardigantime": "^0.0.22",
46
+ "@types/inquirer": "^9.0.9",
47
+ "chalk": "^5.4.1",
48
+ "commander": "^14.0.2",
49
+ "inquirer": "^13.2.1",
42
50
  "js-yaml": "^4.1.1",
43
51
  "marked": "^16.0.0"
44
52
  },
45
53
  "peerDependencies": {
46
- "@riotprompt/agentic": "^0.0.5",
47
- "@riotprompt/execution": "^0.0.4",
48
- "@riotprompt/riotprompt": "^0.0.21"
54
+ "@riotprompt/agentic": "^1.0.0",
55
+ "@riotprompt/execution": "^1.0.0",
56
+ "@riotprompt/riotprompt": "^1.0.0"
49
57
  },
50
58
  "peerDependenciesMeta": {
51
59
  "@riotprompt/agentic": {
@@ -1,6 +0,0 @@
1
- {
2
- "/Users/tobrien/gitw/kjerneverk/riotplan": {
3
- "lastTestRun": 1768074377328,
4
- "lastCommitHash": "42a1f26de39443084ae4f737e587726ded966f7e"
5
- }
6
- }