@riotprompt/riotplan 1.0.0 → 1.0.2-dev.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/bin.js +1 -1
- package/dist/{cli-DmsyaX1E.js → cli-BAr1IsMF.js} +175 -106
- package/dist/cli-BAr1IsMF.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/index.js +153 -92
- package/dist/index.js.map +1 -1
- package/package.json +10 -9
- package/dist/cli-DmsyaX1E.js.map +0 -1
package/dist/cli-DmsyaX1E.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-DmsyaX1E.js","sources":["../src/types.ts","../src/dependencies/index.ts","../src/plan/loader.ts","../src/plan/creator.ts","../src/plan/validator.ts","../src/plan/prompts.ts","../src/analysis/creator.ts","../src/analysis/loader.ts","../src/feedback/index.ts","../src/status/generator.ts","../src/steps/operations.ts","../src/renderer/renderers/markdown.ts","../src/renderer/renderers/json.ts","../src/renderer/renderers/html.ts","../src/templates/registry.ts","../src/templates/apply.ts","../src/templates/templates/basic.ts","../src/templates/templates/feature.ts","../src/templates/templates/refactoring.ts","../src/templates/templates/migration.ts","../src/templates/templates/sprint.ts","../src/templates/templates/index.ts","../src/commands/plan/init.ts","../src/commands/plan/validate.ts","../src/commands/plan/archive.ts","../src/commands/plan/template.ts","../src/commands/plan/index.ts","../src/commands/render/render.ts","../src/commands/render/index.ts","../src/cli/commands/status.ts","../src/cli/commands/step.ts","../src/cli/commands/feedback.ts","../src/ai/generator.ts","../src/ai/provider-loader.ts","../src/cli/commands/create.ts","../src/cli/commands/elaborate.ts","../src/cli/commands/analysis.ts","../src/cli/commands/generate.ts","../src/cli/commands/amend.ts","../src/verification/constants.ts","../src/verification/criteria-parser.ts","../src/verification/coverage-checker.ts","../src/verification/completion-checker.ts","../src/cli/commands/verify.ts","../src/cli/cli.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// ===== LLM PROVIDER TYPES =====\n\n/**\n * Message in a conversation\n */\nexport interface Message {\n role: 'user' | 'assistant' | 'system' | 'developer' | 'tool';\n content: string | string[] | null;\n name?: string;\n}\n\n/**\n * LLM request interface\n */\nexport interface Request {\n messages: Message[];\n model: string;\n responseFormat?: any;\n validator?: any;\n addMessage(message: Message): void;\n}\n\n/**\n * Response from an LLM provider\n */\nexport interface ProviderResponse {\n content: string;\n model: string;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n toolCalls?: Array<{\n id: string;\n type: 'function';\n function: {\n name: string;\n arguments: string;\n };\n }>;\n}\n\n/**\n * Options for execution\n */\nexport interface ExecutionOptions {\n apiKey?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n timeout?: number;\n retries?: number;\n}\n\n/**\n * Provider interface for LLM execution\n */\nexport interface Provider {\n readonly name: string;\n execute(request: Request, options?: ExecutionOptions): Promise<ProviderResponse>;\n supportsModel?(model: string): boolean;\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// ===== FEEDBACK TYPES =====\n\n/**\n * Platform where feedback occurred\n */\nexport type FeedbackPlatform =\n | \"cursor\"\n | \"chatgpt\"\n | \"slack\"\n | \"email\"\n | \"meeting\"\n | \"voice\"\n | \"document\"\n | \"other\";\n\n/**\n * Participant in a feedback discussion\n */\nexport interface FeedbackParticipant {\n /** Participant name */\n name: string;\n\n /** Type of participant */\n type: \"human\" | \"ai\";\n\n /** Model identifier for AI participants */\n model?: string;\n}\n\n/**\n * Context reference for feedback (file:lines)\n */\nexport interface FeedbackContext {\n /** File path */\n file: string;\n\n /** Start line number */\n startLine?: number;\n\n /** End line number */\n endLine?: number;\n\n /** Content excerpt */\n content?: string;\n}\n\n/**\n * Feedback record for deliberation capture\n *\n * Captures discussions, decisions, and changes made during plan development.\n * Each feedback record represents a deliberation session that influenced the plan.\n */\nexport interface FeedbackRecord {\n /** Unique identifier (e.g., \"001\", \"002\") */\n id: string;\n\n /** Title/subject of the feedback */\n title: string;\n\n /** When created */\n createdAt: Date;\n\n /** Participants in the discussion */\n participants: FeedbackParticipant[];\n\n /** Platform where feedback occurred */\n platform: FeedbackPlatform;\n\n /** Plan version this feedback relates to */\n planVersion?: string;\n\n /** Related file references (file:lines) */\n context?: FeedbackContext[];\n\n /** What was proposed before feedback */\n proposed?: string;\n\n /** The feedback given */\n feedback: string;\n\n /** Discussion/debate content */\n discussion?: string;\n\n /** Resolution/outcome */\n resolution?: string;\n\n /** Changes made as a result */\n changes?: string[];\n\n /** Open questions remaining */\n openQuestions?: string[];\n\n /** Filename (e.g., \"001-initial-review.md\") */\n filename: string;\n}\n\n// ===== EVIDENCE TYPES =====\n\n/**\n * Type of evidence gathered during inception phase\n */\nexport type EvidenceType =\n | \"case-study\" // what-happened-in-*.md\n | \"research\" // research-*.md\n | \"analysis\" // analysis-*.md\n | \"example\" // example-*.md\n | \"external-review\" // External AI review\n | \"reference\"; // Reference material\n\n/**\n * Evidence record for inception phase materials\n *\n * Tracks documentation gathered during plan inception to support\n * decisions and provide context for future reference.\n */\nexport interface EvidenceRecord {\n /** Unique identifier */\n id: string;\n\n /** Evidence type */\n type: EvidenceType;\n\n /** Title/description */\n title: string;\n\n /** When gathered */\n createdAt: Date;\n\n /** Source of evidence */\n source?: string;\n\n /** Filename */\n filename: string;\n\n /** Summary of key findings */\n summary?: string;\n\n /** Tags for categorization */\n tags?: string[];\n}\n\n// ===== REVISION/HISTORY TYPES =====\n\n/**\n * A single revision in plan history\n */\nexport interface PlanRevision {\n /** Version string (e.g., \"0.1\", \"0.2\") */\n version: string;\n\n /** When this revision was created */\n createdAt: Date;\n\n /** Commit message/description */\n message?: string;\n\n /** Author */\n author?: string;\n\n /** Feedback record that triggered this revision */\n feedbackId?: string;\n}\n\n/**\n * A milestone in plan history (explicit cleanup point)\n */\nexport interface PlanMilestone {\n /** Milestone name */\n name: string;\n\n /** Version at this milestone */\n version: string;\n\n /** When created */\n createdAt: Date;\n\n /** Description */\n description?: string;\n}\n\n/**\n * Plan version history\n *\n * Embedded version tracking without Git dependency.\n * Supports milestones for explicit cleanup points.\n */\nexport interface PlanHistory {\n /** All revisions in order */\n revisions: PlanRevision[];\n\n /** Current version */\n currentVersion: string;\n\n /** Milestones (explicit cleanup points) */\n milestones?: PlanMilestone[];\n}\n\n// ===== CONTEXT TYPES =====\n\n/**\n * Context identifier (e.g., \"work\", \"personal\", \"work/kjerneverk\")\n */\nexport type ContextId = string;\n\n/**\n * Plan context definition\n *\n * Contexts allow organizing plans by domain (work, personal, etc.)\n * with optional hierarchy support.\n */\nexport interface PlanContextDefinition {\n /** Context identifier */\n id: ContextId;\n\n /** Display name */\n name: string;\n\n /** Parent context (for hierarchy) */\n parent?: ContextId;\n\n /** Default for this directory? */\n isDefault?: boolean;\n}\n\n// ===== CROSS-PLAN RELATIONSHIP TYPES =====\n\n/**\n * Type of relationship between plans\n */\nexport type RelationshipType =\n | \"spawned-from\" // This plan was spawned from another\n | \"spawned\" // This plan spawned another\n | \"blocks\" // This plan blocks another\n | \"blocked-by\" // This plan is blocked by another\n | \"related\"; // General relationship\n\n/**\n * Relationship between plans\n *\n * Tracks dependencies, spawning, and other relationships\n * between plans for cross-plan coordination.\n */\nexport interface PlanRelationship {\n /** Type of relationship */\n type: RelationshipType;\n\n /** Related plan path */\n planPath: string;\n\n /** Specific step(s) involved */\n steps?: number[];\n\n /** Reason for relationship */\n reason?: string;\n\n /** When established */\n createdAt: Date;\n}\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 /** Feedback directory */\n feedbackDir?: string;\n\n /** Feedback files */\n feedbackFiles?: string[];\n\n /** Evidence directory */\n evidenceDir?: string;\n\n /** Evidence files */\n evidenceFiles?: string[];\n\n /** History directory */\n historyDir?: string;\n\n /** CHANGELOG.md */\n changelog?: 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 /** Feedback records */\n feedback?: FeedbackRecord[];\n\n /** Evidence files */\n evidence?: EvidenceRecord[];\n\n /** Revision history */\n history?: PlanHistory;\n\n /** Context assignment */\n context?: ContextId;\n\n /** Relationships to other plans */\n relationships?: PlanRelationship[];\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 (e.g., \"01-step-name.md\") */\n stepPattern: /^(\\d{2})-(.+)\\.md$/,\n\n /** Feedback file pattern (e.g., \"001-initial-review.md\") */\n feedbackPattern: /^(\\d{3})-(.+)\\.md$/,\n\n /** Evidence file patterns */\n evidencePatterns: [\n /^what-happened-in-(.+)\\.md$/,\n /^research-(.+)\\.md$/,\n /^analysis-(.+)\\.md$/,\n /^example-(.+)\\.md$/,\n ],\n\n /** Standard files */\n standardFiles: {\n summary: \"SUMMARY.md\",\n status: \"STATUS.md\",\n executionPlan: \"EXECUTION_PLAN.md\",\n readme: \"README.md\",\n changelog: \"CHANGELOG.md\",\n },\n\n /** Standard directories */\n standardDirs: {\n plan: \"plan\",\n analysis: \"analysis\",\n architecture: \"architecture\",\n implementation: \"implementation\",\n testing: \"testing\",\n feedback: \"feedback\",\n evidence: \"evidence\",\n history: \".history\",\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\n /** Emoji to status mapping (reverse lookup) */\n emojiToStatus: {\n \"⬜\": \"pending\",\n \"🔄\": \"in_progress\",\n \"✅\": \"completed\",\n \"❌\": \"failed\",\n \"⏸️\": \"blocked\",\n \"⏭️\": \"skipped\",\n } as Record<string, TaskStatus>,\n} as const;\n\n","/**\n * Dependencies Module\n *\n * Provides dependency tracking and analysis for plan steps:\n * - Parse dependencies from step markdown files\n * - Build dependency graphs\n * - Detect circular dependencies\n * - Compute critical path\n * - Determine execution order\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport type { Plan, PlanStep } from \"../types.js\";\n\n// ===== TYPES =====\n\n/**\n * Dependency information for a step\n */\nexport interface StepDependency {\n /** The step that has dependencies */\n stepNumber: number;\n\n /** Steps this step depends on (must be completed before this step) */\n dependsOn: number[];\n\n /** Steps that depend on this step (blocked until this completes) */\n blockedBy: number[];\n}\n\n/**\n * A dependency graph for the entire plan\n */\nexport interface DependencyGraph {\n /** Map of step number to its dependencies */\n dependencies: Map<number, StepDependency>;\n\n /** Steps with no dependencies (can start immediately) */\n roots: number[];\n\n /** Steps with no dependents (end points) */\n leaves: number[];\n\n /** Whether the graph has circular dependencies */\n hasCircular: boolean;\n\n /** Circular dependency chains if any */\n circularChains: number[][];\n}\n\n/**\n * Result of dependency validation\n */\nexport interface DependencyValidation {\n /** Whether all dependencies are valid */\n valid: boolean;\n\n /** Errors found */\n errors: DependencyError[];\n\n /** Warnings found */\n warnings: DependencyWarning[];\n}\n\n/**\n * A dependency error\n */\nexport interface DependencyError {\n /** Error type */\n type:\n | \"circular\"\n | \"missing\"\n | \"self-reference\"\n | \"invalid-step\"\n | \"duplicate\";\n\n /** Affected step */\n stepNumber: number;\n\n /** Related steps */\n relatedSteps?: number[];\n\n /** Error message */\n message: string;\n}\n\n/**\n * A dependency warning\n */\nexport interface DependencyWarning {\n /** Warning type */\n type: \"long-chain\" | \"bottleneck\" | \"orphan\";\n\n /** Affected step */\n stepNumber: number;\n\n /** Warning message */\n message: string;\n}\n\n/**\n * Critical path analysis result\n */\nexport interface CriticalPath {\n /** Steps in the critical path (in order) */\n path: number[];\n\n /** Total length of the critical path */\n length: number;\n\n /** Estimated duration (if steps have duration estimates) */\n estimatedDuration?: number;\n}\n\n/**\n * Execution order for steps\n */\nexport interface ExecutionOrder {\n /** Steps in execution order (respects dependencies) */\n order: number[];\n\n /** Steps grouped by parallel execution level */\n levels: number[][];\n}\n\n// ===== PARSING =====\n\n/**\n * Parse dependencies from step content\n *\n * Looks for dependency declarations in the markdown:\n * - `## Dependencies` section with bullet points\n * - `depends-on: 1, 2, 3` in frontmatter\n * - Inline references like `(depends on Step 01)`\n *\n * @param content - Step file content\n * @returns Array of step numbers this step depends on\n */\nexport function parseDependenciesFromContent(content: string): number[] {\n const dependencies: Set<number> = new Set();\n\n // Parse frontmatter depends-on\n const frontmatterMatch = content.match(\n /^---\\n[\\s\\S]*?depends-on:\\s*([^\\n]+)\\n[\\s\\S]*?---/\n );\n if (frontmatterMatch) {\n const nums = frontmatterMatch[1].match(/\\d+/g);\n if (nums) {\n nums.forEach((n) => dependencies.add(parseInt(n)));\n }\n }\n\n // Parse ## Dependencies section\n const depSectionMatch = content.match(\n /##\\s+Dependencies\\s*\\n([\\s\\S]*?)(?=\\n##|\\n#\\s|$)/i\n );\n if (depSectionMatch) {\n const section = depSectionMatch[1];\n // Look for bullet points with step references\n const bulletMatches = section.matchAll(\n /[-*]\\s*(?:Step\\s*)?(\\d+)/gi\n );\n for (const match of bulletMatches) {\n dependencies.add(parseInt(match[1]));\n }\n // Look for \"Step XX\" references\n const stepRefs = section.matchAll(/Step\\s+(\\d+)/gi);\n for (const match of stepRefs) {\n dependencies.add(parseInt(match[1]));\n }\n }\n\n // Parse inline dependency references\n const inlineMatches = content.matchAll(\n /\\(depends\\s+on\\s+(?:Step\\s*)?(\\d+(?:\\s*,\\s*\\d+)*)\\)/gi\n );\n for (const match of inlineMatches) {\n const nums = match[1].match(/\\d+/g);\n if (nums) {\n nums.forEach((n) => dependencies.add(parseInt(n)));\n }\n }\n\n // Parse \"Requires: Step X\" format - capture all step references on the line\n const requiresMatches = content.matchAll(\n /Requires:\\s*(.+?)(?:\\n|$)/gi\n );\n for (const match of requiresMatches) {\n const lineContent = match[1];\n // Find all numbers in the line, whether preceded by \"Step\" or not\n const nums = lineContent.match(/\\d+/g);\n if (nums) {\n nums.forEach((n) => dependencies.add(parseInt(n)));\n }\n }\n\n return Array.from(dependencies).sort((a, b) => a - b);\n}\n\n/**\n * Parse dependencies from a step file\n *\n * @param filePath - Path to step file\n * @returns Array of step numbers this step depends on\n */\nexport async function parseDependenciesFromFile(\n filePath: string\n): Promise<number[]> {\n const content = await readFile(filePath, \"utf-8\");\n return parseDependenciesFromContent(content);\n}\n\n/**\n * Parse all dependencies from a plan\n *\n * @param plan - The plan to analyze\n * @returns Map of step number to its dependencies\n */\nexport async function parseAllDependencies(\n plan: Plan\n): Promise<Map<number, number[]>> {\n const dependencies = new Map<number, number[]>();\n\n for (const step of plan.steps) {\n try {\n const deps = await parseDependenciesFromFile(step.filePath);\n dependencies.set(step.number, deps);\n } catch {\n // If file can't be read, assume no dependencies\n dependencies.set(step.number, []);\n }\n }\n\n return dependencies;\n}\n\n// ===== GRAPH BUILDING =====\n\n/**\n * Build a dependency graph from a plan\n *\n * @param plan - The plan to analyze\n * @returns Dependency graph\n */\nexport async function buildDependencyGraph(\n plan: Plan\n): Promise<DependencyGraph> {\n const rawDeps = await parseAllDependencies(plan);\n return buildDependencyGraphFromMap(plan, rawDeps);\n}\n\n/**\n * Build a dependency graph from a pre-parsed dependency map\n *\n * @param plan - The plan\n * @param rawDeps - Map of step number to dependencies\n * @returns Dependency graph\n */\nexport function buildDependencyGraphFromMap(\n plan: Plan,\n rawDeps: Map<number, number[]>\n): DependencyGraph {\n const stepNumbers = new Set(plan.steps.map((s) => s.number));\n const dependencies = new Map<number, StepDependency>();\n\n // Initialize all steps\n for (const step of plan.steps) {\n dependencies.set(step.number, {\n stepNumber: step.number,\n dependsOn: [],\n blockedBy: [],\n });\n }\n\n // Build forward dependencies (dependsOn)\n for (const [stepNumber, deps] of rawDeps) {\n const stepDep = dependencies.get(stepNumber);\n if (stepDep) {\n // Filter to only valid steps\n stepDep.dependsOn = deps.filter((d) => stepNumbers.has(d));\n }\n }\n\n // Build reverse dependencies (blockedBy)\n for (const [stepNumber, stepDep] of dependencies) {\n for (const depNum of stepDep.dependsOn) {\n const depStep = dependencies.get(depNum);\n if (depStep) {\n depStep.blockedBy.push(stepNumber);\n }\n }\n }\n\n // Find roots (no dependencies)\n const roots = Array.from(dependencies.values())\n .filter((d) => d.dependsOn.length === 0)\n .map((d) => d.stepNumber)\n .sort((a, b) => a - b);\n\n // Find leaves (no dependents)\n const leaves = Array.from(dependencies.values())\n .filter((d) => d.blockedBy.length === 0)\n .map((d) => d.stepNumber)\n .sort((a, b) => a - b);\n\n // Detect circular dependencies\n const circularChains = detectCircularDependencies(dependencies);\n\n return {\n dependencies,\n roots,\n leaves,\n hasCircular: circularChains.length > 0,\n circularChains,\n };\n}\n\n/**\n * Detect circular dependencies using DFS\n */\nfunction detectCircularDependencies(\n dependencies: Map<number, StepDependency>\n): number[][] {\n const circular: number[][] = [];\n const visited = new Set<number>();\n const recursionStack = new Set<number>();\n const path: number[] = [];\n\n function dfs(node: number): boolean {\n if (recursionStack.has(node)) {\n // Found a cycle - extract the cycle from path\n const cycleStart = path.indexOf(node);\n if (cycleStart !== -1) {\n circular.push([...path.slice(cycleStart), node]);\n }\n return true;\n }\n\n if (visited.has(node)) {\n return false;\n }\n\n visited.add(node);\n recursionStack.add(node);\n path.push(node);\n\n const stepDep = dependencies.get(node);\n if (stepDep) {\n for (const dep of stepDep.dependsOn) {\n dfs(dep);\n }\n }\n\n path.pop();\n recursionStack.delete(node);\n return false;\n }\n\n // Start DFS from each node\n for (const node of dependencies.keys()) {\n visited.clear();\n recursionStack.clear();\n path.length = 0;\n dfs(node);\n }\n\n // Deduplicate cycles (same cycle can be found from different starting points)\n const uniqueCycles: number[][] = [];\n const seenCycles = new Set<string>();\n\n for (const cycle of circular) {\n // Normalize the cycle by rotating to start with smallest element\n const minIdx = cycle.indexOf(Math.min(...cycle));\n const normalized = [\n ...cycle.slice(minIdx),\n ...cycle.slice(0, minIdx),\n ];\n const key = normalized.join(\"-\");\n\n if (!seenCycles.has(key)) {\n seenCycles.add(key);\n uniqueCycles.push(normalized);\n }\n }\n\n return uniqueCycles;\n}\n\n// ===== VALIDATION =====\n\n/**\n * Validate dependencies in a plan\n *\n * @param plan - The plan to validate\n * @param graph - Optional pre-built dependency graph\n * @param rawDeps - Optional raw dependencies map (before filtering)\n * @returns Validation result\n */\nexport async function validateDependencies(\n plan: Plan,\n graph?: DependencyGraph,\n rawDeps?: Map<number, number[]>\n): Promise<DependencyValidation> {\n const depGraph = graph || (await buildDependencyGraph(plan));\n // Get raw dependencies to check for invalid references\n const rawDependencies = rawDeps || (await parseAllDependencies(plan));\n const errors: DependencyError[] = [];\n const warnings: DependencyWarning[] = [];\n\n const stepNumbers = new Set(plan.steps.map((s) => s.number));\n\n // Check for circular dependencies\n for (const chain of depGraph.circularChains) {\n errors.push({\n type: \"circular\",\n stepNumber: chain[0],\n relatedSteps: chain,\n message: `Circular dependency detected: ${chain.map((n) => `Step ${n}`).join(\" → \")}`,\n });\n }\n\n // Check each step's dependencies using raw dependencies (before filtering)\n for (const [stepNumber, deps] of rawDependencies) {\n // Check for self-reference\n if (deps.includes(stepNumber)) {\n errors.push({\n type: \"self-reference\",\n stepNumber,\n message: `Step ${stepNumber} depends on itself`,\n });\n }\n\n // Check for duplicate dependencies\n const seen = new Set<number>();\n for (const dep of deps) {\n if (seen.has(dep)) {\n errors.push({\n type: \"duplicate\",\n stepNumber,\n relatedSteps: [dep],\n message: `Step ${stepNumber} has duplicate dependency on Step ${dep}`,\n });\n }\n seen.add(dep);\n\n // Check for invalid step references\n if (!stepNumbers.has(dep)) {\n errors.push({\n type: \"invalid-step\",\n stepNumber,\n relatedSteps: [dep],\n message: `Step ${stepNumber} depends on non-existent Step ${dep}`,\n });\n }\n }\n }\n\n // Check for long dependency chains (warning)\n const chainLength = calculateLongestChain(depGraph);\n if (chainLength > 5) {\n warnings.push({\n type: \"long-chain\",\n stepNumber: depGraph.roots[0] || 1,\n message: `Plan has a long dependency chain (${chainLength} steps). Consider parallelizing work.`,\n });\n }\n\n // Check for bottlenecks (steps that many others depend on)\n for (const [stepNumber, stepDep] of depGraph.dependencies) {\n if (stepDep.blockedBy.length > 3) {\n warnings.push({\n type: \"bottleneck\",\n stepNumber,\n message: `Step ${stepNumber} is a bottleneck (${stepDep.blockedBy.length} steps depend on it)`,\n });\n }\n }\n\n // Check for orphan steps (not in dependency chain but not a deliberate root)\n // This is just informational, not an error\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Calculate the longest dependency chain in the graph\n */\nfunction calculateLongestChain(graph: DependencyGraph): number {\n // Can't compute for circular graphs\n if (graph.hasCircular) {\n return 0;\n }\n\n const memo = new Map<number, number>();\n const visiting = new Set<number>();\n\n function getChainLength(node: number): number {\n if (memo.has(node)) {\n return memo.get(node)!;\n }\n\n // Prevent infinite recursion (shouldn't happen if hasCircular is correct)\n if (visiting.has(node)) {\n return 0;\n }\n\n visiting.add(node);\n\n const stepDep = graph.dependencies.get(node);\n if (!stepDep || stepDep.dependsOn.length === 0) {\n memo.set(node, 1);\n visiting.delete(node);\n return 1;\n }\n\n let maxLength = 0;\n for (const dep of stepDep.dependsOn) {\n const length = getChainLength(dep);\n maxLength = Math.max(maxLength, length);\n }\n\n const result = maxLength + 1;\n memo.set(node, result);\n visiting.delete(node);\n return result;\n }\n\n let longest = 0;\n for (const node of graph.dependencies.keys()) {\n longest = Math.max(longest, getChainLength(node));\n }\n\n return longest;\n}\n\n// ===== CRITICAL PATH =====\n\n/**\n * Find the critical path through the plan\n *\n * The critical path is the longest sequence of dependent steps\n * that determines the minimum time to complete the plan.\n *\n * @param plan - The plan to analyze\n * @param graph - Optional pre-built dependency graph\n * @returns Critical path information\n */\nexport async function findCriticalPath(\n plan: Plan,\n graph?: DependencyGraph\n): Promise<CriticalPath> {\n const depGraph = graph || (await buildDependencyGraph(plan));\n\n if (depGraph.hasCircular) {\n return {\n path: [],\n length: 0,\n };\n }\n\n // Use dynamic programming to find longest path\n const longestTo = new Map<number, { length: number; prev: number | null }>();\n\n // Initialize\n for (const node of depGraph.dependencies.keys()) {\n longestTo.set(node, { length: 1, prev: null });\n }\n\n // Process in topological order\n const order = await computeExecutionOrder(plan, depGraph);\n\n for (const node of order.order) {\n const stepDep = depGraph.dependencies.get(node)!;\n const current = longestTo.get(node)!;\n\n for (const dependent of stepDep.blockedBy) {\n const depInfo = longestTo.get(dependent)!;\n if (current.length + 1 > depInfo.length) {\n depInfo.length = current.length + 1;\n depInfo.prev = node;\n }\n }\n }\n\n // Find the longest path ending point\n let maxLength = 0;\n let endNode: number | null = null;\n\n for (const [node, info] of longestTo) {\n if (info.length > maxLength) {\n maxLength = info.length;\n endNode = node;\n }\n }\n\n // Reconstruct path\n const path: number[] = [];\n let current = endNode;\n\n while (current !== null) {\n path.unshift(current);\n current = longestTo.get(current)?.prev ?? null;\n }\n\n return {\n path,\n length: maxLength,\n };\n}\n\n// ===== EXECUTION ORDER =====\n\n/**\n * Compute execution order that respects dependencies\n *\n * Returns both a linear order and parallel execution levels.\n *\n * @param plan - The plan to analyze\n * @param graph - Optional pre-built dependency graph\n * @returns Execution order information\n */\nexport async function computeExecutionOrder(\n plan: Plan,\n graph?: DependencyGraph\n): Promise<ExecutionOrder> {\n const depGraph = graph || (await buildDependencyGraph(plan));\n\n if (depGraph.hasCircular) {\n // Can't compute order with circular dependencies\n return {\n order: plan.steps.map((s) => s.number).sort((a, b) => a - b),\n levels: [plan.steps.map((s) => s.number).sort((a, b) => a - b)],\n };\n }\n\n // Kahn's algorithm for topological sort with level tracking\n const inDegree = new Map<number, number>();\n const levels: number[][] = [];\n const order: number[] = [];\n\n // Initialize in-degrees\n for (const [node, stepDep] of depGraph.dependencies) {\n inDegree.set(node, stepDep.dependsOn.length);\n }\n\n // Start with roots (in-degree 0)\n let currentLevel = [...depGraph.roots];\n currentLevel.sort((a, b) => a - b);\n\n while (currentLevel.length > 0) {\n levels.push([...currentLevel]);\n order.push(...currentLevel);\n\n const nextLevel: number[] = [];\n\n for (const node of currentLevel) {\n const stepDep = depGraph.dependencies.get(node)!;\n\n for (const dependent of stepDep.blockedBy) {\n const deg = inDegree.get(dependent)! - 1;\n inDegree.set(dependent, deg);\n\n if (deg === 0) {\n nextLevel.push(dependent);\n }\n }\n }\n\n currentLevel = nextLevel.sort((a, b) => a - b);\n }\n\n return { order, levels };\n}\n\n// ===== HELPER FUNCTIONS =====\n\n/**\n * Get steps that can be started now (all dependencies completed)\n *\n * @param plan - The plan\n * @param graph - Optional pre-built dependency graph\n * @returns Steps ready to start\n */\nexport async function getReadySteps(\n plan: Plan,\n graph?: DependencyGraph\n): Promise<PlanStep[]> {\n const depGraph = graph || (await buildDependencyGraph(plan));\n const completedSteps = new Set(\n plan.steps.filter((s) => s.status === \"completed\").map((s) => s.number)\n );\n\n const ready: PlanStep[] = [];\n\n for (const step of plan.steps) {\n if (step.status !== \"pending\") continue;\n\n const stepDep = depGraph.dependencies.get(step.number);\n if (!stepDep) continue;\n\n // Check if all dependencies are completed\n const allDepsComplete = stepDep.dependsOn.every((d) =>\n completedSteps.has(d)\n );\n\n if (allDepsComplete) {\n ready.push(step);\n }\n }\n\n return ready;\n}\n\n/**\n * Get steps that are blocked by a specific step\n *\n * @param plan - The plan\n * @param stepNumber - The blocking step\n * @param graph - Optional pre-built dependency graph\n * @returns Steps blocked by this step\n */\nexport async function getBlockedSteps(\n plan: Plan,\n stepNumber: number,\n graph?: DependencyGraph\n): Promise<PlanStep[]> {\n const depGraph = graph || (await buildDependencyGraph(plan));\n const stepDep = depGraph.dependencies.get(stepNumber);\n\n if (!stepDep) return [];\n\n return plan.steps.filter((s) => stepDep.blockedBy.includes(s.number));\n}\n\n/**\n * Get the dependency chain for a step (all transitive dependencies)\n *\n * @param plan - The plan\n * @param stepNumber - The step to analyze\n * @param graph - Optional pre-built dependency graph\n * @returns All steps that must be completed before this step\n */\nexport async function getDependencyChain(\n plan: Plan,\n stepNumber: number,\n graph?: DependencyGraph\n): Promise<number[]> {\n const depGraph = graph || (await buildDependencyGraph(plan));\n const chain = new Set<number>();\n const visited = new Set<number>();\n\n function collect(node: number): void {\n if (visited.has(node)) return;\n visited.add(node);\n\n const stepDep = depGraph.dependencies.get(node);\n if (!stepDep) return;\n\n for (const dep of stepDep.dependsOn) {\n chain.add(dep);\n collect(dep);\n }\n }\n\n collect(stepNumber);\n\n return Array.from(chain).sort((a, b) => a - b);\n}\n\n/**\n * Update step dependencies in memory\n *\n * @param step - The step to update\n * @param dependencies - New dependency list\n * @returns Updated step\n */\nexport function updateStepDependencies(\n step: PlanStep,\n dependencies: number[]\n): PlanStep {\n return {\n ...step,\n dependencies: [...new Set(dependencies)].sort((a, b) => a - b),\n };\n}\n\n","/**\n * Plan Loader Module\n *\n * Loads plan directories into Plan data structures.\n * Discovers and parses all standard files, steps, feedback, and evidence.\n */\n\nimport { readdir, readFile, stat } from \"node:fs/promises\";\nimport { join, basename, resolve } from \"node:path\";\nimport type {\n Plan,\n PlanFiles,\n PlanMetadata,\n PlanStep,\n PlanState,\n FeedbackRecord,\n FeedbackParticipant,\n FeedbackPlatform,\n EvidenceRecord,\n EvidenceType,\n} from \"../types.js\";\nimport { PLAN_CONVENTIONS } from \"../types.js\";\nimport { parseDependenciesFromContent } from \"../dependencies/index.js\";\n\n// ===== OPTIONS =====\n\n/**\n * Options for loading a plan\n */\nexport interface LoadPlanOptions {\n /** Include feedback records (default: true) */\n includeFeedback?: boolean;\n\n /** Include evidence files (default: true) */\n includeEvidence?: boolean;\n\n /** Parse STATUS.md for state (default: true) */\n parseStatus?: boolean;\n}\n\n// ===== MAIN EXPORT =====\n\n/**\n * Load a plan from a directory\n *\n * @param path - Path to the plan directory\n * @param options - Loading options\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 */\nexport async function loadPlan(\n path: string,\n options: LoadPlanOptions = {}\n): Promise<Plan> {\n const {\n includeFeedback = true,\n includeEvidence = true,\n parseStatus = true,\n } = options;\n\n // Resolve to absolute path\n const planPath = resolve(path);\n\n // Verify path exists and is directory\n let pathStat;\n try {\n pathStat = await stat(planPath);\n } catch {\n throw new Error(`Plan path does not exist: ${planPath}`);\n }\n\n if (!pathStat.isDirectory()) {\n throw new Error(`Plan path is not a directory: ${planPath}`);\n }\n\n // Discover files\n const files = await discoverPlanFiles(planPath);\n\n // Extract metadata\n const metadata = await extractMetadata(planPath, files);\n\n // Load steps\n const steps =\n files.steps.length > 0 ? await loadSteps(planPath, files) : [];\n\n // Initialize state\n let state: PlanState = {\n status: \"pending\",\n lastUpdatedAt: new Date(),\n blockers: [],\n issues: [],\n progress: 0,\n };\n\n // Parse STATUS.md if present and requested\n if (parseStatus && files.status) {\n const statusContent = await readFile(\n join(planPath, files.status),\n \"utf-8\"\n );\n state = parseStatusDocument(statusContent, steps);\n }\n\n // Load feedback if requested\n const feedback =\n includeFeedback && files.feedbackDir\n ? await loadFeedbackRecords(join(planPath, files.feedbackDir))\n : undefined;\n\n // Load evidence if requested\n const evidence =\n includeEvidence && files.evidenceDir\n ? await loadEvidenceRecords(join(planPath, files.evidenceDir))\n : undefined;\n\n return {\n metadata,\n files,\n steps,\n state,\n feedback,\n evidence,\n };\n}\n\n// ===== FILE DISCOVERY =====\n\n/**\n * Discover all files and directories in a plan\n */\nasync function discoverPlanFiles(planPath: string): Promise<PlanFiles> {\n const files: PlanFiles = {\n steps: [],\n subdirectories: [],\n };\n\n const entries = await readdir(planPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n // Track subdirectories\n files.subdirectories.push(entry.name);\n\n // Check standard directories\n if (entry.name === PLAN_CONVENTIONS.standardDirs.plan) {\n files.steps = await discoverStepFiles(\n join(planPath, entry.name)\n );\n } else if (entry.name === PLAN_CONVENTIONS.standardDirs.feedback) {\n files.feedbackDir = entry.name;\n files.feedbackFiles = await discoverFeedbackFiles(\n join(planPath, entry.name)\n );\n } else if (entry.name === PLAN_CONVENTIONS.standardDirs.evidence) {\n files.evidenceDir = entry.name;\n files.evidenceFiles = await discoverEvidenceFiles(\n join(planPath, entry.name)\n );\n } else if (entry.name === PLAN_CONVENTIONS.standardDirs.analysis) {\n files.analysisDir = entry.name;\n } else if (entry.name === PLAN_CONVENTIONS.standardDirs.history) {\n files.historyDir = entry.name;\n }\n } else if (entry.isFile()) {\n const name = entry.name;\n\n // Check standard files\n if (name === PLAN_CONVENTIONS.standardFiles.summary) {\n files.summary = name;\n } else if (name === PLAN_CONVENTIONS.standardFiles.status) {\n files.status = name;\n } else if (name === PLAN_CONVENTIONS.standardFiles.executionPlan) {\n files.executionPlan = name;\n } else if (name === PLAN_CONVENTIONS.standardFiles.readme) {\n files.readme = name;\n } else if (name === PLAN_CONVENTIONS.standardFiles.changelog) {\n files.changelog = name;\n } else if (isMetaPromptFile(name, basename(planPath))) {\n files.metaPrompt = name;\n }\n }\n }\n\n // If no plan/ subdirectory, check for step files in root\n if (files.steps.length === 0) {\n const rootSteps = await discoverStepFiles(planPath);\n if (rootSteps.length > 0) {\n files.steps = rootSteps;\n }\n }\n\n return files;\n}\n\n/**\n * Check if a file is a meta-prompt file\n */\nfunction isMetaPromptFile(filename: string, planCode: string): boolean {\n for (const pattern of PLAN_CONVENTIONS.metaPromptPatterns) {\n const expected = pattern.replace(\"{code}\", planCode);\n if (filename === expected) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Discover step files in a directory\n */\nasync function discoverStepFiles(dir: string): Promise<string[]> {\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n\n const stepFiles: string[] = [];\n\n for (const entry of entries) {\n if (PLAN_CONVENTIONS.stepPattern.test(entry)) {\n stepFiles.push(entry);\n }\n }\n\n // Sort by step number\n return stepFiles.sort((a, b) => {\n const matchA = a.match(PLAN_CONVENTIONS.stepPattern);\n const matchB = b.match(PLAN_CONVENTIONS.stepPattern);\n if (!matchA || !matchB) return 0;\n const numA = parseInt(matchA[1]);\n const numB = parseInt(matchB[1]);\n return numA - numB;\n });\n}\n\n/**\n * Discover feedback files in a directory\n */\nasync function discoverFeedbackFiles(dir: string): Promise<string[]> {\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n\n const feedbackFiles: string[] = [];\n\n for (const entry of entries) {\n if (PLAN_CONVENTIONS.feedbackPattern.test(entry)) {\n feedbackFiles.push(entry);\n }\n }\n\n // Sort by ID\n return feedbackFiles.sort((a, b) => {\n const matchA = a.match(PLAN_CONVENTIONS.feedbackPattern);\n const matchB = b.match(PLAN_CONVENTIONS.feedbackPattern);\n if (!matchA || !matchB) return 0;\n return matchA[1].localeCompare(matchB[1]);\n });\n}\n\n/**\n * Discover evidence files in a directory\n */\nasync function discoverEvidenceFiles(dir: string): Promise<string[]> {\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return [];\n }\n\n const evidenceFiles: string[] = [];\n\n for (const entry of entries) {\n for (const pattern of PLAN_CONVENTIONS.evidencePatterns) {\n if (pattern.test(entry)) {\n evidenceFiles.push(entry);\n break;\n }\n }\n }\n\n return evidenceFiles.sort();\n}\n\n// ===== STEP LOADING =====\n\n/**\n * Load step data from files\n */\nasync function loadSteps(\n planPath: string,\n files: PlanFiles\n): Promise<PlanStep[]> {\n const steps: PlanStep[] = [];\n\n // Determine step directory (plan/ or root)\n const stepDir = files.subdirectories.includes(\n PLAN_CONVENTIONS.standardDirs.plan\n )\n ? join(planPath, PLAN_CONVENTIONS.standardDirs.plan)\n : planPath;\n\n for (const filename of files.steps) {\n const match = filename.match(PLAN_CONVENTIONS.stepPattern);\n if (!match) continue;\n\n const [, numberStr, code] = match;\n const number = parseInt(numberStr);\n const filePath = join(stepDir, filename);\n\n let content: string;\n try {\n content = await readFile(filePath, \"utf-8\");\n } catch {\n // File doesn't exist, skip\n continue;\n }\n\n // Parse dependencies from step content\n const dependencies = parseDependenciesFromContent(content);\n\n steps.push({\n number,\n code,\n filename,\n title: extractTitle(content) || formatCode(code),\n description: extractDescription(content),\n status: \"pending\", // Default, may be overridden by STATUS.md\n dependencies: dependencies.length > 0 ? dependencies : undefined,\n filePath,\n });\n }\n\n return steps;\n}\n\n// ===== METADATA EXTRACTION =====\n\n/**\n * Extract plan metadata from files\n */\nasync function extractMetadata(\n planPath: string,\n files: PlanFiles\n): Promise<PlanMetadata> {\n const code = basename(planPath);\n let name = formatCode(code);\n let description: string | undefined;\n\n // Try to extract from SUMMARY.md\n if (files.summary) {\n try {\n const content = await readFile(\n join(planPath, files.summary),\n \"utf-8\"\n );\n const extractedName = extractTitle(content);\n if (extractedName) {\n name = extractedName;\n }\n description = extractFirstParagraph(content);\n } catch {\n // File read failed, use defaults\n }\n }\n\n return {\n code,\n name,\n description,\n path: planPath,\n };\n}\n\n/**\n * Extract title from markdown content (first # heading)\n */\nfunction extractTitle(markdown: string): string | null {\n const match = markdown.match(/^#\\s+(.+)$/m);\n return match ? match[1].trim() : null;\n}\n\n/**\n * Extract description from markdown (first paragraph after title)\n */\nfunction extractDescription(markdown: string): string | undefined {\n return extractFirstParagraph(markdown);\n}\n\n/**\n * Extract first paragraph from markdown\n */\nfunction extractFirstParagraph(markdown: string): string | undefined {\n const lines = markdown.split(\"\\n\");\n let foundTitle = false;\n let paragraph = \"\";\n\n for (const line of lines) {\n if (line.startsWith(\"#\")) {\n if (foundTitle && paragraph) {\n break; // Hit another heading\n }\n foundTitle = true;\n continue;\n }\n\n if (foundTitle && line.trim()) {\n // Skip special lines\n if (\n line.startsWith(\"-\") ||\n line.startsWith(\"|\") ||\n line.startsWith(\">\") ||\n line.startsWith(\"```\")\n ) {\n if (paragraph) break;\n continue;\n }\n paragraph += line.trim() + \" \";\n } else if (foundTitle && paragraph && !line.trim()) {\n break; // End of paragraph\n }\n }\n\n const result = paragraph.trim();\n return result || undefined;\n}\n\n/**\n * Format a code slug into a readable name\n */\nfunction formatCode(code: string): string {\n return code\n .replace(/-/g, \" \")\n .replace(/_/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n// ===== STATUS PARSING (Basic) =====\n\n// Status emoji strings for matching\nconst STATUS_EMOJIS = [\"⬜\", \"🔄\", \"✅\", \"❌\", \"⏸️\", \"⏭️\"];\n\n/**\n * Extract status emoji from a string\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.md content into PlanState\n * Note: This is a basic implementation. Full parsing is in Step 05.\n */\nfunction parseStatusDocument(content: string, steps: PlanStep[]): PlanState {\n const state: PlanState = {\n status: \"pending\",\n lastUpdatedAt: new Date(),\n blockers: [],\n issues: [],\n progress: 0,\n };\n\n // Parse status from content - look for Status row in table\n const statusRowMatch = content.match(/\\*\\*Status\\*\\*\\s*\\|\\s*([^|]+)/i);\n if (statusRowMatch) {\n const emoji = findStatusEmoji(statusRowMatch[1]);\n if (emoji) {\n const statusFromEmoji =\n PLAN_CONVENTIONS.emojiToStatus[\n emoji as keyof typeof PLAN_CONVENTIONS.emojiToStatus\n ];\n if (statusFromEmoji) {\n state.status = statusFromEmoji;\n }\n }\n }\n\n // Parse step statuses from table - look for rows with step numbers\n const lines = content.split(\"\\n\");\n for (const line of lines) {\n // Match lines that look like step status rows: | 01 | Name | ✅ |\n const stepMatch = line.match(/^\\|\\s*(\\d{2})\\s*\\|[^|]+\\|([^|]+)\\|/);\n if (stepMatch) {\n const stepNum = parseInt(stepMatch[1]);\n const statusCell = stepMatch[2];\n const emoji = findStatusEmoji(statusCell);\n\n if (emoji) {\n const status =\n PLAN_CONVENTIONS.emojiToStatus[\n emoji as keyof typeof PLAN_CONVENTIONS.emojiToStatus\n ];\n if (status) {\n const step = steps.find((s) => s.number === stepNum);\n if (step) {\n step.status = status;\n }\n }\n }\n }\n }\n\n // Calculate progress\n const completedSteps = steps.filter((s) => s.status === \"completed\").length;\n state.progress =\n steps.length > 0 ? Math.round((completedSteps / steps.length) * 100) : 0;\n\n // Find current step (first in_progress)\n const currentStep = steps.find((s) => s.status === \"in_progress\");\n if (currentStep) {\n state.currentStep = currentStep.number;\n }\n\n // Find last completed step\n const completedStepNumbers = steps\n .filter((s) => s.status === \"completed\")\n .map((s) => s.number);\n if (completedStepNumbers.length > 0) {\n state.lastCompletedStep = Math.max(...completedStepNumbers);\n }\n\n return state;\n}\n\n// ===== FEEDBACK LOADING =====\n\n/**\n * Load feedback records from directory\n */\nasync function loadFeedbackRecords(\n feedbackPath: string\n): Promise<FeedbackRecord[]> {\n let files: string[];\n try {\n files = await readdir(feedbackPath);\n } catch {\n return [];\n }\n\n const records: FeedbackRecord[] = [];\n\n for (const file of files) {\n if (!PLAN_CONVENTIONS.feedbackPattern.test(file)) continue;\n\n try {\n const content = await readFile(join(feedbackPath, file), \"utf-8\");\n const record = parseFeedbackFile(file, content);\n if (record) records.push(record);\n } catch {\n // Skip files that can't be read\n }\n }\n\n return records.sort((a, b) => a.id.localeCompare(b.id));\n}\n\n/**\n * Parse a feedback file into a FeedbackRecord\n */\nfunction parseFeedbackFile(\n filename: string,\n content: string\n): FeedbackRecord | null {\n const match = filename.match(PLAN_CONVENTIONS.feedbackPattern);\n if (!match) return null;\n\n const [, id, titleSlug] = match;\n\n // Parse frontmatter and content\n const { frontmatter, body } = parseFrontmatter(content);\n\n // Parse participants\n const participants: FeedbackParticipant[] = [];\n if (Array.isArray(frontmatter.participants)) {\n for (const p of frontmatter.participants) {\n if (typeof p === \"string\") {\n participants.push({ name: p, type: \"human\" });\n } else if (p && typeof p === \"object\") {\n const obj = p as Record<string, unknown>;\n participants.push({\n name: (typeof obj.name === \"string\" ? obj.name : undefined) || \"Unknown\",\n type: (obj.type === \"human\" || obj.type === \"ai\" ? obj.type : \"human\"),\n model: typeof obj.model === \"string\" ? obj.model : undefined,\n });\n }\n }\n }\n\n // Determine platform\n let platform: FeedbackPlatform = \"other\";\n if (typeof frontmatter.platform === \"string\") {\n const validPlatforms: FeedbackPlatform[] = [\n \"cursor\",\n \"chatgpt\",\n \"slack\",\n \"email\",\n \"meeting\",\n \"voice\",\n \"document\",\n \"other\",\n ];\n if (validPlatforms.includes(frontmatter.platform as FeedbackPlatform)) {\n platform = frontmatter.platform as FeedbackPlatform;\n }\n }\n\n return {\n id,\n title: (typeof frontmatter.title === \"string\" ? frontmatter.title : undefined) || formatCode(titleSlug),\n createdAt: (typeof frontmatter.date === \"string\" || typeof frontmatter.date === \"number\") ? new Date(frontmatter.date) : new Date(),\n participants:\n participants.length > 0\n ? participants\n : [{ name: \"Unknown\", type: \"human\" }],\n platform,\n planVersion: typeof frontmatter.planVersion === \"string\" ? frontmatter.planVersion : undefined,\n feedback: body.trim(),\n resolution: typeof frontmatter.resolution === \"string\" ? frontmatter.resolution : undefined,\n changes: Array.isArray(frontmatter.changes) ? frontmatter.changes.filter((c): c is string => typeof c === \"string\") : undefined,\n openQuestions: Array.isArray(frontmatter.openQuestions) ? frontmatter.openQuestions.filter((q): q is string => typeof q === \"string\") : undefined,\n filename,\n };\n}\n\n// ===== EVIDENCE LOADING =====\n\n/**\n * Load evidence records from directory\n */\nasync function loadEvidenceRecords(\n evidencePath: string\n): Promise<EvidenceRecord[]> {\n let files: string[];\n try {\n files = await readdir(evidencePath);\n } catch {\n return [];\n }\n\n const records: EvidenceRecord[] = [];\n\n for (const file of files) {\n // Check against all evidence patterns\n let matched = false;\n for (const pattern of PLAN_CONVENTIONS.evidencePatterns) {\n if (pattern.test(file)) {\n matched = true;\n break;\n }\n }\n if (!matched) continue;\n\n try {\n const content = await readFile(join(evidencePath, file), \"utf-8\");\n const record = parseEvidenceFile(file, content);\n if (record) records.push(record);\n } catch {\n // Skip files that can't be read\n }\n }\n\n return records.sort((a, b) => a.id.localeCompare(b.id));\n}\n\n/**\n * Parse an evidence file into an EvidenceRecord\n */\nfunction parseEvidenceFile(\n filename: string,\n content: string\n): EvidenceRecord | null {\n // Determine evidence type from filename pattern\n let type: EvidenceType = \"reference\";\n let titleMatch: RegExpMatchArray | null = null;\n\n for (let i = 0; i < PLAN_CONVENTIONS.evidencePatterns.length; i++) {\n const pattern = PLAN_CONVENTIONS.evidencePatterns[i];\n const match = filename.match(pattern);\n if (match) {\n titleMatch = match;\n // Map index to type\n const types: EvidenceType[] = [\n \"case-study\",\n \"research\",\n \"analysis\",\n \"example\",\n ];\n type = types[i] || \"reference\";\n break;\n }\n }\n\n if (!titleMatch) return null;\n\n // Parse frontmatter\n const { frontmatter, body } = parseFrontmatter(content);\n\n // Extract title from frontmatter or first heading\n const title =\n frontmatter.title ||\n extractTitle(body) ||\n formatCode(titleMatch[1] || filename);\n\n // Generate ID from filename\n const id = filename.replace(/\\.md$/, \"\");\n\n return {\n id,\n type,\n title: typeof title === \"string\" ? title : \"\",\n createdAt: (typeof frontmatter.date === \"string\" || typeof frontmatter.date === \"number\") ? new Date(frontmatter.date) : new Date(),\n source: typeof frontmatter.source === \"string\" ? frontmatter.source : undefined,\n filename,\n summary: (typeof frontmatter.summary === \"string\" ? frontmatter.summary : undefined) || extractFirstParagraph(body),\n tags: Array.isArray(frontmatter.tags) ? frontmatter.tags.filter((t): t is string => typeof t === \"string\") : undefined,\n };\n}\n\n// ===== UTILITIES =====\n\ninterface ParsedFrontmatter {\n frontmatter: Record<string, unknown>;\n body: string;\n}\n\n/**\n * Parse YAML frontmatter from markdown content\n */\nfunction parseFrontmatter(content: string): ParsedFrontmatter {\n const frontmatterMatch = content.match(/^---\\n([\\s\\S]*?)\\n---\\n/);\n\n if (!frontmatterMatch) {\n return { frontmatter: {}, body: content };\n }\n\n const frontmatterStr = frontmatterMatch[1];\n const body = content.slice(frontmatterMatch[0].length);\n\n // Simple YAML parsing (key: value, arrays with - prefix)\n const frontmatter: Record<string, unknown> = {};\n const lines = frontmatterStr.split(\"\\n\");\n let currentKey: string | null = null;\n let currentArray: unknown[] | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Array item\n if (trimmed.startsWith(\"- \") && currentKey) {\n if (!currentArray) {\n currentArray = [];\n frontmatter[currentKey] = currentArray;\n }\n const value = trimmed.slice(2).trim();\n // Check if it's an object (has colon)\n if (value.includes(\":\")) {\n const obj: Record<string, string> = {};\n const parts = value.split(\",\").map((p) => p.trim());\n for (const part of parts) {\n const [k, v] = part.split(\":\").map((s) => s.trim());\n if (k && v) {\n obj[k] = v.replace(/^[\"']|[\"']$/g, \"\");\n }\n }\n currentArray.push(obj);\n } else {\n currentArray.push(value.replace(/^[\"']|[\"']$/g, \"\"));\n }\n continue;\n }\n\n // Key-value pair\n const kvMatch = line.match(/^(\\w+):\\s*(.*)$/);\n if (kvMatch) {\n const [, key, value] = kvMatch;\n currentKey = key;\n currentArray = null;\n\n if (value.trim()) {\n // Inline value\n frontmatter[key] = value.trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n // If no value, might be followed by array items\n }\n }\n\n return { frontmatter, body };\n}\n\n","/**\n * Plan Creator Module\n *\n * Creates new plan directories with standard structure and files.\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport type { Plan, PlanStep } from \"../types.js\";\nimport { PLAN_CONVENTIONS } from \"../types.js\";\n\n// ===== TYPES =====\n\n/**\n * Configuration for creating a new plan\n */\nexport interface CreatePlanConfig {\n /** Plan code/slug (directory name) - lowercase letters, numbers, hyphens only */\n code: string;\n\n /** Human-readable name */\n name: string;\n\n /** Base path for plan (plan created as subdirectory) */\n basePath: string;\n\n /** Plan description */\n description?: string;\n\n /** Initial steps */\n steps?: Array<{ title: string; description?: string }>;\n\n /** Context assignment */\n context?: string;\n\n /** Author name */\n author?: string;\n\n /** Create feedback directory (default: true) */\n createFeedbackDir?: boolean;\n\n /** Create evidence directory (default: true) */\n createEvidenceDir?: boolean;\n\n /** Template to use (basic support) */\n template?: \"blank\" | \"default\";\n}\n\n/**\n * Result of plan creation\n */\nexport interface CreatePlanResult {\n /** Created plan */\n plan: Plan;\n\n /** Path where plan was created */\n path: string;\n\n /** Files that were created */\n filesCreated: string[];\n}\n\n// ===== MAIN EXPORT =====\n\n/**\n * Create a new plan\n *\n * @param config - Plan configuration\n * @returns The created plan and files\n *\n * @example\n * ```typescript\n * const result = await createPlan({\n * code: 'my-feature',\n * name: 'My Feature Implementation',\n * basePath: './prompts',\n * description: 'Implementing the new 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 * console.log(result.path); // './prompts/my-feature'\n * ```\n */\nexport async function createPlan(\n config: CreatePlanConfig\n): Promise<CreatePlanResult> {\n // Validate code\n if (!/^[a-z0-9-]+$/.test(config.code)) {\n throw new Error(\n `Invalid plan code: \"${config.code}\". Use lowercase letters, numbers, and hyphens only.`\n );\n }\n\n const planPath = resolve(join(config.basePath, config.code));\n const filesCreated: string[] = [];\n\n // Create directories\n const createFeedback = config.createFeedbackDir ?? true;\n const createEvidence = config.createEvidenceDir ?? true;\n\n await createPlanDirectories(planPath, {\n feedback: createFeedback,\n evidence: createEvidence,\n });\n\n // Generate and write SUMMARY.md\n const summaryPath = join(planPath, PLAN_CONVENTIONS.standardFiles.summary);\n await writeFile(summaryPath, generateSummaryMd(config));\n filesCreated.push(summaryPath);\n\n // Generate and write EXECUTION_PLAN.md\n const execPath = join(\n planPath,\n PLAN_CONVENTIONS.standardFiles.executionPlan\n );\n await writeFile(execPath, generateExecutionPlanMd(config));\n filesCreated.push(execPath);\n\n // Generate and write STATUS.md\n const statusPath = join(planPath, PLAN_CONVENTIONS.standardFiles.status);\n await writeFile(statusPath, generateStatusMd(config));\n filesCreated.push(statusPath);\n\n // Create step files\n const steps = config.steps || getDefaultSteps();\n\n const createdSteps: PlanStep[] = [];\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i];\n const stepNum = i + 1;\n const code = slugify(step.title);\n const filename = `${String(stepNum).padStart(2, \"0\")}-${code}.md`;\n const stepPath = join(\n planPath,\n PLAN_CONVENTIONS.standardDirs.plan,\n filename\n );\n\n await writeFile(\n stepPath,\n generateStepMd(stepNum, step.title, step.description)\n );\n filesCreated.push(stepPath);\n\n createdSteps.push({\n number: stepNum,\n code,\n filename,\n title: step.title,\n description: step.description,\n status: \"pending\",\n filePath: stepPath,\n });\n }\n\n // Build subdirectories list\n const subdirectories: string[] = [PLAN_CONVENTIONS.standardDirs.plan];\n if (createFeedback) {\n subdirectories.push(PLAN_CONVENTIONS.standardDirs.feedback);\n }\n if (createEvidence) {\n subdirectories.push(PLAN_CONVENTIONS.standardDirs.evidence);\n }\n\n // Construct Plan object\n const plan: Plan = {\n metadata: {\n code: config.code,\n name: config.name,\n description: config.description,\n author: config.author,\n path: planPath,\n createdAt: new Date(),\n },\n files: {\n summary: PLAN_CONVENTIONS.standardFiles.summary,\n status: PLAN_CONVENTIONS.standardFiles.status,\n executionPlan: PLAN_CONVENTIONS.standardFiles.executionPlan,\n steps: createdSteps.map((s) => s.filename),\n subdirectories,\n feedbackDir: createFeedback\n ? PLAN_CONVENTIONS.standardDirs.feedback\n : undefined,\n evidenceDir: createEvidence\n ? PLAN_CONVENTIONS.standardDirs.evidence\n : undefined,\n },\n steps: createdSteps,\n state: {\n status: \"pending\",\n lastUpdatedAt: new Date(),\n blockers: [],\n issues: [],\n progress: 0,\n },\n context: config.context,\n };\n\n return { plan, path: planPath, filesCreated };\n}\n\n// ===== DIRECTORY CREATION =====\n\n/**\n * Create plan directory structure\n */\nasync function createPlanDirectories(\n planPath: string,\n options: { feedback?: boolean; evidence?: boolean }\n): Promise<void> {\n // Create main directory\n await mkdir(planPath, { recursive: true });\n\n // Create plan/ subdirectory for steps\n const planDir = join(planPath, PLAN_CONVENTIONS.standardDirs.plan);\n await mkdir(planDir, { recursive: true });\n\n // Create feedback/ if requested\n if (options.feedback) {\n const feedbackDir = join(\n planPath,\n PLAN_CONVENTIONS.standardDirs.feedback\n );\n await mkdir(feedbackDir, { recursive: true });\n }\n\n // Create evidence/ if requested\n if (options.evidence) {\n const evidenceDir = join(\n planPath,\n PLAN_CONVENTIONS.standardDirs.evidence\n );\n await mkdir(evidenceDir, { recursive: true });\n }\n}\n\n// ===== FILE GENERATORS =====\n\n/**\n * Generate SUMMARY.md content\n */\nfunction generateSummaryMd(config: CreatePlanConfig): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const authorLine = config.author ? `\\n*Author: ${config.author}*` : \"\";\n\n return `# ${config.name}\n\n## Overview\n\n${config.description || \"Description of this plan.\"}\n\n## Goals\n\n1. Goal 1\n2. Goal 2\n3. Goal 3\n\n## Scope\n\n### In Scope\n\n- Item 1\n- Item 2\n\n### Out of Scope\n\n- Item 1\n\n## Success Criteria\n\n- [ ] Criterion 1\n- [ ] Criterion 2\n\n---\n\n*Plan created: ${date}*${authorLine}\n`;\n}\n\n/**\n * Generate EXECUTION_PLAN.md content\n */\nfunction generateExecutionPlanMd(config: CreatePlanConfig): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const steps = config.steps || getDefaultSteps();\n\n let stepsSection = \"\";\n steps.forEach((step, i) => {\n const num = String(i + 1).padStart(2, \"0\");\n stepsSection += `| ${num} | ${step.title} | ${step.description || \"\"} |\\n`;\n });\n\n return `# Execution Plan: ${config.name}\n\n## Strategy\n\nDescribe the overall approach and strategy for this plan.\n\n## Prerequisites\n\n- [ ] Prerequisite 1\n- [ ] Prerequisite 2\n\n## Steps\n\n| Step | Name | Description |\n|------|------|-------------|\n${stepsSection}\n## Quality Gates\n\nAfter each step:\n- [ ] Tests pass\n- [ ] Lint passes\n- [ ] Code review complete\n\n## Notes\n\nAdditional notes about the execution approach.\n\n---\n\n*Last updated: ${date}*\n`;\n}\n\n/**\n * Generate STATUS.md content\n */\nfunction generateStatusMd(config: CreatePlanConfig): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const steps = config.steps || getDefaultSteps();\n\n let stepsTable = \"\";\n steps.forEach((step, i) => {\n const num = String(i + 1).padStart(2, \"0\");\n stepsTable += `| ${num} | ${step.title} | ⬜ | - | - | |\\n`;\n });\n\n return `# ${config.name} Status\n\n## Current State\n\n| Field | Value |\n|-------|-------|\n| **Status** | ⬜ PLANNING |\n| **Current Step** | - |\n| **Last Completed** | - |\n| **Started** | - |\n| **Last Updated** | ${date} |\n| **Progress** | 0% (0/${steps.length} steps) |\n\n## Step Progress\n\n| Step | Name | Status | Started | Completed | Notes |\n|------|------|--------|---------|-----------|-------|\n${stepsTable}\n## Blockers\n\nNone currently.\n\n## Issues\n\nNone currently.\n\n## Notes\n\n---\n\n*Last updated: ${date}*\n`;\n}\n\n/**\n * Generate step file content\n */\nfunction generateStepMd(\n stepNum: number,\n title: string,\n description?: string\n): string {\n const num = String(stepNum).padStart(2, \"0\");\n\n return `# Step ${num}: ${title}\n\n## Objective\n\n${description || \"Describe the objective of this step.\"}\n\n## Background\n\nProvide context and rationale for this step.\n\n## Tasks\n\n### 1. Task 1\n\nDescription of task 1.\n\n### 2. Task 2\n\nDescription of task 2.\n\n## Acceptance Criteria\n\n- [ ] Criterion 1\n- [ ] Criterion 2\n\n## Testing\n\nDescribe how to verify this step is complete.\n\n## Files Changed\n\n- File 1\n- File 2\n\n## Notes\n\nAdditional notes for this step.\n`;\n}\n\n// ===== UTILITIES =====\n\n/**\n * Get default steps when none provided\n */\nfunction getDefaultSteps(): Array<{ title: string; description?: string }> {\n return [\n { title: \"Setup\", description: \"Initial setup and prerequisites\" },\n { title: \"Implementation\", description: \"Core implementation work\" },\n { title: \"Testing\", description: \"Verify everything works\" },\n ];\n}\n\n/**\n * Convert a title to a slug\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\n","/**\n * Plan Validation\n *\n * Validates plan structure, step numbering, dependencies, and content.\n * Provides actionable error messages and identifies fixable issues.\n */\n\nimport { access, readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Plan, PlanStep } from \"../types.js\";\nimport { PLAN_CONVENTIONS } from \"../types.js\";\n\n// ===== TYPES =====\n\nexport interface ValidationResult {\n /** Is the plan valid? */\n valid: boolean;\n\n /** Errors (must fix) */\n errors: ValidationError[];\n\n /** Warnings (should fix) */\n warnings: ValidationWarning[];\n\n /** Info (observations) */\n info: ValidationInfo[];\n\n /** Auto-fixable issues */\n fixable: FixableIssue[];\n}\n\nexport interface ValidationError {\n code: string;\n message: string;\n path?: string;\n step?: number;\n}\n\nexport interface ValidationWarning {\n code: string;\n message: string;\n path?: string;\n step?: number;\n}\n\nexport interface ValidationInfo {\n code: string;\n message: string;\n}\n\nexport interface FixableIssue {\n code: string;\n description: string;\n fix: () => Promise<void>;\n}\n\nexport interface ValidateOptions {\n /** Check step content */\n validateContent?: boolean;\n\n /** Check dependencies */\n validateDependencies?: boolean;\n\n /** Check STATUS.md consistency */\n validateStatus?: boolean;\n\n /** Strict mode (warnings become errors) */\n strict?: boolean;\n}\n\n// ===== STRUCTURE VALIDATION =====\n\n/**\n * Validate plan directory structure\n */\nasync function validateStructure(planPath: string): Promise<{\n errors: ValidationError[];\n warnings: ValidationWarning[];\n}> {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check directory exists\n try {\n await access(planPath);\n } catch {\n errors.push({\n code: \"DIR_NOT_FOUND\",\n message: `Plan directory not found: ${planPath}`,\n path: planPath,\n });\n return { errors, warnings };\n }\n\n // Check for SUMMARY.md\n const summaryPath = join(planPath, PLAN_CONVENTIONS.standardFiles.summary);\n try {\n await access(summaryPath);\n } catch {\n warnings.push({\n code: \"MISSING_SUMMARY\",\n message: \"SUMMARY.md not found\",\n path: summaryPath,\n });\n }\n\n // Check for STATUS.md\n const statusPath = join(planPath, PLAN_CONVENTIONS.standardFiles.status);\n try {\n await access(statusPath);\n } catch {\n warnings.push({\n code: \"MISSING_STATUS\",\n message: \"STATUS.md not found\",\n path: statusPath,\n });\n }\n\n // Check for EXECUTION_PLAN.md\n const execPath = join(\n planPath,\n PLAN_CONVENTIONS.standardFiles.executionPlan\n );\n try {\n await access(execPath);\n } catch {\n warnings.push({\n code: \"MISSING_EXEC_PLAN\",\n message: \"EXECUTION_PLAN.md not found\",\n path: execPath,\n });\n }\n\n // Check for plan/ directory or step files\n const planDir = join(planPath, PLAN_CONVENTIONS.standardDirs.plan);\n try {\n await access(planDir);\n const files = await readdir(planDir);\n const stepFiles = files.filter((f) =>\n PLAN_CONVENTIONS.stepPattern.test(f)\n );\n if (stepFiles.length === 0) {\n warnings.push({\n code: \"NO_STEPS\",\n message: \"No step files found in plan/ directory\",\n });\n }\n } catch {\n // Plan directory doesn't exist; check root for step files\n try {\n const rootFiles = await readdir(planPath);\n const stepFiles = rootFiles.filter((f) =>\n PLAN_CONVENTIONS.stepPattern.test(f)\n );\n if (stepFiles.length === 0) {\n warnings.push({\n code: \"NO_STEPS\",\n message: \"No step files found\",\n });\n }\n } catch {\n warnings.push({\n code: \"NO_STEPS\",\n message: \"Unable to read plan directory for step files\",\n });\n }\n }\n\n return { errors, warnings };\n}\n\n// ===== STEP NUMBERING VALIDATION =====\n\n/**\n * Validate step file numbering\n */\nasync function validateStepNumbering(planPath: string): Promise<{\n errors: ValidationError[];\n warnings: ValidationWarning[];\n fixable: FixableIssue[];\n}> {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const fixable: FixableIssue[] = [];\n\n // Get step files\n const planDir = join(planPath, PLAN_CONVENTIONS.standardDirs.plan);\n let stepFiles: string[] = [];\n let stepDir = planDir;\n\n try {\n const files = await readdir(planDir);\n stepFiles = files.filter((f) => PLAN_CONVENTIONS.stepPattern.test(f));\n } catch {\n // Plan dir doesn't exist; check root\n try {\n const files = await readdir(planPath);\n stepFiles = files.filter((f) =>\n PLAN_CONVENTIONS.stepPattern.test(f)\n );\n stepDir = planPath;\n } catch {\n return { errors, warnings, fixable };\n }\n }\n\n if (stepFiles.length === 0) return { errors, warnings, fixable };\n\n // Extract numbers\n const numbers: number[] = [];\n for (const file of stepFiles) {\n const match = file.match(PLAN_CONVENTIONS.stepPattern);\n if (match) {\n numbers.push(parseInt(match[1]));\n }\n }\n\n numbers.sort((a, b) => a - b);\n\n // Check for gaps\n for (let i = 0; i < numbers.length; i++) {\n const expected = i + 1;\n if (numbers[i] !== expected) {\n if (numbers[i] > expected) {\n warnings.push({\n code: \"STEP_GAP\",\n message: `Gap in step numbering: expected ${expected}, found ${numbers[i]}`,\n step: numbers[i],\n });\n\n // Add fixable (placeholder - actual fix would require more context)\n const gapPosition = expected;\n fixable.push({\n code: \"FIX_STEP_GAP\",\n description: `Renumber steps to close gap at ${gapPosition}`,\n fix: async () => {\n // This would need to be implemented with renumberSteps\n // For now, this is a placeholder that does nothing\n void stepDir; // Acknowledge the variable\n void gapPosition;\n },\n });\n }\n }\n }\n\n // Check for duplicates\n const seen = new Set<number>();\n for (const num of numbers) {\n if (seen.has(num)) {\n errors.push({\n code: \"DUPLICATE_STEP\",\n message: `Duplicate step number: ${num}`,\n step: num,\n });\n }\n seen.add(num);\n }\n\n // Check doesn't start at 0\n if (numbers[0] === 0) {\n warnings.push({\n code: \"STEP_ZERO\",\n message: \"Step numbering should start at 01, not 00\",\n });\n }\n\n return { errors, warnings, fixable };\n}\n\n// ===== CONTENT VALIDATION =====\n\n/**\n * Validate step file content\n */\nasync function validateStepContent(step: PlanStep): Promise<{\n errors: ValidationError[];\n warnings: ValidationWarning[];\n}> {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n try {\n const content = await readFile(step.filePath, \"utf-8\");\n\n // Check for title\n if (!content.match(/^#\\s+/m)) {\n warnings.push({\n code: \"MISSING_TITLE\",\n message: `Step ${step.number} missing title heading`,\n step: step.number,\n path: step.filePath,\n });\n }\n\n // Check for objective section\n if (!content.match(/##\\s+Objective/i)) {\n warnings.push({\n code: \"MISSING_OBJECTIVE\",\n message: `Step ${step.number} missing Objective section`,\n step: step.number,\n });\n }\n\n // Check for acceptance criteria\n if (!content.match(/##\\s+Acceptance Criteria/i)) {\n warnings.push({\n code: \"MISSING_ACCEPTANCE\",\n message: `Step ${step.number} missing Acceptance Criteria section`,\n step: step.number,\n });\n }\n\n // Check step number in title matches filename\n const titleMatch = content.match(/^#\\s+Step\\s+(\\d+)/m);\n if (titleMatch) {\n const titleNum = parseInt(titleMatch[1]);\n if (titleNum !== step.number) {\n errors.push({\n code: \"STEP_NUMBER_MISMATCH\",\n message: `Step ${step.number} has title \"Step ${titleNum}\" - mismatch`,\n step: step.number,\n });\n }\n }\n } catch {\n errors.push({\n code: \"STEP_UNREADABLE\",\n message: `Cannot read step file: ${step.filePath}`,\n step: step.number,\n });\n }\n\n return { errors, warnings };\n}\n\n// ===== DEPENDENCY VALIDATION =====\n\n/**\n * Validate step dependencies\n */\nfunction validateDependenciesCheck(steps: PlanStep[]): {\n errors: ValidationError[];\n warnings: ValidationWarning[];\n} {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n const stepNumbers = new Set(steps.map((s) => s.number));\n\n for (const step of steps) {\n if (!step.dependencies) continue;\n\n for (const dep of step.dependencies) {\n // Check dependency exists\n if (!stepNumbers.has(dep)) {\n errors.push({\n code: \"INVALID_DEPENDENCY\",\n message: `Step ${step.number} depends on non-existent step ${dep}`,\n step: step.number,\n });\n }\n\n // Check for self-dependency\n if (dep === step.number) {\n errors.push({\n code: \"SELF_DEPENDENCY\",\n message: `Step ${step.number} depends on itself`,\n step: step.number,\n });\n }\n\n // Check for backward dependency\n if (dep > step.number) {\n warnings.push({\n code: \"FORWARD_DEPENDENCY\",\n message: `Step ${step.number} depends on later step ${dep}`,\n step: step.number,\n });\n }\n }\n }\n\n // Check for circular dependencies\n const circular = detectCircularDependencies(steps);\n for (const cycle of circular) {\n errors.push({\n code: \"CIRCULAR_DEPENDENCY\",\n message: `Circular dependency detected: ${cycle.join(\" → \")}`,\n });\n }\n\n return { errors, warnings };\n}\n\n/**\n * Detect circular dependencies using DFS\n */\nfunction detectCircularDependencies(steps: PlanStep[]): number[][] {\n const cycles: number[][] = [];\n const visited = new Set<number>();\n const inStack = new Set<number>();\n const path: number[] = [];\n\n const stepMap = new Map(steps.map((s) => [s.number, s]));\n\n function dfs(stepNum: number): void {\n if (inStack.has(stepNum)) {\n // Found cycle\n const cycleStart = path.indexOf(stepNum);\n cycles.push([...path.slice(cycleStart), stepNum]);\n return;\n }\n\n if (visited.has(stepNum)) return;\n\n visited.add(stepNum);\n inStack.add(stepNum);\n path.push(stepNum);\n\n const step = stepMap.get(stepNum);\n if (step?.dependencies) {\n for (const dep of step.dependencies) {\n dfs(dep);\n }\n }\n\n path.pop();\n inStack.delete(stepNum);\n }\n\n for (const step of steps) {\n dfs(step.number);\n }\n\n return cycles;\n}\n\n// ===== MAIN VALIDATION FUNCTION =====\n\n/**\n * Validate a plan\n */\nexport async function validatePlan(\n planPath: string,\n options: ValidateOptions = {}\n): Promise<ValidationResult> {\n const {\n validateContent = true,\n validateDependencies: checkDeps = true,\n validateStatus = true,\n strict = false,\n } = options;\n\n const result: ValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n info: [],\n fixable: [],\n };\n\n // Structure validation\n const structure = await validateStructure(planPath);\n result.errors.push(...structure.errors);\n result.warnings.push(...structure.warnings);\n\n // If directory doesn't exist, return early\n if (structure.errors.some((e) => e.code === \"DIR_NOT_FOUND\")) {\n result.valid = false;\n return result;\n }\n\n // Step numbering\n const numbering = await validateStepNumbering(planPath);\n result.errors.push(...numbering.errors);\n result.warnings.push(...numbering.warnings);\n result.fixable.push(...numbering.fixable);\n\n // Try to load plan for further validation\n try {\n const { loadPlan } = await import(\"./loader.js\");\n const plan: Plan = await loadPlan(planPath, {\n parseStatus: validateStatus,\n });\n\n // Content validation\n if (validateContent) {\n for (const step of plan.steps) {\n const content = await validateStepContent(step);\n result.errors.push(...content.errors);\n result.warnings.push(...content.warnings);\n }\n }\n\n // Dependency validation\n if (checkDeps) {\n const deps = validateDependenciesCheck(plan.steps);\n result.errors.push(...deps.errors);\n result.warnings.push(...deps.warnings);\n }\n\n // Info\n result.info.push({\n code: \"PLAN_LOADED\",\n message: `Plan \"${plan.metadata.name}\" loaded with ${plan.steps.length} steps`,\n });\n } catch (e) {\n result.errors.push({\n code: \"LOAD_FAILED\",\n message: `Failed to load plan: ${(e as Error).message}`,\n });\n }\n\n // Determine validity\n if (strict) {\n result.valid =\n result.errors.length === 0 && result.warnings.length === 0;\n } else {\n result.valid = result.errors.length === 0;\n }\n\n return result;\n}\n\n","import { mkdir, writeFile, readFile, readdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\n\nexport interface SavedPrompt {\n id: string;\n timestamp: Date;\n type: \"initial\" | \"elaborate\" | \"amend\";\n content: string;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Save the initial plan prompt\n */\nexport async function saveInitialPrompt(\n planPath: string,\n planName: string,\n content: string\n): Promise<string> {\n const filePath = join(planPath, `${planName}-prompt.md`);\n \n const markdown = `# ${planName}\n\n## Initial Prompt\n\n*Saved: ${new Date().toISOString()}*\n\n---\n\n${content}\n`;\n \n await mkdir(dirname(filePath), { recursive: true });\n await writeFile(filePath, markdown, \"utf-8\");\n return filePath;\n}\n\n/**\n * Save an elaboration prompt to analysis/prompts/\n */\nexport async function saveElaborationPrompt(\n planPath: string,\n content: string,\n metadata?: Record<string, unknown>\n): Promise<string> {\n const promptsDir = join(planPath, \"analysis\", \"prompts\");\n await mkdir(promptsDir, { recursive: true });\n \n // Get next number\n const existing = await getPromptFiles(promptsDir);\n const nextNum = existing.length + 1;\n const paddedNum = String(nextNum).padStart(3, \"0\");\n \n const filePath = join(promptsDir, `${paddedNum}-feedback.md`);\n \n const markdown = `# Elaboration Feedback #${nextNum}\n\n*Saved: ${new Date().toISOString()}*\n\n${metadata ? `## Context\\n\\n${JSON.stringify(metadata, null, 2)}\\n` : \"\"}\n## Feedback\n\n${content}\n`;\n \n await writeFile(filePath, markdown, \"utf-8\");\n return filePath;\n}\n\n/**\n * Save an amendment prompt to amendments/\n */\nexport async function saveAmendmentPrompt(\n planPath: string,\n content: string,\n metadata?: Record<string, unknown>\n): Promise<string> {\n const amendmentsDir = join(planPath, \"amendments\");\n await mkdir(amendmentsDir, { recursive: true });\n \n // Get next number\n const existing = await getPromptFiles(amendmentsDir);\n const nextNum = existing.length + 1;\n const paddedNum = String(nextNum).padStart(3, \"0\");\n \n const filePath = join(amendmentsDir, `${paddedNum}-feedback.md`);\n \n const markdown = `# Plan Amendment #${nextNum}\n\n*Saved: ${new Date().toISOString()}*\n\n${metadata ? `## Context\\n\\n${JSON.stringify(metadata, null, 2)}\\n` : \"\"}\n## Amendment\n\n${content}\n`;\n \n await writeFile(filePath, markdown, \"utf-8\");\n return filePath;\n}\n\n/**\n * Get all prompt files in a directory\n */\nasync function getPromptFiles(dir: string): Promise<string[]> {\n try {\n const files = await readdir(dir);\n return files.filter(f => f.endsWith(\".md\")).sort();\n } catch {\n return [];\n }\n}\n\n/**\n * Load all elaboration prompts for a plan\n */\nexport async function loadElaborationPrompts(\n planPath: string\n): Promise<SavedPrompt[]> {\n const promptsDir = join(planPath, \"analysis\", \"prompts\");\n const files = await getPromptFiles(promptsDir);\n \n const prompts: SavedPrompt[] = [];\n for (const file of files) {\n const content = await readFile(join(promptsDir, file), \"utf-8\");\n const match = file.match(/^(\\d+)-/);\n prompts.push({\n id: match ? match[1] : file,\n timestamp: new Date(), // Could parse from content\n type: \"elaborate\",\n content,\n });\n }\n return prompts;\n}\n\n/**\n * Load all amendment prompts for a plan\n */\nexport async function loadAmendmentPrompts(\n planPath: string\n): Promise<SavedPrompt[]> {\n const amendmentsDir = join(planPath, \"amendments\");\n const files = await getPromptFiles(amendmentsDir);\n \n const prompts: SavedPrompt[] = [];\n for (const file of files) {\n const content = await readFile(join(amendmentsDir, file), \"utf-8\");\n const match = file.match(/^(\\d+)-/);\n prompts.push({\n id: match ? match[1] : file,\n timestamp: new Date(),\n type: \"amend\",\n content,\n });\n }\n return prompts;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\n\nexport interface CreateAnalysisOptions {\n planPath: string;\n planName: string;\n initialPrompt: string;\n}\n\n/**\n * Create the analysis directory structure\n */\nexport async function createAnalysisDirectory(\n options: CreateAnalysisOptions\n): Promise<string> {\n const { planPath, planName, initialPrompt } = options;\n const analysisPath = join(planPath, \"analysis\");\n \n // Create directories\n await mkdir(join(analysisPath, \"prompts\"), { recursive: true });\n \n // Create initial REQUIREMENTS.md\n const requirementsContent = generateRequirementsTemplate(planName, initialPrompt);\n await writeFile(\n join(analysisPath, \"REQUIREMENTS.md\"),\n requirementsContent,\n \"utf-8\"\n );\n \n return analysisPath;\n}\n\n/**\n * Generate the initial REQUIREMENTS.md template\n */\nfunction generateRequirementsTemplate(planName: string, prompt: string): string {\n return `# ${formatPlanName(planName)} - Requirements Analysis\n\n## Status\n\n| Field | Value |\n|-------|-------|\n| **Status** | \\`draft\\` |\n| **Created** | ${new Date().toISOString().split(\"T\")[0]} |\n| **Last Updated** | ${new Date().toISOString().split(\"T\")[0]} |\n| **Elaborations** | 0 |\n\n## Initial Prompt\n\n${prompt}\n\n---\n\n## Requirements\n\n> This section should be elaborated based on the initial prompt.\n> Use \\`riotplan elaborate\\` to provide feedback and refine requirements.\n\n### Functional Requirements\n\n_To be elaborated..._\n\n### Non-Functional Requirements\n\n_To be elaborated..._\n\n### Constraints\n\n_To be elaborated..._\n\n### Assumptions\n\n_To be elaborated..._\n\n---\n\n## Verification Criteria\n\n> These criteria will be used to verify the plan addresses all requirements.\n\n### Must Have\n\n- [ ] _To be defined..._\n\n### Should Have\n\n- [ ] _To be defined..._\n\n### Could Have\n\n- [ ] _To be defined..._\n\n---\n\n## Notes\n\n_Add any additional context or notes here._\n`;\n}\n\n/**\n * Convert kebab-case to Title Case\n */\nfunction formatPlanName(name: string): string {\n return name\n .split(\"-\")\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n","import { readFile, readdir, stat } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Analysis, AnalysisMetadata, ElaborationRecord } from \"./types.js\";\n\n/**\n * Load an analysis from disk\n */\nexport async function loadAnalysis(planPath: string): Promise<Analysis | null> {\n const analysisPath = join(planPath, \"analysis\");\n \n // Check if analysis exists\n try {\n await stat(analysisPath);\n } catch {\n return null;\n }\n \n // Load requirements\n let requirements = \"\";\n try {\n requirements = await readFile(\n join(analysisPath, \"REQUIREMENTS.md\"),\n \"utf-8\"\n );\n } catch {\n // No requirements file\n }\n \n // Load philosophy (optional)\n let philosophy: string | undefined;\n try {\n philosophy = await readFile(\n join(analysisPath, \"PHILOSOPHY.md\"),\n \"utf-8\"\n );\n } catch {\n // No philosophy file\n }\n \n // Load elaborations\n const elaborations = await loadElaborations(analysisPath);\n \n // Build metadata\n const metadata: AnalysisMetadata = {\n createdAt: new Date(), // Could parse from REQUIREMENTS.md\n updatedAt: new Date(),\n elaborationCount: elaborations.length,\n status: parseAnalysisStatus(requirements),\n };\n \n return {\n path: analysisPath,\n requirements,\n philosophy,\n elaborations,\n metadata,\n };\n}\n\n/**\n * Load all elaboration records\n */\nasync function loadElaborations(analysisPath: string): Promise<ElaborationRecord[]> {\n const promptsDir = join(analysisPath, \"prompts\");\n const records: ElaborationRecord[] = [];\n \n try {\n const files = await readdir(promptsDir);\n const mdFiles = files.filter(f => f.endsWith(\".md\")).sort();\n \n for (const file of mdFiles) {\n const content = await readFile(join(promptsDir, file), \"utf-8\");\n const match = file.match(/^(\\d+)-/);\n records.push({\n id: match ? match[1] : file,\n timestamp: new Date(), // Could parse from content\n content,\n });\n }\n } catch {\n // No prompts directory\n }\n \n return records;\n}\n\n/**\n * Parse analysis status from requirements content\n */\nfunction parseAnalysisStatus(content: string): \"draft\" | \"ready\" | \"converted\" {\n const statusMatch = content.match(/\\*\\*Status\\*\\*\\s*\\|\\s*`(\\w+)`/);\n if (statusMatch) {\n const status = statusMatch[1];\n if (status === \"ready\" || status === \"converted\") {\n return status;\n }\n }\n return \"draft\";\n}\n\n/**\n * Check if a plan has an analysis\n */\nexport async function hasAnalysis(planPath: string): Promise<boolean> {\n try {\n await stat(join(planPath, \"analysis\", \"REQUIREMENTS.md\"));\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Feedback Module\n *\n * The philosophical foundation of RiotPlan: preserving deliberation, not just decisions.\n *\n * Feedback records capture:\n * - What was proposed\n * - What feedback was given\n * - What was changed as a result\n * - Why the change was made\n * - Who was involved\n */\n\nimport { readdir, readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n FeedbackRecord,\n FeedbackParticipant,\n FeedbackPlatform,\n FeedbackContext,\n} from \"../types.js\";\nimport { PLAN_CONVENTIONS } from \"../types.js\";\n\n// ===== TYPES =====\n\n/**\n * Options for creating feedback\n */\nexport interface CreateFeedbackOptions {\n /** Feedback title */\n title: string;\n\n /** The feedback content */\n feedback: string;\n\n /** Participants */\n participants?: FeedbackParticipant[];\n\n /** Platform where feedback occurred */\n platform?: FeedbackPlatform;\n\n /** What was proposed before feedback */\n proposed?: string;\n\n /** Discussion/debate content */\n discussion?: string;\n\n /** Resolution/outcome */\n resolution?: string;\n\n /** Changes made as a result */\n changes?: string[];\n\n /** Open questions remaining */\n openQuestions?: string[];\n\n /** Context references (file:lines) */\n context?: FeedbackContext[];\n\n /** Plan version this relates to */\n planVersion?: string;\n}\n\n/**\n * Result of creating feedback\n */\nexport interface CreateFeedbackResult {\n /** Created feedback record */\n record: FeedbackRecord;\n\n /** Path to created file */\n path: string;\n}\n\n// ===== MAIN EXPORTS =====\n\n/**\n * Create a new feedback record\n *\n * @param planPath - Path to the plan directory\n * @param options - Feedback options\n * @returns The created feedback record and file path\n *\n * @example\n * ```typescript\n * const result = await createFeedback('./prompts/my-plan', {\n * title: 'Initial Review',\n * feedback: 'Consider adding more error handling',\n * participants: [\n * { name: 'Tim', type: 'human' },\n * { name: 'Claude', type: 'ai', model: 'claude-sonnet-4' }\n * ],\n * platform: 'cursor'\n * });\n * console.log(result.record.id); // '001'\n * ```\n */\nexport async function createFeedback(\n planPath: string,\n options: CreateFeedbackOptions\n): Promise<CreateFeedbackResult> {\n // Ensure feedback directory exists\n const feedbackDir = join(planPath, PLAN_CONVENTIONS.standardDirs.feedback);\n await mkdir(feedbackDir, { recursive: true });\n\n // Generate ID and filename\n const id = await getNextFeedbackId(feedbackDir);\n const slug = slugify(options.title);\n const filename = `${id}-${slug}.md`;\n const filePath = join(feedbackDir, filename);\n\n // Generate content\n const content = generateFeedbackMd(id, options);\n\n // Write file\n await writeFile(filePath, content);\n\n // Construct record\n const record: FeedbackRecord = {\n id,\n title: options.title,\n createdAt: new Date(),\n participants: options.participants || [{ name: \"Unknown\", type: \"human\" }],\n platform: options.platform || \"other\",\n feedback: options.feedback,\n proposed: options.proposed,\n discussion: options.discussion,\n resolution: options.resolution,\n changes: options.changes,\n openQuestions: options.openQuestions,\n context: options.context,\n planVersion: options.planVersion,\n filename,\n };\n\n return { record, path: filePath };\n}\n\n/**\n * List all feedback records for a plan\n *\n * @param planPath - Path to the plan directory\n * @returns Array of feedback records sorted by ID\n */\nexport async function listFeedback(\n planPath: string\n): Promise<FeedbackRecord[]> {\n const feedbackDir = join(planPath, PLAN_CONVENTIONS.standardDirs.feedback);\n\n try {\n const files = await readdir(feedbackDir);\n const records: FeedbackRecord[] = [];\n\n for (const file of files) {\n if (!PLAN_CONVENTIONS.feedbackPattern.test(file)) continue;\n\n try {\n const content = await readFile(join(feedbackDir, file), \"utf-8\");\n const record = parseFeedbackFile(file, content);\n if (record) records.push(record);\n } catch {\n // Skip files that can't be read\n }\n }\n\n return records.sort((a, b) => a.id.localeCompare(b.id));\n } catch {\n return []; // No feedback directory\n }\n}\n\n/**\n * Get a specific feedback record by ID\n *\n * @param planPath - Path to the plan directory\n * @param id - Feedback ID (e.g., '001' or '1')\n * @returns The feedback record or null if not found\n */\nexport async function getFeedback(\n planPath: string,\n id: string\n): Promise<FeedbackRecord | null> {\n const feedbackDir = join(planPath, PLAN_CONVENTIONS.standardDirs.feedback);\n const normalizedId = id.padStart(3, \"0\");\n\n try {\n const files = await readdir(feedbackDir);\n\n for (const file of files) {\n const match = file.match(PLAN_CONVENTIONS.feedbackPattern);\n if (match && match[1] === normalizedId) {\n const content = await readFile(join(feedbackDir, file), \"utf-8\");\n return parseFeedbackFile(file, content);\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n// ===== ID GENERATION =====\n\n/**\n * Get the next feedback ID\n */\nasync function getNextFeedbackId(feedbackDir: string): Promise<string> {\n try {\n const files = await readdir(feedbackDir);\n let maxId = 0;\n\n for (const file of files) {\n const match = file.match(PLAN_CONVENTIONS.feedbackPattern);\n if (match) {\n const id = parseInt(match[1]);\n if (id > maxId) maxId = id;\n }\n }\n\n return String(maxId + 1).padStart(3, \"0\");\n } catch {\n // Directory doesn't exist yet\n return \"001\";\n }\n}\n\n/**\n * Convert a title to a slug\n */\nfunction slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .substring(0, 50);\n}\n\n// ===== FILE GENERATION =====\n\n/**\n * Generate feedback markdown content\n */\nfunction generateFeedbackMd(\n _id: string,\n options: CreateFeedbackOptions\n): string {\n const date = new Date().toISOString().split(\"T\")[0];\n\n let content = `# Feedback: ${options.title}\n\n## Context\n\n- **Date**: ${date}\n`;\n\n // Add participants\n if (options.participants && options.participants.length > 0) {\n const participantStr = options.participants\n .map(\n (p) =>\n `${p.name} (${p.type}${p.model ? `, ${p.model}` : \"\"})`\n )\n .join(\", \");\n content += `- **Participants**: ${participantStr}\\n`;\n }\n\n // Add platform\n if (options.platform) {\n content += `- **Platform**: ${options.platform}\\n`;\n }\n\n // Add plan version\n if (options.planVersion) {\n content += `- **Plan Version**: ${options.planVersion}\\n`;\n }\n\n // Add file context\n if (options.context && options.context.length > 0) {\n const contextStr = options.context\n .map((c) =>\n c.startLine\n ? `${c.file}:${c.startLine}-${c.endLine || c.startLine}`\n : c.file\n )\n .join(\", \");\n content += `- **Related Files**: ${contextStr}\\n`;\n }\n\n // What was proposed\n if (options.proposed) {\n content += `\n## What Was Proposed\n\n${options.proposed}\n`;\n }\n\n // Feedback given\n content += `\n## Feedback Given\n\n${options.feedback}\n`;\n\n // Discussion\n if (options.discussion) {\n content += `\n## Discussion\n\n${options.discussion}\n`;\n }\n\n // Resolution\n if (options.resolution) {\n content += `\n## Resolution\n\n${options.resolution}\n`;\n }\n\n // Changes made\n if (options.changes && options.changes.length > 0) {\n content += `\n## Changes Made\n\n${options.changes.map((c) => `- ${c}`).join(\"\\n\")}\n`;\n }\n\n // Open questions\n if (options.openQuestions && options.openQuestions.length > 0) {\n content += `\n## Open Questions\n\n${options.openQuestions.map((q) => `- ${q}`).join(\"\\n\")}\n`;\n }\n\n return content;\n}\n\n// ===== FILE PARSING =====\n\n/**\n * Parse a feedback file into a FeedbackRecord\n */\nfunction parseFeedbackFile(\n filename: string,\n content: string\n): FeedbackRecord | null {\n const match = filename.match(PLAN_CONVENTIONS.feedbackPattern);\n if (!match) return null;\n\n const [, id] = match;\n\n // Extract title from first heading\n const titleMatch = content.match(/^#\\s+Feedback:\\s+(.+)$/m);\n const title = titleMatch ? titleMatch[1].trim() : \"Untitled\";\n\n // Extract date from context\n const dateMatch = content.match(/\\*\\*Date\\*\\*:\\s*(\\d{4}-\\d{2}-\\d{2})/);\n const createdAt = dateMatch ? new Date(dateMatch[1]) : new Date();\n\n // Extract platform\n const platformMatch = content.match(/\\*\\*Platform\\*\\*:\\s*(\\w+)/);\n let platform: FeedbackPlatform = \"other\";\n if (platformMatch) {\n const p = platformMatch[1].toLowerCase();\n const validPlatforms: FeedbackPlatform[] = [\n \"cursor\",\n \"chatgpt\",\n \"slack\",\n \"email\",\n \"meeting\",\n \"voice\",\n \"document\",\n \"other\",\n ];\n if (validPlatforms.includes(p as FeedbackPlatform)) {\n platform = p as FeedbackPlatform;\n }\n }\n\n // Extract plan version\n const versionMatch = content.match(/\\*\\*Plan Version\\*\\*:\\s*(.+)/);\n const planVersion = versionMatch ? versionMatch[1].trim() : undefined;\n\n // Extract participants\n const participants: FeedbackParticipant[] = [];\n const participantsMatch = content.match(/\\*\\*Participants\\*\\*:\\s*(.+)/);\n if (participantsMatch) {\n // Split on \"), \" to handle participants with models containing commas\n const parts = participantsMatch[1].split(/\\),\\s*/);\n for (const part of parts) {\n // Add back the closing paren if it was removed by split\n const fullPart = part.endsWith(\")\") ? part : part + \")\";\n const pMatch = fullPart\n .trim()\n .match(/(.+?)\\s*\\((\\w+)(?:,\\s*(.+))?\\)/);\n if (pMatch) {\n participants.push({\n name: pMatch[1].trim(),\n type: pMatch[2] as \"human\" | \"ai\",\n model: pMatch[3]?.trim(),\n });\n }\n }\n }\n\n // Extract sections\n const feedbackContent = extractSection(content, \"Feedback Given\");\n const proposed = extractSection(content, \"What Was Proposed\");\n const discussion = extractSection(content, \"Discussion\");\n const resolution = extractSection(content, \"Resolution\");\n const changesSection = extractSection(content, \"Changes Made\");\n const openQuestionsSection = extractSection(content, \"Open Questions\");\n\n // Parse changes as list\n const changes = changesSection\n ? changesSection\n .split(\"\\n\")\n .filter((line) => line.trim().startsWith(\"-\"))\n .map((line) => line.trim().replace(/^-\\s*/, \"\"))\n : undefined;\n\n // Parse open questions as list\n const openQuestions = openQuestionsSection\n ? openQuestionsSection\n .split(\"\\n\")\n .filter((line) => line.trim().startsWith(\"-\"))\n .map((line) => line.trim().replace(/^-\\s*/, \"\"))\n : undefined;\n\n return {\n id,\n title,\n createdAt,\n participants:\n participants.length > 0\n ? participants\n : [{ name: \"Unknown\", type: \"human\" }],\n platform,\n feedback: feedbackContent || content,\n proposed,\n discussion,\n resolution,\n changes,\n openQuestions,\n planVersion,\n filename,\n };\n}\n\n/**\n * Extract a section from markdown content\n */\nfunction extractSection(\n content: string,\n sectionName: string\n): string | undefined {\n const regex = new RegExp(\n `##\\\\s+${sectionName}\\\\s*\\\\n([\\\\s\\\\S]*?)(?=\\\\n##|$)`,\n \"i\"\n );\n const match = content.match(regex);\n return match ? match[1].trim() : undefined;\n}\n\n","/**\n * STATUS.md Generator\n *\n * Generates and updates STATUS.md files from plan state.\n */\n\nimport type {\n Plan,\n PlanStep,\n TaskStatus,\n Blocker,\n Issue,\n} from \"../types.js\";\nimport { PLAN_CONVENTIONS } from \"../types.js\";\n\n// ===== TYPES =====\n\nexport interface GenerateStatusOptions {\n /** Preserve existing notes section */\n preserveNotes?: boolean;\n\n /** Existing STATUS.md content (for preservation) */\n existingContent?: string;\n\n /** Include phase progress if phases defined */\n includePhases?: boolean;\n\n /** Date format for timestamps */\n dateFormat?: \"iso\" | \"short\" | \"long\";\n}\n\nexport interface UpdateStatusOptions {\n /** Step that was completed/updated */\n step?: number;\n\n /** New status for step */\n stepStatus?: TaskStatus;\n\n /** Add blocker */\n addBlocker?: string;\n\n /** Remove blocker by description match */\n removeBlocker?: string;\n\n /** Add issue */\n addIssue?: { title: string; description: string };\n\n /** Add note */\n addNote?: string;\n}\n\n// ===== DATE FORMATTING =====\n\n/**\n * Format a date for display\n */\nfunction formatDate(\n date: Date | undefined,\n format: \"iso\" | \"short\" | \"long\"\n): string {\n if (!date) return \"-\";\n\n switch (format) {\n case \"iso\":\n return date.toISOString().split(\"T\")[0];\n case \"long\":\n return date.toLocaleDateString(\"en-US\", {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n });\n case \"short\":\n default:\n return date.toISOString().split(\"T\")[0];\n }\n}\n\n/**\n * Get emoji for status\n */\nfunction getStatusEmoji(status: TaskStatus): string {\n return PLAN_CONVENTIONS.statusEmoji[status] || \"⬜\";\n}\n\n/**\n * Get display string for status (emoji + text)\n */\nfunction getStatusDisplay(status: TaskStatus): string {\n const emoji = getStatusEmoji(status);\n const text = status.toUpperCase().replace(\"_\", \" \");\n return `${emoji} ${text}`;\n}\n\n// ===== SECTION GENERATORS =====\n\n/**\n * Generate the Current State section\n */\nfunction generateCurrentStateSection(\n plan: Plan,\n dateFormat: \"iso\" | \"short\" | \"long\"\n): string {\n const { state, steps } = plan;\n const completedCount = steps.filter((s) => s.status === \"completed\").length;\n const progress =\n steps.length > 0\n ? Math.round((completedCount / steps.length) * 100)\n : 0;\n\n const currentStep = state.currentStep\n ? steps.find((s) => s.number === state.currentStep)\n : undefined;\n const lastCompleted = state.lastCompletedStep\n ? steps.find((s) => s.number === state.lastCompletedStep)\n : undefined;\n\n const currentStepDisplay = currentStep\n ? `${String(currentStep.number).padStart(2, \"0\")} - ${currentStep.title}`\n : \"-\";\n const lastCompletedDisplay = lastCompleted\n ? `${String(lastCompleted.number).padStart(2, \"0\")} - ${lastCompleted.title}`\n : \"-\";\n\n return `## Current State\n\n| Field | Value |\n|-------|-------|\n| **Status** | ${getStatusDisplay(state.status)} |\n| **Current Step** | ${currentStepDisplay} |\n| **Last Completed** | ${lastCompletedDisplay} |\n| **Started** | ${formatDate(state.startedAt, dateFormat)} |\n| **Last Updated** | ${formatDate(state.lastUpdatedAt, dateFormat)} |\n| **Progress** | ${progress}% (${completedCount}/${steps.length} steps) |\n`;\n}\n\n/**\n * Generate the Phase Progress section\n */\nfunction generatePhaseProgressSection(plan: Plan): string {\n if (!plan.phases || plan.phases.length === 0) return \"\";\n\n let content = `## Phase Progress\n\n| Phase | Steps | Status | Progress |\n|-------|-------|--------|----------|\n`;\n\n for (const phase of plan.phases) {\n const phaseSteps = plan.steps.filter((s) =>\n phase.steps.includes(s.number)\n );\n const completed = phaseSteps.filter(\n (s) => s.status === \"completed\"\n ).length;\n const progress = `${completed}/${phaseSteps.length}`;\n const stepRange = `${String(phase.steps[0]).padStart(2, \"0\")}-${String(phase.steps[phase.steps.length - 1]).padStart(2, \"0\")}`;\n const statusText =\n phase.status.charAt(0).toUpperCase() +\n phase.status.slice(1).replace(\"_\", \" \");\n\n content += `| **${phase.name}** | ${stepRange} | ${getStatusEmoji(phase.status)} ${statusText} | ${progress} |\\n`;\n }\n\n return content + \"\\n\";\n}\n\n/**\n * Generate the Step Progress section\n */\nfunction generateStepProgressSection(\n steps: PlanStep[],\n dateFormat: \"iso\" | \"short\" | \"long\"\n): string {\n let content = `## Step Progress\n\n| Step | Name | Status | Started | Completed | Notes |\n|------|------|--------|---------|-----------|-------|\n`;\n\n for (const step of steps) {\n const num = String(step.number).padStart(2, \"0\");\n const started = formatDate(step.startedAt, dateFormat);\n const completed = formatDate(step.completedAt, dateFormat);\n const notes = step.notes || \"\";\n\n content += `| ${num} | ${step.title} | ${getStatusEmoji(step.status)} | ${started} | ${completed} | ${notes} |\\n`;\n }\n\n return content + \"\\n\";\n}\n\n/**\n * Generate the Blockers section\n */\nfunction generateBlockersSection(blockers: Blocker[]): string {\n if (blockers.length === 0) {\n return `## Blockers\n\nNone currently.\n\n`;\n }\n\n let content = `## Blockers\n\n`;\n for (const blocker of blockers) {\n content += `- ${blocker.description}`;\n if (blocker.affectedSteps && blocker.affectedSteps.length > 0) {\n content += ` (affects steps: ${blocker.affectedSteps.join(\", \")})`;\n }\n content += \"\\n\";\n }\n\n return content + \"\\n\";\n}\n\n/**\n * Generate the Issues section\n */\nfunction generateIssuesSection(issues: Issue[]): string {\n if (issues.length === 0) {\n return `## Issues\n\nNone currently.\n\n`;\n }\n\n let content = `## Issues\n\n`;\n for (const issue of issues) {\n content += `- **${issue.title}**: ${issue.description}\\n`;\n }\n\n return content + \"\\n\";\n}\n\n/**\n * Generate the Notes section\n */\nfunction generateNotesSection(existingNotes?: string): string {\n const notes = existingNotes || \"\";\n\n return `## Notes\n\n${notes}\n\n`;\n}\n\n/**\n * Generate the footer with status legend\n */\nfunction generateFooter(dateFormat: \"iso\" | \"short\" | \"long\"): string {\n return `---\n\n**Status Legend**:\n- ${PLAN_CONVENTIONS.statusEmoji.pending} Pending\n- ${PLAN_CONVENTIONS.statusEmoji.in_progress} In Progress\n- ${PLAN_CONVENTIONS.statusEmoji.completed} Completed\n- ${PLAN_CONVENTIONS.statusEmoji.failed} Failed\n- ${PLAN_CONVENTIONS.statusEmoji.blocked} Blocked\n- ${PLAN_CONVENTIONS.statusEmoji.skipped} Skipped\n\n*Last updated: ${formatDate(new Date(), dateFormat)}*\n`;\n}\n\n// ===== MAIN FUNCTIONS =====\n\n/**\n * Generate a complete STATUS.md document from a plan\n */\nexport function generateStatus(\n plan: Plan,\n options: GenerateStatusOptions = {}\n): string {\n const {\n preserveNotes = true,\n existingContent,\n includePhases = true,\n dateFormat = \"short\",\n } = options;\n\n // Extract existing notes if preserving\n let existingNotes: string | undefined;\n if (preserveNotes && existingContent) {\n const notesMatch = existingContent.match(\n /## Notes\\s*\\n([\\s\\S]*?)(?=\\n---|\\n##|$)/\n );\n if (notesMatch) {\n existingNotes = notesMatch[1].trim();\n }\n }\n\n // Build document\n let content = `# ${plan.metadata.name} Status\n\n`;\n\n // Current state\n content += generateCurrentStateSection(plan, dateFormat);\n content += \"\\n\";\n\n // Phase progress (if applicable)\n if (includePhases && plan.phases && plan.phases.length > 0) {\n content += generatePhaseProgressSection(plan);\n }\n\n // Step progress\n content += generateStepProgressSection(plan.steps, dateFormat);\n\n // Blockers\n content += generateBlockersSection(plan.state.blockers);\n\n // Issues\n content += generateIssuesSection(plan.state.issues);\n\n // Notes\n content += generateNotesSection(existingNotes);\n\n // Footer\n content += generateFooter(dateFormat);\n\n return content;\n}\n\n/**\n * Update a plan's state based on status changes\n */\nexport function updateStatus(plan: Plan, updates: UpdateStatusOptions): Plan {\n const updatedState = { ...plan.state };\n const updatedSteps = plan.steps.map((s) => ({ ...s }));\n\n // Update step status\n if (updates.step !== undefined && updates.stepStatus) {\n const stepIndex = updatedSteps.findIndex(\n (s) => s.number === updates.step\n );\n if (stepIndex >= 0) {\n updatedSteps[stepIndex] = {\n ...updatedSteps[stepIndex],\n status: updates.stepStatus,\n startedAt:\n updates.stepStatus === \"in_progress\"\n ? new Date()\n : updatedSteps[stepIndex].startedAt,\n completedAt:\n updates.stepStatus === \"completed\"\n ? new Date()\n : updatedSteps[stepIndex].completedAt,\n };\n\n // Update plan state\n if (updates.stepStatus === \"in_progress\") {\n updatedState.currentStep = updates.step;\n if (updatedState.status === \"pending\") {\n updatedState.status = \"in_progress\";\n updatedState.startedAt = new Date();\n }\n } else if (updates.stepStatus === \"completed\") {\n updatedState.lastCompletedStep = updates.step;\n\n // Check if all complete\n const allComplete = updatedSteps.every(\n (s) => s.status === \"completed\" || s.status === \"skipped\"\n );\n if (allComplete) {\n updatedState.status = \"completed\";\n updatedState.completedAt = new Date();\n }\n }\n }\n }\n\n // Add blocker\n if (updates.addBlocker) {\n updatedState.blockers = [\n ...updatedState.blockers,\n {\n id: `blocker-${Date.now()}`,\n description: updates.addBlocker,\n severity: \"medium\",\n affectedSteps: [],\n createdAt: new Date(),\n },\n ];\n }\n\n // Remove blocker\n if (updates.removeBlocker) {\n updatedState.blockers = updatedState.blockers.filter(\n (b) => !b.description.includes(updates.removeBlocker!)\n );\n }\n\n // Add issue\n if (updates.addIssue) {\n updatedState.issues = [\n ...updatedState.issues,\n {\n id: `issue-${Date.now()}`,\n title: updates.addIssue.title,\n description: updates.addIssue.description,\n severity: \"medium\",\n createdAt: new Date(),\n },\n ];\n }\n\n // Update timestamp\n updatedState.lastUpdatedAt = new Date();\n\n // Calculate progress\n const completedCount = updatedSteps.filter(\n (s) => s.status === \"completed\"\n ).length;\n updatedState.progress =\n updatedSteps.length > 0\n ? Math.round((completedCount / updatedSteps.length) * 100)\n : 0;\n\n return {\n ...plan,\n steps: updatedSteps,\n state: updatedState,\n };\n}\n\n","/**\n * Step Operations\n *\n * Provides functions for manipulating plan steps:\n * - Insert, remove, move steps with automatic renumbering\n * - Status changes (start, complete, block, unblock)\n */\n\nimport { readdir, rename, readFile, writeFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Plan, PlanStep, TaskStatus } from \"../types.js\";\nimport { PLAN_CONVENTIONS } from \"../types.js\";\n\n// ===== TYPES =====\n\nexport interface InsertStepOptions {\n /** Step title */\n title: string;\n\n /** Step description */\n description?: string;\n\n /** Position to insert (1-based). If omitted, appends. */\n position?: number;\n\n /** Insert after this step number */\n after?: number;\n\n /** Initial status */\n status?: TaskStatus;\n}\n\nexport interface InsertStepResult {\n /** Inserted step */\n step: PlanStep;\n\n /** Files that were renamed */\n renamedFiles: Array<{ from: string; to: string }>;\n\n /** Created file path */\n createdFile: string;\n}\n\nexport interface RemoveStepResult {\n /** Removed step */\n removedStep: PlanStep;\n\n /** Files that were renamed */\n renamedFiles: Array<{ from: string; to: string }>;\n\n /** Deleted file path */\n deletedFile: string;\n}\n\nexport interface MoveStepResult {\n /** Moved step */\n step: PlanStep;\n\n /** New position */\n newPosition: number;\n\n /** Files that were renamed */\n renamedFiles: Array<{ from: string; to: string }>;\n}\n\n// ===== INTERNAL TYPES =====\n\ninterface StepFile {\n number: number;\n code: string;\n filename: string;\n path: string;\n}\n\n// ===== HELPER FUNCTIONS =====\n\n/**\n * Get step files from a plan directory\n */\nasync function getStepFiles(planPath: string): Promise<StepFile[]> {\n // Try standard plan subdirectory first\n let planDir = join(planPath, PLAN_CONVENTIONS.standardDirs.plan);\n let entries: string[];\n\n try {\n entries = await readdir(planDir);\n } catch {\n // Fall back to root directory\n planDir = planPath;\n entries = await readdir(planDir);\n }\n\n const stepFiles: StepFile[] = [];\n\n for (const entry of entries) {\n const match = entry.match(PLAN_CONVENTIONS.stepPattern);\n if (match) {\n stepFiles.push({\n number: parseInt(match[1]),\n code: match[2],\n filename: entry,\n path: join(planDir, entry),\n });\n }\n }\n\n return stepFiles.sort((a, b) => a.number - b.number);\n}\n\n/**\n * Get the plan directory (either plan/ subdirectory or root)\n */\nasync function getPlanDir(planPath: string): Promise<string> {\n const standardDir = join(planPath, PLAN_CONVENTIONS.standardDirs.plan);\n try {\n await readdir(standardDir);\n return standardDir;\n } catch {\n return planPath;\n }\n}\n\n/**\n * Generate a step filename from number and code\n */\nfunction generateStepFilename(number: number, code: string): string {\n return `${String(number).padStart(2, \"0\")}-${code}.md`;\n}\n\n/**\n * Generate a code from a title\n */\nfunction generateCode(title: string): string {\n return title\n .toLowerCase()\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"\");\n}\n\n/**\n * Renumber steps starting from a position\n */\nasync function renumberSteps(\n planPath: string,\n fromNumber: number,\n delta: number // +1 for insert, -1 for remove\n): Promise<Array<{ from: string; to: string }>> {\n const planDir = await getPlanDir(planPath);\n const stepFiles = await getStepFiles(planPath);\n const renames: Array<{ from: string; to: string }> = [];\n\n // Sort in reverse for positive delta (avoid collisions)\n const sortedFiles =\n delta > 0\n ? stepFiles.filter((f) => f.number >= fromNumber).reverse()\n : stepFiles.filter((f) => f.number > fromNumber);\n\n for (const file of sortedFiles) {\n const newNumber = file.number + delta;\n const newFilename = generateStepFilename(newNumber, file.code);\n const newPath = join(planDir, newFilename);\n\n if (file.filename !== newFilename) {\n await rename(file.path, newPath);\n renames.push({ from: file.filename, to: newFilename });\n\n // Update step number reference inside the file\n const content = await readFile(newPath, \"utf-8\");\n const updatedContent = content.replace(\n /^#\\s+Step\\s+\\d+:/m,\n `# Step ${String(newNumber).padStart(2, \"0\")}:`\n );\n if (updatedContent !== content) {\n await writeFile(newPath, updatedContent);\n }\n }\n }\n\n return renames;\n}\n\n/**\n * Generate step file content\n */\nfunction generateStepContent(\n number: number,\n title: string,\n description?: string\n): string {\n const num = String(number).padStart(2, \"0\");\n return `# Step ${num}: ${title}\n\n## Objective\n\n${description || \"Describe the objective of this step.\"}\n\n## Background\n\nProvide context and rationale for this step.\n\n## Tasks\n\n### 1. Task 1\n\nDescription of task 1.\n\n## Acceptance Criteria\n\n- [ ] Criterion 1\n- [ ] Criterion 2\n\n## Testing\n\nDescribe how to verify this step is complete.\n\n## Files Changed\n\n- File 1\n\n## Notes\n\n`;\n}\n\n// ===== INSERT STEP =====\n\n/**\n * Insert a new step into a plan\n */\nexport async function insertStep(\n plan: Plan,\n options: InsertStepOptions\n): Promise<InsertStepResult> {\n const planDir = await getPlanDir(plan.metadata.path);\n\n // Determine position\n let position: number;\n if (options.position !== undefined) {\n position = options.position;\n } else if (options.after !== undefined) {\n position = options.after + 1;\n } else {\n position = plan.steps.length + 1;\n }\n\n // Validate position\n if (position < 1 || position > plan.steps.length + 1) {\n throw new Error(\n `Invalid position ${position}. Must be between 1 and ${plan.steps.length + 1}`\n );\n }\n\n // Renumber existing steps (only if inserting in the middle)\n let renamedFiles: Array<{ from: string; to: string }> = [];\n if (position <= plan.steps.length) {\n renamedFiles = await renumberSteps(plan.metadata.path, position, 1);\n }\n\n // Generate new step\n const code = generateCode(options.title);\n const filename = generateStepFilename(position, code);\n const filePath = join(planDir, filename);\n\n // Generate content\n const content = generateStepContent(\n position,\n options.title,\n options.description\n );\n await writeFile(filePath, content);\n\n // Create step object\n const step: PlanStep = {\n number: position,\n code,\n filename,\n title: options.title,\n description: options.description,\n status: options.status || \"pending\",\n filePath,\n };\n\n return {\n step,\n renamedFiles,\n createdFile: filePath,\n };\n}\n\n// ===== REMOVE STEP =====\n\n/**\n * Remove a step from a plan\n */\nexport async function removeStep(\n plan: Plan,\n stepNumber: number\n): Promise<RemoveStepResult> {\n // Find step\n const step = plan.steps.find((s) => s.number === stepNumber);\n if (!step) {\n throw new Error(`Step ${stepNumber} not found`);\n }\n\n // Delete file\n await rm(step.filePath);\n\n // Renumber remaining steps\n const renamedFiles = await renumberSteps(plan.metadata.path, stepNumber, -1);\n\n return {\n removedStep: step,\n renamedFiles,\n deletedFile: step.filePath,\n };\n}\n\n// ===== MOVE STEP =====\n\n/**\n * Move a step to a new position\n */\nexport async function moveStep(\n plan: Plan,\n fromNumber: number,\n toNumber: number\n): Promise<MoveStepResult> {\n if (fromNumber === toNumber) {\n throw new Error(\"Source and destination are the same\");\n }\n\n const step = plan.steps.find((s) => s.number === fromNumber);\n if (!step) {\n throw new Error(`Step ${fromNumber} not found`);\n }\n\n if (toNumber < 1 || toNumber > plan.steps.length) {\n throw new Error(`Invalid destination ${toNumber}`);\n }\n\n const planDir = await getPlanDir(plan.metadata.path);\n const renamedFiles: Array<{ from: string; to: string }> = [];\n\n // Temporary rename to avoid collision\n const tempPath = join(planDir, `__temp_${step.filename}`);\n await rename(step.filePath, tempPath);\n\n // Renumber affected steps\n if (fromNumber < toNumber) {\n // Moving down: shift steps up\n for (let i = fromNumber + 1; i <= toNumber; i++) {\n const s = plan.steps.find((st) => st.number === i);\n if (s) {\n const newFilename = generateStepFilename(i - 1, s.code);\n const newPath = join(planDir, newFilename);\n await rename(s.filePath, newPath);\n renamedFiles.push({ from: s.filename, to: newFilename });\n\n // Update content\n const content = await readFile(newPath, \"utf-8\");\n const updatedContent = content.replace(\n /^#\\s+Step\\s+\\d+:/m,\n `# Step ${String(i - 1).padStart(2, \"0\")}:`\n );\n if (updatedContent !== content) {\n await writeFile(newPath, updatedContent);\n }\n }\n }\n } else {\n // Moving up: shift steps down (in reverse to avoid collisions)\n for (let i = fromNumber - 1; i >= toNumber; i--) {\n const s = plan.steps.find((st) => st.number === i);\n if (s) {\n const newFilename = generateStepFilename(i + 1, s.code);\n const newPath = join(planDir, newFilename);\n await rename(s.filePath, newPath);\n renamedFiles.push({ from: s.filename, to: newFilename });\n\n // Update content\n const content = await readFile(newPath, \"utf-8\");\n const updatedContent = content.replace(\n /^#\\s+Step\\s+\\d+:/m,\n `# Step ${String(i + 1).padStart(2, \"0\")}:`\n );\n if (updatedContent !== content) {\n await writeFile(newPath, updatedContent);\n }\n }\n }\n }\n\n // Move step to final position\n const newFilename = generateStepFilename(toNumber, step.code);\n const newPath = join(planDir, newFilename);\n await rename(tempPath, newPath);\n renamedFiles.push({ from: step.filename, to: newFilename });\n\n // Update step number in file content\n const content = await readFile(newPath, \"utf-8\");\n const updatedContent = content.replace(\n /^#\\s+Step\\s+\\d+:/m,\n `# Step ${String(toNumber).padStart(2, \"0\")}:`\n );\n if (updatedContent !== content) {\n await writeFile(newPath, updatedContent);\n }\n\n return {\n step: {\n ...step,\n number: toNumber,\n filename: newFilename,\n filePath: newPath,\n },\n newPosition: toNumber,\n renamedFiles,\n };\n}\n\n// ===== STATUS CHANGE FUNCTIONS =====\n\n/**\n * Block a step with a reason\n */\nexport function blockStep(\n plan: Plan,\n stepNumber: number,\n reason: string\n): PlanStep {\n const step = plan.steps.find((s) => s.number === stepNumber);\n if (!step) {\n throw new Error(`Step ${stepNumber} not found`);\n }\n\n return {\n ...step,\n status: \"blocked\",\n notes: reason,\n };\n}\n\n/**\n * Unblock a step\n */\nexport function unblockStep(plan: Plan, stepNumber: number): PlanStep {\n const step = plan.steps.find((s) => s.number === stepNumber);\n if (!step) {\n throw new Error(`Step ${stepNumber} not found`);\n }\n\n return {\n ...step,\n status: \"pending\",\n notes: undefined,\n };\n}\n\n/**\n * Complete a step\n */\nexport function completeStep(\n plan: Plan,\n stepNumber: number,\n notes?: string\n): PlanStep {\n const step = plan.steps.find((s) => s.number === stepNumber);\n if (!step) {\n throw new Error(`Step ${stepNumber} not found`);\n }\n\n return {\n ...step,\n status: \"completed\",\n completedAt: new Date(),\n notes,\n };\n}\n\n/**\n * Start a step\n */\nexport function startStep(plan: Plan, stepNumber: number): PlanStep {\n const step = plan.steps.find((s) => s.number === stepNumber);\n if (!step) {\n throw new Error(`Step ${stepNumber} not found`);\n }\n\n return {\n ...step,\n status: \"in_progress\",\n startedAt: new Date(),\n };\n}\n\n/**\n * Skip a step\n */\nexport function skipStep(\n plan: Plan,\n stepNumber: number,\n reason?: string\n): PlanStep {\n const step = plan.steps.find((s) => s.number === stepNumber);\n if (!step) {\n throw new Error(`Step ${stepNumber} not found`);\n }\n\n return {\n ...step,\n status: \"skipped\",\n notes: reason,\n };\n}\n\n/**\n * Fail a step\n */\nexport function failStep(\n plan: Plan,\n stepNumber: number,\n reason?: string\n): PlanStep {\n const step = plan.steps.find((s) => s.number === stepNumber);\n if (!step) {\n throw new Error(`Step ${stepNumber} not found`);\n }\n\n return {\n ...step,\n status: \"failed\",\n notes: reason,\n };\n}\n\n","/**\n * Markdown Renderer\n *\n * Render a plan to Markdown format.\n */\n\nimport type { Plan, PlanStep } from \"../../types.js\";\n\n/**\n * Options for Markdown rendering\n */\nexport interface MarkdownRenderOptions {\n /** Include metadata section */\n includeMetadata?: boolean;\n\n /** Include step details */\n includeStepDetails?: boolean;\n\n /** Include feedback records */\n includeFeedback?: boolean;\n\n /** Include evidence records */\n includeEvidence?: boolean;\n\n /** Use task list format for steps */\n useTaskList?: boolean;\n\n /** Table of contents */\n includeToc?: boolean;\n}\n\n/**\n * Default options for Markdown rendering\n */\nconst DEFAULT_OPTIONS: MarkdownRenderOptions = {\n includeMetadata: true,\n includeStepDetails: true,\n includeFeedback: false,\n includeEvidence: false,\n useTaskList: false,\n includeToc: false,\n};\n\n/**\n * Render a plan to Markdown\n */\nexport function renderToMarkdown(\n plan: Plan,\n options?: Partial<MarkdownRenderOptions>,\n): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const sections: string[] = [];\n\n // Title\n sections.push(`# ${plan.metadata.name}\\n`);\n\n // Table of contents\n if (opts.includeToc) {\n sections.push(renderToc(plan, opts));\n }\n\n // Metadata\n if (opts.includeMetadata) {\n sections.push(renderMetadata(plan));\n }\n\n // Status overview\n sections.push(renderStatusOverview(plan));\n\n // Steps\n sections.push(renderSteps(plan, opts));\n\n // Feedback\n if (opts.includeFeedback && plan.feedback && plan.feedback.length > 0) {\n sections.push(renderFeedback(plan));\n }\n\n // Evidence\n if (opts.includeEvidence && plan.evidence && plan.evidence.length > 0) {\n sections.push(renderEvidence(plan));\n }\n\n return sections.join(\"\\n\");\n}\n\n/**\n * Render table of contents\n */\nfunction renderToc(plan: Plan, opts: MarkdownRenderOptions): string {\n const lines: string[] = [\"## Table of Contents\\n\"];\n\n lines.push(\"- [Status Overview](#status-overview)\");\n lines.push(\"- [Steps](#steps)\");\n\n if (opts.includeFeedback && plan.feedback?.length) {\n lines.push(\"- [Feedback](#feedback)\");\n }\n\n if (opts.includeEvidence && plan.evidence?.length) {\n lines.push(\"- [Evidence](#evidence)\");\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Render metadata section\n */\nfunction renderMetadata(plan: Plan): string {\n const lines: string[] = [\"## Metadata\\n\"];\n\n lines.push(`| Field | Value |`);\n lines.push(`|-------|-------|`);\n lines.push(`| **Code** | ${plan.metadata.code} |`);\n lines.push(`| **Name** | ${plan.metadata.name} |`);\n if (plan.metadata.description) {\n lines.push(`| **Description** | ${plan.metadata.description} |`);\n }\n if (plan.metadata.author) {\n lines.push(`| **Author** | ${plan.metadata.author} |`);\n }\n if (plan.metadata.createdAt) {\n lines.push(`| **Created** | ${formatDate(plan.metadata.createdAt)} |`);\n }\n if (plan.context) {\n lines.push(`| **Context** | ${plan.context} |`);\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Render status overview\n */\nfunction renderStatusOverview(plan: Plan): string {\n const lines: string[] = [\"## Status Overview\\n\"];\n const state = plan.state;\n\n lines.push(`| Field | Value |`);\n lines.push(`|-------|-------|`);\n lines.push(`| **Status** | ${formatStatus(state.status)} |`);\n lines.push(`| **Progress** | ${state.progress}% |`);\n\n if (state.currentStep !== undefined) {\n lines.push(`| **Current Step** | ${state.currentStep} |`);\n }\n\n const totalSteps = plan.steps?.length ?? 0;\n const completed =\n plan.steps?.filter((s) => s.status === \"completed\").length ?? 0;\n lines.push(`| **Completed** | ${completed}/${totalSteps} steps |`);\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Format status with emoji\n */\nfunction formatStatus(status: string): string {\n const statusEmoji: Record<string, string> = {\n not_started: \"⬜\",\n in_progress: \"🔄\",\n completed: \"✅\",\n blocked: \"⏸️\",\n cancelled: \"❌\",\n };\n\n return `${statusEmoji[status] || \"\"} ${status}`;\n}\n\n/**\n * Render steps section\n */\nfunction renderSteps(plan: Plan, opts: MarkdownRenderOptions): string {\n const lines: string[] = [\"## Steps\\n\"];\n const steps = plan.steps || [];\n\n if (steps.length === 0) {\n lines.push(\"*No steps defined.*\\n\");\n return lines.join(\"\\n\");\n }\n\n if (opts.useTaskList) {\n for (const step of steps) {\n const checked = step.status === \"completed\" ? \"x\" : \" \";\n lines.push(`- [${checked}] **${step.number}. ${step.title}**`);\n if (opts.includeStepDetails && step.description) {\n lines.push(` ${step.description}`);\n }\n }\n } else {\n lines.push(`| # | Title | Status | Started | Completed |`);\n lines.push(`|---|-------|--------|---------|-----------|`);\n\n for (const step of steps) {\n const status = formatStepStatus(step);\n const started = step.startedAt ? formatDate(step.startedAt) : \"-\";\n const completed = step.completedAt ? formatDate(step.completedAt) : \"-\";\n lines.push(\n `| ${step.number} | ${step.title} | ${status} | ${started} | ${completed} |`,\n );\n }\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Format step status with emoji\n */\nfunction formatStepStatus(step: PlanStep): string {\n const statusEmoji: Record<string, string> = {\n pending: \"⬜\",\n not_started: \"⬜\",\n in_progress: \"🔄\",\n completed: \"✅\",\n blocked: \"⏸️\",\n skipped: \"⏭️\",\n };\n\n return statusEmoji[step.status] || step.status;\n}\n\n/**\n * Render feedback section\n */\nfunction renderFeedback(plan: Plan): string {\n const lines: string[] = [\"## Feedback\\n\"];\n const feedback = plan.feedback || [];\n\n for (const record of feedback) {\n lines.push(`### ${record.id}: ${record.title}`);\n lines.push(`- **Platform**: ${record.platform}`);\n lines.push(`- **Date**: ${formatDate(record.createdAt)}`);\n if (record.resolution) {\n lines.push(`\\n${record.resolution}\\n`);\n }\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Render evidence section\n */\nfunction renderEvidence(plan: Plan): string {\n const lines: string[] = [\"## Evidence\\n\"];\n const evidence = plan.evidence || [];\n\n for (const record of evidence) {\n lines.push(`### ${record.id}: ${record.title}`);\n lines.push(`- **Type**: ${record.type}`);\n if (record.source) {\n lines.push(`- **Source**: ${record.source}`);\n }\n }\n\n return lines.join(\"\\n\") + \"\\n\";\n}\n\n/**\n * Format a date\n */\nfunction formatDate(date: Date): string {\n if (typeof date === \"string\") {\n return date;\n }\n return date.toISOString().split(\"T\")[0];\n}\n","/**\n * JSON Renderer\n *\n * Render a plan to JSON format.\n */\n\nimport type { Plan } from \"../../types.js\";\n\n/**\n * Options for JSON rendering\n */\nexport interface JsonRenderOptions {\n /** Pretty print with indentation */\n pretty?: boolean;\n\n /** Indentation (spaces or tab) */\n indent?: number | string;\n\n /** Include full step content */\n includeStepContent?: boolean;\n\n /** Include feedback records */\n includeFeedback?: boolean;\n\n /** Include evidence records */\n includeEvidence?: boolean;\n\n /** Only include specific fields */\n fields?: string[];\n}\n\n/**\n * Default options for JSON rendering\n */\nconst DEFAULT_OPTIONS: JsonRenderOptions = {\n pretty: true,\n indent: 2,\n includeStepContent: false,\n includeFeedback: true,\n includeEvidence: true,\n};\n\n/**\n * JSON export format\n */\ninterface PlanExport {\n metadata: {\n code: string;\n name: string;\n description?: string;\n author?: string;\n created?: string;\n context?: string;\n };\n status: {\n status: string;\n progress: number;\n currentStep?: number;\n completedSteps: number[];\n blockedSteps: number[];\n };\n steps: Array<{\n number: number;\n title: string;\n description?: string;\n status: string;\n started?: string;\n completed?: string;\n notes?: string;\n }>;\n feedback?: Array<{\n id: string;\n title: string;\n platform: string;\n createdAt: string;\n }>;\n evidence?: Array<{\n id: string;\n type: string;\n title: string;\n source?: string;\n }>;\n exportedAt: string;\n}\n\n/**\n * Render a plan to JSON\n */\nexport function renderToJson(\n plan: Plan,\n options?: Partial<JsonRenderOptions>,\n): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const steps = plan.steps || [];\n const completedSteps = steps\n .filter((s) => s.status === \"completed\")\n .map((s) => s.number);\n const blockedSteps = steps\n .filter((s) => s.status === \"blocked\")\n .map((s) => s.number);\n\n const exported: PlanExport = {\n metadata: {\n code: plan.metadata.code,\n name: plan.metadata.name,\n description: plan.metadata.description,\n author: plan.metadata.author,\n created: plan.metadata.createdAt\n ? formatDate(plan.metadata.createdAt)\n : undefined,\n context: plan.context,\n },\n status: {\n status: plan.state.status,\n progress: plan.state.progress,\n currentStep: plan.state.currentStep,\n completedSteps,\n blockedSteps,\n },\n steps: steps.map((step) => ({\n number: step.number,\n title: step.title,\n description: step.description,\n status: step.status,\n started: step.startedAt ? formatDate(step.startedAt) : undefined,\n completed: step.completedAt ? formatDate(step.completedAt) : undefined,\n ...(opts.includeStepContent ? { notes: step.notes } : {}),\n })),\n exportedAt: new Date().toISOString(),\n };\n\n // Include feedback if requested\n if (opts.includeFeedback && plan.feedback) {\n exported.feedback = plan.feedback.map((f) => ({\n id: f.id,\n title: f.title,\n platform: f.platform,\n createdAt: formatDate(f.createdAt),\n }));\n }\n\n // Include evidence if requested\n if (opts.includeEvidence && plan.evidence) {\n exported.evidence = plan.evidence.map((e) => ({\n id: e.id,\n type: e.type,\n title: e.title,\n source: e.source,\n }));\n }\n\n // Filter fields if specified\n if (opts.fields && opts.fields.length > 0) {\n const filtered: Record<string, unknown> = {};\n for (const field of opts.fields) {\n if (field in exported) {\n filtered[field] = exported[field as keyof PlanExport];\n }\n }\n return opts.pretty\n ? JSON.stringify(filtered, null, opts.indent)\n : JSON.stringify(filtered);\n }\n\n return opts.pretty\n ? JSON.stringify(exported, null, opts.indent)\n : JSON.stringify(exported);\n}\n\n/**\n * Format a date\n */\nfunction formatDate(date: Date): string {\n if (typeof date === \"string\") {\n return date;\n }\n return date.toISOString();\n}\n","/**\n * HTML Renderer\n *\n * Render a plan to HTML format.\n */\n\nimport type { Plan, PlanStep } from \"../../types.js\";\n\n/**\n * Options for HTML rendering\n */\nexport interface HtmlRenderOptions {\n /** Include full HTML document (with head/body) */\n fullDocument?: boolean;\n\n /** Document title (defaults to plan name) */\n title?: string;\n\n /** Include inline CSS styles */\n includeStyles?: boolean;\n\n /** CSS theme: light or dark */\n theme?: \"light\" | \"dark\";\n\n /** Include step details */\n includeStepDetails?: boolean;\n\n /** Include feedback records */\n includeFeedback?: boolean;\n\n /** Include evidence records */\n includeEvidence?: boolean;\n}\n\n/**\n * Default options for HTML rendering\n */\nconst DEFAULT_OPTIONS: HtmlRenderOptions = {\n fullDocument: true,\n includeStyles: true,\n theme: \"light\",\n includeStepDetails: true,\n includeFeedback: false,\n includeEvidence: false,\n};\n\n/**\n * Render a plan to HTML\n */\nexport function renderToHtml(\n plan: Plan,\n options?: Partial<HtmlRenderOptions>,\n): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const title = opts.title || plan.metadata.name;\n\n const content = renderContent(plan, opts);\n\n if (!opts.fullDocument) {\n return content;\n }\n\n const styles = opts.includeStyles ? renderStyles(opts.theme || \"light\") : \"\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(title)}</title>\n ${styles}\n</head>\n<body>\n <div class=\"container\">\n ${content}\n </div>\n</body>\n</html>`;\n}\n\n/**\n * Render main content\n */\nfunction renderContent(plan: Plan, opts: HtmlRenderOptions): string {\n const sections: string[] = [];\n\n // Header\n sections.push(`<header>\n <h1>${escapeHtml(plan.metadata.name)}</h1>\n ${plan.metadata.description ? `<p class=\"description\">${escapeHtml(plan.metadata.description)}</p>` : \"\"}\n</header>`);\n\n // Status overview\n sections.push(renderStatusHtml(plan));\n\n // Steps\n sections.push(renderStepsHtml(plan, opts));\n\n // Feedback\n if (opts.includeFeedback && plan.feedback?.length) {\n sections.push(renderFeedbackHtml(plan));\n }\n\n // Evidence\n if (opts.includeEvidence && plan.evidence?.length) {\n sections.push(renderEvidenceHtml(plan));\n }\n\n // Footer\n sections.push(`<footer>\n <p>Generated by RiotPlan Renderer on ${new Date().toISOString()}</p>\n</footer>`);\n\n return sections.join(\"\\n\\n\");\n}\n\n/**\n * Render status section\n */\nfunction renderStatusHtml(plan: Plan): string {\n const state = plan.state;\n const totalSteps = plan.steps?.length ?? 0;\n const completed =\n plan.steps?.filter((s) => s.status === \"completed\").length ?? 0;\n\n return `<section class=\"status\">\n <h2>Status Overview</h2>\n <div class=\"status-grid\">\n <div class=\"status-item\">\n <span class=\"label\">Status</span>\n <span class=\"value status-${state.status}\">${getStatusEmoji(state.status)} ${state.status}</span>\n </div>\n <div class=\"status-item\">\n <span class=\"label\">Progress</span>\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" style=\"width: ${state.progress}%\"></div>\n </div>\n <span class=\"value\">${state.progress}%</span>\n </div>\n <div class=\"status-item\">\n <span class=\"label\">Steps</span>\n <span class=\"value\">${completed} / ${totalSteps}</span>\n </div>\n </div>\n</section>`;\n}\n\n/**\n * Render steps section\n */\nfunction renderStepsHtml(plan: Plan, opts: HtmlRenderOptions): string {\n const steps = plan.steps || [];\n\n if (steps.length === 0) {\n return `<section class=\"steps\">\n <h2>Steps</h2>\n <p class=\"empty\">No steps defined.</p>\n</section>`;\n }\n\n const stepItems = steps.map((step) => renderStepHtml(step, opts)).join(\"\\n\");\n\n return `<section class=\"steps\">\n <h2>Steps</h2>\n <div class=\"step-list\">\n ${stepItems}\n </div>\n</section>`;\n}\n\n/**\n * Render individual step\n */\nfunction renderStepHtml(step: PlanStep, opts: HtmlRenderOptions): string {\n const detailsHtml =\n opts.includeStepDetails && step.description\n ? `<p class=\"step-description\">${escapeHtml(step.description)}</p>`\n : \"\";\n\n const dateHtml =\n step.startedAt || step.completedAt\n ? `<div class=\"step-dates\">\n ${step.startedAt ? `<span>Started: ${formatDate(step.startedAt)}</span>` : \"\"}\n ${step.completedAt ? `<span>Completed: ${formatDate(step.completedAt)}</span>` : \"\"}\n </div>`\n : \"\";\n\n return `<div class=\"step step-${step.status}\">\n <div class=\"step-header\">\n <span class=\"step-number\">${step.number}</span>\n <span class=\"step-title\">${escapeHtml(step.title)}</span>\n <span class=\"step-status\">${getStatusEmoji(step.status)}</span>\n </div>\n ${detailsHtml}\n ${dateHtml}\n</div>`;\n}\n\n/**\n * Render feedback section\n */\nfunction renderFeedbackHtml(plan: Plan): string {\n const feedback = plan.feedback || [];\n\n const items = feedback\n .map(\n (f) => `<div class=\"feedback-item\">\n <h4>${escapeHtml(f.id)}: ${escapeHtml(f.title)}</h4>\n <div class=\"meta\">\n <span>Platform: ${f.platform}</span>\n <span>Date: ${formatDate(f.createdAt)}</span>\n </div>\n </div>`,\n )\n .join(\"\\n\");\n\n return `<section class=\"feedback\">\n <h2>Feedback</h2>\n ${items}\n</section>`;\n}\n\n/**\n * Render evidence section\n */\nfunction renderEvidenceHtml(plan: Plan): string {\n const evidence = plan.evidence || [];\n\n const items = evidence\n .map(\n (e) => `<div class=\"evidence-item\">\n <h4>${escapeHtml(e.id)}: ${escapeHtml(e.title)}</h4>\n <div class=\"meta\">\n <span>Type: ${e.type}</span>\n ${e.source ? `<span>Source: ${escapeHtml(e.source)}</span>` : \"\"}\n </div>\n </div>`,\n )\n .join(\"\\n\");\n\n return `<section class=\"evidence\">\n <h2>Evidence</h2>\n ${items}\n</section>`;\n}\n\n/**\n * Get status emoji\n */\nfunction getStatusEmoji(status: string): string {\n const emojis: Record<string, string> = {\n not_started: \"⬜\",\n pending: \"⬜\",\n in_progress: \"🔄\",\n completed: \"✅\",\n blocked: \"⏸️\",\n skipped: \"⏭️\",\n cancelled: \"❌\",\n };\n return emojis[status] || \"\";\n}\n\n/**\n * Format a date\n */\nfunction formatDate(date: Date): string {\n if (typeof date === \"string\") {\n return date;\n }\n return date.toISOString().split(\"T\")[0];\n}\n\n/**\n * Render CSS styles\n */\nfunction renderStyles(theme: \"light\" | \"dark\"): string {\n const colors =\n theme === \"dark\"\n ? {\n bg: \"#1a1a1a\",\n text: \"#e0e0e0\",\n border: \"#333\",\n accent: \"#4a9eff\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n }\n : {\n bg: \"#ffffff\",\n text: \"#333333\",\n border: \"#e0e0e0\",\n accent: \"#2196f3\",\n success: \"#4caf50\",\n warning: \"#ff9800\",\n error: \"#f44336\",\n };\n\n return `<style>\n * { box-sizing: border-box; margin: 0; padding: 0; }\n body { \n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: ${colors.bg};\n color: ${colors.text};\n line-height: 1.6;\n }\n .container { max-width: 900px; margin: 0 auto; padding: 2rem; }\n header { margin-bottom: 2rem; }\n h1 { font-size: 2rem; margin-bottom: 0.5rem; }\n h2 { font-size: 1.5rem; margin-bottom: 1rem; border-bottom: 2px solid ${colors.accent}; padding-bottom: 0.5rem; }\n .description { color: ${colors.text}; opacity: 0.8; }\n \n section { margin-bottom: 2rem; }\n \n .status-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; }\n .status-item { padding: 1rem; border: 1px solid ${colors.border}; border-radius: 8px; }\n .status-item .label { display: block; font-size: 0.875rem; opacity: 0.7; margin-bottom: 0.25rem; }\n .status-item .value { font-weight: bold; }\n \n .progress-bar { height: 8px; background: ${colors.border}; border-radius: 4px; overflow: hidden; margin: 0.5rem 0; }\n .progress-fill { height: 100%; background: ${colors.accent}; transition: width 0.3s; }\n \n .step-list { display: flex; flex-direction: column; gap: 0.75rem; }\n .step { padding: 1rem; border: 1px solid ${colors.border}; border-radius: 8px; }\n .step-header { display: flex; align-items: center; gap: 0.75rem; }\n .step-number { font-weight: bold; color: ${colors.accent}; min-width: 2rem; }\n .step-title { flex: 1; }\n .step-description { margin-top: 0.5rem; opacity: 0.8; font-size: 0.9rem; }\n .step-dates { margin-top: 0.5rem; font-size: 0.8rem; opacity: 0.6; }\n \n .step-completed { border-left: 4px solid ${colors.success}; }\n .step-in_progress { border-left: 4px solid ${colors.accent}; }\n .step-blocked { border-left: 4px solid ${colors.warning}; }\n \n .feedback-item, .evidence-item { padding: 1rem; border: 1px solid ${colors.border}; border-radius: 8px; margin-bottom: 0.75rem; }\n .meta { font-size: 0.8rem; opacity: 0.7; margin: 0.5rem 0; }\n .meta span { margin-right: 1rem; }\n \n footer { margin-top: 3rem; padding-top: 1rem; border-top: 1px solid ${colors.border}; font-size: 0.8rem; opacity: 0.6; }\n \n .empty { opacity: 0.6; font-style: italic; }\n</style>`;\n}\n\n/**\n * Escape HTML entities\n */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n","/**\n * Template Registry\n *\n * Central registry for all available plan templates.\n */\n\n/**\n * A step definition for a template\n */\nexport interface TemplateStep {\n /** Step title */\n title: string;\n\n /** Step description */\n description: string;\n\n /** Tasks in this step */\n tasks?: string[];\n\n /** Acceptance criteria */\n criteria?: string[];\n}\n\n/**\n * A plan template definition\n */\nexport interface PlanTemplate {\n /** Unique template ID */\n id: string;\n\n /** Display name */\n name: string;\n\n /** Description of the template */\n description: string;\n\n /** Category */\n category: \"general\" | \"development\" | \"operations\" | \"documentation\";\n\n /** Tags for searchability */\n tags: string[];\n\n /** Default steps for this template */\n steps: TemplateStep[];\n\n /** Default phases (optional grouping) */\n phases?: Array<{\n name: string;\n description: string;\n steps: number[]; // Step indices\n }>;\n\n /** Custom SUMMARY.md content template */\n summaryTemplate?: string;\n\n /** Custom EXECUTION_PLAN.md content template */\n executionPlanTemplate?: string;\n\n /** Additional files to create */\n additionalFiles?: Array<{\n path: string;\n content: string;\n }>;\n}\n\n/**\n * Central registry of all templates\n */\nexport const TEMPLATE_REGISTRY: Map<string, PlanTemplate> = new Map();\n\n/**\n * Register a template\n */\nexport function registerTemplate(template: PlanTemplate): void {\n TEMPLATE_REGISTRY.set(template.id, template);\n}\n\n/**\n * Get a template by ID\n */\nexport function getTemplate(id: string): PlanTemplate | undefined {\n return TEMPLATE_REGISTRY.get(id);\n}\n\n/**\n * List all available templates\n */\nexport function listTemplates(): PlanTemplate[] {\n return Array.from(TEMPLATE_REGISTRY.values());\n}\n\n/**\n * List templates by category\n */\nexport function listTemplatesByCategory(\n category: PlanTemplate[\"category\"],\n): PlanTemplate[] {\n return listTemplates().filter((t) => t.category === category);\n}\n\n/**\n * Search templates by tag\n */\nexport function searchTemplatesByTag(tag: string): PlanTemplate[] {\n return listTemplates().filter((t) => t.tags.includes(tag));\n}\n","/**\n * Template Application\n *\n * Apply a template to create a new plan.\n */\n\nimport { createPlan, type CreatePlanConfig } from \"../plan/creator.js\";\nimport { getTemplate, type PlanTemplate } from \"./registry.js\";\n\n/**\n * Options for applying a template\n */\nexport interface ApplyTemplateOptions {\n /** Template ID to apply */\n templateId: string;\n\n /** Plan code (directory name) */\n code: string;\n\n /** Plan display name */\n name: string;\n\n /** Base path to create the plan in */\n basePath: string;\n\n /** Custom description (overrides template) */\n description?: string;\n\n /** Variable substitutions for template content */\n variables?: Record<string, string>;\n\n /** Additional tags to add */\n tags?: string[];\n}\n\n/**\n * Result of applying a template\n */\nexport interface ApplyTemplateResult {\n /** Whether application succeeded */\n success: boolean;\n\n /** Path to created plan */\n path?: string;\n\n /** Template that was applied */\n template?: PlanTemplate;\n\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Apply a template to create a new plan\n */\nexport async function applyTemplate(\n options: ApplyTemplateOptions,\n): Promise<ApplyTemplateResult> {\n const { templateId, code, name, basePath, description, variables } = options;\n\n // Get template\n const template = getTemplate(templateId);\n if (!template) {\n return {\n success: false,\n error: `Template not found: ${templateId}`,\n };\n }\n\n try {\n // Build plan configuration from template\n // Note: tags are available on template but CreatePlanConfig doesn't support them yet\n const config: CreatePlanConfig = {\n code,\n name,\n basePath,\n description:\n description || substituteVariables(template.description, variables),\n steps: template.steps.map((step) => ({\n title: substituteVariables(step.title, variables),\n description: substituteVariables(step.description, variables),\n })),\n };\n\n // Create the plan\n const result = await createPlan(config);\n\n return {\n success: true,\n path: result.path,\n template,\n };\n } catch (error) {\n return {\n success: false,\n error:\n error instanceof Error\n ? error.message\n : \"Unknown error applying template\",\n };\n }\n}\n\n/**\n * Substitute variables in a string\n */\nfunction substituteVariables(\n text: string,\n variables?: Record<string, string>,\n): string {\n if (!variables) return text;\n\n let result = text;\n for (const [key, value] of Object.entries(variables)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), value);\n }\n return result;\n}\n","/**\n * Basic Plan Template\n *\n * A simple, general-purpose plan template with minimal structure.\n * Good for quick plans or when other templates don't fit.\n */\n\nimport type { PlanTemplate } from \"../registry.js\";\n\nexport const BasicTemplate: PlanTemplate = {\n id: \"basic\",\n name: \"Basic Plan\",\n description:\n \"A simple plan template with minimal structure. Good for quick tasks or custom workflows.\",\n category: \"general\",\n tags: [\"basic\", \"simple\", \"quick\"],\n steps: [\n {\n title: \"Define Objectives\",\n description: \"Clearly define what this plan will accomplish.\",\n tasks: [\n \"Identify the primary goal\",\n \"List key success criteria\",\n \"Define scope and boundaries\",\n ],\n criteria: [\n \"Objectives are clearly documented\",\n \"Success criteria are measurable\",\n ],\n },\n {\n title: \"Execute\",\n description: \"Carry out the planned work.\",\n tasks: [\n \"Perform the main tasks\",\n \"Track progress\",\n \"Document any issues\",\n ],\n criteria: [\"All tasks completed\", \"Issues documented and addressed\"],\n },\n {\n title: \"Review and Complete\",\n description: \"Review the results and finalize the plan.\",\n tasks: [\n \"Review work against objectives\",\n \"Document outcomes\",\n \"Note lessons learned\",\n ],\n criteria: [\"Objectives met\", \"Documentation complete\"],\n },\n ],\n};\n","/**\n * Feature Development Template\n *\n * Template for planning new feature development.\n * Includes analysis, design, implementation, and testing phases.\n */\n\nimport type { PlanTemplate } from \"../registry.js\";\n\nexport const FeatureTemplate: PlanTemplate = {\n id: \"feature\",\n name: \"Feature Development\",\n description:\n \"Plan template for developing new features. Covers analysis, design, implementation, testing, and deployment.\",\n category: \"development\",\n tags: [\"feature\", \"development\", \"agile\", \"software\"],\n phases: [\n {\n name: \"Discovery\",\n description: \"Understand requirements and constraints\",\n steps: [0, 1],\n },\n {\n name: \"Design\",\n description: \"Design the solution\",\n steps: [2, 3],\n },\n {\n name: \"Implementation\",\n description: \"Build the feature\",\n steps: [4, 5],\n },\n {\n name: \"Delivery\",\n description: \"Test and deploy\",\n steps: [6, 7],\n },\n ],\n steps: [\n {\n title: \"Requirements Analysis\",\n description: \"Gather and analyze feature requirements.\",\n tasks: [\n \"Review user stories or requirements\",\n \"Identify stakeholders\",\n \"Document acceptance criteria\",\n \"Clarify any ambiguities\",\n ],\n criteria: [\n \"Requirements documented\",\n \"Acceptance criteria defined\",\n \"Stakeholder sign-off\",\n ],\n },\n {\n title: \"Technical Assessment\",\n description: \"Assess technical feasibility and constraints.\",\n tasks: [\n \"Review existing codebase\",\n \"Identify dependencies\",\n \"Estimate effort\",\n \"Identify risks\",\n ],\n criteria: [\n \"Technical assessment documented\",\n \"Dependencies identified\",\n \"Effort estimated\",\n ],\n },\n {\n title: \"Architecture Design\",\n description: \"Design the feature architecture.\",\n tasks: [\n \"Create high-level design\",\n \"Define data models\",\n \"Design APIs/interfaces\",\n \"Document architecture decisions\",\n ],\n criteria: [\"Architecture documented\", \"Design reviewed\"],\n },\n {\n title: \"Detailed Design\",\n description: \"Create detailed implementation design.\",\n tasks: [\n \"Break down into components\",\n \"Design component interfaces\",\n \"Plan database changes\",\n \"Design error handling\",\n ],\n criteria: [\"Detailed design complete\", \"Component breakdown documented\"],\n },\n {\n title: \"Core Implementation\",\n description: \"Implement the core feature functionality.\",\n tasks: [\n \"Implement data models\",\n \"Build core logic\",\n \"Implement APIs\",\n \"Write unit tests\",\n ],\n criteria: [\"Core functionality implemented\", \"Unit tests passing\"],\n },\n {\n title: \"Integration\",\n description: \"Integrate with existing systems.\",\n tasks: [\n \"Integrate with dependencies\",\n \"Handle edge cases\",\n \"Add error handling\",\n \"Write integration tests\",\n ],\n criteria: [\"Integration complete\", \"Integration tests passing\"],\n },\n {\n title: \"Testing\",\n description: \"Comprehensive testing of the feature.\",\n tasks: [\n \"Run full test suite\",\n \"Perform manual testing\",\n \"Fix any bugs found\",\n \"Document test results\",\n ],\n criteria: [\n \"All tests passing\",\n \"Manual testing complete\",\n \"No critical bugs\",\n ],\n },\n {\n title: \"Deployment\",\n description: \"Deploy the feature to production.\",\n tasks: [\n \"Prepare deployment artifacts\",\n \"Update documentation\",\n \"Deploy to staging\",\n \"Deploy to production\",\n \"Monitor for issues\",\n ],\n criteria: [\n \"Feature deployed\",\n \"Documentation updated\",\n \"No production issues\",\n ],\n },\n ],\n};\n","/**\n * Refactoring Template\n *\n * Template for code refactoring projects.\n * Focuses on safety, incremental changes, and verification.\n */\n\nimport type { PlanTemplate } from \"../registry.js\";\n\nexport const RefactoringTemplate: PlanTemplate = {\n id: \"refactoring\",\n name: \"Code Refactoring\",\n description:\n \"Plan template for code refactoring. Emphasizes safety, incremental changes, and thorough testing.\",\n category: \"development\",\n tags: [\"refactoring\", \"cleanup\", \"technical-debt\", \"maintenance\"],\n steps: [\n {\n title: \"Analysis\",\n description: \"Analyze the code to be refactored.\",\n tasks: [\n \"Identify code to refactor\",\n \"Understand current behavior\",\n \"Map dependencies\",\n \"Document current tests\",\n ],\n criteria: [\n \"Code scope defined\",\n \"Dependencies mapped\",\n \"Existing tests documented\",\n ],\n },\n {\n title: \"Test Coverage\",\n description: \"Ensure adequate test coverage before refactoring.\",\n tasks: [\n \"Identify test gaps\",\n \"Write characterization tests\",\n \"Verify all tests pass\",\n \"Document expected behavior\",\n ],\n criteria: [\n \"Test coverage adequate\",\n \"All tests passing\",\n \"Behavior documented\",\n ],\n },\n {\n title: \"Plan Changes\",\n description: \"Plan the refactoring approach.\",\n tasks: [\n \"Define target architecture\",\n \"Plan incremental steps\",\n \"Identify safe checkpoints\",\n \"Estimate effort\",\n ],\n criteria: [\n \"Target state defined\",\n \"Steps planned\",\n \"Checkpoints identified\",\n ],\n },\n {\n title: \"Incremental Refactoring\",\n description: \"Apply refactoring in small, safe increments.\",\n tasks: [\n \"Apply changes incrementally\",\n \"Run tests after each change\",\n \"Commit at checkpoints\",\n \"Document changes made\",\n ],\n criteria: [\n \"Changes applied safely\",\n \"Tests passing at each step\",\n \"Changes documented\",\n ],\n },\n {\n title: \"Verification\",\n description: \"Verify refactoring maintains behavior.\",\n tasks: [\n \"Run full test suite\",\n \"Perform manual testing\",\n \"Check performance\",\n \"Review for regressions\",\n ],\n criteria: [\n \"All tests passing\",\n \"No regressions\",\n \"Performance acceptable\",\n ],\n },\n {\n title: \"Cleanup\",\n description: \"Final cleanup and documentation.\",\n tasks: [\n \"Remove old code\",\n \"Update documentation\",\n \"Update related code comments\",\n \"Final review\",\n ],\n criteria: [\n \"Old code removed\",\n \"Documentation updated\",\n \"Code review complete\",\n ],\n },\n ],\n};\n","/**\n * Migration Template\n *\n * Template for migration projects (data, system, or platform).\n * Focuses on safety, rollback capability, and validation.\n */\n\nimport type { PlanTemplate } from \"../registry.js\";\n\nexport const MigrationTemplate: PlanTemplate = {\n id: \"migration\",\n name: \"Migration Plan\",\n description:\n \"Plan template for migrations (data, system, platform). Emphasizes safety, rollback capability, and thorough validation.\",\n category: \"operations\",\n tags: [\"migration\", \"data\", \"platform\", \"upgrade\", \"operations\"],\n phases: [\n {\n name: \"Preparation\",\n description: \"Prepare for migration\",\n steps: [0, 1, 2],\n },\n {\n name: \"Execution\",\n description: \"Execute the migration\",\n steps: [3, 4],\n },\n {\n name: \"Validation\",\n description: \"Validate and complete\",\n steps: [5, 6],\n },\n ],\n steps: [\n {\n title: \"Assessment\",\n description: \"Assess what needs to be migrated.\",\n tasks: [\n \"Inventory items to migrate\",\n \"Identify dependencies\",\n \"Document current state\",\n \"Assess risks\",\n ],\n criteria: [\n \"Inventory complete\",\n \"Dependencies documented\",\n \"Risks identified\",\n ],\n },\n {\n title: \"Planning\",\n description: \"Plan the migration approach.\",\n tasks: [\n \"Define migration strategy\",\n \"Plan rollback procedures\",\n \"Define success criteria\",\n \"Schedule migration window\",\n ],\n criteria: [\n \"Strategy documented\",\n \"Rollback plan ready\",\n \"Success criteria defined\",\n ],\n },\n {\n title: \"Preparation\",\n description: \"Prepare systems and data for migration.\",\n tasks: [\n \"Set up target environment\",\n \"Create backup of source\",\n \"Prepare migration scripts\",\n \"Test migration in staging\",\n ],\n criteria: [\"Target ready\", \"Backup complete\", \"Scripts tested\"],\n },\n {\n title: \"Migration Execution\",\n description: \"Execute the migration.\",\n tasks: [\n \"Start migration window\",\n \"Execute migration scripts\",\n \"Monitor progress\",\n \"Log all changes\",\n ],\n criteria: [\"Migration completed\", \"All items migrated\", \"Changes logged\"],\n },\n {\n title: \"Initial Validation\",\n description: \"Perform initial validation of migrated data/systems.\",\n tasks: [\n \"Verify data integrity\",\n \"Check system functionality\",\n \"Compare source and target\",\n \"Document discrepancies\",\n ],\n criteria: [\n \"Data integrity verified\",\n \"Functionality confirmed\",\n \"Discrepancies documented\",\n ],\n },\n {\n title: \"Full Validation\",\n description: \"Complete validation and user acceptance.\",\n tasks: [\n \"Run validation scripts\",\n \"Perform user acceptance testing\",\n \"Verify all success criteria\",\n \"Get stakeholder sign-off\",\n ],\n criteria: [\n \"All validations passed\",\n \"UAT complete\",\n \"Stakeholder approval\",\n ],\n },\n {\n title: \"Completion\",\n description: \"Finalize migration and clean up.\",\n tasks: [\n \"Decommission source (if applicable)\",\n \"Update documentation\",\n \"Archive migration artifacts\",\n \"Conduct retrospective\",\n ],\n criteria: [\n \"Source decommissioned\",\n \"Documentation updated\",\n \"Retrospective complete\",\n ],\n },\n ],\n};\n","/**\n * Sprint Template\n *\n * Template for sprint/iteration planning.\n * Covers planning, execution, review, and retrospective.\n */\n\nimport type { PlanTemplate } from \"../registry.js\";\n\nexport const SprintTemplate: PlanTemplate = {\n id: \"sprint\",\n name: \"Sprint Plan\",\n description:\n \"Plan template for agile sprints or iterations. Covers planning, daily execution, review, and retrospective.\",\n category: \"general\",\n tags: [\"sprint\", \"agile\", \"iteration\", \"scrum\"],\n steps: [\n {\n title: \"Sprint Planning\",\n description: \"Plan the sprint goals and work items.\",\n tasks: [\n \"Review backlog\",\n \"Select sprint items\",\n \"Define sprint goal\",\n \"Break down stories\",\n \"Estimate capacity\",\n ],\n criteria: [\n \"Sprint goal defined\",\n \"Items selected and estimated\",\n \"Team committed\",\n ],\n },\n {\n title: \"Sprint Execution\",\n description: \"Execute the sprint work.\",\n tasks: [\n \"Daily standups\",\n \"Work on sprint items\",\n \"Track progress\",\n \"Address blockers\",\n ],\n criteria: [\"Daily progress tracked\", \"Blockers addressed\"],\n },\n {\n title: \"Sprint Review\",\n description: \"Review completed work with stakeholders.\",\n tasks: [\n \"Demo completed features\",\n \"Gather feedback\",\n \"Update backlog\",\n \"Document outcomes\",\n ],\n criteria: [\"Demo completed\", \"Feedback gathered\", \"Backlog updated\"],\n },\n {\n title: \"Sprint Retrospective\",\n description: \"Reflect on the sprint and identify improvements.\",\n tasks: [\n \"What went well\",\n \"What could improve\",\n \"Action items\",\n \"Update processes\",\n ],\n criteria: [\n \"Retrospective completed\",\n \"Improvements identified\",\n \"Action items assigned\",\n ],\n },\n ],\n};\n","/**\n * Built-in Plan Templates\n *\n * Standard templates for common plan types.\n */\n\nexport { BasicTemplate } from \"./basic.js\";\nexport { FeatureTemplate } from \"./feature.js\";\nexport { RefactoringTemplate } from \"./refactoring.js\";\nexport { MigrationTemplate } from \"./migration.js\";\nexport { SprintTemplate } from \"./sprint.js\";\n\n// Import and register all templates\nimport { registerTemplate } from \"../registry.js\";\nimport { BasicTemplate } from \"./basic.js\";\nimport { FeatureTemplate } from \"./feature.js\";\nimport { RefactoringTemplate } from \"./refactoring.js\";\nimport { MigrationTemplate } from \"./migration.js\";\nimport { SprintTemplate } from \"./sprint.js\";\n\n// Register built-in templates\nregisterTemplate(BasicTemplate);\nregisterTemplate(FeatureTemplate);\nregisterTemplate(RefactoringTemplate);\nregisterTemplate(MigrationTemplate);\nregisterTemplate(SprintTemplate);\n","/**\n * plan init command\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createPlan } from \"../../plan/creator.js\";\n\n/**\n * Format a code into a human-readable name\n */\nfunction formatName(code: string): string {\n return code\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\n/**\n * Generate initial steps based on count\n */\nfunction generateInitialSteps(\n count: number\n): Array<{ title: string; description?: string }> {\n const defaults = [\n { title: \"Setup\", description: \"Initial setup and prerequisites\" },\n { title: \"Implementation\", description: \"Core implementation work\" },\n { title: \"Testing\", description: \"Verify everything works\" },\n { title: \"Documentation\", description: \"Update documentation\" },\n { title: \"Release\", description: \"Final release preparation\" },\n ];\n return defaults.slice(0, count);\n}\n\n/**\n * Create the init command\n */\nexport function initCommand(): Command {\n return new Command(\"init\")\n .description(\"Create a new plan\")\n .argument(\"<name>\", \"Plan name/code (lowercase, hyphens)\")\n .option(\"-d, --description <desc>\", \"Plan description\")\n .option(\"-t, --template <template>\", \"Template to use\", \"default\")\n .option(\"-p, --path <path>\", \"Base path for plan\", \".\")\n .option(\"--steps <count>\", \"Number of initial steps\", \"3\")\n .action(async (name, options) => {\n try {\n const result = await createPlan({\n code: name,\n name: formatName(name),\n basePath: options.path,\n description: options.description,\n steps: generateInitialSteps(parseInt(options.steps)),\n });\n\n // eslint-disable-next-line no-console\n console.log(chalk.green(\"✓\") + ` Created plan: ${result.plan.metadata.name}`);\n // eslint-disable-next-line no-console\n console.log(chalk.dim(`Location: ${result.path}`));\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(\"Files created:\");\n for (const file of result.filesCreated.slice(0, 5)) {\n // eslint-disable-next-line no-console\n console.log(chalk.dim(` - ${file}`));\n }\n if (result.filesCreated.length > 5) {\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(\n ` ... and ${result.filesCreated.length - 5} more`\n )\n );\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(chalk.red(\"✗\") + ` Failed to create plan: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","/**\n * plan validate command\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { validatePlan } from \"../../plan/validator.js\";\n\n/**\n * Create the validate command\n */\nexport function validateCommand(): Command {\n return new Command(\"validate\")\n .description(\"Validate plan structure\")\n .argument(\"[path]\", \"Path to plan directory\", \".\")\n .option(\"--strict\", \"Treat warnings as errors\")\n .option(\"--fix\", \"Attempt to fix issues (not yet implemented)\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (path, options) => {\n try {\n const result = await validatePlan(path, {\n strict: options.strict,\n });\n\n if (options.json) {\n // eslint-disable-next-line no-console\n console.log(JSON.stringify(result, null, 2));\n process.exit(result.valid ? 0 : 1);\n }\n\n // Output info\n for (const info of result.info) {\n // eslint-disable-next-line no-console\n console.log(chalk.blue(\"ℹ\") + ` ${info.message}`);\n }\n\n // Output warnings\n for (const warning of result.warnings) {\n // eslint-disable-next-line no-console\n console.log(chalk.yellow(\"⚠\") + ` [${warning.code}] ${warning.message}`);\n }\n\n // Output errors\n for (const error of result.errors) {\n // eslint-disable-next-line no-console\n console.log(chalk.red(\"✗\") + ` [${error.code}] ${error.message}`);\n }\n\n // Output fixable issues\n if (result.fixable.length > 0 && !options.fix) {\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(\n `${result.fixable.length} issue(s) can be auto-fixed with --fix`\n )\n );\n }\n\n // Summary\n // eslint-disable-next-line no-console\n console.log();\n if (result.valid) {\n // eslint-disable-next-line no-console\n console.log(chalk.green(\"✓\") + \" Plan is valid\");\n } else {\n // eslint-disable-next-line no-console\n console.log(chalk.red(\"✗\") + \" Plan has validation errors\");\n process.exit(1);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(chalk.red(\"✗\") + ` Validation failed: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","/**\n * plan archive command\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { resolve, join, basename } from \"node:path\";\nimport { rename, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { loadPlan } from \"../../plan/loader.js\";\nimport { generateStatus } from \"../../status/generator.js\";\nimport type { Plan } from \"../../types.js\";\n\n/**\n * Create the archive command\n */\nexport function archiveCommand(): Command {\n return new Command(\"archive\")\n .description(\"Archive a completed plan\")\n .argument(\"[path]\", \"Path to plan directory\", \".\")\n .option(\"-t, --target <dir>\", \"Archive target directory\", \"./archive\")\n .option(\"--force\", \"Archive even if not completed\")\n .option(\"--mark-complete\", \"Mark plan as completed before archiving\")\n .action(async (path, options) => {\n try {\n const planPath = resolve(path);\n const plan = await loadPlan(planPath);\n\n // Check if completed\n if (plan.state.status !== \"completed\" && !options.force) {\n if (options.markComplete) {\n // Mark as completed\n const updatedPlan: Plan = {\n ...plan,\n state: {\n ...plan.state,\n status: \"completed\",\n completedAt: new Date(),\n lastUpdatedAt: new Date(),\n },\n };\n\n // Update STATUS.md\n const statusPath = join(planPath, \"STATUS.md\");\n const existingContent = await readFile(\n statusPath,\n \"utf-8\"\n ).catch(() => \"\");\n const newStatus = generateStatus(updatedPlan, {\n existingContent,\n });\n await writeFile(statusPath, newStatus);\n\n // eslint-disable-next-line no-console\n console.log(chalk.green(\"✓\") + \" Marked plan as completed\");\n } else {\n // eslint-disable-next-line no-console\n console.log(chalk.yellow(\"⚠\") + \" Plan is not completed. Use --force to archive anyway, or --mark-complete\");\n process.exit(1);\n }\n }\n\n // Create archive directory\n const archiveDir = resolve(options.target);\n await mkdir(archiveDir, { recursive: true });\n\n // Move plan to archive\n const archivePath = join(archiveDir, basename(planPath));\n await rename(planPath, archivePath);\n\n // eslint-disable-next-line no-console\n console.log(chalk.green(\"✓\") + ` Archived: ${plan.metadata.name}`);\n // eslint-disable-next-line no-console\n console.log(chalk.dim(` From: ${planPath}`));\n // eslint-disable-next-line no-console\n console.log(chalk.dim(` To: ${archivePath}`));\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(chalk.red(\"✗\") + ` Archive failed: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","/**\n * plan template commands\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n listTemplates,\n getTemplate,\n applyTemplate,\n} from \"../../templates/index.js\";\n\n/**\n * Create the template list command\n */\nexport function templateListCommand(): Command {\n return new Command(\"list\")\n .description(\"List available plan templates\")\n .option(\"-c, --category <category>\", \"Filter by category\")\n .action((options) => {\n const templates = listTemplates();\n\n const filtered = options.category\n ? templates.filter((t) => t.category === options.category)\n : templates;\n\n if (filtered.length === 0) {\n // eslint-disable-next-line no-console\n console.log(chalk.yellow(\"No templates found.\"));\n return;\n }\n\n // eslint-disable-next-line no-console\n console.log(chalk.bold(\"\\nAvailable Templates:\\n\"));\n\n for (const template of filtered) {\n // eslint-disable-next-line no-console\n console.log(chalk.cyan(` ${template.id}`));\n // eslint-disable-next-line no-console\n console.log(chalk.white(` ${template.name}`));\n // eslint-disable-next-line no-console\n console.log(chalk.dim(` ${template.description}`));\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(\n ` Category: ${template.category} | Steps: ${template.steps.length}`\n )\n );\n // eslint-disable-next-line no-console\n console.log();\n }\n });\n}\n\n/**\n * Create the template show command\n */\nexport function templateShowCommand(): Command {\n return new Command(\"show\")\n .description(\"Show details of a template\")\n .argument(\"<id>\", \"Template ID\")\n .action((id) => {\n const template = getTemplate(id);\n\n if (!template) {\n // eslint-disable-next-line no-console\n console.error(chalk.red(`Template not found: ${id}`));\n process.exit(1);\n }\n\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(chalk.bold(template.name));\n // eslint-disable-next-line no-console\n console.log(chalk.dim(`ID: ${template.id}`));\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(template.description);\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(\n chalk.cyan(\"Category: \") + template.category\n );\n // eslint-disable-next-line no-console\n console.log(\n chalk.cyan(\"Tags: \") + template.tags.join(\", \")\n );\n\n // Show phases if defined\n if (template.phases && template.phases.length > 0) {\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(chalk.bold(\"Phases:\"));\n for (const phase of template.phases) {\n // eslint-disable-next-line no-console\n console.log(chalk.yellow(` ${phase.name}`));\n // eslint-disable-next-line no-console\n console.log(chalk.dim(` ${phase.description}`));\n }\n }\n\n // Show steps\n // eslint-disable-next-line no-console\n console.log();\n // eslint-disable-next-line no-console\n console.log(chalk.bold(\"Steps:\"));\n for (let i = 0; i < template.steps.length; i++) {\n const step = template.steps[i];\n const num = String(i + 1).padStart(2, \"0\");\n // eslint-disable-next-line no-console\n console.log(chalk.white(` ${num}. ${step.title}`));\n // eslint-disable-next-line no-console\n console.log(chalk.dim(` ${step.description}`));\n }\n // eslint-disable-next-line no-console\n console.log();\n });\n}\n\n/**\n * Create the template use command\n */\nexport function templateUseCommand(): Command {\n return new Command(\"use\")\n .description(\"Create a new plan from a template\")\n .argument(\"<template>\", \"Template ID\")\n .argument(\"<name>\", \"Plan name/code (lowercase, hyphens)\")\n .option(\"-d, --description <desc>\", \"Custom description\")\n .option(\"-p, --path <path>\", \"Base path for plan\", \".\")\n .action(async (templateId, name, options) => {\n try {\n // Format name into display name\n const displayName = name\n .split(\"-\")\n .map(\n (word: string) =>\n word.charAt(0).toUpperCase() + word.slice(1)\n )\n .join(\" \");\n\n const result = await applyTemplate({\n templateId,\n code: name,\n name: displayName,\n basePath: options.path,\n description: options.description,\n });\n\n if (result.success) {\n // eslint-disable-next-line no-console\n console.log(\n chalk.green(\"✓\") +\n ` Created plan from template: ${templateId}`\n );\n // eslint-disable-next-line no-console\n console.log(chalk.dim(`Location: ${result.path}`));\n } else {\n // eslint-disable-next-line no-console\n console.error(chalk.red(\"✗\") + ` ${result.error}`);\n process.exit(1);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n chalk.red(\"✗\") +\n ` Failed to create plan: ${(error as Error).message}`\n );\n process.exit(1);\n }\n });\n}\n\n/**\n * Create the template command group\n */\nexport function templateCommand(): Command {\n const cmd = new Command(\"template\").description(\n \"Manage plan templates\"\n );\n\n cmd.addCommand(templateListCommand());\n cmd.addCommand(templateShowCommand());\n cmd.addCommand(templateUseCommand());\n\n return cmd;\n}\n\n","/**\n * @riotprompt/riotplan-commands-plan\n *\n * Plan management commands for RiotPlan CLI\n */\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./init.js\";\nimport { validateCommand } from \"./validate.js\";\nimport { archiveCommand } from \"./archive.js\";\nimport { templateCommand } from \"./template.js\";\n\nexport { initCommand } from \"./init.js\";\nexport { validateCommand } from \"./validate.js\";\nexport { archiveCommand } from \"./archive.js\";\nexport {\n templateCommand,\n templateListCommand,\n templateShowCommand,\n templateUseCommand,\n} from \"./template.js\";\n\n/**\n * Register all plan commands on a Commander program\n */\nexport function registerPlanCommands(program: Command): void {\n const planCmd = program\n .command(\"plan\")\n .description(\"Plan management commands\");\n\n planCmd.addCommand(initCommand());\n planCmd.addCommand(validateCommand());\n planCmd.addCommand(archiveCommand());\n planCmd.addCommand(templateCommand());\n}\n","/**\n * render command\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { writeFile } from \"node:fs/promises\";\nimport { loadPlan } from \"../../plan/loader.js\";\nimport {\n renderPlan,\n renderToMarkdown,\n renderToJson,\n renderToHtml,\n type RenderFormat,\n} from \"../../renderer/index.js\";\n\n/**\n * Create the render command\n */\nexport function renderCommand(): Command {\n return new Command(\"render\")\n .description(\"Render plan to various formats\")\n .option(\"-p, --path <path>\", \"Path to plan directory\", \".\")\n .option(\n \"-f, --format <format>\",\n \"Output format: markdown, json, html\",\n \"markdown\"\n )\n .option(\"-o, --output <file>\", \"Output file (defaults to stdout)\")\n .option(\"--theme <theme>\", \"HTML theme: light, dark\", \"light\")\n .option(\"--pretty\", \"Pretty print JSON output\", true)\n .option(\"--no-metadata\", \"Exclude metadata from output\")\n .option(\"--feedback\", \"Include feedback records\")\n .option(\"--evidence\", \"Include evidence records\")\n .option(\"--task-list\", \"Use task list format for markdown steps\")\n .option(\"--toc\", \"Include table of contents (markdown)\")\n .option(\"--no-styles\", \"Exclude styles from HTML output\")\n .option(\"--full\", \"Include all details\")\n .action(async (options) => {\n try {\n // Load the plan\n const plan = await loadPlan(options.path);\n\n // Validate format\n const format = options.format.toLowerCase() as RenderFormat;\n if (![\"markdown\", \"json\", \"html\"].includes(format)) {\n // eslint-disable-next-line no-console\n console.error(\n chalk.red(\"✗\") +\n ` Invalid format: ${options.format}. Use markdown, json, or html.`\n );\n process.exit(1);\n }\n\n // Build render options based on format\n let content: string;\n\n if (format === \"markdown\") {\n content = renderToMarkdown(plan, {\n includeMetadata: options.metadata !== false,\n includeStepDetails: true,\n includeFeedback: options.feedback || options.full,\n includeEvidence: options.evidence || options.full,\n useTaskList: options.taskList,\n includeToc: options.toc,\n });\n } else if (format === \"json\") {\n content = renderToJson(plan, {\n pretty: options.pretty,\n includeStepContent: options.full,\n includeFeedback: options.feedback || options.full,\n includeEvidence: options.evidence || options.full,\n });\n } else {\n content = renderToHtml(plan, {\n theme: options.theme as \"light\" | \"dark\",\n includeStyles: options.styles !== false,\n includeStepDetails: true,\n includeFeedback: options.feedback || options.full,\n includeEvidence: options.evidence || options.full,\n });\n }\n\n // Output\n if (options.output) {\n await writeFile(options.output, content, \"utf-8\");\n // eslint-disable-next-line no-console\n console.log(\n chalk.green(\"✓\") +\n ` Rendered plan to ${options.output}`\n );\n } else {\n // eslint-disable-next-line no-console\n console.log(content);\n }\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n chalk.red(\"✗\") +\n ` Render failed: ${(error as Error).message}`\n );\n process.exit(1);\n }\n });\n}\n\n/**\n * Create the render export command (for multiple formats)\n */\nexport function renderExportCommand(): Command {\n return new Command(\"export\")\n .description(\"Export plan to multiple formats\")\n .option(\"-p, --path <path>\", \"Path to plan directory\", \".\")\n .option(\"-o, --output-dir <dir>\", \"Output directory\", \"./export\")\n .option(\"--all\", \"Export all formats\", false)\n .option(\"--markdown\", \"Export markdown\", false)\n .option(\"--json\", \"Export JSON\", false)\n .option(\"--html\", \"Export HTML\", false)\n .option(\"--theme <theme>\", \"HTML theme: light, dark\", \"light\")\n .option(\"--full\", \"Include all details\")\n .action(async (options) => {\n try {\n // Load the plan\n const plan = await loadPlan(options.path);\n const outputDir = options.outputDir;\n\n // Determine which formats to export\n const formats: RenderFormat[] = [];\n if (options.all) {\n formats.push(\"markdown\", \"json\", \"html\");\n } else {\n if (options.markdown) formats.push(\"markdown\");\n if (options.json) formats.push(\"json\");\n if (options.html) formats.push(\"html\");\n }\n\n if (formats.length === 0) {\n // eslint-disable-next-line no-console\n console.error(\n chalk.yellow(\"!\") +\n \" No formats specified. Use --all, --markdown, --json, or --html\"\n );\n process.exit(1);\n }\n\n // Create output directory\n const { mkdir } = await import(\"node:fs/promises\");\n await mkdir(outputDir, { recursive: true });\n\n // Export each format\n for (const format of formats) {\n const result = renderPlan(plan, {\n format,\n theme: options.theme as \"light\" | \"dark\",\n includeStepDetails: true,\n includeFeedback: options.full,\n includeEvidence: options.full,\n pretty: true,\n });\n\n if (result.success && result.content) {\n const ext =\n format === \"markdown\"\n ? \"md\"\n : format === \"json\"\n ? \"json\"\n : \"html\";\n const filename = `${plan.metadata.code}.${ext}`;\n const filepath = `${outputDir}/${filename}`;\n\n await writeFile(filepath, result.content, \"utf-8\");\n // eslint-disable-next-line no-console\n console.log(chalk.green(\"✓\") + ` Exported: ${filepath}`);\n } else {\n // eslint-disable-next-line no-console\n console.error(\n chalk.red(\"✗\") +\n ` Failed to export ${format}: ${result.error}`\n );\n }\n }\n\n // eslint-disable-next-line no-console\n console.log(\n chalk.dim(\n `\\nExported ${formats.length} format(s) to ${outputDir}`\n )\n );\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error(\n chalk.red(\"✗\") +\n ` Export failed: ${(error as Error).message}`\n );\n process.exit(1);\n }\n });\n}\n\n","/**\n * @riotprompt/riotplan-commands-render\n *\n * Render commands for RiotPlan CLI\n */\n\nimport { Command } from \"commander\";\nimport { renderCommand } from \"./render.js\";\n\nexport { renderCommand } from \"./render.js\";\n\n/**\n * Register all render commands on a Commander program\n */\nexport function registerRenderCommands(program: Command): void {\n program.addCommand(renderCommand());\n}\n\n","/**\n * Status commands for RiotPlan CLI\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadPlan } from \"../../index.js\";\nimport type { Plan, PlanStep } from \"../../types.js\";\n\nexport { showCommand } from \"./status-show.js\";\n\n/**\n * Get status icon for a given status\n */\nexport function getStatusIcon(status: string): string {\n const icons: Record<string, string> = {\n pending: \"⬜\",\n in_progress: \"🔄\",\n completed: \"✅\",\n failed: \"❌\",\n blocked: \"⏸️\",\n skipped: \"⏭️\",\n };\n return icons[status] || \"⬜\";\n}\n\n/**\n * Output plan summary\n */\nexport function outputPlanSummary(plan: Plan): void {\n \n console.log();\n \n console.log(chalk.bold(plan.metadata.name));\n \n console.log(chalk.dim(`Code: ${plan.metadata.code}`));\n \n console.log();\n \n console.log(`Status: ${getStatusIcon(plan.state.status)} ${plan.state.status}`);\n \n if (plan.state.progress !== undefined) {\n \n console.log(`Progress: ${plan.state.progress}%`);\n }\n \n if (plan.state.currentStep) {\n \n console.log(`Current Step: ${plan.state.currentStep}`);\n }\n \n if (plan.state.blockers && plan.state.blockers.length > 0) {\n \n console.log();\n \n console.log(chalk.yellow(\"Blockers:\"));\n for (const blocker of plan.state.blockers) {\n \n console.log(chalk.yellow(` - ${blocker.description}`));\n }\n }\n}\n\n/**\n * Output step list\n */\nexport function outputStepList(steps: PlanStep[]): void {\n for (const step of steps) {\n const icon = getStatusIcon(step.status);\n \n console.log(` ${icon} ${String(step.number).padStart(2, \"0\")}. ${step.title}`);\n }\n}\n\n/**\n * Register status commands on the program\n */\nexport function registerStatusCommands(program: Command): void {\n program\n .command(\"status\")\n .description(\"Show plan status\")\n .argument(\"[path]\", \"Path to plan directory\", \".\")\n .option(\"-v, --verbose\", \"Show detailed status with steps\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (path, options) => {\n try {\n const plan = await loadPlan(path);\n\n if (options.json) {\n \n console.log(JSON.stringify({\n name: plan.metadata.name,\n code: plan.metadata.code,\n status: plan.state.status,\n progress: plan.state.progress,\n currentStep: plan.state.currentStep,\n steps: plan.steps.map((s) => ({\n number: s.number,\n title: s.title,\n status: s.status,\n })),\n blockers: plan.state.blockers,\n }, null, 2));\n return;\n }\n\n outputPlanSummary(plan);\n \n if (options.verbose) {\n \n console.log();\n \n console.log(\"Steps:\");\n outputStepList(plan.steps);\n }\n } catch (error) {\n \n console.error(chalk.red(\"✗\") + ` Failed to load plan: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","/**\n * Step commands for RiotPlan CLI\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { loadPlan, insertStep, startStep, completeStep, blockStep, unblockStep, skipStep } from \"../../index.js\";\n\n/**\n * Register step commands with the CLI program\n */\nexport function registerStepCommands(program: Command): void {\n const step = program\n .command(\"step\")\n .description(\"Manage plan steps\");\n\n step.command(\"list\")\n .description(\"List all steps in the plan\")\n .argument(\"[path]\", \"Path to plan directory\", process.cwd())\n .action(async (path: string) => {\n try {\n const plan = await loadPlan(path);\n \n console.log(chalk.bold(`\\nSteps for ${plan.metadata.name}:`));\n \n console.log();\n\n for (const planStep of plan.steps) {\n const statusIcon = getStatusIcon(planStep.status);\n \n console.log(`${statusIcon} ${planStep.number}. ${planStep.title} (${planStep.status})`);\n }\n \n console.log();\n } catch (error) {\n \n console.error(chalk.red(\"Error listing steps:\"), (error as Error).message);\n process.exit(1);\n }\n });\n\n step.command(\"add\")\n .description(\"Add a new step to the plan\")\n .argument(\"<title>\", \"Title of the step\")\n .option(\"-p, --position <number>\", \"Position to insert step\", parseInt)\n .option(\"-d, --description <text>\", \"Description of the step\")\n .option(\"--after <number>\", \"Insert after this step number\", parseInt)\n .argument(\"[path]\", \"Path to plan directory\", process.cwd())\n .action(async (title: string, options: { position?: number; description?: string; after?: number }, path: string) => {\n try {\n const plan = await loadPlan(path);\n const result = await insertStep(plan, {\n title,\n position: options.position,\n description: options.description,\n after: options.after,\n });\n \n console.log(chalk.green(`✓ Added step ${result.step.number}: ${result.step.title}`));\n \n console.log(chalk.dim(` File: ${result.createdFile}`));\n } catch (error) {\n \n console.error(chalk.red(\"Error adding step:\"), (error as Error).message);\n process.exit(1);\n }\n });\n\n step.command(\"start\")\n .description(\"Start a step\")\n .argument(\"<n>\", \"Step number to start\", parseInt)\n .argument(\"[path]\", \"Path to plan directory\", process.cwd())\n .action(async (stepNumber: number, path: string) => {\n try {\n const plan = await loadPlan(path);\n const started = startStep(plan, stepNumber);\n \n console.log(chalk.green(`✓ Started step ${started.number}: ${started.title}`));\n } catch (error) {\n \n console.error(chalk.red(\"Error starting step:\"), (error as Error).message);\n process.exit(1);\n }\n });\n\n step.command(\"complete\")\n .description(\"Mark a step as complete\")\n .argument(\"<n>\", \"Step number to complete\", parseInt)\n .option(\"-n, --notes <text>\", \"Completion notes\")\n .argument(\"[path]\", \"Path to plan directory\", process.cwd())\n .action(async (stepNumber: number, options: { notes?: string }, path: string) => {\n try {\n const plan = await loadPlan(path);\n const completed = completeStep(plan, stepNumber, options.notes);\n \n console.log(chalk.green(`✓ Completed step ${completed.number}: ${completed.title}`));\n if (options.notes) {\n \n console.log(chalk.dim(` Notes: ${options.notes}`));\n }\n } catch (error) {\n \n console.error(chalk.red(\"Error completing step:\"), (error as Error).message);\n process.exit(1);\n }\n });\n\n step.command(\"block\")\n .description(\"Block a step\")\n .argument(\"<n>\", \"Step number to block\", parseInt)\n .argument(\"<reason>\", \"Reason for blocking\")\n .argument(\"[path]\", \"Path to plan directory\", process.cwd())\n .action(async (stepNumber: number, reason: string, path: string) => {\n try {\n const plan = await loadPlan(path);\n const blocked = blockStep(plan, stepNumber, reason);\n\n console.log(chalk.yellow(`⏸️ Blocked step ${blocked.number}: ${blocked.title}`));\n\n console.log(chalk.dim(` Reason: ${reason}`));\n } catch (error) {\n\n console.error(chalk.red(\"Error blocking step:\"), (error as Error).message);\n process.exit(1);\n }\n });\n\n step.command(\"unblock\")\n .description(\"Unblock a step\")\n .argument(\"<n>\", \"Step number to unblock\", parseInt)\n .argument(\"[path]\", \"Path to plan directory\", process.cwd())\n .action(async (stepNumber: number, path: string) => {\n try {\n const plan = await loadPlan(path);\n const unblocked = unblockStep(plan, stepNumber);\n\n console.log(chalk.green(`▶️ Unblocked step ${unblocked.number}: ${unblocked.title}`));\n } catch (error) {\n\n console.error(chalk.red(\"Error unblocking step:\"), (error as Error).message);\n process.exit(1);\n }\n });\n\n step.command(\"skip\")\n .description(\"Skip a step\")\n .argument(\"<n>\", \"Step number to skip\", parseInt)\n .option(\"-r, --reason <text>\", \"Reason for skipping\")\n .argument(\"[path]\", \"Path to plan directory\", process.cwd())\n .action(async (stepNumber: number, options: { reason?: string }, path: string) => {\n try {\n const plan = await loadPlan(path);\n const skipped = skipStep(plan, stepNumber, options.reason);\n\n console.log(chalk.cyan(`⏭️ Skipped step ${skipped.number}: ${skipped.title}`));\n if (options.reason) {\n\n console.log(chalk.dim(` Reason: ${options.reason}`));\n }\n } catch (error) {\n\n console.error(chalk.red(\"Error skipping step:\"), (error as Error).message);\n process.exit(1);\n }\n });\n}\n\n/**\n * Get status icon for a given status\n */\nfunction getStatusIcon(status: string): string {\n const icons: Record<string, string> = {\n pending: \"⬜\",\n in_progress: \"🔄\",\n completed: \"✅\",\n failed: \"❌\",\n blocked: \"⏸️\",\n skipped: \"⏭️\",\n };\n return icons[status] || \"⬜\";\n}\n","/**\n * Feedback commands for RiotPlan CLI\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { createFeedback, listFeedback, getFeedback } from \"../../feedback/index.js\";\n\n/**\n * Register feedback commands on the program\n */\nexport function registerFeedbackCommands(program: Command): void {\n const feedbackCmd = program\n .command(\"feedback\")\n .description(\"Feedback management commands\");\n\n // Create feedback\n feedbackCmd\n .command(\"create\")\n .description(\"Create a new feedback record\")\n .argument(\"<title>\", \"Feedback title\")\n .argument(\"[path]\", \"Path to plan directory\", \".\")\n .option(\"-p, --platform <platform>\", \"Platform (e.g., github, slack)\")\n .option(\"-f, --feedback <text>\", \"Feedback content\")\n .action(async (title, path, options) => {\n try {\n const result = await createFeedback(path, {\n title,\n feedback: options.feedback || \"Feedback pending\",\n platform: options.platform,\n participants: [{ name: \"User\", type: \"human\" }],\n });\n\n \n console.log(chalk.green(\"✓\") + ` Created feedback: ${result.record.title}`);\n \n console.log(chalk.dim(`ID: ${result.record.id}`));\n } catch (error) {\n \n console.error(chalk.red(\"✗\") + ` Failed to create feedback: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n // List feedback\n feedbackCmd\n .command(\"list\")\n .description(\"List all feedback records\")\n .argument(\"[path]\", \"Path to plan directory\", \".\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (path, options) => {\n try {\n const records = await listFeedback(path);\n\n if (options.json) {\n \n console.log(JSON.stringify(records, null, 2));\n return;\n }\n\n if (records.length === 0) {\n \n console.log(chalk.dim(\"No feedback records found.\"));\n return;\n }\n\n \n console.log();\n \n console.log(chalk.bold(`Feedback Records (${records.length})`));\n \n console.log();\n\n for (const record of records) {\n const date = record.createdAt.toISOString().split(\"T\")[0];\n \n console.log(` ${chalk.cyan(record.id)} ${record.title} ${chalk.dim(`(${date})`)}`);\n }\n \n console.log();\n } catch (error) {\n \n console.error(chalk.red(\"✗\") + ` Failed to list feedback: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n\n // Show feedback\n feedbackCmd\n .command(\"show\")\n .description(\"Show a specific feedback record\")\n .argument(\"<id>\", \"Feedback ID\")\n .argument(\"[path]\", \"Path to plan directory\", \".\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (id, path, options) => {\n try {\n const record = await getFeedback(path, id);\n\n if (!record) {\n \n console.error(chalk.red(\"✗\") + ` Feedback ${id} not found`);\n process.exit(1);\n }\n\n if (options.json) {\n \n console.log(JSON.stringify(record, null, 2));\n return;\n }\n\n \n console.log();\n \n console.log(chalk.bold(record.title));\n \n console.log(chalk.dim(`ID: ${record.id}`));\n \n console.log(chalk.dim(`Created: ${record.createdAt.toISOString().split(\"T\")[0]}`));\n\n if (record.platform) {\n \n console.log(`Platform: ${record.platform}`);\n }\n\n if (record.participants && record.participants.length > 0) {\n \n console.log();\n \n console.log(\"Participants:\");\n for (const p of record.participants) {\n \n console.log(chalk.dim(` - ${p.name} (${p.type})`));\n }\n }\n\n if (record.feedback) {\n \n console.log();\n \n console.log(\"Feedback:\");\n \n console.log(chalk.dim(` ${record.feedback}`));\n }\n\n \n console.log();\n } catch (error) {\n \n console.error(chalk.red(\"✗\") + ` Failed to show feedback: ${(error as Error).message}`);\n process.exit(1);\n }\n });\n}\n","/**\n * AI Plan Generator\n * \n * Generates plan content using LLM providers\n */\n\nimport type { Provider, Request, ExecutionOptions } from '../types.js';\n\nexport interface GeneratedPlan {\n summary: string;\n approach: string;\n successCriteria: string;\n steps: GeneratedStep[];\n}\n\nexport interface GeneratedStep {\n number: number;\n title: string;\n objective: string;\n background: string;\n tasks: GeneratedTask[];\n acceptanceCriteria: string[];\n testing: string;\n filesChanged: string[];\n notes: string;\n}\n\nexport interface GeneratedTask {\n id: string;\n description: string;\n}\n\nexport interface GenerationContext {\n planName: string;\n description: string;\n elaborations?: string[];\n stepCount?: number;\n}\n\n/**\n * Generate a plan using AI\n */\nexport async function generatePlan(\n context: GenerationContext,\n provider: Provider,\n options: ExecutionOptions = {}\n): Promise<GeneratedPlan> {\n const prompt = buildPlanPrompt(context);\n \n const request: Request = {\n model: options.model || 'claude-sonnet-4-5',\n messages: [\n {\n role: 'system',\n content: SYSTEM_PROMPT,\n },\n {\n role: 'user',\n content: prompt,\n },\n ],\n responseFormat: {\n type: 'json_schema',\n json_schema: {\n name: 'plan_generation',\n description: 'Generate a detailed execution plan',\n schema: {\n type: 'object',\n properties: {\n summary: { type: 'string' },\n approach: { type: 'string' },\n successCriteria: { type: 'string' },\n steps: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n number: { type: 'number' },\n title: { type: 'string' },\n objective: { type: 'string' },\n background: { type: 'string' },\n tasks: {\n type: 'array',\n items: {\n type: 'object',\n properties: {\n id: { type: 'string' },\n description: { type: 'string' },\n },\n required: ['id', 'description'],\n },\n },\n acceptanceCriteria: {\n type: 'array',\n items: { type: 'string' },\n },\n testing: { type: 'string' },\n filesChanged: {\n type: 'array',\n items: { type: 'string' },\n },\n notes: { type: 'string' },\n },\n required: ['number', 'title', 'objective', 'background', 'tasks', 'acceptanceCriteria', 'testing', 'filesChanged', 'notes'],\n },\n },\n },\n required: ['summary', 'approach', 'successCriteria', 'steps'],\n },\n },\n },\n addMessage: function(message) {\n this.messages.push(message);\n },\n };\n\n const response = await provider.execute(request, options);\n \n return parsePlanResponse(response.content, context.stepCount || 5);\n}\n\nconst SYSTEM_PROMPT = `You are an expert project planner and software architect. Your role is to analyze project requirements and create detailed, actionable execution plans.\n\nWhen creating a plan:\n1. Break down the work into clear, sequential steps\n2. Provide specific, actionable tasks for each step\n3. Define measurable acceptance criteria\n4. Consider dependencies and ordering\n5. Be concrete and specific, not vague or generic\n6. Think about testing and verification at each stage\n\nCRITICAL: You must output ONLY valid JSON. Do not include any text before or after the JSON object. Ensure all strings are properly escaped.`;\n\nfunction buildPlanPrompt(context: GenerationContext): string {\n let prompt = `Create a detailed execution plan for the following project:\n\n**Project Name**: ${context.planName}\n\n**Description**:\n${context.description}\n`;\n\n if (context.elaborations && context.elaborations.length > 0) {\n prompt += `\\n**Additional Context**:\\n`;\n context.elaborations.forEach((elab, i) => {\n prompt += `\\n${i + 1}. ${elab}\\n`;\n });\n }\n\n prompt += `\\n**Requirements**:\n- Generate ${context.stepCount || 5} steps\n- Each step should be focused and achievable\n- Provide specific tasks, not generic placeholders\n- Include concrete acceptance criteria\n- Consider what files or components will be affected\n\nPlease provide:\n1. Executive Summary (2-3 paragraphs explaining what this plan accomplishes)\n2. Approach (how you'll tackle this work, key decisions)\n3. Success Criteria (how we'll know the project is complete)\n4. Detailed steps with:\n - Step title\n - Objective (what this step accomplishes)\n - Background (context needed)\n - Tasks (specific actions to take)\n - Acceptance criteria (how to verify completion)\n - Testing approach\n - Files that will be changed\n - Any notes or considerations\n\nIMPORTANT: Output ONLY the JSON object below, with no markdown formatting, no code blocks, no additional text. Ensure all strings use proper JSON escaping for quotes and newlines.\n\nJSON structure:\n{\n \"summary\": \"executive summary text\",\n \"approach\": \"approach description\",\n \"successCriteria\": \"success criteria description\",\n \"steps\": [\n {\n \"number\": 1,\n \"title\": \"Step Title\",\n \"objective\": \"what this step accomplishes\",\n \"background\": \"context and prerequisites\",\n \"tasks\": [\n {\"id\": \"01.1\", \"description\": \"specific task\"},\n {\"id\": \"01.2\", \"description\": \"another task\"}\n ],\n \"acceptanceCriteria\": [\"criterion 1\", \"criterion 2\"],\n \"testing\": \"how to verify this step\",\n \"filesChanged\": [\"file1.ts\", \"file2.ts\"],\n \"notes\": \"additional notes\"\n }\n ]\n}`;\n\n return prompt;\n}\n\n/**\n * Parse the LLM response into a structured plan\n */\nfunction parsePlanResponse(content: string, _stepCount: number): GeneratedPlan {\n try {\n // Try to extract JSON from markdown code blocks if present\n let jsonContent = content.trim();\n \n // Remove markdown code blocks\n const codeBlockMatch = jsonContent.match(/```(?:json)?\\s*([\\s\\S]*?)\\s*```/);\n if (codeBlockMatch) {\n jsonContent = codeBlockMatch[1].trim();\n }\n \n // Try to find JSON object (first { to last })\n const firstBrace = jsonContent.indexOf('{');\n const lastBrace = jsonContent.lastIndexOf('}');\n if (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {\n jsonContent = jsonContent.substring(firstBrace, lastBrace + 1);\n }\n \n let parsed;\n try {\n parsed = JSON.parse(jsonContent);\n } catch {\n // If JSON parsing fails, try to clean up common issues\n jsonContent = jsonContent\n .replace(/\\n/g, '\\\\n') // Escape newlines\n .replace(/\\t/g, '\\\\t') // Escape tabs\n .replace(/\\r/g, '\\\\r'); // Escape carriage returns\n \n parsed = JSON.parse(jsonContent);\n }\n \n // Validate structure\n if (!parsed.summary || !parsed.approach || !parsed.successCriteria || !parsed.steps) {\n throw new Error('Invalid plan structure: missing required fields');\n }\n \n // Ensure we have the right number of steps\n // Note: AI may generate different number of steps than requested\n \n return parsed as GeneratedPlan;\n } catch (error) {\n throw new Error(`Failed to parse plan response: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Format a generated plan into markdown content for SUMMARY.md\n */\nexport function formatSummary(plan: GeneratedPlan, planName: string): string {\n const title = planName.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n \n return `# ${title} - Summary\n\n## Executive Summary\n\n${plan.summary}\n\n## Approach\n\n${plan.approach}\n\n## Success Criteria\n\n${plan.successCriteria}\n`;\n}\n\n/**\n * Format step into markdown content\n */\nexport function formatStep(step: GeneratedStep): string {\n const num = String(step.number).padStart(2, '0');\n \n let content = `# Step ${num}: ${step.title}\n\n## Objective\n\n${step.objective}\n\n## Background\n\n${step.background}\n\n## Tasks\n\n`;\n\n step.tasks.forEach(task => {\n content += `### ${task.id} ${task.description}\\n\\n`;\n });\n\n content += `## Acceptance Criteria\n\n`;\n step.acceptanceCriteria.forEach(criterion => {\n content += `- [ ] ${criterion}\\n`;\n });\n\n content += `\\n## Testing\n\n${step.testing}\n\n## Files Changed\n\n`;\n step.filesChanged.forEach(file => {\n content += `- ${file}\\n`;\n });\n\n if (step.notes) {\n content += `\\n## Notes\n\n${step.notes}\n`;\n }\n\n return content;\n}\n","/**\n * Provider Loader\n * \n * Dynamically loads LLM providers based on availability\n */\n\nimport type { Provider } from '../types.js';\n\nexport interface ProviderConfig {\n name: string;\n apiKey?: string;\n model?: string;\n}\n\n/**\n * Load a provider by name\n */\nexport async function loadProvider(config: ProviderConfig): Promise<Provider> {\n const { name, apiKey } = config;\n \n try {\n switch (name.toLowerCase()) {\n case 'anthropic':\n case 'claude':\n return await loadAnthropicProvider(apiKey);\n \n case 'openai':\n case 'gpt':\n return await loadOpenAIProvider(apiKey);\n \n case 'gemini':\n case 'google':\n return await loadGeminiProvider(apiKey);\n \n default:\n throw new Error(`Unknown provider: ${name}`);\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('Cannot find package')) {\n throw new Error(\n `Provider '${name}' is not installed. Install it with:\\n` +\n ` npm install @riotprompt/execution-${name}`\n );\n }\n throw error;\n }\n}\n\nasync function loadAnthropicProvider(_apiKey?: string): Promise<Provider> {\n // eslint-disable-next-line import/no-extraneous-dependencies\n const { createAnthropicProvider } = await import('@riotprompt/execution-anthropic');\n return createAnthropicProvider();\n}\n\nasync function loadOpenAIProvider(_apiKey?: string): Promise<Provider> {\n const { createOpenAIProvider } = await import('@riotprompt/execution-openai');\n return createOpenAIProvider();\n}\n\nasync function loadGeminiProvider(_apiKey?: string): Promise<Provider> {\n const { createGeminiProvider } = await import('@riotprompt/execution-gemini');\n return createGeminiProvider();\n}\n\n/**\n * Detect available providers\n */\nexport async function detectAvailableProviders(): Promise<string[]> {\n const providers: string[] = [];\n \n const candidates = [\n { name: 'anthropic', pkg: '@riotprompt/execution-anthropic' },\n { name: 'openai', pkg: '@riotprompt/execution-openai' },\n { name: 'gemini', pkg: '@riotprompt/execution-gemini' },\n ];\n \n for (const candidate of candidates) {\n try {\n await import(candidate.pkg);\n providers.push(candidate.name);\n } catch {\n // Provider not available\n }\n }\n \n return providers;\n}\n\n/**\n * Get default provider based on environment variables\n */\nexport function getDefaultProvider(): string | null {\n if (process.env.ANTHROPIC_API_KEY) return 'anthropic';\n if (process.env.OPENAI_API_KEY) return 'openai';\n if (process.env.GOOGLE_API_KEY) return 'gemini';\n return null;\n}\n\n/**\n * Get API key for a provider from environment\n */\nexport function getProviderApiKey(provider: string): string | undefined {\n switch (provider.toLowerCase()) {\n case 'anthropic':\n case 'claude':\n return process.env.ANTHROPIC_API_KEY;\n case 'openai':\n case 'gpt':\n return process.env.OPENAI_API_KEY;\n case 'gemini':\n case 'google':\n return process.env.GOOGLE_API_KEY;\n default:\n return undefined;\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { join } from \"node:path\";\nimport { stat, readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { saveInitialPrompt, saveElaborationPrompt } from \"../../plan/prompts.js\";\nimport { createAnalysisDirectory } from \"../../analysis/index.js\";\nimport { \n generatePlan, \n formatSummary, \n formatStep,\n loadProvider,\n getDefaultProvider,\n getProviderApiKey,\n detectAvailableProviders,\n type GenerationContext,\n} from \"../../ai/index.js\";\n\nexport interface CreateOptions {\n direct?: boolean;\n analyze?: boolean;\n path?: string;\n provider?: string;\n model?: string;\n noAi?: boolean;\n}\n\n/**\n * Prompt user for plan name if not provided\n */\nasync function promptForName(): Promise<string> {\n const { name } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"name\",\n message: \"Plan name (kebab-case):\",\n validate: (input: string) => {\n if (!input.trim()) return \"Name is required\";\n if (!/^[a-z0-9-]+$/.test(input)) {\n return \"Use lowercase letters, numbers, and hyphens only\";\n }\n return true;\n },\n },\n ]);\n return name;\n}\n\n/**\n * Prompt user for initial plan description\n */\nasync function promptForDescription(): Promise<string> {\n const { description } = await inquirer.prompt([\n {\n type: \"editor\",\n name: \"description\",\n message: \"Describe what you want to accomplish (opens editor):\",\n },\n ]);\n return description;\n}\n\n/**\n * Ask user whether to analyze first or generate directly\n */\nasync function promptForMode(): Promise<\"analyze\" | \"direct\"> {\n console.log(chalk.cyan(\"\\nHow would you like to proceed?\"));\n console.log(chalk.gray(\" 1) Create an analysis first (recommended for complex plans)\"));\n console.log(chalk.gray(\" 2) Generate the plan directly\"));\n \n const { mode } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"mode\",\n message: \"Select mode:\",\n choices: [\n {\n name: \"1) Create an analysis first\",\n value: \"analyze\",\n },\n {\n name: \"2) Generate the plan directly\",\n value: \"direct\",\n },\n ],\n default: \"direct\",\n },\n ]);\n return mode;\n}\n\n/**\n * Prompt for elaboration feedback\n */\nasync function promptForElaboration(): Promise<string> {\n const { feedback } = await inquirer.prompt([{\n type: \"editor\",\n name: \"feedback\",\n message: \"Enter your elaboration feedback (opens editor):\",\n }]);\n return feedback;\n}\n\n/**\n * Mark analysis as ready\n */\nasync function markAnalysisReady(planPath: string): Promise<void> {\n const reqPath = join(planPath, \"analysis\", \"REQUIREMENTS.md\");\n let content = await readFile(reqPath, \"utf-8\");\n content = content.replace(\n /\\*\\*Status\\*\\*\\s*\\|\\s*`\\w+`/,\n \"**Status** | `ready`\"\n );\n await writeFile(reqPath, content, \"utf-8\");\n}\n\n/**\n * Check if plan already exists\n */\nasync function planExists(planPath: string): Promise<boolean> {\n try {\n await stat(join(planPath, \"EXECUTION_PLAN.md\"));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Generate plan files with AI\n */\nasync function generatePlanWithAI(\n planPath: string,\n planName: string,\n description: string,\n elaborations: string[],\n stepCount: number,\n options: CreateOptions\n): Promise<void> {\n // Create plan directory\n await mkdir(join(planPath, \"plan\"), { recursive: true });\n \n const title = planName.split(\"-\").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n const today = new Date().toISOString().split(\"T\")[0];\n \n try {\n // Detect available providers\n const available = await detectAvailableProviders();\n \n if (available.length === 0) {\n console.log(chalk.yellow(\"\\n⚠️ No AI providers installed. Falling back to template generation.\"));\n console.log(chalk.gray(\"Install a provider with: npm install @riotprompt/execution-anthropic\"));\n await generatePlanTemplate(planPath, planName, description, stepCount);\n return;\n }\n \n // Determine which provider to use\n const providerName = options.provider || getDefaultProvider();\n \n if (!providerName) {\n console.log(chalk.yellow(\"\\n⚠️ No API key found in environment.\"));\n console.log(chalk.gray(\"Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GOOGLE_API_KEY\"));\n await generatePlanTemplate(planPath, planName, description, stepCount);\n return;\n }\n \n console.log(chalk.cyan(`\\n🤖 Generating plan with ${providerName}...`));\n \n // Load provider\n const provider = await loadProvider({\n name: providerName,\n apiKey: getProviderApiKey(providerName),\n model: options.model,\n });\n \n // Generate plan with AI\n const context: GenerationContext = {\n planName,\n description,\n elaborations,\n stepCount,\n };\n \n const generatedPlan = await generatePlan(context, provider, {\n model: options.model,\n apiKey: getProviderApiKey(providerName),\n });\n \n // Write SUMMARY.md\n const summaryContent = formatSummary(generatedPlan, planName);\n await writeFile(join(planPath, \"SUMMARY.md\"), summaryContent, \"utf-8\");\n console.log(chalk.gray(\" Created: SUMMARY.md\"));\n \n // Write EXECUTION_PLAN.md\n const execContent = generateExecutionPlan(planPath, title, generatedPlan.steps);\n await writeFile(join(planPath, \"EXECUTION_PLAN.md\"), execContent, \"utf-8\");\n console.log(chalk.gray(\" Created: EXECUTION_PLAN.md\"));\n \n // Write STATUS.md\n const statusContent = generateStatus(title, generatedPlan.steps, today);\n await writeFile(join(planPath, \"STATUS.md\"), statusContent, \"utf-8\");\n console.log(chalk.gray(\" Created: STATUS.md\"));\n \n // Write step files\n for (const step of generatedPlan.steps) {\n const num = String(step.number).padStart(2, \"0\");\n const stepContent = formatStep(step);\n await writeFile(join(planPath, \"plan\", `${num}-step.md`), stepContent, \"utf-8\");\n console.log(chalk.gray(` Created: plan/${num}-step.md`));\n }\n \n } catch (error) {\n console.error(chalk.red(\"\\n❌ AI generation failed:\"), error instanceof Error ? error.message : error);\n console.log(chalk.yellow(\"Falling back to template generation...\"));\n await generatePlanTemplate(planPath, planName, description, stepCount);\n }\n}\n\n/**\n * Generate plan files from templates (fallback)\n */\nasync function generatePlanTemplate(\n planPath: string,\n planName: string,\n description: string,\n stepCount: number = 5\n): Promise<void> {\n const title = planName.split(\"-\").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n const today = new Date().toISOString().split(\"T\")[0];\n \n // Generate SUMMARY.md\n const summaryContent = `# ${title} - Summary\n\n## Executive Summary\n\n> Generated from initial prompt. Review and edit as needed.\n\n${description}\n\n## Approach\n\n_Approach to be defined..._\n\n## Success Criteria\n\n_Success criteria to be defined..._\n`;\n await writeFile(join(planPath, \"SUMMARY.md\"), summaryContent, \"utf-8\");\n console.log(chalk.gray(\" Created: SUMMARY.md\"));\n \n // Generate EXECUTION_PLAN.md\n const steps = Array.from({ length: stepCount }, (_, i) => {\n const num = String(i + 1).padStart(2, \"0\");\n return `| ${i + 1} | Step ${num} | \\`plan/${num}-step.md\\` | - |`;\n }).join(\"\\n\");\n \n const execContent = `# ${title} - Execution Plan\n\n> Execute: \"${planPath}/EXECUTION_PLAN.md\"\n\n## Execution Sequence\n\n| Order | Step | File | Est. Time |\n|-------|------|------|-----------|\n${steps}\n\n## How to Execute\n\n1. Read STATUS.md for current state\n2. Find next pending step\n3. Execute step file\n4. Update STATUS.md\n5. Continue until complete\n`;\n await writeFile(join(planPath, \"EXECUTION_PLAN.md\"), execContent, \"utf-8\");\n console.log(chalk.gray(\" Created: EXECUTION_PLAN.md\"));\n \n // Generate STATUS.md\n const statusSteps = Array.from({ length: stepCount }, (_, i) => {\n const num = String(i + 1).padStart(2, \"0\");\n return `| ${num} | Step ${num} | ⬜ Pending | - | - | - |`;\n }).join(\"\\n\");\n \n const statusContent = `# ${title} - Execution Status\n\n## Current State\n\n| Field | Value |\n|-------|-------|\n| **Status** | \\`pending\\` |\n| **Current Step** | - |\n| **Last Completed** | - |\n| **Started At** | - |\n| **Last Updated** | ${today} |\n\n## Step Progress\n\n| Step | Name | Status | Started | Completed | Notes |\n|------|------|--------|---------|-----------|-------|\n${statusSteps}\n\n## Blockers\n\n_No blockers currently._\n\n## Issues\n\n_No issues currently._\n\n## Notes\n\n_Plan generated. Ready for review and execution._\n`;\n await writeFile(join(planPath, \"STATUS.md\"), statusContent, \"utf-8\");\n console.log(chalk.gray(\" Created: STATUS.md\"));\n \n // Generate step files\n for (let i = 1; i <= stepCount; i++) {\n const num = String(i).padStart(2, \"0\");\n const stepContent = `# Step ${num}: [Title]\n\n## Objective\n\n_Define the objective of this step..._\n\n## Background\n\n_Provide context..._\n\n## Tasks\n\n### ${num}.1 Task One\n\n_Describe the task..._\n\n## Acceptance Criteria\n\n- [ ] Criterion one\n- [ ] Criterion two\n\n## Testing\n\n_How to verify this step is complete..._\n\n## Files Changed\n\n- _List files that will be modified..._\n\n## Notes\n\n_Additional notes..._\n`;\n await writeFile(join(planPath, \"plan\", `${num}-step.md`), stepContent, \"utf-8\");\n console.log(chalk.gray(` Created: plan/${num}-step.md`));\n }\n}\n\nfunction generateExecutionPlan(planPath: string, title: string, steps: any[]): string {\n const stepRows = steps.map((step) => {\n const num = String(step.number).padStart(2, \"0\");\n return `| ${step.number} | ${step.title} | \\`plan/${num}-step.md\\` | - |`;\n }).join(\"\\n\");\n \n return `# ${title} - Execution Plan\n\n> Execute: \"${planPath}/EXECUTION_PLAN.md\"\n\n## Execution Sequence\n\n| Order | Step | File | Est. Time |\n|-------|------|------|-----------|\n${stepRows}\n\n## How to Execute\n\n1. Read STATUS.md for current state\n2. Find next pending step\n3. Execute step file\n4. Update STATUS.md\n5. Continue until complete\n`;\n}\n\nfunction generateStatus(title: string, steps: any[], today: string): string {\n const stepRows = steps.map(step => {\n const num = String(step.number).padStart(2, \"0\");\n return `| ${num} | ${step.title} | ⬜ Pending | - | - | - |`;\n }).join(\"\\n\");\n \n return `# ${title} - Execution Status\n\n## Current State\n\n| Field | Value |\n|-------|-------|\n| **Status** | \\`pending\\` |\n| **Current Step** | - |\n| **Last Completed** | - |\n| **Started At** | - |\n| **Last Updated** | ${today} |\n\n## Step Progress\n\n| Step | Name | Status | Started | Completed | Notes |\n|------|------|--------|---------|-----------|-------|\n${stepRows}\n\n## Blockers\n\n_No blockers currently._\n\n## Issues\n\n_No issues currently._\n\n## Notes\n\n_Plan generated. Ready for review and execution._\n`;\n}\n\n/**\n * Register the create command\n */\nexport function registerCreateCommand(program: Command): void {\n program\n .command(\"create [name]\")\n .description(\"Interactively create a new plan\")\n .option(\"-d, --direct\", \"Skip analysis, generate plan directly\")\n .option(\"-a, --analyze\", \"Force analysis phase\")\n .option(\"-p, --path <path>\", \"Output directory (default: current)\")\n .option(\"-s, --steps <number>\", \"Number of steps to generate\", \"5\")\n .option(\"--provider <name>\", \"AI provider (anthropic, openai, gemini)\")\n .option(\"--model <name>\", \"Model to use for generation\")\n .option(\"--no-ai\", \"Skip AI generation, use templates only\")\n .action(async (name: string | undefined, options: CreateOptions & { steps?: string }) => {\n try {\n // Get name if not provided\n const planName = name || (await promptForName());\n \n // Get description\n console.log(chalk.cyan(\"\\nDescribe your plan:\"));\n const description = await promptForDescription();\n \n // Determine mode\n let mode: \"analyze\" | \"direct\";\n if (options.direct) {\n mode = \"direct\";\n } else if (options.analyze) {\n mode = \"analyze\";\n } else {\n mode = await promptForMode();\n }\n \n // Output path\n const basePath = options.path || process.cwd();\n const planPath = join(basePath, planName);\n const stepCount = parseInt(options.steps || \"5\", 10);\n \n console.log(chalk.green(`\\nCreating plan: ${planName}`));\n console.log(chalk.gray(`Path: ${planPath}`));\n console.log(chalk.gray(`Mode: ${mode}`));\n \n // Save the initial prompt\n const promptPath = await saveInitialPrompt(planPath, planName, description);\n console.log(chalk.gray(`Prompt saved: ${promptPath}`));\n \n if (mode === \"analyze\") {\n // Create analysis directory structure\n const analysisPath = await createAnalysisDirectory({\n planPath,\n planName,\n initialPrompt: description,\n });\n console.log(chalk.green(`\\n✅ Analysis created: ${analysisPath}`));\n \n // Ask if they want to elaborate now\n const { elaborateNow } = await inquirer.prompt([{\n type: \"confirm\",\n name: \"elaborateNow\",\n message: \"Would you like to add elaboration feedback now?\",\n default: true,\n }]);\n \n if (elaborateNow) {\n let continueElaborating = true;\n while (continueElaborating) {\n const feedback = await promptForElaboration();\n if (feedback.trim()) {\n await saveElaborationPrompt(planPath, feedback);\n console.log(chalk.green(\"✅ Elaboration saved.\"));\n }\n \n const { more } = await inquirer.prompt([{\n type: \"confirm\",\n name: \"more\",\n message: \"Add more elaboration?\",\n default: false,\n }]);\n continueElaborating = more;\n }\n }\n \n // Ask if ready to generate\n const { generateNow } = await inquirer.prompt([{\n type: \"confirm\",\n name: \"generateNow\",\n message: \"Ready to generate plan from analysis?\",\n default: false,\n }]);\n \n if (generateNow) {\n await markAnalysisReady(planPath);\n const elaborations: string[] = [];\n // TODO: Load elaborations from analysis\n await generatePlanWithAI(planPath, planName, description, elaborations, stepCount, options);\n console.log(chalk.green(\"\\n✅ Plan generated!\"));\n } else {\n console.log(chalk.cyan(\"\\nWhen ready:\"));\n console.log(chalk.gray(\" - Add more: riotplan elaborate\"));\n console.log(chalk.gray(\" - Generate: riotplan analysis ready && riotplan generate\"));\n }\n } else {\n // Direct mode - generate immediately\n if (options.noAi) {\n console.log(chalk.cyan(\"\\nGenerating plan from templates...\"));\n await generatePlanTemplate(planPath, planName, description, stepCount);\n } else {\n await generatePlanWithAI(planPath, planName, description, [], stepCount, options);\n }\n console.log(chalk.green(\"\\n✅ Plan generated!\"));\n }\n \n // Show completion message\n if (await planExists(planPath)) {\n console.log(chalk.green(\"\\n🎉 Plan creation complete!\"));\n console.log(chalk.cyan(\"\\nNext steps:\"));\n console.log(chalk.gray(` cd ${planPath}`));\n console.log(chalk.gray(\" riotplan status\"));\n console.log(chalk.gray(\" riotplan step start 01\"));\n }\n \n } catch (error) {\n console.error(chalk.red(\"Failed to create plan:\"), error);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { resolve } from \"node:path\";\nimport { loadAnalysis, hasAnalysis } from \"../../analysis/index.js\";\nimport { saveElaborationPrompt } from \"../../plan/prompts.js\";\nimport type { Analysis } from \"../../analysis/types.js\";\n\nexport interface ElaborateOptions {\n path?: string;\n message?: string;\n}\n\n/**\n * Prompt for elaboration feedback\n */\nasync function promptForFeedback(): Promise<string> {\n const { feedback } = await inquirer.prompt([\n {\n type: \"editor\",\n name: \"feedback\",\n message: \"Provide your elaboration feedback (opens editor):\",\n },\n ]);\n return feedback;\n}\n\n/**\n * Display current analysis state\n */\nfunction displayAnalysisState(analysis: Analysis | null): void {\n if (!analysis) return;\n \n console.log(chalk.cyan(\"\\n📋 Current Analysis State:\"));\n console.log(chalk.gray(` Status: ${analysis.metadata.status}`));\n console.log(chalk.gray(` Elaborations: ${analysis.metadata.elaborationCount}`));\n \n if (analysis.elaborations.length > 0) {\n console.log(chalk.gray(\"\\n Previous elaborations:\"));\n for (const elab of analysis.elaborations.slice(-3)) {\n const preview = elab.content.slice(0, 50).replace(/\\n/g, \" \");\n console.log(chalk.gray(` - #${elab.id}: ${preview}...`));\n }\n }\n}\n\n/**\n * Register the elaborate command\n */\nexport function registerElaborateCommand(program: Command): void {\n program\n .command(\"elaborate [path]\")\n .description(\"Add elaboration feedback to analysis\")\n .option(\"-m, --message <message>\", \"Feedback message (skip editor)\")\n .action(async (pathArg: string | undefined, options: ElaborateOptions) => {\n try {\n const planPath = resolve(pathArg || options.path || process.cwd());\n \n // Check if analysis exists\n if (!(await hasAnalysis(planPath))) {\n console.error(chalk.red(\"No analysis found at this path.\"));\n console.log(chalk.gray(\"Run 'riotplan create --analyze' first.\"));\n process.exit(1);\n }\n \n // Load current analysis\n const analysis = await loadAnalysis(planPath);\n displayAnalysisState(analysis);\n \n // Get feedback\n const feedback = options.message || (await promptForFeedback());\n \n if (!feedback.trim()) {\n console.log(chalk.yellow(\"No feedback provided. Aborting.\"));\n return;\n }\n \n // Save elaboration\n const savedPath = await saveElaborationPrompt(planPath, feedback, {\n previousCount: analysis?.metadata.elaborationCount || 0,\n });\n \n console.log(chalk.green(`\\n✅ Elaboration saved: ${savedPath}`));\n console.log(chalk.cyan(\"\\nNext steps:\"));\n console.log(chalk.gray(\" - Continue elaborating: riotplan elaborate\"));\n console.log(chalk.gray(\" - Generate plan: riotplan generate\"));\n console.log(chalk.gray(\" - View analysis: riotplan analysis show\"));\n \n } catch (error) {\n console.error(chalk.red(\"Failed to save elaboration:\"), error);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { resolve } from \"node:path\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { hasAnalysis } from \"../../analysis/index.js\";\n\n/**\n * Register analysis subcommands\n */\nexport function registerAnalysisCommands(program: Command): void {\n const analysis = program\n .command(\"analysis\")\n .description(\"Analysis management commands\");\n \n analysis\n .command(\"show [path]\")\n .description(\"Display current analysis\")\n .action(async (pathArg: string | undefined) => {\n try {\n const planPath = resolve(pathArg || process.cwd());\n \n if (!(await hasAnalysis(planPath))) {\n console.error(chalk.red(\"No analysis found.\"));\n process.exit(1);\n }\n \n // Read and display REQUIREMENTS.md\n const reqPath = join(planPath, \"analysis\", \"REQUIREMENTS.md\");\n const content = await readFile(reqPath, \"utf-8\");\n \n console.log(chalk.cyan(\"\\n📋 REQUIREMENTS.md:\\n\"));\n console.log(content);\n \n } catch (error) {\n console.error(chalk.red(\"Failed to show analysis:\"), error);\n process.exit(1);\n }\n });\n \n analysis\n .command(\"ready [path]\")\n .description(\"Mark analysis as ready for plan generation\")\n .action(async (pathArg: string | undefined) => {\n try {\n const planPath = resolve(pathArg || process.cwd());\n \n if (!(await hasAnalysis(planPath))) {\n console.error(chalk.red(\"No analysis found.\"));\n process.exit(1);\n }\n \n // Update status in REQUIREMENTS.md\n const reqPath = join(planPath, \"analysis\", \"REQUIREMENTS.md\");\n let content = await readFile(reqPath, \"utf-8\");\n content = content.replace(\n /\\*\\*Status\\*\\*\\s*\\|\\s*`\\w+`/,\n \"**Status** | `ready`\"\n );\n \n await writeFile(reqPath, content, \"utf-8\");\n \n console.log(chalk.green(\"✅ Analysis marked as ready.\"));\n console.log(chalk.cyan(\"Run 'riotplan generate' to create the plan.\"));\n \n } catch (error) {\n console.error(chalk.red(\"Failed to update analysis:\"), error);\n process.exit(1);\n }\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { resolve, join } from \"node:path\";\nimport { readFile, stat, mkdir, writeFile } from \"node:fs/promises\";\nimport { loadAnalysis, hasAnalysis } from \"../../analysis/index.js\";\nimport { \n generatePlan, \n formatSummary, \n formatStep,\n loadProvider,\n getDefaultProvider,\n getProviderApiKey,\n detectAvailableProviders,\n} from \"../../ai/index.js\";\nimport type { GenerationContext as AIGenerationContext } from \"../../ai/index.js\";\n\nexport interface GenerateOptions {\n path?: string;\n steps?: number;\n force?: boolean;\n provider?: string;\n model?: string;\n noAi?: boolean;\n}\n\n/**\n * Check if plan files already exist\n */\nasync function planExists(planPath: string): Promise<boolean> {\n try {\n await stat(join(planPath, \"EXECUTION_PLAN.md\"));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Load initial prompt from plan directory\n */\nasync function loadInitialPrompt(planPath: string, planName: string): Promise<string | null> {\n try {\n const promptPath = join(planPath, `${planName}-prompt.md`);\n const content = await readFile(promptPath, \"utf-8\");\n // Extract just the prompt content (after the --- separator)\n const match = content.match(/---\\n\\n([\\s\\S]+)$/);\n return match ? match[1].trim() : content;\n } catch {\n return null;\n }\n}\n\ninterface GenerationContext {\n source: \"analysis\" | \"prompt\";\n content: string;\n elaborations?: string[];\n}\n\n/**\n * Build generation context from analysis or prompt\n */\nasync function buildGenerationContext(planPath: string, planName: string): Promise<GenerationContext> {\n // Try to load analysis first\n if (await hasAnalysis(planPath)) {\n const analysis = await loadAnalysis(planPath);\n if (analysis && analysis.metadata.status === \"ready\") {\n return {\n source: \"analysis\",\n content: analysis.requirements,\n elaborations: analysis.elaborations.map(e => e.content),\n };\n } else if (analysis) {\n console.log(chalk.yellow(\"⚠️ Analysis exists but not marked ready.\"));\n const { proceed } = await inquirer.prompt([{\n type: \"confirm\",\n name: \"proceed\",\n message: \"Generate plan from draft analysis?\",\n default: false,\n }]);\n if (proceed) {\n return {\n source: \"analysis\",\n content: analysis.requirements,\n elaborations: analysis.elaborations.map(e => e.content),\n };\n }\n }\n }\n \n // Fall back to initial prompt\n const prompt = await loadInitialPrompt(planPath, planName);\n if (!prompt) {\n throw new Error(\"No analysis or initial prompt found\");\n }\n \n return {\n source: \"prompt\",\n content: prompt,\n };\n}\n\n/**\n * Register the generate command\n */\nexport function registerGenerateCommand(program: Command): void {\n program\n .command(\"generate [path]\")\n .description(\"Generate plan files from analysis or prompt\")\n .option(\"-s, --steps <number>\", \"Number of steps to generate\", \"5\")\n .option(\"-f, --force\", \"Overwrite existing plan files\")\n .option(\"--provider <name>\", \"AI provider (anthropic, openai, gemini)\")\n .option(\"--model <name>\", \"Model to use for generation\")\n .option(\"--no-ai\", \"Skip AI generation, use templates only\")\n .action(async (pathArg: string | undefined, options: GenerateOptions) => {\n try {\n const planPath = resolve(pathArg || options.path || process.cwd());\n const planName = planPath.split(\"/\").pop() || \"plan\";\n \n // Check for existing plan\n if (await planExists(planPath) && !options.force) {\n console.error(chalk.red(\"Plan already exists. Use --force to overwrite.\"));\n process.exit(1);\n }\n \n // Build context\n console.log(chalk.cyan(\"Loading generation context...\"));\n const context = await buildGenerationContext(planPath, planName);\n console.log(chalk.gray(`Source: ${context.source}`));\n \n // Generate plan files\n const stepCount = parseInt(String(options.steps), 10) || 5;\n \n if (options.noAi) {\n console.log(chalk.cyan(\"\\nGenerating plan from templates...\"));\n await generatePlanFiles(planPath, planName, context, { stepCount });\n } else {\n console.log(chalk.cyan(\"\\nGenerating plan with AI...\"));\n await generatePlanWithAI(planPath, planName, context, stepCount, options);\n }\n \n console.log(chalk.green(\"\\n✅ Plan generated successfully!\"));\n console.log(chalk.cyan(\"\\nNext steps:\"));\n console.log(chalk.gray(\" - Review: riotplan status\"));\n console.log(chalk.gray(\" - Amend: riotplan amend\"));\n console.log(chalk.gray(\" - Start: riotplan step start 01\"));\n \n } catch (error) {\n console.error(chalk.red(\"Failed to generate plan:\"), error);\n process.exit(1);\n }\n });\n}\n\n/**\n * Generate the plan files\n */\nasync function generatePlanFiles(\n planPath: string,\n planName: string,\n context: GenerationContext,\n options: { stepCount: number }\n): Promise<void> {\n // Create plan directory\n await mkdir(join(planPath, \"plan\"), { recursive: true });\n \n // Generate SUMMARY.md\n const summaryContent = generateSummary(planName, context);\n await writeFile(join(planPath, \"SUMMARY.md\"), summaryContent, \"utf-8\");\n console.log(chalk.gray(\" Created: SUMMARY.md\"));\n \n // Generate EXECUTION_PLAN.md\n const execContent = generateExecutionPlan(planPath, planName, options.stepCount);\n await writeFile(join(planPath, \"EXECUTION_PLAN.md\"), execContent, \"utf-8\");\n console.log(chalk.gray(\" Created: EXECUTION_PLAN.md\"));\n \n // Generate STATUS.md\n const statusContent = generateStatus(planName, options.stepCount);\n await writeFile(join(planPath, \"STATUS.md\"), statusContent, \"utf-8\");\n console.log(chalk.gray(\" Created: STATUS.md\"));\n \n // Generate step files\n for (let i = 1; i <= options.stepCount; i++) {\n const stepNum = String(i).padStart(2, \"0\");\n const stepContent = generateStepFile(i);\n await writeFile(\n join(planPath, \"plan\", `${stepNum}-step.md`),\n stepContent,\n \"utf-8\"\n );\n console.log(chalk.gray(` Created: plan/${stepNum}-step.md`));\n }\n}\n\nfunction generateSummary(planName: string, context: GenerationContext): string {\n const title = planName.split(\"-\").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n return `# ${title} - Summary\n\n## Executive Summary\n\n> Generated from ${context.source}. Review and edit as needed.\n\n_Summary to be elaborated..._\n\n## Approach\n\n_Approach to be defined..._\n\n## Success Criteria\n\n_Success criteria to be defined..._\n`;\n}\n\nfunction generateExecutionPlan(planPath: string, planName: string, stepCount: number): string {\n const title = planName.split(\"-\").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n const steps = Array.from({ length: stepCount }, (_, i) => {\n const num = String(i + 1).padStart(2, \"0\");\n return `| ${i + 1} | Step ${num} | \\`plan/${num}-step.md\\` | - |`;\n }).join(\"\\n\");\n \n return `# ${title} - Execution Plan\n\n> Execute: \"${planPath}/EXECUTION_PLAN.md\"\n\n## Execution Sequence\n\n| Order | Step | File | Est. Time |\n|-------|------|------|-----------|\n${steps}\n\n## How to Execute\n\n1. Read STATUS.md for current state\n2. Find next pending step\n3. Execute step file\n4. Update STATUS.md\n5. Continue until complete\n`;\n}\n\nfunction generateStatus(planName: string, stepCount: number): string {\n const title = planName.split(\"-\").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n const today = new Date().toISOString().split(\"T\")[0];\n const steps = Array.from({ length: stepCount }, (_, i) => {\n const num = String(i + 1).padStart(2, \"0\");\n return `| ${num} | Step ${num} | ⬜ Pending | - | - | - |`;\n }).join(\"\\n\");\n \n return `# ${title} - Execution Status\n\n## Current State\n\n| Field | Value |\n|-------|-------|\n| **Status** | \\`pending\\` |\n| **Current Step** | - |\n| **Last Completed** | - |\n| **Started At** | - |\n| **Last Updated** | ${today} |\n\n## Step Progress\n\n| Step | Name | Status | Started | Completed | Notes |\n|------|------|--------|---------|-----------|-------|\n${steps}\n\n## Blockers\n\n_No blockers currently._\n\n## Issues\n\n_No issues currently._\n\n## Notes\n\n_Plan generated. Ready for review and execution._\n`;\n}\n\nfunction generateStepFile(stepNum: number): string {\n const num = String(stepNum).padStart(2, \"0\");\n return `# Step ${num}: [Title]\n\n## Objective\n\n_Define the objective of this step..._\n\n## Background\n\n_Provide context..._\n\n## Tasks\n\n### ${num}.1 Task One\n\n_Describe the task..._\n\n## Acceptance Criteria\n\n- [ ] Criterion one\n- [ ] Criterion two\n\n## Testing\n\n_How to verify this step is complete..._\n\n## Files Changed\n\n- _List files that will be modified..._\n\n## Notes\n\n_Additional notes..._\n`;\n}\n\n/**\n * Generate plan with AI\n */\nasync function generatePlanWithAI(\n planPath: string,\n planName: string,\n context: GenerationContext,\n stepCount: number,\n options: GenerateOptions\n): Promise<void> {\n try {\n // Detect available providers\n const available = await detectAvailableProviders();\n \n if (available.length === 0) {\n console.log(chalk.yellow(\"\\n⚠️ No AI providers installed. Falling back to template generation.\"));\n console.log(chalk.gray(\"Install a provider with: npm install @riotprompt/execution-anthropic\"));\n await generatePlanFiles(planPath, planName, context, { stepCount });\n return;\n }\n \n // Determine which provider to use\n const providerName = options.provider || getDefaultProvider();\n \n if (!providerName) {\n console.log(chalk.yellow(\"\\n⚠️ No API key found in environment.\"));\n console.log(chalk.gray(\"Set ANTHROPIC_API_KEY, OPENAI_API_KEY, or GOOGLE_API_KEY\"));\n await generatePlanFiles(planPath, planName, context, { stepCount });\n return;\n }\n \n console.log(chalk.cyan(`🤖 Using ${providerName} for generation...`));\n \n // Load provider\n const provider = await loadProvider({\n name: providerName,\n apiKey: getProviderApiKey(providerName),\n model: options.model,\n });\n \n // Build generation context\n const genContext: AIGenerationContext = {\n planName,\n description: context.content,\n elaborations: context.elaborations,\n stepCount,\n };\n \n const generatedPlan = await generatePlan(genContext, provider, {\n model: options.model,\n apiKey: getProviderApiKey(providerName),\n });\n \n // Create plan directory\n await mkdir(join(planPath, \"plan\"), { recursive: true });\n \n // Write SUMMARY.md\n const summaryContent = formatSummary(generatedPlan, planName);\n await writeFile(join(planPath, \"SUMMARY.md\"), summaryContent, \"utf-8\");\n console.log(chalk.gray(\" Created: SUMMARY.md\"));\n \n // Write EXECUTION_PLAN.md\n const title = planName.split(\"-\").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \");\n const execContent = generateExecutionPlanFromSteps(planPath, title, generatedPlan.steps);\n await writeFile(join(planPath, \"EXECUTION_PLAN.md\"), execContent, \"utf-8\");\n console.log(chalk.gray(\" Created: EXECUTION_PLAN.md\"));\n \n // Write STATUS.md\n const statusContent = generateStatusFromSteps(title, generatedPlan.steps);\n await writeFile(join(planPath, \"STATUS.md\"), statusContent, \"utf-8\");\n console.log(chalk.gray(\" Created: STATUS.md\"));\n \n // Write step files\n for (const step of generatedPlan.steps) {\n const num = String(step.number).padStart(2, \"0\");\n const stepContent = formatStep(step);\n await writeFile(join(planPath, \"plan\", `${num}-step.md`), stepContent, \"utf-8\");\n console.log(chalk.gray(` Created: plan/${num}-step.md`));\n }\n \n } catch (error) {\n console.error(chalk.red(\"\\n❌ AI generation failed:\"), error instanceof Error ? error.message : error);\n console.log(chalk.yellow(\"Falling back to template generation...\"));\n await generatePlanFiles(planPath, planName, context, { stepCount });\n }\n}\n\nfunction generateExecutionPlanFromSteps(planPath: string, title: string, steps: any[]): string {\n const stepRows = steps.map((step) => {\n const num = String(step.number).padStart(2, \"0\");\n return `| ${step.number} | ${step.title} | \\`plan/${num}-step.md\\` | - |`;\n }).join(\"\\n\");\n \n return `# ${title} - Execution Plan\n\n> Execute: \"${planPath}/EXECUTION_PLAN.md\"\n\n## Execution Sequence\n\n| Order | Step | File | Est. Time |\n|-------|------|------|-----------|\n${stepRows}\n\n## How to Execute\n\n1. Read STATUS.md for current state\n2. Find next pending step\n3. Execute step file\n4. Update STATUS.md\n5. Continue until complete\n`;\n}\n\nfunction generateStatusFromSteps(title: string, steps: any[]): string {\n const today = new Date().toISOString().split(\"T\")[0];\n const stepRows = steps.map(step => {\n const num = String(step.number).padStart(2, \"0\");\n return `| ${num} | ${step.title} | ⬜ Pending | - | - | - |`;\n }).join(\"\\n\");\n \n return `# ${title} - Execution Status\n\n## Current State\n\n| Field | Value |\n|-------|-------|\n| **Status** | \\`pending\\` |\n| **Current Step** | - |\n| **Last Completed** | - |\n| **Started At** | - |\n| **Last Updated** | ${today} |\n\n## Step Progress\n\n| Step | Name | Status | Started | Completed | Notes |\n|------|------|--------|---------|-----------|-------|\n${stepRows}\n\n## Blockers\n\n_No blockers currently._\n\n## Issues\n\n_No issues currently._\n\n## Notes\n\n_Plan generated. Ready for review and execution._\n`;\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { resolve, join } from \"node:path\";\nimport { stat, readFile } from \"node:fs/promises\";\nimport { saveAmendmentPrompt, loadAmendmentPrompts } from \"../../plan/prompts.js\";\n\nexport interface AmendOptions {\n path?: string;\n message?: string;\n step?: string;\n}\n\n/**\n * Check if plan exists\n */\nasync function planExists(planPath: string): Promise<boolean> {\n try {\n await stat(join(planPath, \"EXECUTION_PLAN.md\"));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Display current plan state\n */\nasync function displayPlanState(planPath: string): Promise<void> {\n try {\n const statusPath = join(planPath, \"STATUS.md\");\n const content = await readFile(statusPath, \"utf-8\");\n \n // Extract status table\n const statusMatch = content.match(/\\*\\*Status\\*\\*\\s*\\|\\s*`(\\w+)`/);\n const currentMatch = content.match(/\\*\\*Current Step\\*\\*\\s*\\|\\s*([^\\n|]+)/);\n \n console.log(chalk.cyan(\"\\n📋 Current Plan State:\"));\n console.log(chalk.gray(` Status: ${statusMatch ? statusMatch[1] : \"unknown\"}`));\n console.log(chalk.gray(` Current Step: ${currentMatch ? currentMatch[1].trim() : \"-\"}`));\n \n // Show previous amendments\n const amendments = await loadAmendmentPrompts(planPath);\n if (amendments.length > 0) {\n console.log(chalk.gray(`\\n Previous amendments: ${amendments.length}`));\n for (const amend of amendments.slice(-3)) {\n const preview = amend.content.slice(0, 50).replace(/\\n/g, \" \");\n console.log(chalk.gray(` - #${amend.id}: ${preview}...`));\n }\n }\n } catch {\n console.log(chalk.yellow(\"Could not load plan state\"));\n }\n}\n\n/**\n * Prompt for amendment feedback\n */\nasync function promptForAmendment(): Promise<string> {\n const { feedback } = await inquirer.prompt([\n {\n type: \"editor\",\n name: \"feedback\",\n message: \"Provide your plan amendment (opens editor):\",\n },\n ]);\n return feedback;\n}\n\n/**\n * Ask which aspect they want to amend\n */\nasync function promptForAmendmentType(): Promise<string> {\n const { type } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"type\",\n message: \"What would you like to amend?\",\n choices: [\n { name: \"Step organization/ordering\", value: \"structure\" },\n { name: \"Specific step content\", value: \"step\" },\n { name: \"Add a new step\", value: \"add\" },\n { name: \"Remove a step\", value: \"remove\" },\n { name: \"Dependencies between steps\", value: \"dependencies\" },\n { name: \"General feedback\", value: \"general\" },\n ],\n },\n ]);\n return type;\n}\n\n/**\n * Register the amend command\n */\nexport function registerAmendCommand(program: Command): void {\n program\n .command(\"amend [path]\")\n .description(\"Provide amendment feedback on a plan\")\n .option(\"-m, --message <message>\", \"Amendment message (skip editor)\")\n .option(\"-s, --step <number>\", \"Specific step to amend\")\n .action(async (pathArg: string | undefined, options: AmendOptions) => {\n try {\n const planPath = resolve(pathArg || options.path || process.cwd());\n \n // Check if plan exists\n if (!(await planExists(planPath))) {\n console.error(chalk.red(\"No plan found at this path.\"));\n console.log(chalk.gray(\"Run 'riotplan generate' first.\"));\n process.exit(1);\n }\n \n // Display current state\n await displayPlanState(planPath);\n \n // Get amendment type and feedback\n let feedback: string;\n const metadata: Record<string, unknown> = {};\n \n if (options.message) {\n feedback = options.message;\n if (options.step) {\n metadata.step = options.step;\n metadata.type = \"step\";\n }\n } else {\n const type = await promptForAmendmentType();\n metadata.type = type;\n \n if (type === \"step\") {\n const { stepNum } = await inquirer.prompt([{\n type: \"input\",\n name: \"stepNum\",\n message: \"Which step number?\",\n }]);\n metadata.step = stepNum;\n }\n \n feedback = await promptForAmendment();\n }\n \n if (!feedback.trim()) {\n console.log(chalk.yellow(\"No feedback provided. Aborting.\"));\n return;\n }\n \n // Save amendment\n const savedPath = await saveAmendmentPrompt(planPath, feedback, metadata);\n \n console.log(chalk.green(`\\n✅ Amendment saved: ${savedPath}`));\n console.log(chalk.cyan(\"\\nNext steps:\"));\n console.log(chalk.gray(\" - Continue amending: riotplan amend\"));\n console.log(chalk.gray(\" - Regenerate plan: riotplan generate --force\"));\n console.log(chalk.gray(\" - View status: riotplan status\"));\n \n } catch (error) {\n console.error(chalk.red(\"Failed to save amendment:\"), error);\n process.exit(1);\n }\n });\n}\n\n/**\n * Register amendments list subcommand\n */\nexport function registerAmendmentsCommands(program: Command): void {\n const amendments = program\n .command(\"amendments\")\n .description(\"View plan amendments\");\n \n amendments\n .command(\"list [path]\")\n .description(\"List all amendments\")\n .action(async (pathArg: string | undefined) => {\n try {\n const planPath = resolve(pathArg || process.cwd());\n const allAmendments = await loadAmendmentPrompts(planPath);\n \n if (allAmendments.length === 0) {\n console.log(chalk.yellow(\"No amendments found.\"));\n return;\n }\n \n console.log(chalk.cyan(`\\n📝 Amendments (${allAmendments.length}):\\n`));\n for (const amend of allAmendments) {\n console.log(chalk.white(`#${amend.id}:`));\n console.log(chalk.gray(amend.content.slice(0, 200)));\n console.log();\n }\n } catch (error) {\n console.error(chalk.red(\"Failed to list amendments:\"), error);\n process.exit(1);\n }\n });\n}\n","/**\n * Weight multipliers for coverage scoring by priority\n */\nexport const PRIORITY_WEIGHTS = {\n must: 1.0,\n should: 0.7,\n could: 0.3,\n} as const;\n\n/**\n * Patterns for detecting criteria in markdown\n */\nexport const CRITERIA_PATTERNS = {\n /** Checkbox item: - [ ] or - [x] */\n checkbox: /^[-*]\\s*\\[([x ])\\]\\s*(.+)$/gm,\n \n /** Section headers for criteria */\n mustHaveHeader: /^###?\\s*Must\\s+Have/i,\n shouldHaveHeader: /^###?\\s*Should\\s+Have/i,\n couldHaveHeader: /^###?\\s*Could\\s+Have/i,\n \n /** Verification criteria section */\n verificationSection: /^##\\s*Verification\\s+Criteria/im,\n} as const;\n\n/**\n * Minimum scores for \"healthy\" status\n */\nexport const HEALTH_THRESHOLDS = {\n coverage: {\n good: 80,\n warning: 60,\n critical: 40,\n },\n completion: {\n good: 90,\n warning: 70,\n critical: 50,\n },\n} as const;\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { VerificationCriterion, CriteriaPriority } from \"./types.js\";\nimport { CRITERIA_PATTERNS } from \"./constants.js\";\n\nexport interface ParsedCriteria {\n criteria: VerificationCriterion[];\n source: string;\n parseErrors: string[];\n}\n\n/**\n * Parse verification criteria from a plan's analysis\n */\nexport async function parseCriteria(planPath: string): Promise<ParsedCriteria> {\n const reqPath = join(planPath, \"analysis\", \"REQUIREMENTS.md\");\n \n try {\n const content = await readFile(reqPath, \"utf-8\");\n return parseCriteriaFromContent(content, reqPath);\n } catch (error) {\n return {\n criteria: [],\n source: reqPath,\n parseErrors: [`Could not read ${reqPath}: ${(error as Error).message}`],\n };\n }\n}\n\n/**\n * Parse criteria from markdown content\n */\nexport function parseCriteriaFromContent(\n content: string,\n source: string\n): ParsedCriteria {\n const criteria: VerificationCriterion[] = [];\n const parseErrors: string[] = [];\n \n // Find the Verification Criteria section\n const sectionMatch = content.match(CRITERIA_PATTERNS.verificationSection);\n if (!sectionMatch) {\n return {\n criteria: [],\n source,\n parseErrors: [\"No 'Verification Criteria' section found\"],\n };\n }\n \n // Extract content after the section header until next ## header\n const sectionStart = sectionMatch.index! + sectionMatch[0].length;\n const nextSectionMatch = content.slice(sectionStart).match(/^##\\s+[^#]/m);\n const sectionEnd = nextSectionMatch \n ? sectionStart + nextSectionMatch.index! \n : content.length;\n const sectionContent = content.slice(sectionStart, sectionEnd);\n \n // Split into priority sections\n const lines = sectionContent.split(\"\\n\");\n let currentPriority: CriteriaPriority = \"should\"; // default\n let lineNumber = content.slice(0, sectionStart).split(\"\\n\").length;\n \n for (const line of lines) {\n lineNumber++;\n \n // Check for priority headers\n if (CRITERIA_PATTERNS.mustHaveHeader.test(line)) {\n currentPriority = \"must\";\n continue;\n }\n if (CRITERIA_PATTERNS.shouldHaveHeader.test(line)) {\n currentPriority = \"should\";\n continue;\n }\n if (CRITERIA_PATTERNS.couldHaveHeader.test(line)) {\n currentPriority = \"could\";\n continue;\n }\n \n // Check for checkbox items\n const checkboxMatch = line.match(/^[-*]\\s*\\[([x ])\\]\\s*(.+)$/i);\n if (checkboxMatch) {\n const text = checkboxMatch[2].trim();\n const id = generateCriterionId(text, criteria.length);\n \n criteria.push({\n id,\n text,\n priority: currentPriority,\n source,\n lineNumber,\n });\n }\n }\n \n if (criteria.length === 0) {\n parseErrors.push(\"No checkbox criteria found in Verification Criteria section\");\n }\n \n return { criteria, source, parseErrors };\n}\n\n/**\n * Generate a unique ID for a criterion\n */\nfunction generateCriterionId(text: string, index: number): string {\n // Create a short, readable ID from the text\n const slug = text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 30);\n return `${String(index + 1).padStart(3, \"0\")}-${slug}`;\n}\n\n/**\n * Get criteria summary statistics\n */\nexport function getCriteriaSummary(criteria: VerificationCriterion[]): {\n total: number;\n must: number;\n should: number;\n could: number;\n} {\n return {\n total: criteria.length,\n must: criteria.filter(c => c.priority === \"must\").length,\n should: criteria.filter(c => c.priority === \"should\").length,\n could: criteria.filter(c => c.priority === \"could\").length,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { \n VerificationCriterion, \n CriterionResult, \n CoverageReport,\n CriteriaStatus \n} from \"./types.js\";\nimport { PRIORITY_WEIGHTS } from \"./constants.js\";\nimport { parseCriteria } from \"./criteria-parser.js\";\n\nexport interface CoverageOptions {\n /** Minimum keyword match score to consider \"covered\" */\n coverageThreshold?: number;\n /** Minimum keyword match score to consider \"partial\" */\n partialThreshold?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<CoverageOptions> = {\n coverageThreshold: 0.6,\n partialThreshold: 0.3,\n};\n\n/**\n * Check coverage of analysis criteria in plan steps\n */\nexport async function checkCoverage(\n planPath: string,\n options: CoverageOptions = {}\n): Promise<CoverageReport> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n \n // Parse criteria from analysis\n const { criteria, parseErrors } = await parseCriteria(planPath);\n \n if (criteria.length === 0) {\n return createEmptyReport(parseErrors);\n }\n \n // Load all step files\n const steps = await loadStepFiles(planPath);\n \n // Check each criterion against steps\n const results: CriterionResult[] = [];\n \n for (const criterion of criteria) {\n const result = checkCriterionCoverage(criterion, steps, opts);\n results.push(result);\n }\n \n // Build report\n return buildCoverageReport(results);\n}\n\n/**\n * Load all step file contents\n */\nasync function loadStepFiles(planPath: string): Promise<Map<number, string>> {\n const steps = new Map<number, string>();\n const planDir = join(planPath, \"plan\");\n \n try {\n const files = await readdir(planDir);\n const stepFiles = files.filter(f => /^\\d{2}-/.test(f) && f.endsWith(\".md\"));\n \n for (const file of stepFiles) {\n const stepNum = parseInt(file.slice(0, 2));\n const content = await readFile(join(planDir, file), \"utf-8\");\n steps.set(stepNum, content);\n }\n } catch {\n // Plan directory doesn't exist or is empty\n }\n \n return steps;\n}\n\n/**\n * Check if a single criterion is covered by any step\n */\nfunction checkCriterionCoverage(\n criterion: VerificationCriterion,\n steps: Map<number, string>,\n options: Required<CoverageOptions>\n): CriterionResult {\n // Extract keywords from criterion\n const keywords = extractKeywords(criterion.text);\n \n // Check each step for coverage\n const matchedSteps: number[] = [];\n let bestScore = 0;\n \n for (const [stepNum, content] of steps) {\n const score = calculateMatchScore(keywords, content);\n if (score > bestScore) {\n bestScore = score;\n }\n if (score >= options.partialThreshold) {\n matchedSteps.push(stepNum);\n }\n }\n \n // Determine status\n let status: CriteriaStatus;\n if (bestScore >= options.coverageThreshold) {\n status = \"covered\";\n } else if (bestScore >= options.partialThreshold) {\n status = \"partial\";\n } else {\n status = \"missing\";\n }\n \n return {\n criterion,\n status,\n matchedSteps,\n notes: matchedSteps.length > 0 \n ? `Best match in step(s): ${matchedSteps.join(\", \")}` \n : undefined,\n };\n}\n\n/**\n * Extract significant keywords from text\n */\nfunction extractKeywords(text: string): string[] {\n // Remove common words and extract meaningful terms\n const stopWords = new Set([\n \"a\", \"an\", \"the\", \"is\", \"are\", \"was\", \"were\", \"be\", \"been\",\n \"being\", \"have\", \"has\", \"had\", \"do\", \"does\", \"did\", \"will\",\n \"would\", \"could\", \"should\", \"may\", \"might\", \"must\", \"shall\",\n \"can\", \"need\", \"to\", \"of\", \"in\", \"for\", \"on\", \"with\", \"at\",\n \"by\", \"from\", \"as\", \"or\", \"and\", \"but\", \"if\", \"then\", \"so\",\n \"that\", \"this\", \"it\", \"its\", \"all\", \"any\", \"each\", \"every\",\n ]);\n \n return text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, \" \")\n .split(/\\s+/)\n .filter(word => word.length > 2 && !stopWords.has(word));\n}\n\n/**\n * Calculate match score between keywords and content\n */\nfunction calculateMatchScore(keywords: string[], content: string): number {\n if (keywords.length === 0) return 0;\n \n const contentLower = content.toLowerCase();\n let matches = 0;\n \n for (const keyword of keywords) {\n if (contentLower.includes(keyword)) {\n matches++;\n }\n }\n \n return matches / keywords.length;\n}\n\n/**\n * Build the full coverage report\n */\nfunction buildCoverageReport(results: CriterionResult[]): CoverageReport {\n const covered = results.filter(r => r.status === \"covered\");\n const partial = results.filter(r => r.status === \"partial\");\n const missing = results.filter(r => r.status === \"missing\");\n \n // Calculate by priority\n const byPriority = {\n must: calculatePriorityStats(results, \"must\"),\n should: calculatePriorityStats(results, \"should\"),\n could: calculatePriorityStats(results, \"could\"),\n };\n \n // Calculate weighted coverage score\n const coverageScore = calculateWeightedScore(byPriority);\n \n // Generate questions for gaps\n const questions = generateVerificationQuestions(partial, missing);\n \n return {\n totalCriteria: results.length,\n covered,\n partial,\n missing,\n byPriority,\n coverageScore,\n questions,\n };\n}\n\nfunction calculatePriorityStats(\n results: CriterionResult[],\n priority: string\n): { total: number; covered: number; partial: number; missing: number } {\n const forPriority = results.filter(r => r.criterion.priority === priority);\n return {\n total: forPriority.length,\n covered: forPriority.filter(r => r.status === \"covered\").length,\n partial: forPriority.filter(r => r.status === \"partial\").length,\n missing: forPriority.filter(r => r.status === \"missing\").length,\n };\n}\n\nfunction calculateWeightedScore(byPriority: CoverageReport[\"byPriority\"]): number {\n let totalWeight = 0;\n let weightedCovered = 0;\n \n for (const [priority, stats] of Object.entries(byPriority)) {\n const weight = PRIORITY_WEIGHTS[priority as keyof typeof PRIORITY_WEIGHTS];\n totalWeight += stats.total * weight;\n weightedCovered += (stats.covered + stats.partial * 0.5) * weight;\n }\n \n if (totalWeight === 0) return 100;\n return Math.round((weightedCovered / totalWeight) * 100);\n}\n\nfunction generateVerificationQuestions(\n partial: CriterionResult[],\n missing: CriterionResult[]\n): string[] {\n const questions: string[] = [];\n \n for (const result of missing.slice(0, 3)) {\n questions.push(`Where is \"${result.criterion.text}\" addressed in the plan?`);\n }\n \n for (const result of partial.slice(0, 2)) {\n questions.push(\n `Is \"${result.criterion.text}\" fully covered in step(s) ${result.matchedSteps.join(\", \")}?`\n );\n }\n \n return questions;\n}\n\nfunction createEmptyReport(errors: string[]): CoverageReport {\n return {\n totalCriteria: 0,\n covered: [],\n partial: [],\n missing: [],\n byPriority: {\n must: { total: 0, covered: 0, partial: 0, missing: 0 },\n should: { total: 0, covered: 0, partial: 0, missing: 0 },\n could: { total: 0, covered: 0, partial: 0, missing: 0 },\n },\n coverageScore: 100,\n questions: errors,\n };\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n StepCompletionResult,\n StepCompletionStatus,\n AcceptanceCriterion,\n CompletionReport,\n} from \"./types.js\";\n\n/**\n * Check completion of plan execution\n */\nexport async function checkCompletion(planPath: string): Promise<CompletionReport> {\n // Load STATUS.md\n const statusMap = await loadStatusMap(planPath);\n \n // Load step files and extract acceptance criteria\n const stepResults = await loadStepResults(planPath, statusMap);\n \n // Build report\n return buildCompletionReport(stepResults);\n}\n\n/**\n * Load step status from STATUS.md\n */\nasync function loadStatusMap(planPath: string): Promise<Map<number, string>> {\n const statusMap = new Map<number, string>();\n \n try {\n const statusPath = join(planPath, \"STATUS.md\");\n const content = await readFile(statusPath, \"utf-8\");\n \n // Parse the step progress table\n // Format: | 01 | Step Name | ✅ Completed | ... |\n const tableMatch = content.match(/\\|\\s*Step\\s*\\|\\s*Name\\s*\\|\\s*Status[\\s\\S]*?(?=\\n##|\\n\\n##|$)/i);\n if (tableMatch) {\n const lines = tableMatch[0].split(\"\\n\");\n for (const line of lines) {\n const match = line.match(/\\|\\s*(\\d+)\\s*\\|[^|]+\\|\\s*([^|]+)\\|/);\n if (match) {\n const stepNum = parseInt(match[1]);\n const status = match[2].trim();\n statusMap.set(stepNum, status);\n }\n }\n }\n } catch {\n // STATUS.md doesn't exist\n }\n \n return statusMap;\n}\n\n/**\n * Load step files and extract acceptance criteria\n */\nasync function loadStepResults(\n planPath: string,\n statusMap: Map<number, string>\n): Promise<StepCompletionResult[]> {\n const results: StepCompletionResult[] = [];\n const planDir = join(planPath, \"plan\");\n \n try {\n const files = await readdir(planDir);\n const stepFiles = files.filter(f => /^\\d{2}-/.test(f) && f.endsWith(\".md\")).sort();\n \n for (const file of stepFiles) {\n const stepNum = parseInt(file.slice(0, 2));\n const content = await readFile(join(planDir, file), \"utf-8\");\n \n const result = analyzeStep(stepNum, content, statusMap.get(stepNum) || \"⬜ Pending\");\n results.push(result);\n }\n } catch {\n // Plan directory doesn't exist\n }\n \n return results;\n}\n\n/**\n * Analyze a single step for completion\n */\nfunction analyzeStep(\n stepNum: number,\n content: string,\n markedStatus: string\n): StepCompletionResult {\n // Extract title\n const titleMatch = content.match(/^#\\s+(.+)$/m);\n const stepTitle = titleMatch ? titleMatch[1] : `Step ${stepNum}`;\n \n // Extract acceptance criteria\n const criteria = extractAcceptanceCriteria(content, stepNum);\n \n // Determine actual completion status\n const status = determineCompletionStatus(criteria, markedStatus);\n \n return {\n stepNumber: stepNum,\n stepTitle,\n status,\n acceptanceCriteria: criteria,\n markedStatus,\n };\n}\n\n/**\n * Extract acceptance criteria from step content\n */\nfunction extractAcceptanceCriteria(content: string, stepNum: number): AcceptanceCriterion[] {\n const criteria: AcceptanceCriterion[] = [];\n \n // Find Acceptance Criteria section\n const sectionMatch = content.match(/##\\s*Acceptance\\s+Criteria([\\s\\S]*?)(?=\\n##|$)/i);\n if (!sectionMatch) {\n return criteria;\n }\n \n const sectionContent = sectionMatch[1];\n \n // Extract checkbox items\n const checkboxRegex = /^[-*]\\s*\\[([x ])\\]\\s*(.+)$/gim;\n let match;\n \n while ((match = checkboxRegex.exec(sectionContent)) !== null) {\n criteria.push({\n text: match[2].trim(),\n checked: match[1].toLowerCase() === \"x\",\n stepNumber: stepNum,\n });\n }\n \n return criteria;\n}\n\n/**\n * Determine actual completion status based on criteria and marked status\n */\nfunction determineCompletionStatus(\n criteria: AcceptanceCriterion[],\n markedStatus: string\n): StepCompletionStatus {\n const isMarkedComplete = markedStatus.includes(\"✅\") || markedStatus.toLowerCase().includes(\"complete\");\n const isMarkedPending = markedStatus.includes(\"⬜\") || markedStatus.toLowerCase().includes(\"pending\");\n const isMarkedInProgress = markedStatus.includes(\"🔄\") || markedStatus.toLowerCase().includes(\"progress\");\n const isMarkedSkipped = markedStatus.includes(\"⏭️\") || markedStatus.toLowerCase().includes(\"skip\");\n \n if (isMarkedSkipped) {\n return \"skipped\";\n }\n \n if (criteria.length === 0) {\n // No criteria to check, trust marked status\n if (isMarkedComplete) return \"complete\";\n if (isMarkedPending) return \"pending\";\n return \"partial\";\n }\n \n const checkedCount = criteria.filter(c => c.checked).length;\n const allChecked = checkedCount === criteria.length;\n const noneChecked = checkedCount === 0;\n \n if (isMarkedComplete) {\n if (allChecked) return \"complete\";\n if (noneChecked) return \"incomplete\"; // Marked done but nothing checked\n return \"partial\";\n }\n \n if (isMarkedInProgress) {\n return \"partial\";\n }\n \n return \"pending\";\n}\n\n/**\n * Build the completion report\n */\nfunction buildCompletionReport(results: StepCompletionResult[]): CompletionReport {\n const complete = results.filter(r => r.status === \"complete\");\n const partial = results.filter(r => r.status === \"partial\");\n const incomplete = results.filter(r => r.status === \"incomplete\");\n const pending = results.filter(r => r.status === \"pending\" || r.status === \"skipped\");\n \n // Calculate completion score\n const totalSteps = results.length;\n const completedSteps = complete.length + partial.length * 0.5;\n const completionScore = totalSteps > 0 \n ? Math.round((completedSteps / totalSteps) * 100) \n : 100;\n \n // Collect outstanding items\n const outstandingItems: string[] = [];\n \n for (const result of [...incomplete, ...partial]) {\n const unchecked = result.acceptanceCriteria.filter(c => !c.checked);\n for (const criterion of unchecked) {\n outstandingItems.push(`Step ${result.stepNumber}: ${criterion.text}`);\n }\n }\n \n return {\n totalSteps,\n complete,\n partial,\n incomplete,\n pending,\n completionScore,\n outstandingItems,\n };\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { resolve } from \"node:path\";\nimport { checkCoverage, checkCompletion, parseCriteria, getCriteriaSummary } from \"../../verification/index.js\";\nimport type { CoverageReport, CompletionReport, StepCompletionResult, VerificationReport } from \"../../verification/types.js\";\n\nexport interface VerifyOptions {\n analysis?: boolean;\n execution?: boolean;\n criteria?: boolean;\n json?: boolean;\n}\n\n/**\n * Format coverage report for terminal output\n */\nfunction formatCoverageReport(report: CoverageReport): void {\n console.log(chalk.bold.cyan(\"\\nVerification: Analysis → Plan Alignment\"));\n console.log(chalk.cyan(\"═\".repeat(50)));\n \n if (report.totalCriteria === 0) {\n console.log(chalk.yellow(\"\\nNo verification criteria found.\"));\n if (report.questions.length > 0) {\n console.log(chalk.gray(\"\\nNotes:\"));\n for (const note of report.questions) {\n console.log(chalk.gray(` - ${note}`));\n }\n }\n return;\n }\n \n console.log(chalk.gray(\"\\nChecking requirements coverage...\\n\"));\n \n // Covered\n if (report.covered.length > 0) {\n console.log(chalk.green(`✅ COVERED (${report.covered.length}):`));\n for (const result of report.covered) {\n const steps = result.matchedSteps.length > 0 \n ? ` → Steps ${result.matchedSteps.join(\", \")}` \n : \"\";\n console.log(chalk.green(` • ${result.criterion.text}${steps}`));\n }\n console.log();\n }\n \n // Partial\n if (report.partial.length > 0) {\n console.log(chalk.yellow(`⚠️ PARTIAL (${report.partial.length}):`));\n for (const result of report.partial) {\n const steps = result.matchedSteps.length > 0 \n ? ` → Steps ${result.matchedSteps.join(\", \")}` \n : \"\";\n console.log(chalk.yellow(` • ${result.criterion.text}${steps}`));\n if (result.notes) {\n console.log(chalk.gray(` ${result.notes}`));\n }\n }\n console.log();\n }\n \n // Missing\n if (report.missing.length > 0) {\n console.log(chalk.red(`❌ MISSING (${report.missing.length}):`));\n for (const result of report.missing) {\n const priority = result.criterion.priority === \"must\" \n ? chalk.red(\"[MUST]\") \n : result.criterion.priority === \"should\" \n ? chalk.yellow(\"[SHOULD]\") \n : chalk.gray(\"[COULD]\");\n console.log(chalk.red(` • ${priority} ${result.criterion.text}`));\n }\n console.log();\n }\n \n // Priority breakdown\n console.log(chalk.cyan(\"Coverage by Priority:\"));\n console.log(chalk.gray(` Must: ${formatPriorityCoverage(report.byPriority.must)}`));\n console.log(chalk.gray(` Should: ${formatPriorityCoverage(report.byPriority.should)}`));\n console.log(chalk.gray(` Could: ${formatPriorityCoverage(report.byPriority.could)}`));\n console.log();\n \n // Verification questions\n if (report.questions.length > 0) {\n console.log(chalk.cyan(\"Verification Questions:\"));\n for (let i = 0; i < report.questions.length; i++) {\n console.log(chalk.gray(` ${i + 1}. ${report.questions[i]}`));\n }\n console.log();\n }\n \n // Score\n const scoreColor = report.coverageScore >= 80 \n ? chalk.green \n : report.coverageScore >= 60 \n ? chalk.yellow \n : chalk.red;\n console.log(chalk.bold(`Alignment Score: ${scoreColor(report.coverageScore + \"%\")}`));\n}\n\nfunction formatPriorityCoverage(stats: { total: number; covered: number; partial: number; missing: number }): string {\n if (stats.total === 0) return \"N/A\";\n const covered = stats.covered + stats.partial;\n const pct = Math.round((covered / stats.total) * 100);\n return `${covered}/${stats.total} (${pct}%)`;\n}\n\n/**\n * Format completion report for terminal output\n */\nfunction formatCompletionReport(report: CompletionReport): void {\n console.log(chalk.bold.cyan(\"\\nVerification: Plan → Execution Alignment\"));\n console.log(chalk.cyan(\"═\".repeat(50)));\n \n if (report.totalSteps === 0) {\n console.log(chalk.yellow(\"\\nNo steps found in plan.\"));\n return;\n }\n \n console.log(chalk.gray(\"\\nChecking step completion...\\n\"));\n \n // Show each step\n const allSteps = [\n ...report.complete,\n ...report.partial,\n ...report.incomplete,\n ...report.pending,\n ].sort((a, b) => a.stepNumber - b.stepNumber);\n \n for (const step of allSteps) {\n formatStepResult(step);\n }\n \n // Summary\n console.log(chalk.cyan(\"\\nSummary:\"));\n console.log(chalk.green(` ✅ Complete: ${report.complete.length}`));\n console.log(chalk.yellow(` ⚠️ Partial: ${report.partial.length}`));\n console.log(chalk.red(` ❌ Incomplete: ${report.incomplete.length}`));\n console.log(chalk.gray(` ⬜ Pending: ${report.pending.length}`));\n console.log();\n \n // Outstanding items\n if (report.outstandingItems.length > 0) {\n console.log(chalk.cyan(\"Outstanding Items:\"));\n for (const item of report.outstandingItems.slice(0, 10)) {\n console.log(chalk.gray(` • ${item}`));\n }\n if (report.outstandingItems.length > 10) {\n console.log(chalk.gray(` ... and ${report.outstandingItems.length - 10} more`));\n }\n console.log();\n }\n \n // Score\n const scoreColor = report.completionScore >= 90 \n ? chalk.green \n : report.completionScore >= 70 \n ? chalk.yellow \n : chalk.red;\n console.log(chalk.bold(`Execution Completeness: ${scoreColor(report.completionScore + \"%\")}`));\n}\n\n/**\n * Format a single step result\n */\nfunction formatStepResult(step: StepCompletionResult): void {\n const statusIcon = {\n complete: chalk.green(\"✅\"),\n partial: chalk.yellow(\"⚠️\"),\n incomplete: chalk.red(\"❌\"),\n pending: chalk.gray(\"⬜\"),\n skipped: chalk.gray(\"⏭️\"),\n }[step.status];\n \n const stepNum = String(step.stepNumber).padStart(2, \"0\");\n console.log(`${statusIcon} Step ${stepNum} - ${step.stepTitle}`);\n \n // Show criteria details for non-complete steps\n if (step.status !== \"complete\" && step.status !== \"pending\" && step.status !== \"skipped\") {\n for (const criterion of step.acceptanceCriteria) {\n const icon = criterion.checked ? chalk.green(\"✅\") : chalk.red(\"❌\");\n console.log(chalk.gray(` ${icon} ${criterion.text}`));\n }\n }\n \n // Special message for incomplete (marked done but not done)\n if (step.status === \"incomplete\") {\n console.log(chalk.red(` ⚠️ Marked as ${step.markedStatus} but criteria not met`));\n }\n}\n\n/**\n * Run full verification and generate combined report\n */\nasync function runFullVerification(planPath: string): Promise<VerificationReport> {\n const coverage = await checkCoverage(planPath);\n const completion = await checkCompletion(planPath);\n \n // Calculate overall health\n const healthScore = calculateHealthScore(coverage, completion);\n \n // Generate summary and recommendations\n const summary = generateSummary(coverage, completion);\n const recommendations = generateRecommendations(coverage, completion);\n \n return {\n planPath,\n timestamp: new Date(),\n coverage: coverage.totalCriteria > 0 ? coverage : undefined,\n completion: completion.totalSteps > 0 ? completion : undefined,\n healthScore,\n summary,\n recommendations,\n };\n}\n\nfunction calculateHealthScore(\n coverage: CoverageReport,\n completion: CompletionReport\n): number {\n const scores: number[] = [];\n \n if (coverage.totalCriteria > 0) {\n scores.push(coverage.coverageScore);\n }\n \n if (completion.totalSteps > 0) {\n scores.push(completion.completionScore);\n }\n \n if (scores.length === 0) return 100;\n return Math.round(scores.reduce((a, b) => a + b, 0) / scores.length);\n}\n\nfunction generateSummary(\n coverage: CoverageReport,\n completion: CompletionReport\n): string[] {\n const summary: string[] = [];\n \n if (coverage.totalCriteria > 0) {\n summary.push(`Analysis coverage: ${coverage.coverageScore}% (${coverage.covered.length}/${coverage.totalCriteria} criteria)`);\n }\n \n if (completion.totalSteps > 0) {\n summary.push(`Execution progress: ${completion.completionScore}% (${completion.complete.length}/${completion.totalSteps} steps)`);\n }\n \n return summary;\n}\n\nfunction generateRecommendations(\n coverage: CoverageReport,\n completion: CompletionReport\n): string[] {\n const recommendations: string[] = [];\n \n // Coverage recommendations\n if (coverage.missing.length > 0) {\n const mustMissing = coverage.missing.filter(r => r.criterion.priority === \"must\");\n if (mustMissing.length > 0) {\n recommendations.push(`Add plan steps for ${mustMissing.length} missing MUST HAVE criteria`);\n }\n }\n \n // Completion recommendations\n if (completion.incomplete.length > 0) {\n recommendations.push(`Review ${completion.incomplete.length} step(s) marked complete but with unchecked criteria`);\n }\n \n if (completion.outstandingItems.length > 0) {\n recommendations.push(`Address ${completion.outstandingItems.length} outstanding acceptance criteria`);\n }\n \n return recommendations;\n}\n\n/**\n * Format the full verification report\n */\nfunction formatFullReport(report: VerificationReport): void {\n console.log(chalk.bold.cyan(\"\\n╔════════════════════════════════════════════════╗\"));\n console.log(chalk.bold.cyan(\"║ PLAN VERIFICATION REPORT ║\"));\n console.log(chalk.bold.cyan(\"╚════════════════════════════════════════════════╝\"));\n console.log(chalk.gray(`\\nPath: ${report.planPath}`));\n console.log(chalk.gray(`Time: ${report.timestamp.toISOString()}`));\n \n // Coverage section\n if (report.coverage) {\n formatCoverageReport(report.coverage);\n } else {\n console.log(chalk.gray(\"\\n(No analysis found - skipping coverage check)\"));\n }\n \n // Completion section\n if (report.completion) {\n formatCompletionReport(report.completion);\n } else {\n console.log(chalk.gray(\"\\n(No plan steps found - skipping completion check)\"));\n }\n \n // Summary\n console.log(chalk.bold.cyan(\"\\n═══════════════════════════════════════════════\"));\n console.log(chalk.bold(\"Summary:\"));\n for (const line of report.summary) {\n console.log(chalk.gray(` • ${line}`));\n }\n \n // Recommendations\n if (report.recommendations.length > 0) {\n console.log(chalk.bold(\"\\nRecommendations:\"));\n for (const rec of report.recommendations) {\n console.log(chalk.yellow(` → ${rec}`));\n }\n }\n \n // Health score\n const healthColor = report.healthScore >= 80 \n ? chalk.green \n : report.healthScore >= 60 \n ? chalk.yellow \n : chalk.red;\n console.log(chalk.bold(`\\nOverall Health: ${healthColor(report.healthScore + \"%\")}`));\n}\n\n/**\n * Display criteria list\n */\nasync function displayCriteria(planPath: string): Promise<void> {\n const { criteria, parseErrors } = await parseCriteria(planPath);\n const summary = getCriteriaSummary(criteria);\n \n console.log(chalk.bold.cyan(\"\\nVerification Criteria\"));\n console.log(chalk.cyan(\"═\".repeat(50)));\n \n if (criteria.length === 0) {\n console.log(chalk.yellow(\"\\nNo criteria found.\"));\n for (const error of parseErrors) {\n console.log(chalk.gray(` ${error}`));\n }\n return;\n }\n \n console.log(chalk.gray(`\\nTotal: ${summary.total} criteria\\n`));\n \n // Group by priority\n const grouped = {\n must: criteria.filter(c => c.priority === \"must\"),\n should: criteria.filter(c => c.priority === \"should\"),\n could: criteria.filter(c => c.priority === \"could\"),\n };\n \n if (grouped.must.length > 0) {\n console.log(chalk.red.bold(`Must Have (${grouped.must.length}):`));\n for (const c of grouped.must) {\n console.log(chalk.gray(` - ${c.text}`));\n }\n console.log();\n }\n \n if (grouped.should.length > 0) {\n console.log(chalk.yellow.bold(`Should Have (${grouped.should.length}):`));\n for (const c of grouped.should) {\n console.log(chalk.gray(` - ${c.text}`));\n }\n console.log();\n }\n \n if (grouped.could.length > 0) {\n console.log(chalk.gray.bold(`Could Have (${grouped.could.length}):`));\n for (const c of grouped.could) {\n console.log(chalk.gray(` - ${c.text}`));\n }\n }\n}\n\n/**\n * Register the verify command\n */\nexport function registerVerifyCommand(program: Command): void {\n program\n .command(\"verify [path]\")\n .description(\"Verify plan alignment and completion\")\n .option(\"-a, --analysis\", \"Verify plan covers analysis requirements\")\n .option(\"-e, --execution\", \"Verify execution is complete\")\n .option(\"-c, --criteria\", \"Show all verification criteria\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (pathArg: string | undefined, options: VerifyOptions) => {\n try {\n const planPath = resolve(pathArg || process.cwd());\n \n // Handle --criteria flag\n if (options.criteria) {\n await displayCriteria(planPath);\n return;\n }\n \n // Determine what to run\n const runAnalysis = options.analysis;\n const runExecution = options.execution;\n const runAll = !runAnalysis && !runExecution;\n \n if (runAll) {\n // Run full verification\n const report = await runFullVerification(planPath);\n \n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n } else {\n formatFullReport(report);\n }\n } else {\n // Run specific checks\n if (runAnalysis) {\n const report = await checkCoverage(planPath);\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n } else {\n formatCoverageReport(report);\n }\n }\n \n if (runExecution) {\n const report = await checkCompletion(planPath);\n if (options.json) {\n console.log(JSON.stringify(report, null, 2));\n } else {\n formatCompletionReport(report);\n }\n }\n }\n \n } catch (error) {\n console.error(chalk.red(\"Verification failed:\"), error);\n process.exit(1);\n }\n });\n}\n","#!/usr/bin/env node\n\n/**\n * RiotPlan CLI\n *\n * Command-line interface for managing and executing plans.\n * This is a thin shell that imports commands from separate packages.\n *\n * Commands:\n * - riotplan plan init <name> Create a new plan\n * - riotplan plan validate [path] Validate plan structure\n * - riotplan plan archive [path] Archive a completed plan\n * - riotplan status [path] Show current status\n * - riotplan step list [path] List steps\n * - riotplan step add <title> Add a step\n * - riotplan step start <n> Start a step\n * - riotplan step complete <n> Complete a step\n * - riotplan feedback create Create feedback record\n * - riotplan feedback list List feedback records\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { readFileSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\n// Import command registration functions from command packages\nimport { registerPlanCommands } from \"../commands/plan/index.js\";\nimport { registerRenderCommands } from \"../commands/render/index.js\";\nimport { registerStatusCommands } from \"./commands/status.js\";\nimport { registerStepCommands } from \"./commands/step.js\";\nimport { registerFeedbackCommands } from \"./commands/feedback.js\";\nimport { registerCreateCommand } from \"./commands/create.js\";\nimport { registerElaborateCommand } from \"./commands/elaborate.js\";\nimport { registerAnalysisCommands } from \"./commands/analysis.js\";\nimport { registerGenerateCommand } from \"./commands/generate.js\";\nimport { registerAmendCommand, registerAmendmentsCommands } from \"./commands/amend.js\";\nimport { registerVerifyCommand } from \"./commands/verify.js\";\n\n// Read version from package.json\n// In development: src/cli/cli.ts -> ../../package.json\n// In production: dist/cli-*.js -> ../package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nlet packageJsonPath = join(__dirname, \"../package.json\");\nlet VERSION: string;\ntry {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n VERSION = packageJson.version;\n} catch {\n // Fallback if path is wrong\n packageJsonPath = join(__dirname, \"../../package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n VERSION = packageJson.version;\n}\n\n/**\n * Create the CLI program with all commands\n */\nexport function createProgram(): Command {\n const program = new Command();\n\n program\n .name(\"riotplan\")\n .description(\"Manage long-lived, stateful AI workflows\")\n .version(VERSION)\n .configureHelp({\n sortSubcommands: true,\n subcommandTerm: (cmd) => cmd.name(),\n });\n\n // Register command groups from packages\n registerPlanCommands(program);\n registerRenderCommands(program);\n registerStatusCommands(program);\n registerStepCommands(program);\n registerFeedbackCommands(program);\n registerCreateCommand(program);\n registerElaborateCommand(program);\n registerAnalysisCommands(program);\n registerGenerateCommand(program);\n registerAmendCommand(program);\n registerAmendmentsCommands(program);\n registerVerifyCommand(program);\n\n // Global options\n program\n .option(\"-v, --verbose\", \"Verbose output\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--no-color\", \"Disable colored output\");\n\n // Handle unknown commands\n program.on(\"command:*\", () => {\n \n console.error(chalk.red(`Unknown command: ${program.args.join(\" \")}`));\n \n console.log(`Run ${chalk.cyan(\"riotplan --help\")} for usage.`);\n process.exit(1);\n });\n\n return program;\n}\n"],"names":["detectCircularDependencies","current","parseFeedbackFile","createFeedback","slugify","loadPlan","formatDate","getStatusEmoji","generateStatus","newFilename","newPath","content","updatedContent","DEFAULT_OPTIONS","BasicTemplate","FeatureTemplate","RefactoringTemplate","MigrationTemplate","SprintTemplate","getStatusIcon","planExists","generatePlanWithAI","generateExecutionPlan","generateSummary","__filename","__dirname"],"mappings":"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"}
|