forgecraft 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/init.ts","../../src/cli/commands/plan.ts","../../src/cli/commands/design.ts","../../src/cli/commands/build.ts","../../src/cli/commands/review.ts","../../src/cli/commands/sprint.ts","../../src/cli/commands/status.ts","../../src/cli/commands/fix.ts","../../src/cli/commands/undo.ts","../../src/cli/commands/auto.ts","../../src/cli/commands/resume.ts","../../src/cli/commands/map.ts","../../src/cli/commands/diff.ts","../../src/cli/commands/doctor.ts","../../src/cli/commands/clean.ts","../../src/cli/commands/export.ts","../../src/cli/commands/history.ts","../../src/cli/commands/start.ts","../../src/cli/commands/push.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { initCommand } from \"./commands/init.js\";\nimport { planCommand } from \"./commands/plan.js\";\nimport { designCommand } from \"./commands/design.js\";\nimport { buildCommand } from \"./commands/build.js\";\nimport { reviewCommand } from \"./commands/review.js\";\nimport { sprintCommand } from \"./commands/sprint.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { fixCommand } from \"./commands/fix.js\";\nimport { undoCommand } from \"./commands/undo.js\";\nimport { autoCommand } from \"./commands/auto.js\";\nimport { resumeCommand } from \"./commands/resume.js\";\nimport { mapCommand } from \"./commands/map.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { cleanCommand } from \"./commands/clean.js\";\nimport { exportCommand } from \"./commands/export.js\";\nimport { historyCommand, checkoutCommand } from \"./commands/history.js\";\nimport { startCommand } from \"./commands/start.js\";\nimport { pushCommand } from \"./commands/push.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"forge\")\n .description(\n chalk.bold(\"Forge\") +\n \" — AI Development Orchestration Framework\\n\" +\n \" Structured multi-agent pipeline: plan → design → build → review\"\n )\n .version(\"1.0.0\");\n\n// ── Pipeline Commands ────────────────────────────────────\n\nprogram\n .command(\"auto [description]\")\n .description(\"Fully autonomous mode — plan, build, and review in one command\")\n .option(\"--no-sandbox\", \"Disable sandbox (not recommended)\")\n .option(\"-q, --quiet\", \"Hide live agent output, show spinners only\")\n .option(\"--allow-network <domains>\", \"Comma-separated allowed network domains\")\n .option(\"--mute\", \"Suppress notification sounds\")\n .option(\"--deploy\", \"Configure GitHub Pages deployment after build\")\n .option(\"--skip-design\", \"Skip design phase (faster, no Storybook previews)\")\n .action(autoCommand);\n\nprogram\n .command(\"resume\")\n .description(\"Resume an interrupted sprint from where it left off\")\n .option(\"--no-sandbox\", \"Disable sandbox\")\n .option(\"-q, --quiet\", \"Spinners only\")\n .option(\"--mute\", \"Suppress sounds\")\n .option(\"--skip-design\", \"Skip design phase\")\n .action(resumeCommand);\n\nprogram\n .command(\"sprint [description]\")\n .description(\"Run full pipeline with human gates between phases\")\n .action(sprintCommand);\n\n// ── Step-by-Step Commands ────────────────────────────────\n\nprogram\n .command(\"init\")\n .description(\"Initialize Forge in the current project\")\n .option(\"-f, --framework <framework>\", \"Framework (nextjs, react, django)\")\n .option(\"--no-storybook\", \"Skip Storybook setup\")\n .action(initCommand);\n\nprogram\n .command(\"plan [description]\")\n .description(\"Generate a sprint plan from a project description\")\n .option(\"--regen\", \"Regenerate plan from scratch\")\n .action(planCommand);\n\nprogram\n .command(\"design\")\n .description(\"Generate and review design previews in Storybook\")\n .option(\"-s, --story <storyId>\", \"Design a specific story only\")\n .option(\"--import <path>\", \"Import design references (screenshots, mockups)\")\n .action(designCommand);\n\nprogram\n .command(\"build\")\n .description(\"Build stories sequentially with the Worker agent\")\n .option(\"-s, --story <storyId>\", \"Build a specific story only\")\n .action(buildCommand);\n\nprogram\n .command(\"review\")\n .description(\"Run QA review on completed stories\")\n .option(\"-s, --story <storyId>\", \"Review a specific story only\")\n .action(reviewCommand);\n\nprogram\n .command(\"start\")\n .description(\"Start the dev server for the current project\")\n .action(startCommand);\n\nprogram\n .command(\"push\")\n .description(\"Push project to GitHub (commits + tags)\")\n .action(pushCommand);\n\n// ── Utilities ────────────────────────────────────────────\n\nprogram\n .command(\"status\")\n .description(\"Show current sprint state and progress\")\n .action(statusCommand);\n\nprogram\n .command(\"map\")\n .description(\"Visual sprint map with story status and dependencies\")\n .action(mapCommand);\n\nprogram\n .command(\"diff <v1> [v2]\")\n .description(\"Show changes between two versions or tags\")\n .action(diffCommand);\n\nprogram\n .command(\"fix <description>\")\n .description(\"Fix a bug or make a small change\")\n .option(\"-i, --image <path>\", \"Attach a screenshot for visual context\")\n .action(fixCommand);\n\nprogram\n .command(\"undo\")\n .description(\"Revert the last agent action\")\n .option(\"-n, --steps <number>\", \"Number of commits to show\", \"10\")\n .action(undoCommand);\n\nprogram\n .command(\"history\")\n .description(\"Show version timeline, checkpoints, and activity log\")\n .action(historyCommand);\n\nprogram\n .command(\"checkout <version>\")\n .description(\"Jump to a specific version or checkpoint\")\n .action(checkoutCommand);\n\nprogram\n .command(\"export\")\n .description(\"Export sprint plan as markdown\")\n .option(\"-o, --output <path>\", \"Output file path\", \"sprint-plan.md\")\n .action(exportCommand);\n\nprogram\n .command(\"clean\")\n .description(\"Reset sprint state (keeps config)\")\n .option(\"-f, --force\", \"Skip confirmation prompt\")\n .option(\"--snapshots\", \"Only clean snapshots\")\n .action(cleanCommand);\n\nprogram\n .command(\"doctor\")\n .description(\"Diagnose setup issues and check system requirements\")\n .action(doctorCommand);\n\n// ── Parse ─────────────────────────────────────────────────\n\nprogram.parse();\n","import fs from \"fs/promises\";\nimport path from \"path\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport inquirer from \"inquirer\";\nimport type { ForgeConfig } from \"../../types/plan.js\";\n\nconst DEFAULT_CONFIG: ForgeConfig = {\n framework: \"nextjs\",\n model: \"sonnet\",\n designPreview: \"storybook\",\n githubSync: false,\n githubRepo: null,\n autoCommit: true,\n storybook: {\n port: 6006,\n },\n};\n\nexport async function initCommand(options: {\n framework?: string;\n storybook?: boolean;\n}) {\n console.log(\n chalk.bold(\"\\n⚡ Forge\") + \" — Initializing project\\n\"\n );\n\n // ── Check if already initialized ────────────────────────\n const forgeDir = path.join(process.cwd(), \".forge\");\n const exists = await fs\n .access(forgeDir)\n .then(() => true)\n .catch(() => false);\n\n if (exists) {\n console.log(\n chalk.yellow(\" .forge/ directory already exists. Reinitialize? \")\n );\n const { confirm } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"confirm\",\n message: \"Overwrite existing Forge config?\",\n default: false,\n },\n ]);\n if (!confirm) {\n console.log(chalk.dim(\" Aborted.\"));\n return;\n }\n }\n\n // ── Gather preferences ──────────────────────────────────\n const answers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"framework\",\n message: \"What framework are you using?\",\n choices: [\n { name: \"Next.js (TypeScript + Tailwind + App Router)\", value: \"nextjs\" },\n { name: \"React + Vite (TypeScript SPA)\", value: \"react\" },\n { name: \"Django (Python + DRF)\", value: \"django\" },\n { name: \"Flutter (coming soon)\", value: \"flutter\", disabled: true },\n ],\n default: options.framework || \"nextjs\",\n },\n {\n type: \"list\",\n name: \"model\",\n message: \"Which Claude model should agents use?\",\n choices: [\n { name: \"Sonnet (fast, cost-effective)\", value: \"sonnet\" },\n { name: \"Opus (highest quality, slower)\", value: \"opus\" },\n { name: \"Haiku (fastest, basic tasks)\", value: \"haiku\" },\n ],\n default: \"sonnet\",\n },\n {\n type: \"confirm\",\n name: \"githubSync\",\n message: \"Sync sprint board to GitHub Issues/Projects?\",\n default: false,\n },\n ]);\n\n let githubRepo: string | null = null;\n if (answers.githubSync) {\n const { repo } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"repo\",\n message: \"GitHub repo (owner/repo):\",\n validate: (input: string) =>\n input.includes(\"/\") || \"Use format: owner/repo\",\n },\n ]);\n githubRepo = repo;\n }\n\n // ── Create .forge directory ─────────────────────────────\n const spinner = ora(\"Creating .forge directory...\").start();\n\n const config: ForgeConfig = {\n ...DEFAULT_CONFIG,\n framework: answers.framework,\n model: answers.model,\n githubSync: answers.githubSync,\n githubRepo,\n };\n\n try {\n // Create directories\n await fs.mkdir(forgeDir, { recursive: true });\n await fs.mkdir(path.join(forgeDir, \"snapshots\"), { recursive: true });\n await fs.mkdir(path.join(forgeDir, \"designs\"), { recursive: true });\n\n // Write config\n await fs.writeFile(\n path.join(process.cwd(), \"forge.config.json\"),\n JSON.stringify(config, null, 2)\n );\n\n // Write initial state\n await fs.writeFile(\n path.join(forgeDir, \"state.json\"),\n JSON.stringify(\n {\n currentPhase: \"init\",\n currentStory: null,\n workerMode: null,\n queue: [],\n history: [],\n },\n null,\n 2\n )\n );\n\n // Add .forge/snapshots to .gitignore (snapshots can be large)\n const gitignorePath = path.join(process.cwd(), \".gitignore\");\n const gitignoreExists = await fs\n .access(gitignorePath)\n .then(() => true)\n .catch(() => false);\n\n if (gitignoreExists) {\n const content = await fs.readFile(gitignorePath, \"utf-8\");\n if (!content.includes(\".forge/snapshots\")) {\n await fs.appendFile(gitignorePath, \"\\n# Forge snapshots\\n.forge/snapshots/\\n\");\n }\n }\n\n spinner.succeed(\"Created .forge/ directory\");\n\n // ── Summary ─────────────────────────────────────────────\n console.log(\n chalk.green(\"\\n ✅ Forge initialized!\\n\")\n );\n console.log(\" Created:\");\n console.log(chalk.dim(\" .forge/state.json — Sprint state\"));\n console.log(chalk.dim(\" .forge/snapshots/ — Action snapshots\"));\n console.log(chalk.dim(\" .forge/designs/ — Design metadata\"));\n console.log(chalk.dim(\" forge.config.json — Project config\"));\n\n if (answers.githubSync) {\n console.log(\n chalk.cyan(\n `\\n 🔗 GitHub sync enabled for ${githubRepo}`\n )\n );\n } else {\n console.log(\n chalk.dim(\n \"\\n 💡 Tip: Run \" +\n chalk.white(\"forge init --github\") +\n \" later to enable GitHub sync\"\n )\n );\n }\n\n console.log(\n chalk.bold(\n \"\\n Next step: \" +\n chalk.cyan('forge plan \"describe your app\"') +\n \"\\n\"\n )\n );\n } catch (error) {\n spinner.fail(\"Failed to initialize Forge\");\n console.error(chalk.red(` ${error}`));\n process.exit(1);\n }\n}\n","// ============================================================\n// forge plan — Generate sprint plan\n// ============================================================\n\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { stateManager } from \"../../state/index.js\";\nimport { Orchestrator } from \"../../core/orchestrator/index.js\";\nimport { Pipeline } from \"../../core/pipeline/index.js\";\n\nexport async function planCommand(\n description?: string,\n options?: { regen?: boolean }\n) {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(\n chalk.red(\"\\n Forge not initialized. Run: forge init\\n\")\n );\n return;\n }\n\n if (!description) {\n const { desc } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"desc\",\n message: \"Describe your application:\",\n validate: (input: string) =>\n input.length > 10 || \"Please provide a more detailed description\",\n },\n ]);\n description = desc;\n }\n\n const pipeline = new Pipeline(config);\n await pipeline.runPlanPhase(description!);\n}\n","// ============================================================\n// forge design — Generate and review design previews\n// ============================================================\n\nimport chalk from \"chalk\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport ora from \"ora\";\nimport { stateManager } from \"../../state/index.js\";\nimport { Pipeline } from \"../../core/pipeline/index.js\";\n\nexport async function designCommand(options?: {\n story?: string;\n import?: string;\n}) {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const plan = await stateManager.getPlan();\n if (!plan) {\n console.log(\n chalk.red('\\n No sprint plan found. Run: forge plan \"description\"\\n')\n );\n return;\n }\n\n // ── Design Import ───────────────────────────────────────\n if (options?.import) {\n await importDesigns(options.import);\n return;\n }\n\n const pipeline = new Pipeline(config);\n await pipeline.runDesignPhase(plan);\n}\n\n/** Import design files (screenshots, mockups) as references */\nasync function importDesigns(importPath: string): Promise<void> {\n const spinner = ora({ text: \"Importing designs...\", indent: 2 }).start();\n\n const absPath = path.resolve(importPath);\n\n // Check if path exists\n try {\n const stat = await fs.stat(absPath);\n\n let files: string[] = [];\n\n if (stat.isDirectory()) {\n // Import all image files from directory\n const entries = await fs.readdir(absPath);\n const imageExts = [\".png\", \".jpg\", \".jpeg\", \".svg\", \".webp\", \".gif\"];\n files = entries\n .filter((f) => imageExts.includes(path.extname(f).toLowerCase()))\n .map((f) => path.join(absPath, f));\n } else {\n // Single file\n files = [absPath];\n }\n\n if (files.length === 0) {\n spinner.warn(\"No image files found (png, jpg, svg, webp, gif)\");\n return;\n }\n\n // Copy to .forge/designs/references/\n await stateManager.saveDesignReferences(files);\n\n spinner.succeed(`Imported ${files.length} design reference${files.length > 1 ? \"s\" : \"\"}`);\n\n console.log(\"\");\n for (const file of files) {\n console.log(chalk.dim(` ${path.basename(file)}`));\n }\n console.log(\"\");\n\n console.log(\n chalk.dim(\" These references will be used in the design and build phases.\")\n );\n console.log(\n chalk.dim(\" The AI agent will read them and match the visual style.\\n\")\n );\n } catch {\n spinner.fail(`Path not found: ${absPath}`);\n }\n}\n","// ============================================================\n// forge build — Build stories sequentially\n// ============================================================\n\nimport chalk from \"chalk\";\nimport { stateManager } from \"../../state/index.js\";\nimport { Pipeline } from \"../../core/pipeline/index.js\";\n\nexport async function buildCommand(options?: { story?: string }) {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const plan = await stateManager.getPlan();\n if (!plan) {\n console.log(\n chalk.red('\\n No sprint plan found. Run: forge plan \"description\"\\n')\n );\n return;\n }\n\n // If building a specific story, filter the plan\n if (options?.story) {\n const story = plan.epics\n .flatMap((e) => e.stories)\n .find((s) => s.id === options.story);\n\n if (!story) {\n console.log(chalk.red(`\\n Story \"${options.story}\" not found.\\n`));\n return;\n }\n\n if (story.status === \"done\") {\n console.log(chalk.yellow(`\\n Story \"${story.title}\" is already done.\\n`));\n return;\n }\n }\n\n const pipeline = new Pipeline(config);\n await pipeline.runBuildPhase(plan);\n}\n","// ============================================================\n// forge review — Run QA review on completed stories\n// ============================================================\n\nimport chalk from \"chalk\";\nimport { stateManager } from \"../../state/index.js\";\nimport { Pipeline } from \"../../core/pipeline/index.js\";\n\nexport async function reviewCommand(options?: { story?: string }) {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const plan = await stateManager.getPlan();\n if (!plan) {\n console.log(\n chalk.red('\\n No sprint plan found. Run: forge plan \"description\"\\n')\n );\n return;\n }\n\n const reviewable = plan.epics\n .flatMap((e) => e.stories)\n .filter((s) => s.status === \"reviewing\");\n\n if (reviewable.length === 0) {\n console.log(\n chalk.yellow(\"\\n No stories ready for review. Run: forge build\\n\")\n );\n return;\n }\n\n const pipeline = new Pipeline(config);\n await pipeline.runReviewPhase(plan);\n}\n","// ============================================================\n// forge sprint — Full pipeline: plan → design → build → review\n// ============================================================\n\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { stateManager } from \"../../state/index.js\";\nimport { Pipeline } from \"../../core/pipeline/index.js\";\n\nexport async function sprintCommand(description?: string) {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n if (!description) {\n const { desc } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"desc\",\n message: \"What do you want to build?\",\n validate: (input: string) =>\n input.length > 10 || \"Please provide a more detailed description\",\n },\n ]);\n description = desc;\n }\n\n const pipeline = new Pipeline(config);\n await pipeline.runSprint(description!);\n}\n","// ============================================================\n// forge status — Show current sprint state and progress\n// ============================================================\n\nimport chalk from \"chalk\";\nimport { stateManager } from \"../../state/index.js\";\nimport { GitManager } from \"../../core/git/index.js\";\n\nconst STATUS_ICONS: Record<string, string> = {\n planned: \"📋\",\n designing: \"🎨\",\n \"design-approved\": \"✅\",\n building: \"🔧\",\n reviewing: \"🔍\",\n done: \"✅\",\n blocked: \"🚫\",\n};\n\nexport async function statusCommand() {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const plan = await stateManager.getPlan();\n const state = await stateManager.getState();\n const git = new GitManager();\n\n console.log(chalk.bold(\"\\n⚡ Forge Status\\n\"));\n\n // ── Project info ────────────────────────────────────────\n if (plan) {\n console.log(chalk.bold(` Project: ${plan.project}`));\n console.log(chalk.dim(` Framework: ${plan.framework}`));\n console.log(chalk.dim(` Phase: ${state.currentPhase}`));\n\n const currentBranch = await git.getCurrentBranch();\n console.log(chalk.dim(` Branch: ${currentBranch}`));\n console.log(\"\");\n\n // ── Sprint progress ───────────────────────────────────\n const allStories = plan.epics.flatMap((e) => e.stories);\n const done = allStories.filter((s) => s.status === \"done\").length;\n const total = allStories.length;\n const percent = total > 0 ? Math.round((done / total) * 100) : 0;\n\n const barWidth = 30;\n const filled = Math.round((percent / 100) * barWidth);\n const bar =\n chalk.green(\"█\".repeat(filled)) +\n chalk.dim(\"░\".repeat(barWidth - filled));\n\n console.log(` Progress: ${bar} ${percent}% (${done}/${total} stories)`);\n console.log(\"\");\n\n // ── Stories by status ─────────────────────────────────\n for (const epic of plan.epics) {\n console.log(chalk.bold(` ${epic.title}`));\n for (const story of epic.stories) {\n const icon = STATUS_ICONS[story.status] || \"❓\";\n const statusText =\n story.status === \"done\"\n ? chalk.green(story.status)\n : story.status === \"building\" || story.status === \"reviewing\"\n ? chalk.yellow(story.status)\n : story.status === \"blocked\"\n ? chalk.red(story.status)\n : chalk.dim(story.status);\n\n const branchInfo = story.branch\n ? chalk.dim(` (${story.branch})`)\n : \"\";\n\n console.log(\n ` ${icon} ${story.title} — ${statusText}${branchInfo}`\n );\n }\n console.log(\"\");\n }\n\n // ── Queued changes ────────────────────────────────────\n if (state.queue.length > 0) {\n console.log(chalk.bold(\" Queued Changes:\"));\n for (const change of state.queue) {\n console.log(chalk.yellow(` 📝 ${change.message}`));\n }\n console.log(\"\");\n }\n\n // ── Tags ──────────────────────────────────────────────\n const tags = await git.listTags();\n if (tags.length > 0) {\n console.log(chalk.bold(\" Checkpoints:\"));\n for (const tag of tags) {\n console.log(chalk.dim(` 🏷️ ${tag}`));\n }\n console.log(\"\");\n }\n } else {\n console.log(chalk.dim(\" No sprint plan yet.\"));\n console.log(\n chalk.dim(\n ' Run: ' + chalk.white('forge plan \"describe your app\"') + \"\\n\"\n )\n );\n }\n}\n","// ============================================================\n// forge fix \"description\" — Fix a bug or make a small change\n// Works on main. No branch switching.\n// Supports --image flag to attach a screenshot for context.\n// ============================================================\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { existsSync } from \"fs\";\nimport { stateManager } from \"../../state/index.js\";\nimport { Orchestrator } from \"../../core/orchestrator/index.js\";\nimport { Worker } from \"../../core/worker/index.js\";\nimport { GitManager } from \"../../core/git/index.js\";\n\nexport async function fixCommand(description: string, options?: { image?: string }) {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n if (!description || description.trim().length === 0) {\n console.log(chalk.red(\"\\n Please describe the fix: forge fix \\\"description\\\"\\n\"));\n return;\n }\n\n // Validate image path if provided\n if (options?.image && !existsSync(options.image)) {\n console.log(chalk.red(`\\n Image not found: ${options.image}\\n`));\n return;\n }\n\n console.log(chalk.bold(\"\\n forge fix\\n\"));\n console.log(chalk.dim(` \"${description}\"`));\n if (options?.image) {\n console.log(chalk.dim(` image: ${options.image}`));\n }\n console.log(\"\");\n\n const orchestrator = new Orchestrator(config);\n const worker = new Worker(config, {});\n const git = new GitManager();\n const state = await stateManager.getState();\n\n // ── Orchestrator classifies the request ─────────────────\n const spinner = ora({ text: \"Analyzing request...\", indent: 2 }).start();\n\n let decision;\n try {\n decision = await orchestrator.routeUserInput(description, state);\n } catch (err) {\n spinner.fail(\"Failed to analyze request\");\n console.log(chalk.red(` ${err instanceof Error ? err.message : err}`));\n return;\n }\n\n switch (decision.action) {\n case \"route-to-worker\": {\n const mode = decision.workerMode || \"fix\";\n spinner.text = `Worker (${mode}) applying fix...`;\n\n // Snapshot before fixing\n const headBefore = await git.getHead();\n await stateManager.saveSnapshot({\n action: \"fix\",\n storyId: state.currentStory,\n branch: \"main\",\n commitBefore: headBefore,\n });\n\n // Build prompt — include image reference if provided\n let fixPrompt = decision.prompt || description;\n if (options?.image) {\n fixPrompt += `\\n\\nA screenshot has been saved at: ${options.image}\\nRead this image file to see the visual issue the user is referring to.`;\n }\n\n const result = await worker.run(mode, fixPrompt, {\n onProgress: (event) => {\n if (event.type === \"tool_use\") {\n spinner.text = event.content;\n }\n },\n });\n\n if (result.success) {\n await git.commitAll(`fix: ${description}`);\n spinner.succeed(\"Fix applied\");\n\n for (const file of result.filesModified) {\n console.log(chalk.dim(` modified: ${file}`));\n }\n for (const file of result.filesCreated) {\n console.log(chalk.dim(` created: ${file}`));\n }\n } else {\n spinner.fail(\"Fix failed\");\n for (const error of result.errors) {\n console.log(chalk.red(` ${error}`));\n }\n }\n\n await stateManager.addHistoryEntry({\n action: \"fix\",\n storyId: null,\n details: description,\n });\n break;\n }\n\n case \"add-story\": {\n spinner.succeed(\"New feature detected\");\n\n const plan = await stateManager.getPlan();\n if (plan && plan.epics.length > 0) {\n const newStory = {\n id: `story-${Date.now()}`,\n title: decision.story?.title || description,\n description: decision.story?.description || description,\n type: (decision.story?.type as any) || \"fullstack\",\n status: \"planned\" as const,\n branch: null,\n designApproved: false,\n tags: [],\n priority: 99,\n dependencies: [],\n };\n\n // Add to last epic\n plan.epics[plan.epics.length - 1].stories.push(newStory);\n await stateManager.savePlan(plan);\n await git.commitAll(`forge: add story \"${newStory.title}\"`);\n\n console.log(chalk.green(` Added: ${newStory.title}`));\n console.log(chalk.dim(` Run ${chalk.white(\"forge build\")} or ${chalk.white(\"forge auto\")} to build it.\\n`));\n } else {\n console.log(chalk.yellow(\" No plan found. Run forge plan first to create a sprint plan.\\n\"));\n }\n break;\n }\n\n case \"answer\": {\n spinner.stop();\n console.log(` ${decision.response}\\n`);\n break;\n }\n\n case \"queue-change\": {\n spinner.succeed(\"Change queued (Worker is busy)\");\n console.log(chalk.dim(\" Will apply after the current task completes.\\n\"));\n break;\n }\n\n default: {\n spinner.fail(\"Could not process request\");\n break;\n }\n }\n}\n","// ============================================================\n// forge undo — Revert agent actions using git revert\n// ============================================================\n\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { stateManager } from \"../../state/index.js\";\nimport { GitManager } from \"../../core/git/index.js\";\n\nexport async function undoCommand(options?: { steps?: string }) {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const git = new GitManager();\n\n console.log(chalk.bold(\"\\n Forge Undo\\n\"));\n\n // Get recent forge commits\n const log = await git.getForgeLog(parseInt(options?.steps || \"10\", 10));\n const forgeCommits = log.filter(\n (c) =>\n c.message.startsWith(\"feat:\") ||\n c.message.startsWith(\"fix:\") ||\n c.message.startsWith(\"docs:\")\n );\n\n if (forgeCommits.length === 0) {\n console.log(chalk.dim(\" No actions to undo.\\n\"));\n return;\n }\n\n // Show commits to choose from\n const choices = forgeCommits.map((commit) => {\n const date = new Date(commit.date);\n const timeStr = date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n const hash = commit.hash.slice(0, 7);\n return {\n name: ` ${chalk.dim(hash)} ${commit.message} ${chalk.dim(timeStr)}`,\n value: commit,\n };\n });\n\n const { selected } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"selected\",\n message: \"Which action to undo?\",\n choices: [\n ...choices,\n new inquirer.Separator(),\n { name: chalk.dim(\" Cancel\"), value: null },\n ],\n },\n ]);\n\n if (!selected) {\n console.log(chalk.dim(\" Cancelled.\\n\"));\n return;\n }\n\n // Confirm\n const { confirm } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"confirm\",\n message: `Revert \"${selected.message}\"? This creates a new commit that undoes those changes.`,\n default: false,\n },\n ]);\n\n if (!confirm) {\n console.log(chalk.dim(\" Cancelled.\\n\"));\n return;\n }\n\n // Perform git revert\n try {\n await git.revertCommit(selected.hash);\n\n console.log(chalk.green(`\\n Reverted: ${selected.message}`));\n console.log(chalk.dim(` Commit ${selected.hash.slice(0, 7)} has been undone.\\n`));\n\n // Update forge state history\n await stateManager.addHistoryEntry({\n action: \"undo\",\n storyId: null,\n details: `Reverted: ${selected.message} (${selected.hash.slice(0, 7)})`,\n });\n\n // Update story status if it was a feat: commit\n const plan = await stateManager.getPlan();\n if (plan && selected.message.startsWith(\"feat:\")) {\n const storyTitle = selected.message.replace(\"feat: \", \"\");\n const story = plan.epics\n .flatMap((e) => e.stories)\n .find((s) => s.title === storyTitle);\n\n if (story && (story.status === \"reviewing\" || story.status === \"done\")) {\n story.status = \"planned\";\n await stateManager.savePlan(plan);\n console.log(chalk.dim(` Story \"${story.title}\" reset to planned.\\n`));\n }\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n\n if (msg.includes(\"conflict\")) {\n console.log(chalk.red(\"\\n Revert has conflicts.\"));\n console.log(chalk.dim(\" Resolve them manually, then: git revert --continue\\n\"));\n } else {\n console.log(chalk.red(`\\n Failed to revert: ${msg}`));\n console.log(chalk.dim(\" Try manually: \" + chalk.white(`git revert ${selected.hash.slice(0, 7)}`) + \"\\n\"));\n }\n }\n}\n","// ============================================================\n// forge auto — Fully autonomous \"Lead Agent\" mode\n// ============================================================\n\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport { execSync } from \"child_process\";\nimport { existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport path from \"path\";\nimport { stateManager } from \"../../state/index.js\";\nimport { AutoPipeline } from \"../../core/pipeline/auto.js\";\nimport { loadAndValidateConfig } from \"../../core/utils/config.js\";\nimport { getAdapter } from \"../../core/adapters/index.js\";\n\nfunction checkClaudeAuth(): { ok: boolean; reason: string } {\n try {\n execSync(\"which claude\", { stdio: \"ignore\" });\n } catch {\n return { ok: false, reason: \"Claude Code CLI is not installed.\" };\n }\n\n const claudeDir = path.join(homedir(), \".claude\");\n if (!existsSync(claudeDir)) {\n return { ok: false, reason: \"Claude Code is installed but not logged in.\" };\n }\n\n return { ok: true, reason: \"\" };\n}\n\nexport async function autoCommand(\n description: string | undefined,\n options: {\n sandbox?: boolean;\n quiet?: boolean;\n allowNetwork?: string;\n mute?: boolean;\n deploy?: boolean;\n skipDesign?: boolean;\n }\n) {\n // Auth check\n const auth = checkClaudeAuth();\n if (!auth.ok) {\n console.log(chalk.red(`\\n ${auth.reason}\\n`));\n console.log(chalk.bold(\" Forge requires Claude Code to run.\\n\"));\n console.log(chalk.dim(\" Who can use it:\"));\n console.log(chalk.dim(\" Anyone with a Claude Max, Team, or Enterprise subscription.\\n\"));\n console.log(chalk.dim(\" Setup:\"));\n console.log(chalk.dim(\" 1. npm install -g @anthropic-ai/claude-code\"));\n console.log(chalk.dim(\" 2. claude login\"));\n console.log(chalk.dim(' 3. forge auto \"your app idea\"\\n'));\n console.log(chalk.dim(\" Diagnose: forge doctor\\n\"));\n return;\n }\n\n // Config validation\n const rawConfig = await stateManager.getConfig();\n if (!rawConfig) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n const config = loadAndValidateConfig(rawConfig);\n if (!config) return;\n\n // Auto-skip design for frameworks that don't support it\n const adapter = getAdapter(config.framework);\n const skipDesign = options.skipDesign || !adapter.designSupport;\n\n if (!description) {\n const { desc } = await inquirer.prompt([\n {\n type: \"input\",\n name: \"desc\",\n message: \"What do you want to build?\",\n validate: (input: string) =>\n input.length > 10 || \"Please provide a more detailed description\",\n },\n ]);\n description = desc;\n }\n\n const allowedDomains = options.allowNetwork\n ? options.allowNetwork.split(\",\").map((d) => d.trim())\n : undefined;\n\n const pipeline = new AutoPipeline(config, {\n sandbox: options.sandbox !== false,\n quiet: options.quiet ?? false,\n mute: options.mute ?? false,\n deploy: options.deploy ?? false,\n skipDesign,\n allowedDomains,\n });\n\n const result = await pipeline.run(description!);\n\n if (!result.success) {\n process.exitCode = 1;\n }\n}\n","// ============================================================\n// forge resume — Resume an interrupted sprint\n// Picks up from the last completed story and continues.\n// ============================================================\n\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { stateManager } from \"../../state/index.js\";\nimport { AutoPipeline } from \"../../core/pipeline/auto.js\";\nimport type { Plan, Story } from \"../../types/plan.js\";\n\nexport async function resumeCommand(options: {\n sandbox?: boolean;\n quiet?: boolean;\n mute?: boolean;\n skipDesign?: boolean;\n}) {\n // Validate working directory exists and is accessible (prevents EPERM uv_cwd)\n let workingDir: string;\n try {\n workingDir = process.cwd();\n } catch {\n // CWD was deleted (e.g., by a prior interrupted build). Fall back to home dir\n // and look for the project from the forge state files.\n const home = process.env.HOME || process.env.USERPROFILE || \"/tmp\";\n process.chdir(home);\n console.log(chalk.yellow(\"\\n Working directory no longer exists.\"));\n console.log(chalk.dim(` Falling back to: ${home}`));\n console.log(chalk.dim(\" Please cd to your project directory and retry.\\n\"));\n return;\n }\n\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const plan = await stateManager.getPlan();\n if (!plan) {\n console.log(chalk.red(\"\\n No sprint plan found. Nothing to resume.\\n\"));\n console.log(chalk.dim(' Start a new sprint: forge auto \"description\"\\n'));\n return;\n }\n\n const state = await stateManager.getState();\n const allStories = plan.epics.flatMap((e) => e.stories);\n\n // Count status\n const done = allStories.filter((s) => s.status === \"done\").length;\n const blocked = allStories.filter((s) => s.status === \"blocked\").length;\n const remaining = allStories.filter(\n (s) => s.status !== \"done\" && s.status !== \"blocked\"\n );\n\n if (remaining.length === 0 && blocked === 0) {\n console.log(chalk.green(\"\\n Sprint is already complete. All stories done.\\n\"));\n return;\n }\n\n // Show current state\n console.log(chalk.bold(\"\\n Resuming sprint\"));\n console.log(chalk.dim(` ${plan.project} · ${plan.framework}`));\n console.log(chalk.dim(` Phase: ${state.currentPhase}`));\n console.log(\n chalk.dim(` Progress: ${done}/${allStories.length} done`) +\n (blocked > 0 ? chalk.red(` · ${blocked} blocked`) : \"\")\n );\n console.log(\"\");\n\n // Show what's remaining\n if (remaining.length > 0) {\n console.log(chalk.dim(\" Remaining stories:\"));\n for (const story of remaining) {\n const icon = story.status === \"building\" ? chalk.yellow(\"◑\") :\n story.status === \"reviewing\" ? chalk.magenta(\"◕\") :\n story.status === \"designing\" ? chalk.blue(\"◐\") :\n chalk.dim(\"○\");\n console.log(` ${icon} ${story.title} ${chalk.dim(`(${story.status})`)}`);\n }\n console.log(\"\");\n }\n\n // Show blocked stories\n if (blocked > 0) {\n const blockedStories = allStories.filter((s) => s.status === \"blocked\");\n console.log(chalk.red(\" Blocked stories:\"));\n for (const story of blockedStories) {\n console.log(` ${chalk.red(\"✕\")} ${story.title}`);\n }\n console.log(\"\");\n }\n\n // Confirm\n const { action } = await inquirer.prompt([\n {\n type: \"list\",\n name: \"action\",\n message: \"What would you like to do?\",\n choices: [\n { name: `Resume (${remaining.length} stories left)`, value: \"resume\" },\n ...(blocked > 0\n ? [{ name: `Retry blocked stories (${blocked})`, value: \"retry\" }]\n : []),\n { name: \"Cancel\", value: \"cancel\" },\n ],\n },\n ]);\n\n if (action === \"cancel\") {\n console.log(chalk.dim(\" Cancelled.\\n\"));\n return;\n }\n\n // Reset blocked stories to \"planned\" if retrying\n if (action === \"retry\") {\n for (const story of allStories) {\n if (story.status === \"blocked\") {\n story.status = \"planned\";\n }\n }\n await stateManager.savePlan(plan);\n }\n\n // Reset in-progress stories (building/designing) to their previous state\n for (const story of allStories) {\n if (story.status === \"building\") {\n story.status = story.designApproved ? \"design-approved\" : \"planned\";\n }\n if (story.status === \"designing\") {\n story.status = \"planned\";\n }\n }\n await stateManager.savePlan(plan);\n\n // Run the pipeline — it will skip stories that are already done\n const pipeline = new AutoPipeline(config, {\n sandbox: options.sandbox !== false,\n quiet: options.quiet ?? false,\n mute: options.mute ?? false,\n skipDesign: options.skipDesign ?? false,\n });\n\n const result = await pipeline.resume(plan);\n\n if (!result.success) {\n process.exitCode = 1;\n }\n}\n","// ============================================================\n// forge map — Terminal sprint visualization\n// Shows stories as a tree with status, dependencies, and tags.\n// ============================================================\n\nimport chalk from \"chalk\";\nimport { stateManager } from \"../../state/index.js\";\nimport type { Story, Plan, Epic } from \"../../types/plan.js\";\n\nconst STATUS_ICON: Record<string, string> = {\n planned: chalk.dim(\"○\"),\n designing: chalk.blue(\"◐\"),\n \"design-approved\": chalk.cyan(\"◑\"),\n building: chalk.yellow(\"◑\"),\n reviewing: chalk.magenta(\"◕\"),\n done: chalk.green(\"●\"),\n blocked: chalk.red(\"✕\"),\n};\n\nconst STATUS_COLOR: Record<string, (s: string) => string> = {\n planned: chalk.dim,\n designing: chalk.blue,\n \"design-approved\": chalk.cyan,\n building: chalk.yellow,\n reviewing: chalk.magenta,\n done: chalk.green,\n blocked: chalk.red,\n};\n\nexport async function mapCommand() {\n const plan = await stateManager.getPlan();\n if (!plan) {\n console.log(chalk.red(\"\\n No sprint plan found. Run: forge plan\\n\"));\n return;\n }\n\n const allStories = plan.epics.flatMap((e) => e.stories);\n const done = allStories.filter((s) => s.status === \"done\").length;\n const total = allStories.length;\n const pct = total > 0 ? Math.round((done / total) * 100) : 0;\n\n // Header\n console.log(\"\");\n console.log(chalk.bold(` ${plan.project}`) + chalk.dim(` · ${plan.framework}`));\n console.log(chalk.dim(` ${plan.description}`));\n console.log(\"\");\n\n // Progress bar\n const barWidth = 30;\n const filled = Math.round((done / total) * barWidth);\n const bar = chalk.green(\"█\".repeat(filled)) + chalk.dim(\"░\".repeat(barWidth - filled));\n console.log(` ${bar} ${chalk.bold(`${pct}%`)} ${chalk.dim(`(${done}/${total} stories)`)}`);\n console.log(\"\");\n\n // Sprint map\n for (const epic of plan.epics) {\n const epicDone = epic.stories.filter((s) => s.status === \"done\").length;\n const epicTotal = epic.stories.length;\n const epicStatus = epicDone === epicTotal ? chalk.green(\"done\") :\n epicDone > 0 ? chalk.yellow(\"in progress\") : chalk.dim(\"planned\");\n\n console.log(` ${chalk.bold(epic.title)} ${chalk.dim(`(${epicDone}/${epicTotal})`)} ${epicStatus}`);\n\n for (let i = 0; i < epic.stories.length; i++) {\n const story = epic.stories[i];\n const isLast = i === epic.stories.length - 1;\n const connector = isLast ? \"└\" : \"├\";\n const icon = STATUS_ICON[story.status] || chalk.dim(\"?\");\n const colorFn = STATUS_COLOR[story.status] || chalk.dim;\n const typeTag = chalk.dim(`[${story.type === \"ui\" ? \"ui\" : story.type === \"backend\" ? \"api\" : \"full\"}]`);\n\n let line = ` ${chalk.dim(connector + \"─\")} ${icon} ${colorFn(story.title)} ${typeTag}`;\n\n // Show tags\n if (story.tags.length > 0) {\n line += \" \" + chalk.dim(story.tags[story.tags.length - 1]);\n }\n\n console.log(line);\n\n // Show dependencies\n if (story.dependencies.length > 0) {\n const depPrefix = isLast ? \" \" : \" │\";\n const depNames = story.dependencies\n .map((depId) => {\n const dep = allStories.find((s) => s.id === depId);\n if (!dep) return chalk.dim(depId);\n const depIcon = STATUS_ICON[dep.status] || \"?\";\n return `${depIcon} ${chalk.dim(dep.title)}`;\n })\n .join(\", \");\n console.log(chalk.dim(`${depPrefix} ← depends on: ${depNames}`));\n }\n }\n console.log(\"\");\n }\n\n // Legend\n console.log(chalk.dim(\" Legend: \") +\n `${chalk.dim(\"○\")} planned ` +\n `${chalk.blue(\"◐\")} designing ` +\n `${chalk.yellow(\"◑\")} building ` +\n `${chalk.magenta(\"◕\")} reviewing ` +\n `${chalk.green(\"●\")} done ` +\n `${chalk.red(\"✕\")} blocked`\n );\n console.log(\"\");\n}\n","// ============================================================\n// forge diff <v1> [v2] — Show changes between versions\n// ============================================================\n\nimport chalk from \"chalk\";\nimport { GitManager } from \"../../core/git/index.js\";\n\nexport async function diffCommand(v1: string, v2?: string) {\n const git = new GitManager();\n\n // Resolve tag names — allow shorthand like \"v0.3\" or full \"forge/v0.3-story\"\n const resolveRef = async (ref: string): Promise<string> => {\n // Try exact ref first\n const tags = await git.listTags();\n\n // Exact match\n if (tags.includes(ref)) return ref;\n\n // Try with forge/ prefix\n const prefixed = `forge/${ref}`;\n if (tags.includes(prefixed)) return prefixed;\n\n // Partial match\n const match = tags.find((t) => t.includes(ref));\n if (match) return match;\n\n // Assume it's a commit hash\n return ref;\n };\n\n const ref1 = await resolveRef(v1);\n const ref2 = v2 ? await resolveRef(v2) : \"HEAD\";\n\n console.log(chalk.bold(\"\\n forge diff\"));\n console.log(chalk.dim(` ${ref1} → ${ref2}\\n`));\n\n try {\n const diff = await git.getDiff2(ref1, ref2);\n\n if (!diff.trim()) {\n console.log(chalk.dim(\" No differences found.\\n\"));\n return;\n }\n\n // Parse and colorize diff\n const lines = diff.split(\"\\n\");\n for (const line of lines) {\n if (line.startsWith(\"diff --git\")) {\n console.log(chalk.bold(chalk.white(` ${line}`)));\n } else if (line.startsWith(\"+++\") || line.startsWith(\"---\")) {\n console.log(chalk.dim(` ${line}`));\n } else if (line.startsWith(\"+\")) {\n console.log(chalk.green(` ${line}`));\n } else if (line.startsWith(\"-\")) {\n console.log(chalk.red(` ${line}`));\n } else if (line.startsWith(\"@@\")) {\n console.log(chalk.cyan(` ${line}`));\n } else {\n console.log(chalk.dim(` ${line}`));\n }\n }\n\n // Summary\n const filesChanged = lines.filter((l) => l.startsWith(\"diff --git\")).length;\n const additions = lines.filter((l) => l.startsWith(\"+\") && !l.startsWith(\"+++\")).length;\n const deletions = lines.filter((l) => l.startsWith(\"-\") && !l.startsWith(\"---\")).length;\n console.log(\"\");\n console.log(chalk.dim(` ${filesChanged} files changed, `) +\n chalk.green(`${additions} additions`) +\n chalk.dim(\", \") +\n chalk.red(`${deletions} deletions`) +\n \"\\n\"\n );\n } catch (err) {\n console.log(chalk.red(` Could not compute diff: ${err instanceof Error ? err.message : err}`));\n console.log(chalk.dim(\" Make sure both references exist (use forge history to see tags).\\n\"));\n }\n}\n","// ============================================================\n// forge doctor — Diagnose setup issues\n// ============================================================\n\nimport chalk from \"chalk\";\nimport { execSync } from \"child_process\";\nimport { existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport path from \"path\";\nimport { stateManager } from \"../../state/index.js\";\nimport { listAdapters } from \"../../core/adapters/index.js\";\n\ninterface Check {\n name: string;\n status: \"pass\" | \"fail\" | \"warn\";\n detail: string;\n fix?: string;\n}\n\nfunction checkCommand(cmd: string): boolean {\n try {\n execSync(`which ${cmd}`, { stdio: \"ignore\" });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction getVersion(cmd: string): string {\n try {\n return execSync(`${cmd} --version`, { encoding: \"utf-8\" }).trim().split(\"\\n\")[0];\n } catch {\n return \"unknown\";\n }\n}\n\nexport async function doctorCommand() {\n console.log(chalk.bold(\"\\n forge doctor\\n\"));\n\n const checks: Check[] = [];\n\n // 1. Node.js\n const nodeVersion = process.version;\n const nodeMajor = parseInt(nodeVersion.slice(1));\n checks.push({\n name: \"Node.js\",\n status: nodeMajor >= 18 ? \"pass\" : \"fail\",\n detail: nodeVersion,\n fix: nodeMajor < 18 ? \"Upgrade to Node.js 18+: https://nodejs.org\" : undefined,\n });\n\n // 2. Git\n const hasGit = checkCommand(\"git\");\n checks.push({\n name: \"Git\",\n status: hasGit ? \"pass\" : \"fail\",\n detail: hasGit ? getVersion(\"git\") : \"not found\",\n fix: !hasGit ? \"Install git: https://git-scm.com\" : undefined,\n });\n\n // 3. Claude Code CLI\n const hasClaude = checkCommand(\"claude\");\n checks.push({\n name: \"Claude Code CLI\",\n status: hasClaude ? \"pass\" : \"fail\",\n detail: hasClaude ? \"installed\" : \"not found\",\n fix: !hasClaude ? \"npm install -g @anthropic-ai/claude-code\" : undefined,\n });\n\n // 4. Claude auth\n const claudeDir = path.join(homedir(), \".claude\");\n const hasAuth = existsSync(claudeDir);\n checks.push({\n name: \"Claude auth\",\n status: hasClaude && hasAuth ? \"pass\" : hasClaude ? \"fail\" : \"warn\",\n detail: hasAuth ? \"logged in\" : \"not logged in\",\n fix: !hasAuth ? \"claude login\" : undefined,\n });\n\n // 5. Forge initialized\n const config = await stateManager.getConfig();\n checks.push({\n name: \"Forge project\",\n status: config ? \"pass\" : \"warn\",\n detail: config ? `${config.framework} · ${config.model}` : \"not initialized in this directory\",\n fix: !config ? \"forge init\" : undefined,\n });\n\n // 6. Sprint plan\n const plan = await stateManager.getPlan();\n checks.push({\n name: \"Sprint plan\",\n status: plan ? \"pass\" : \"warn\",\n detail: plan\n ? `${plan.project} · ${plan.epics.flatMap((e) => e.stories).length} stories`\n : \"no plan\",\n fix: !plan ? 'forge plan \"description\"' : undefined,\n });\n\n // 7. Framework tools\n if (config) {\n const framework = config.framework;\n if (framework === \"nextjs\" || framework === \"react\") {\n const hasNpm = checkCommand(\"npm\");\n checks.push({\n name: \"npm\",\n status: hasNpm ? \"pass\" : \"fail\",\n detail: hasNpm ? getVersion(\"npm\").replace(\"npm \", \"\") : \"not found\",\n });\n }\n if (framework === \"django\") {\n const hasPython = checkCommand(\"python3\");\n checks.push({\n name: \"Python 3\",\n status: hasPython ? \"pass\" : \"fail\",\n detail: hasPython ? getVersion(\"python3\") : \"not found\",\n fix: !hasPython ? \"Install Python 3.10+: https://python.org\" : undefined,\n });\n }\n }\n\n // 8. GitHub CLI (optional)\n const hasGh = checkCommand(\"gh\");\n checks.push({\n name: \"GitHub CLI\",\n status: hasGh ? \"pass\" : \"warn\",\n detail: hasGh ? \"installed\" : \"not installed (optional, for GitHub sync)\",\n fix: !hasGh ? \"https://cli.github.com (optional)\" : undefined,\n });\n\n // Display results\n let hasFailure = false;\n for (const check of checks) {\n const icon = check.status === \"pass\" ? chalk.green(\"OK\")\n : check.status === \"fail\" ? chalk.red(\"FAIL\")\n : chalk.yellow(\"WARN\");\n console.log(` ${icon} ${chalk.bold(check.name)} ${chalk.dim(check.detail)}`);\n if (check.fix) {\n console.log(chalk.dim(` fix: ${check.fix}`));\n }\n if (check.status === \"fail\") hasFailure = true;\n }\n\n console.log(\"\");\n\n // Supported frameworks\n console.log(chalk.dim(\" Supported frameworks:\"));\n for (const adapter of listAdapters()) {\n console.log(chalk.dim(` ${adapter.name} (${adapter.language})`));\n }\n console.log(\"\");\n\n if (hasFailure) {\n console.log(chalk.red(\" Some checks failed. Fix the issues above before running Forge.\\n\"));\n } else {\n console.log(chalk.green(\" All checks passed. Forge is ready.\\n\"));\n }\n}\n","// ============================================================\n// forge clean — Reset forge state\n// ============================================================\n\nimport chalk from \"chalk\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport inquirer from \"inquirer\";\n\nexport async function cleanCommand(options: { force?: boolean; snapshots?: boolean }) {\n const forgeDir = path.join(process.cwd(), \".forge\");\n\n try {\n await fs.access(forgeDir);\n } catch {\n console.log(chalk.red(\"\\n No .forge/ directory found. Nothing to clean.\\n\"));\n return;\n }\n\n if (options.snapshots) {\n // Only clean snapshots\n const snapshotsDir = path.join(forgeDir, \"snapshots\");\n try {\n const files = await fs.readdir(snapshotsDir);\n if (files.length === 0) {\n console.log(chalk.dim(\"\\n No snapshots to clean.\\n\"));\n return;\n }\n for (const file of files) {\n await fs.unlink(path.join(snapshotsDir, file));\n }\n console.log(chalk.green(`\\n Cleaned ${files.length} snapshots.\\n`));\n } catch {\n console.log(chalk.dim(\"\\n No snapshots directory found.\\n\"));\n }\n return;\n }\n\n // Full clean\n console.log(chalk.bold(\"\\n forge clean\\n\"));\n console.log(chalk.dim(\" This will remove:\"));\n console.log(chalk.dim(\" .forge/plan.json — Sprint plan\"));\n console.log(chalk.dim(\" .forge/state.json — Sprint state\"));\n console.log(chalk.dim(\" .forge/snapshots/ — All snapshots\"));\n console.log(chalk.dim(\" .forge/designs/ — Design metadata\"));\n console.log(chalk.dim(\"\\n forge.config.json will be kept.\\n\"));\n\n if (!options.force) {\n const { confirm } = await inquirer.prompt([\n {\n type: \"confirm\",\n name: \"confirm\",\n message: \"Reset sprint state? This cannot be undone.\",\n default: false,\n },\n ]);\n if (!confirm) {\n console.log(chalk.dim(\" Cancelled.\\n\"));\n return;\n }\n }\n\n // Remove plan, state, snapshots, designs\n const toRemove = [\"plan.json\", \"state.json\"];\n for (const file of toRemove) {\n try {\n await fs.unlink(path.join(forgeDir, file));\n } catch {\n // File doesn't exist, skip\n }\n }\n\n const dirsToClean = [\"snapshots\", \"designs\"];\n for (const dir of dirsToClean) {\n const dirPath = path.join(forgeDir, dir);\n try {\n await fs.rm(dirPath, { recursive: true });\n await fs.mkdir(dirPath, { recursive: true });\n } catch {\n // Directory doesn't exist, skip\n }\n }\n\n // Write fresh state\n await fs.writeFile(\n path.join(forgeDir, \"state.json\"),\n JSON.stringify({\n currentPhase: \"init\",\n currentStory: null,\n workerMode: null,\n queue: [],\n history: [],\n }, null, 2)\n );\n\n console.log(chalk.green(\" Sprint state reset. Config preserved.\\n\"));\n console.log(chalk.dim(' Start fresh: forge plan \"description\"\\n'));\n}\n","// ============================================================\n// forge export — Export sprint plan as markdown\n// ============================================================\n\nimport chalk from \"chalk\";\nimport fs from \"fs/promises\";\nimport { stateManager } from \"../../state/index.js\";\nimport type { Story } from \"../../types/plan.js\";\n\nconst STATUS_LABEL: Record<string, string> = {\n planned: \"[ ]\",\n designing: \"[~]\",\n \"design-approved\": \"[~]\",\n building: \"[~]\",\n reviewing: \"[~]\",\n done: \"[x]\",\n blocked: \"[!]\",\n};\n\nexport async function exportCommand(options: { output?: string }) {\n const plan = await stateManager.getPlan();\n if (!plan) {\n console.log(chalk.red(\"\\n No sprint plan found. Run: forge plan\\n\"));\n return;\n }\n\n const allStories = plan.epics.flatMap((e) => e.stories);\n const done = allStories.filter((s) => s.status === \"done\").length;\n\n let md = `# ${plan.project}\\n\\n`;\n md += `> ${plan.description}\\n\\n`;\n md += `**Framework:** ${plan.framework} \\n`;\n md += `**Created:** ${plan.created} \\n`;\n md += `**Progress:** ${done}/${allStories.length} stories complete\\n\\n`;\n md += `---\\n\\n`;\n\n for (const epic of plan.epics) {\n const epicDone = epic.stories.filter((s) => s.status === \"done\").length;\n md += `## ${epic.title} (${epicDone}/${epic.stories.length})\\n\\n`;\n\n for (const story of epic.stories) {\n const check = STATUS_LABEL[story.status] || \"[ ]\";\n const type = story.type === \"ui\" ? \"UI\" : story.type === \"backend\" ? \"API\" : \"Full\";\n md += `- ${check} **${story.title}** \\`${type}\\`\\n`;\n md += ` ${story.description}\\n`;\n\n if (story.dependencies.length > 0) {\n const depNames = story.dependencies.map((depId) => {\n const dep = allStories.find((s) => s.id === depId);\n return dep ? dep.title : depId;\n });\n md += ` *Depends on: ${depNames.join(\", \")}*\\n`;\n }\n if (story.tags.length > 0) {\n md += ` Tags: ${story.tags.join(\", \")}\\n`;\n }\n md += `\\n`;\n }\n }\n\n md += `---\\n\\n`;\n md += `*Exported from [ForgeAI](https://github.com/joeljohn159/forgeai)*\\n`;\n\n const outputPath = options.output || \"sprint-plan.md\";\n\n await fs.writeFile(outputPath, md);\n console.log(chalk.green(`\\n Exported to ${outputPath}\\n`));\n}\n","// ============================================================\n// forge history — Show version timeline and checkpoints\n// ============================================================\n\nimport chalk from \"chalk\";\nimport { stateManager } from \"../../state/index.js\";\nimport { GitManager } from \"../../core/git/index.js\";\n\nexport async function historyCommand() {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const git = new GitManager();\n const state = await stateManager.getState();\n const plan = await stateManager.getPlan();\n\n console.log(chalk.bold(\"\\n Forge History\\n\"));\n\n // ── Checkpoints (tags) ──────────────────────────────────\n const tags = await git.listTags();\n if (tags.length > 0) {\n console.log(chalk.bold(\" Checkpoints\\n\"));\n for (const tag of [...tags].reverse()) {\n const label = tag.replace(\"forge/\", \"\");\n console.log(` ${chalk.cyan(tag)} ${chalk.dim(label)}`);\n }\n console.log(\"\");\n }\n\n // ── Activity log (commits) ──────────────────────────────\n console.log(chalk.bold(\" Activity\\n\"));\n\n const log = await git.getForgeLog(30);\n if (log.length === 0) {\n console.log(chalk.dim(\" No activity yet.\\n\"));\n } else {\n for (const entry of log) {\n const date = new Date(entry.date);\n const timeStr = date.toLocaleDateString() + \" \" + date.toLocaleTimeString([], { hour: \"2-digit\", minute: \"2-digit\" });\n const hash = entry.hash.slice(0, 7);\n\n // Color by commit type\n let msgColor = chalk.white;\n if (entry.message.startsWith(\"feat:\")) msgColor = chalk.green;\n else if (entry.message.startsWith(\"fix:\")) msgColor = chalk.yellow;\n else if (entry.message.startsWith(\"forge:\")) msgColor = chalk.cyan;\n else if (entry.message.startsWith(\"docs:\")) msgColor = chalk.blue;\n else if (entry.message.startsWith(\"ci:\")) msgColor = chalk.magenta;\n\n // Check for tags at this commit\n const commitTags = await git.getTagsAtCommit(entry.hash);\n const tagStr = commitTags.length > 0\n ? \" \" + commitTags.map((t) => chalk.cyan(`[${t}]`)).join(\" \")\n : \"\";\n\n console.log(\n chalk.dim(` ${hash}`) +\n ` ${msgColor(entry.message)}` +\n tagStr +\n chalk.dim(` ${timeStr}`)\n );\n }\n console.log(\"\");\n }\n\n // ── Sprint state ────────────────────────────────────────\n if (plan) {\n const allStories = plan.epics.flatMap((e) => e.stories);\n const done = allStories.filter((s) => s.status === \"done\").length;\n const blocked = allStories.filter((s) => s.status === \"blocked\").length;\n const total = allStories.length;\n\n console.log(chalk.bold(\" Sprint\\n\"));\n console.log(chalk.dim(` Phase: ${state.currentPhase}`));\n console.log(chalk.dim(` Stories: ${done}/${total} done${blocked > 0 ? `, ${blocked} blocked` : \"\"}`));\n console.log(chalk.dim(` History entries: ${state.history.length}`));\n console.log(\"\");\n }\n\n // ── Hint ────────────────────────────────────────────────\n if (tags.length > 0) {\n console.log(chalk.dim(` Tip: ${chalk.white(\"forge checkout <tag>\")} to jump to a checkpoint\\n`));\n }\n}\n\n// ============================================================\n// forge checkout — Jump to a specific version\n// ============================================================\n\nexport async function checkoutCommand(version: string) {\n const git = new GitManager();\n\n // Try as a forge tag first\n const tags = await git.listTags();\n const match = tags.find((t) => t === version || t === `forge/${version}`);\n\n if (match) {\n await git.checkoutTag(match);\n console.log(chalk.green(`\\n Checked out ${match}\\n`));\n console.log(chalk.dim(\" You are in detached HEAD state.\"));\n console.log(chalk.dim(\" To go back: \" + chalk.white(\"git checkout main\") + \"\\n\"));\n return;\n }\n\n // Try as a commit hash\n try {\n await git.checkout(version);\n console.log(chalk.green(`\\n Checked out ${version}\\n`));\n } catch {\n console.log(chalk.red(`\\n Version \"${version}\" not found.`));\n console.log(chalk.dim(\" Run: \" + chalk.white(\"forge history\") + \" to see available versions.\\n\"));\n }\n}\n","// ============================================================\n// forge start — Start the dev server for the current project\n// Auto-detects framework from forge.config.json\n// ============================================================\n\nimport chalk from \"chalk\";\nimport { spawn } from \"child_process\";\nimport { stateManager } from \"../../state/index.js\";\nimport { getAdapter } from \"../../core/adapters/index.js\";\n\nexport async function startCommand() {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const adapter = getAdapter(config.framework);\n const [cmd, ...args] = adapter.devCommand.split(\" \");\n\n console.log(chalk.bold(\"\\n forge\") + chalk.dim(\" start\"));\n console.log(chalk.dim(` ${adapter.name} dev server on port ${adapter.devPort}\\n`));\n console.log(chalk.dim(` Running: ${adapter.devCommand}\\n`));\n\n const child = spawn(cmd, args, {\n cwd: process.cwd(),\n stdio: \"inherit\",\n shell: true,\n });\n\n child.on(\"error\", (err) => {\n console.log(chalk.red(`\\n Failed to start: ${err.message}`));\n console.log(chalk.dim(` Try running manually: ${adapter.devCommand}\\n`));\n });\n\n child.on(\"exit\", (code) => {\n if (code && code !== 0) {\n console.log(chalk.red(`\\n Dev server exited with code ${code}\\n`));\n }\n });\n}\n","// ============================================================\n// forge push — Push project to GitHub remote\n// Pushes commits and tags to origin.\n// ============================================================\n\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { stateManager } from \"../../state/index.js\";\nimport { GitManager } from \"../../core/git/index.js\";\n\nexport async function pushCommand() {\n const config = await stateManager.getConfig();\n if (!config) {\n console.log(chalk.red(\"\\n Forge not initialized. Run: forge init\\n\"));\n return;\n }\n\n const git = new GitManager();\n\n // Check remote exists\n const hasRemote = await git.hasRemote();\n if (!hasRemote) {\n console.log(chalk.red(\"\\n No remote 'origin' found.\"));\n console.log(chalk.dim(\" Add one with: git remote add origin <url>\\n\"));\n return;\n }\n\n const spinner = ora({ text: \"Pushing to origin...\", indent: 2 }).start();\n\n try {\n // Commit any uncommitted changes first\n const hasChanges = await git.hasUncommittedChanges();\n if (hasChanges) {\n await git.commitAll(\"forge: save progress before push\");\n spinner.text = \"Committed uncommitted changes, pushing...\";\n }\n\n // Push commits\n await git.push();\n spinner.text = \"Pushing tags...\";\n\n // Push tags\n await git.pushTags();\n\n spinner.succeed(\"Pushed to origin (commits + tags)\");\n\n const branch = await git.getCurrentBranch();\n console.log(chalk.dim(` Branch: ${branch}\\n`));\n } catch (err) {\n spinner.fail(\"Push failed\");\n const msg = err instanceof Error ? err.message : String(err);\n console.log(chalk.red(` ${msg}\\n`));\n console.log(chalk.dim(\" Make sure you have push access and the remote is configured.\\n\"));\n }\n}\n"],"mappings":"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","names":["chalk","chalk","inquirer","chalk","inquirer","chalk","fs","path","ora","chalk","ora","path","fs","chalk","chalk","chalk","chalk","chalk","inquirer","chalk","inquirer","chalk","chalk","chalk","ora","chalk","ora","chalk","inquirer","chalk","inquirer","chalk","inquirer","existsSync","path","path","existsSync","chalk","inquirer","chalk","inquirer","chalk","inquirer","chalk","chalk","chalk","chalk","chalk","execSync","existsSync","homedir","path","execSync","chalk","path","homedir","existsSync","chalk","fs","path","inquirer","chalk","fs","chalk","fs","chalk","chalk","chalk","chalk","chalk","ora","chalk","ora","chalk"]}
@@ -0,0 +1,389 @@
1
+ type StoryStatus = "planned" | "designing" | "design-approved" | "building" | "reviewing" | "done" | "blocked";
2
+ type StoryType = "ui" | "backend" | "fullstack";
3
+ interface Story {
4
+ id: string;
5
+ title: string;
6
+ description: string;
7
+ type: StoryType;
8
+ status: StoryStatus;
9
+ branch: string | null;
10
+ designApproved: boolean;
11
+ tags: string[];
12
+ priority: number;
13
+ dependencies: string[];
14
+ }
15
+ interface Epic {
16
+ id: string;
17
+ title: string;
18
+ status: "planned" | "in-progress" | "done";
19
+ stories: Story[];
20
+ }
21
+ interface Plan {
22
+ project: string;
23
+ framework: string;
24
+ description: string;
25
+ created: string;
26
+ epics: Epic[];
27
+ }
28
+ type Phase = "init" | "plan" | "design" | "build" | "review" | "done";
29
+ type WorkerMode = "design" | "build" | "review" | "fix";
30
+ interface QueuedChange {
31
+ type: "visual-tweak" | "redesign" | "bug-fix" | "new-feature" | "content-change";
32
+ message: string;
33
+ queuedAt: string;
34
+ }
35
+ interface HistoryEntry {
36
+ action: string;
37
+ storyId: string | null;
38
+ timestamp: string;
39
+ snapshotId: string | null;
40
+ details: string;
41
+ }
42
+ interface SprintState {
43
+ currentPhase: Phase;
44
+ currentStory: string | null;
45
+ workerMode: WorkerMode | null;
46
+ queue: QueuedChange[];
47
+ history: HistoryEntry[];
48
+ }
49
+ interface ForgeConfig {
50
+ framework: string;
51
+ model: "sonnet" | "opus" | "haiku";
52
+ designPreview: "storybook" | "html";
53
+ githubSync: boolean;
54
+ githubRepo: string | null;
55
+ autoCommit: boolean;
56
+ storybook: {
57
+ port: number;
58
+ };
59
+ }
60
+ interface OrchestratorDecision {
61
+ action: "route-to-worker" | "add-story" | "reprioritize" | "answer" | "queue-change";
62
+ workerMode?: WorkerMode;
63
+ story?: Partial<Story>;
64
+ response?: string;
65
+ queuedChange?: QueuedChange;
66
+ prompt?: string;
67
+ }
68
+ interface FileSnapshot {
69
+ path: string;
70
+ hash: string;
71
+ }
72
+ interface Snapshot {
73
+ id: string;
74
+ action: string;
75
+ storyId: string | null;
76
+ timestamp: string;
77
+ files: FileSnapshot[];
78
+ branch: string;
79
+ commitBefore: string;
80
+ }
81
+ interface DesignMeta {
82
+ storyId: string;
83
+ approved: boolean;
84
+ approvedAt: string | null;
85
+ feedback: string[];
86
+ storybookPath: string | null;
87
+ referenceImages: string[];
88
+ viewports: {
89
+ mobile: boolean;
90
+ desktop: boolean;
91
+ };
92
+ }
93
+
94
+ declare class Orchestrator {
95
+ private config;
96
+ private plan;
97
+ constructor(config: ForgeConfig);
98
+ generatePlan(description: string): Promise<Plan>;
99
+ routeUserInput(message: string, currentState: SprintState): Promise<OrchestratorDecision>;
100
+ craftWorkerPrompt(story: Story, mode: WorkerMode, context: {
101
+ plan: Plan;
102
+ designMeta?: any;
103
+ existingFiles?: string[];
104
+ }): string;
105
+ private craftDesignPrompt;
106
+ private craftBuildPrompt;
107
+ private craftReviewPrompt;
108
+ private craftFixPrompt;
109
+ private runQuery;
110
+ private executeQuery;
111
+ private isAuthError;
112
+ private cleanJson;
113
+ }
114
+
115
+ interface WorkerUsage {
116
+ inputTokens: number;
117
+ outputTokens: number;
118
+ costUsd: number;
119
+ durationMs: number;
120
+ }
121
+ interface WorkerResult {
122
+ success: boolean;
123
+ filesCreated: string[];
124
+ filesModified: string[];
125
+ errors: string[];
126
+ summary: string;
127
+ usage: WorkerUsage;
128
+ }
129
+ interface WorkerProgressEvent {
130
+ type: "tool_use" | "tool_running" | "tool_done" | "thinking" | "status";
131
+ content: string;
132
+ tool?: string;
133
+ elapsed?: number;
134
+ }
135
+ interface WorkerProgressCallback {
136
+ (event: WorkerProgressEvent): void;
137
+ }
138
+ interface WorkerSandboxOptions {
139
+ sandbox?: boolean;
140
+ workingDir?: string;
141
+ allowedDomains?: string[];
142
+ }
143
+ declare class Worker {
144
+ private config;
145
+ private sandboxOpts;
146
+ private mute;
147
+ constructor(config: ForgeConfig, sandboxOpts?: WorkerSandboxOptions, mute?: boolean);
148
+ run(mode: WorkerMode, prompt: string, options?: {
149
+ workingDir?: string;
150
+ onProgress?: WorkerProgressCallback;
151
+ }): Promise<WorkerResult>;
152
+ private executeQuery;
153
+ private isAuthErrorMsg;
154
+ private isAuthError;
155
+ private notifyAuthError;
156
+ private waitForReauth;
157
+ /** Turn a tool_use block into a short human-readable string */
158
+ private describeToolUse;
159
+ private shortPath;
160
+ }
161
+
162
+ declare class Pipeline {
163
+ private orchestrator;
164
+ private worker;
165
+ private git;
166
+ private config;
167
+ private plan;
168
+ private changeQueue;
169
+ constructor(config: ForgeConfig);
170
+ runSprint(description: string): Promise<void>;
171
+ runPlanPhase(description: string, attempt?: number): Promise<Plan | null>;
172
+ runDesignPhase(plan: Plan): Promise<void>;
173
+ runBuildPhase(plan: Plan): Promise<void>;
174
+ runReviewPhase(plan: Plan): Promise<void>;
175
+ queueChange(change: QueuedChange): void;
176
+ private processQueue;
177
+ private displayPlan;
178
+ private getAllStories;
179
+ private getStoriesByType;
180
+ private tagCounter;
181
+ private getNextTagNumber;
182
+ }
183
+
184
+ interface AutoPipelineOptions {
185
+ workingDir?: string;
186
+ sandbox?: boolean;
187
+ allowedDomains?: string[];
188
+ quiet?: boolean;
189
+ mute?: boolean;
190
+ deploy?: boolean;
191
+ skipDesign?: boolean;
192
+ }
193
+ declare class AutoPipeline {
194
+ private orchestrator;
195
+ private worker;
196
+ private git;
197
+ private config;
198
+ private plan;
199
+ private options;
200
+ private chatQueue;
201
+ private rl;
202
+ private startTime;
203
+ private totalUsage;
204
+ private shuttingDown;
205
+ private activeSpinner;
206
+ private tagCounter;
207
+ constructor(config: ForgeConfig, options?: AutoPipelineOptions);
208
+ private setupGracefulShutdown;
209
+ resume(existingPlan: Plan): Promise<{
210
+ success: boolean;
211
+ plan: Plan;
212
+ errors: string[];
213
+ }>;
214
+ run(description: string): Promise<{
215
+ success: boolean;
216
+ plan: Plan | null;
217
+ errors: string[];
218
+ }>;
219
+ /** Save current progress when a phase fails — prevents data loss */
220
+ private saveProgressOnError;
221
+ private elapsed;
222
+ private makeProgress;
223
+ private showInputHint;
224
+ private groupByDependency;
225
+ private runDesignPhase;
226
+ private designSingleStory;
227
+ private runBuildPhase;
228
+ private buildSingleStory;
229
+ private generateReadme;
230
+ private reviewGate;
231
+ private runReviewPhase;
232
+ private autoFix;
233
+ private runDeployPhase;
234
+ private startChatListener;
235
+ private stopChatListener;
236
+ private processChatQueue;
237
+ private printSummary;
238
+ private addUsage;
239
+ private formatTokens;
240
+ private formatCost;
241
+ private syncToGitHub;
242
+ private autoPush;
243
+ private displayPlan;
244
+ private getAllStories;
245
+ private getStoriesByType;
246
+ }
247
+
248
+ declare class GitManager {
249
+ private git;
250
+ private basePath;
251
+ private cachedBranch;
252
+ private repoVerified;
253
+ constructor(basePath?: string);
254
+ createBranch(name: string): Promise<void>;
255
+ checkout(branch: string): Promise<void>;
256
+ merge(branch: string): Promise<void>;
257
+ deleteBranch(branch: string): Promise<void>;
258
+ getCurrentBranch(): Promise<string>;
259
+ listBranches(): Promise<string[]>;
260
+ commitAll(message: string): Promise<void>;
261
+ commitState(message: string): Promise<void>;
262
+ tag(name: string): Promise<void>;
263
+ listTags(): Promise<string[]>;
264
+ checkoutTag(tagName: string): Promise<void>;
265
+ getDiff(branch: string): Promise<string>;
266
+ /** Diff between any two refs (tags, commits, branches) */
267
+ getDiff2(ref1: string, ref2: string): Promise<string>;
268
+ getLog(count?: number): Promise<any[]>;
269
+ /** Get the current HEAD commit hash */
270
+ getHead(): Promise<string>;
271
+ /** Revert a specific commit (creates a new revert commit) */
272
+ revertCommit(hash: string): Promise<void>;
273
+ /** Get forge-related commits (feat:, fix:, forge:, docs:, ci:) */
274
+ getForgeLog(count?: number): Promise<Array<{
275
+ hash: string;
276
+ date: string;
277
+ message: string;
278
+ }>>;
279
+ /** Get tags pointing at a specific commit */
280
+ getTagsAtCommit(hash: string): Promise<string[]>;
281
+ /** Check if a remote named 'origin' exists */
282
+ hasRemote(): Promise<boolean>;
283
+ /** Push current branch to origin */
284
+ push(): Promise<void>;
285
+ /** Push tags to origin */
286
+ pushTags(): Promise<void>;
287
+ isClean(): Promise<boolean>;
288
+ hasUncommittedChanges(): Promise<boolean>;
289
+ ensureRepo(): Promise<void>;
290
+ ensureMainBranch(): Promise<void>;
291
+ /** Commit any uncommitted changes before branch operations */
292
+ private stashDirtyState;
293
+ /** Ensure .gitignore covers build artifacts and forge internals */
294
+ private ensureGitignore;
295
+ }
296
+
297
+ declare class StateManager {
298
+ private basePath;
299
+ private cache;
300
+ private dirCreated;
301
+ constructor(basePath?: string);
302
+ /** Clear all caches (call when basePath changes) */
303
+ clearCache(): void;
304
+ private forgePath;
305
+ private rootPath;
306
+ savePlan(plan: Plan): Promise<void>;
307
+ getPlan(): Promise<Plan | null>;
308
+ hasPlan(): Promise<boolean>;
309
+ getState(): Promise<SprintState>;
310
+ updatePhase(phase: Phase): Promise<void>;
311
+ updateState(updates: Partial<SprintState>): Promise<void>;
312
+ addHistoryEntry(entry: {
313
+ action: string;
314
+ storyId: string | null;
315
+ details: string;
316
+ snapshotId?: string;
317
+ }): Promise<void>;
318
+ getConfig(): Promise<ForgeConfig | null>;
319
+ isInitialized(): Promise<boolean>;
320
+ saveSnapshot(data: {
321
+ action: string;
322
+ storyId: string | null;
323
+ branch: string;
324
+ commitBefore?: string;
325
+ }): Promise<string>;
326
+ getSnapshot(id: string): Promise<Snapshot | null>;
327
+ listSnapshots(): Promise<Snapshot[]>;
328
+ saveDesignReferences(files: string[]): Promise<void>;
329
+ getDesignReferences(): Promise<string[]>;
330
+ private readJson;
331
+ private writeJson;
332
+ private fileExists;
333
+ }
334
+ declare const stateManager: StateManager;
335
+
336
+ interface FrameworkAdapter {
337
+ /** Framework identifier */
338
+ id: string;
339
+ /** Human-readable name */
340
+ name: string;
341
+ /** Language used */
342
+ language: "typescript" | "python";
343
+ /** Commands to scaffold a new project (run in order) */
344
+ scaffoldCommands: string[];
345
+ /** Command to build the project */
346
+ buildCommand: string;
347
+ /** Command to lint the project */
348
+ lintCommand: string;
349
+ /** Command to type-check */
350
+ typecheckCommand: string;
351
+ /** Command to start dev server */
352
+ devCommand: string;
353
+ /** Port for dev server */
354
+ devPort: number;
355
+ /** Whether Storybook design phase is supported */
356
+ designSupport: boolean;
357
+ /** Extra system prompt instructions for the Worker build mode */
358
+ buildPromptAdditions: string;
359
+ /** Extra system prompt instructions for the Worker design mode */
360
+ designPromptAdditions: string;
361
+ /** Description of the expected project file structure */
362
+ fileStructure: string;
363
+ /** Package manager to use */
364
+ packageManager: "npm" | "pip" | "poetry";
365
+ /** Files that should always exist after scaffold */
366
+ requiredFiles: string[];
367
+ }
368
+
369
+ /** Get the adapter for a framework. Throws if unknown. */
370
+ declare function getAdapter(framework: string): FrameworkAdapter;
371
+ /** List all supported frameworks */
372
+ declare function listAdapters(): FrameworkAdapter[];
373
+
374
+ interface ConfigValidation {
375
+ valid: boolean;
376
+ errors: string[];
377
+ warnings: string[];
378
+ }
379
+ declare function validateConfig(config: any): ConfigValidation;
380
+ /** Validate config and print errors. Returns config if valid, null if not. */
381
+ declare function loadAndValidateConfig(raw: any): ForgeConfig | null;
382
+
383
+ /**
384
+ * Play a system notification sound (fire-and-forget).
385
+ * Skips silently if not a TTY.
386
+ */
387
+ declare function playSound(): void;
388
+
389
+ export { AutoPipeline, type ConfigValidation, type DesignMeta, type Epic, type ForgeConfig, type FrameworkAdapter, GitManager, type HistoryEntry, Orchestrator, type OrchestratorDecision, type Phase, Pipeline, type Plan, type QueuedChange, type Snapshot, type SprintState, type Story, type StoryStatus, type StoryType, Worker, type WorkerMode, type WorkerProgressCallback, type WorkerResult, type WorkerUsage, getAdapter, listAdapters, loadAndValidateConfig, playSound, stateManager, validateConfig };