@forgelore/cli 0.1.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/index.ts","../src/commands/init.ts","../src/ui/banner.ts","../src/ui/theme.ts","../src/commands/propose.ts","../src/commands/status.ts","../src/commands/clarify.ts","../src/commands/list.ts","../src/commands/verify.ts","../src/commands/archive.ts","../src/commands/sync.ts","../src/commands/doctor.ts","../src/commands/capabilities.ts","../src/commands/config.ts","../src/commands/diff.ts"],"sourcesContent":["/**\n * forgelore CLI\n * Spec-driven development for AI-assisted teams\n * Forge knowledge, shape code.\n */\n\nimport { Command } from \"commander\";\nimport { initCommand } from \"./commands/init.js\";\nimport { proposeCommand } from \"./commands/propose.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { clarifyCommand } from \"./commands/clarify.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { verifyCommand } from \"./commands/verify.js\";\nimport { archiveCommand } from \"./commands/archive.js\";\nimport { syncCommand } from \"./commands/sync.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { capabilitiesCommand } from \"./commands/capabilities.js\";\nimport { configCommand } from \"./commands/config.js\";\nimport { diffCommand } from \"./commands/diff.js\";\nimport { renderAnimatedBanner } from \"./ui/banner.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"forgelore\")\n .description(\"Spec-driven development for AI-assisted teams — forge knowledge, shape code\")\n .version(\"0.1.0\");\n\n// --- init ---\nprogram\n .command(\"init\")\n .description(\"Initialize forgelore in the current project\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => initCommand({ cwd: opts.cwd }));\n\n// --- propose ---\nprogram\n .command(\"propose [idea]\")\n .description(\"Create a new change proposal\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((idea, opts) => proposeCommand(idea, { cwd: opts.cwd }));\n\n// --- clarify ---\nprogram\n .command(\"clarify <change>\")\n .description(\"Review and refine requirements for a change\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => clarifyCommand(change, { cwd: opts.cwd }));\n\n// --- status ---\nprogram\n .command(\"status\")\n .description(\"Show project status dashboard\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => statusCommand({ cwd: opts.cwd }));\n\n// --- list ---\nprogram\n .command(\"list\")\n .description(\"List all changes\")\n .option(\"-a, --archived\", \"Include archived changes\")\n .option(\"-s, --status <status>\", \"Filter by status\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => listCommand({ archived: opts.archived, status: opts.status, cwd: opts.cwd }));\n\n// --- verify ---\nprogram\n .command(\"verify [change]\")\n .description(\"Verify a change against its specs (structural check)\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => verifyCommand(change, { cwd: opts.cwd }));\n\n// --- archive ---\nprogram\n .command(\"archive <change>\")\n .description(\"Archive a completed change and extract capabilities\")\n .option(\"--skip-outcome\", \"Skip outcome.md generation step\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => archiveCommand(change, { skipOutcome: opts.skipOutcome, cwd: opts.cwd }));\n\n// --- sync ---\nprogram\n .command(\"sync\")\n .description(\"Sync with the global spec repository\")\n .option(\"--force\", \"Force sync even if local changes exist\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => syncCommand({ force: opts.force, cwd: opts.cwd }));\n\n// --- doctor ---\nprogram\n .command(\"doctor\")\n .description(\"Check forgelore health and diagnose issues\")\n .option(\"--fix\", \"Attempt to fix detected issues\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => doctorCommand({ fix: opts.fix, cwd: opts.cwd }));\n\n// --- capabilities ---\nprogram\n .command(\"capabilities\")\n .alias(\"caps\")\n .description(\"List all registered capabilities\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((opts) => capabilitiesCommand({ json: opts.json, cwd: opts.cwd }));\n\n// --- config ---\nprogram\n .command(\"config [key] [value]\")\n .description(\"Get or set configuration values\")\n .option(\"--list\", \"List all config values\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((key, value, opts) => configCommand(key, value, { list: opts.list, cwd: opts.cwd }));\n\n// --- diff ---\nprogram\n .command(\"diff [change]\")\n .description(\"Show drift between specs and implementation\")\n .option(\"-C, --cwd <path>\", \"Working directory\")\n .action((change, opts) => diffCommand(change, { cwd: opts.cwd }));\n\n// Default: animated banner + help\nprogram.action(async () => {\n await renderAnimatedBanner();\n program.outputHelp();\n});\n\nprogram.parse();\n","/**\n * forgelore init command\n * Scaffold forgelore in a project, configure mode and paths\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport {\n createDefaultConfig,\n writeConfig,\n configExists,\n getForgeloreDir,\n type SpecMode,\n type ForgeloreConfig,\n} from \"@forgelore/core\";\nimport { scaffoldSpecDirs } from \"@forgelore/core\";\nimport { scaffoldKnowledge } from \"@forgelore/core\";\nimport { renderBanner, renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function initCommand(options: { cwd?: string }): Promise<void> {\n const projectRoot = resolve(options.cwd || process.cwd());\n\n console.log(renderBanner());\n\n // Check if already initialized\n if (await configExists(projectRoot)) {\n console.log(\n renderBox(\n `${icons.warning} forgelore is already initialized in this project.\\n` +\n `${colors.muted(\"Run\")} ${colors.primary(\"forgelore status\")} ${colors.muted(\"to see current state.\")}`,\n \"Already Initialized\"\n )\n );\n return;\n }\n\n p.intro(gradients.brand(\" forgelore init \"));\n\n // Choose mode\n const mode = (await p.select({\n message: \"How do you want to manage specs?\",\n options: [\n {\n value: \"local\",\n label: \"Local only\",\n hint: \"Specs live in this repo only\",\n },\n {\n value: \"local+global\",\n label: \"Local + Global\",\n hint: \"Local specs + a shared company spec repo\",\n },\n {\n value: \"global\",\n label: \"Global only\",\n hint: \"Reference a shared spec repo\",\n },\n ],\n })) as SpecMode;\n\n if (p.isCancel(mode)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n // Configure global source if needed\n let globalSource: string | undefined;\n if (mode === \"local+global\" || mode === \"global\") {\n const source = await p.text({\n message: \"Global spec source (filesystem path or GitHub URL):\",\n placeholder: \"/path/to/company-specs or https://github.com/org/specs\",\n validate: (val) => {\n if (!val) return \"Please enter a path or URL\";\n return undefined;\n },\n });\n\n if (p.isCancel(source)) {\n p.cancel(\"Init cancelled.\");\n process.exit(0);\n }\n\n globalSource = source as string;\n }\n\n // Create config\n const config = createDefaultConfig(mode);\n if (globalSource) {\n const isUrl =\n globalSource.startsWith(\"http://\") || globalSource.startsWith(\"https://\");\n config.global = {\n source: globalSource,\n path: isUrl\n ? `~/.cache/forgelore/global/${globalSource.split(\"/\").pop()}`\n : globalSource,\n autoSync: true,\n };\n }\n\n // Scaffold\n const spinner = ora({\n text: \"Scaffolding forgelore...\",\n color: \"magenta\",\n }).start();\n\n try {\n const forgeloreDir = getForgeloreDir(projectRoot);\n await mkdir(forgeloreDir, { recursive: true });\n\n spinner.text = \"Creating directory structure...\";\n await scaffoldSpecDirs(projectRoot);\n\n spinner.text = \"Setting up knowledge base...\";\n await scaffoldKnowledge(projectRoot);\n\n spinner.text = \"Writing config...\";\n await writeConfig(projectRoot, config);\n\n spinner.succeed(colors.success(\"forgelore initialized\"));\n } catch (err) {\n spinner.fail(colors.error(\"Failed to initialize forgelore\"));\n console.error(err);\n process.exit(1);\n }\n\n // Summary\n const summary = [\n `${icons.success} ${colors.white(\"Created:\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/forgelore.json\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/changes/\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/architecture.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/patterns.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/glossary.md\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/capabilities/\")}`,\n ` ${icons.bullet} ${colors.muted(\"forgelore/knowledge/decisions/\")}`,\n \"\",\n `${icons.info} Mode: ${colors.primary(mode)}`,\n ];\n\n if (globalSource) {\n summary.push(`${icons.info} Global: ${colors.secondary(globalSource)}`);\n }\n\n console.log(renderBox(summary.join(\"\\n\"), \"Setup Complete\", \"#10B981\"));\n\n p.outro(\n `Run ${colors.primary(\"forgelore propose\")} ${colors.muted('\"your idea\"')} to create your first spec.`\n );\n}\n","/**\n * forgelore CLI banner and branding\n * Anvil + book ASCII art with forge spark animations\n */\n\nimport boxen from \"boxen\";\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\nimport { colors } from \"./theme.js\";\n\n// Brand gradients: forge (warm) → lore (cool)\nconst forgeGradient = gradient([\"#FF6B35\", \"#FFD700\"]);\nconst loreGradient = gradient([\"#7C3AED\", \"#06B6D4\"]);\nconst brandGradient = gradient([\"#FF6B35\", \"#FFD700\", \"#7C3AED\", \"#06B6D4\"]);\nconst sparkColor = chalk.hex(\"#FFD700\");\nconst emberColor = chalk.hex(\"#FF6B35\");\n\n// Per-character gradient for FORGELORE title\nconst TITLE_GRADIENT = [\n \"#FF6B35\", // F - forge orange\n \"#FF8E3C\", // O\n \"#FFB347\", // R\n \"#FFD700\", // G - spark gold\n \"#C9A832\", // E\n \"#9B6FC0\", // L - transitioning\n \"#7C3AED\", // O - lore violet\n \"#4196CB\", // R\n \"#06B6D4\", // E - lore cyan\n];\n\n// Book (lore) sitting on anvil (forge)\nconst BOOK_LINES = [\n \" .───────────.\",\n \" ╱ ≡ ≡ ≡ ≡ ≡ ╱│\",\n \" ╱ ≡ ≡ ≡ ≡ ≡ ╱ │\",\n \" ├───────────┤ │\",\n \" │ ≡ ≡ ≡ ≡ ≡ │ │\",\n \" │ ≡ ≡ ≡ ≡ ≡ │ ╱\",\n \" │ ≡ ≡ ≡ ≡ ≡ │╱\",\n \" └─────┬─────┘\",\n];\n\nconst ANVIL_LINES = [\n \" ╔═══╧════╗\",\n \" ━━━━━╣████████╠━━━━━\",\n \" ║████████║\",\n \" ╚═══╤════╝\",\n \" █████╧██████\",\n \" ████████████████\",\n];\n\nconst SPARK_CHARS = [\"✦\", \"✧\", \"·\", \"✶\", \"∗\"];\n\nfunction getColoredBook(): string[] {\n return BOOK_LINES.map((l) => loreGradient(l));\n}\n\nfunction getColoredAnvil(): string[] {\n return ANVIL_LINES.map((l) => forgeGradient(l));\n}\n\nfunction getTitle(): string {\n return \"FORGELORE\"\n .split(\"\")\n .map((ch, i) => chalk.bold(chalk.hex(TITLE_GRADIENT[i])(ch)))\n .join(\"\");\n}\n\nfunction randomSpark(): string {\n return sparkColor(\n SPARK_CHARS[Math.floor(Math.random() * SPARK_CHARS.length)]\n );\n}\n\nfunction generateSparkLine(width = 30): string {\n const chars = new Array(width).fill(\" \");\n const count = 2 + Math.floor(Math.random() * 4);\n for (let i = 0; i < count; i++) {\n const pos = Math.floor(Math.random() * width);\n chars[pos] = randomSpark();\n }\n return chars.join(\"\");\n}\n\n// ANSI helpers\nconst HIDE_CURSOR = \"\\x1b[?25l\";\nconst SHOW_CURSOR = \"\\x1b[?25h\";\nconst CLEAR_LINE = \"\\x1b[2K\";\nfunction moveUp(n: number): string {\n return n > 0 ? `\\x1b[${n}A` : \"\";\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\n/**\n * Static banner — used in non-TTY or when animation isn't wanted\n */\nexport function renderBanner(): string {\n const book = getColoredBook().join(\"\\n\");\n const anvil = getColoredAnvil().join(\"\\n\");\n const title = ` ${getTitle()}`;\n const tagline = colors.muted(\" forge knowledge, shape code\");\n const version = chalk.dim(\" v0.1.0\");\n return `\\n${book}\\n${anvil}\\n\\n${title}\\n${tagline}${version}\\n`;\n}\n\n/**\n * Animated banner — anvil rises, book drops, sparks fly, title types out\n * Only runs in interactive TTY; falls back to static otherwise\n */\nexport async function renderAnimatedBanner(): Promise<void> {\n if (!process.stdout.isTTY) {\n console.log(renderBanner());\n return;\n }\n\n const bookColored = getColoredBook();\n const anvilColored = getColoredAnvil();\n const allLines = [...bookColored, ...anvilColored];\n const totalHeight = allLines.length;\n\n process.stdout.write(HIDE_CURSOR);\n\n try {\n console.log(\"\"); // top spacing\n\n // Phase 1: Anvil rises from below (bottom-up reveal)\n for (let i = anvilColored.length - 1; i >= 0; i--) {\n const visible = anvilColored.slice(i);\n for (const line of visible) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n await sleep(45);\n if (i > 0) {\n process.stdout.write(moveUp(visible.length));\n }\n }\n\n // Phase 2: Book drops onto anvil (top-down reveal)\n const anvilHeight = anvilColored.length;\n process.stdout.write(moveUp(anvilHeight));\n\n for (let i = bookColored.length - 1; i >= 0; i--) {\n const visibleBook = bookColored.slice(i);\n const frame = [...visibleBook, ...anvilColored];\n for (const line of frame) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n await sleep(35);\n process.stdout.write(moveUp(frame.length));\n }\n\n // Redraw complete art\n for (const line of allLines) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n\n // Phase 3: Sparks fly from the anvil\n for (let cycle = 0; cycle < 5; cycle++) {\n await sleep(90);\n process.stdout.write(moveUp(totalHeight));\n\n for (let i = 0; i < totalHeight; i++) {\n const line = allLines[i];\n // Add random sparks to the right of anvil lines and around the impact point\n let spark = \"\";\n if (i >= bookColored.length - 2 && i <= bookColored.length + 2) {\n // Near the book-anvil junction — more sparks\n if (Math.random() > 0.3) {\n spark = \" \" + randomSpark();\n if (Math.random() > 0.5) spark += \" \" + randomSpark();\n }\n } else if (Math.random() > 0.7) {\n spark = \" \" + randomSpark();\n }\n process.stdout.write(CLEAR_LINE + line + spark + \"\\n\");\n }\n }\n\n // Final clean render (no sparks)\n process.stdout.write(moveUp(totalHeight));\n for (const line of allLines) {\n process.stdout.write(CLEAR_LINE + line + \"\\n\");\n }\n\n // Phase 4: Title types out letter by letter\n console.log(\"\");\n process.stdout.write(\" \");\n const title = \"FORGELORE\";\n for (let i = 0; i < title.length; i++) {\n // Flash as ember block, then resolve to colored letter\n process.stdout.write(emberColor(\"█\"));\n await sleep(35);\n process.stdout.write(\"\\b\" + chalk.bold(chalk.hex(TITLE_GRADIENT[i])(title[i])));\n await sleep(50);\n }\n console.log(\"\");\n\n // Phase 5: Tagline fades in\n await sleep(200);\n console.log(colors.muted(\" forge knowledge, shape code\") + chalk.dim(\" v0.1.0\"));\n console.log(\"\");\n } finally {\n process.stdout.write(SHOW_CURSOR);\n }\n}\n\n/**\n * Render a boxed section with forge-themed border\n */\nexport function renderBox(\n content: string,\n title?: string,\n borderColor = \"#FF6B35\"\n): string {\n return boxen(content, {\n padding: 1,\n margin: { top: 0, bottom: 1, left: 0, right: 0 },\n borderStyle: \"round\",\n borderColor,\n title,\n titleAlignment: \"left\",\n });\n}\n\n/**\n * Render a titled section with brand gradient\n */\nexport function renderSection(title: string, content: string): string {\n return `\\n${brandGradient(` ${title} `)}\\n${content}\\n`;\n}\n","/**\n * forgelore CLI theme\n * Forge-inspired colors, gradients, and visual constants\n */\n\nimport chalk from \"chalk\";\nimport gradient from \"gradient-string\";\n\n// Brand colors — forge (warm) + lore (cool)\nexport const colors = {\n primary: chalk.hex(\"#FF6B35\"), // forge orange\n secondary: chalk.hex(\"#06B6D4\"), // lore cyan\n accent: chalk.hex(\"#FFD700\"), // spark gold\n lore: chalk.hex(\"#7C3AED\"), // lore violet\n success: chalk.hex(\"#10B981\"), // emerald\n warning: chalk.hex(\"#F97316\"), // orange\n error: chalk.hex(\"#EF4444\"), // red\n muted: chalk.hex(\"#6B7280\"), // gray\n dim: chalk.dim,\n bold: chalk.bold,\n white: chalk.white,\n};\n\n// Gradients\nexport const gradients = {\n brand: gradient([\"#FF6B35\", \"#FFD700\", \"#7C3AED\", \"#06B6D4\"]),\n forge: gradient([\"#FF6B35\", \"#FFD700\"]),\n lore: gradient([\"#7C3AED\", \"#06B6D4\"]),\n warm: gradient([\"#F59E0B\", \"#EF4444\"]),\n cool: gradient([\"#06B6D4\", \"#7C3AED\"]),\n success: gradient([\"#10B981\", \"#06B6D4\"]),\n sunset: gradient([\"#F97316\", \"#EF4444\", \"#7C3AED\"]),\n};\n\n// Status icons\nexport const icons = {\n success: colors.success(\"\\u2713\"),\n error: colors.error(\"\\u2717\"),\n warning: colors.warning(\"\\u26A0\"),\n info: colors.secondary(\"\\u25C6\"),\n pending: colors.muted(\"\\u25CB\"),\n inProgress: colors.accent(\"\\u25CF\"),\n arrow: colors.primary(\"\\u2192\"),\n bullet: colors.muted(\"\\u2022\"),\n star: colors.accent(\"\\u2605\"),\n spark: colors.accent(\"\\u2726\"),\n anvil: colors.primary(\"\\u2692\"),\n};\n\n// Status colors for tasks/changes\nexport function statusColor(status: string): string {\n switch (status) {\n case \"passed\":\n case \"validated\":\n case \"archived\":\n return colors.success(status);\n case \"failed\":\n return colors.error(status);\n case \"in-progress\":\n case \"claimed\":\n case \"implementing\":\n case \"validating\":\n return colors.accent(status);\n case \"blocked\":\n return colors.error(status);\n case \"pending\":\n case \"proposed\":\n case \"planning\":\n return colors.muted(status);\n default:\n return colors.white(status);\n }\n}\n\n// Progress bar\nexport function progressBar(percent: number, width = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n const bar =\n colors.success(\"\\u2588\".repeat(filled)) + colors.muted(\"\\u2591\".repeat(empty));\n return `${bar} ${percent}%`;\n}\n","/**\n * forgelore propose command\n * Create a new change with proposal, specs, design, and tasks\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n createChange,\n} from \"@forgelore/core\";\nimport { renderBanner, renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n}\n\nexport async function proposeCommand(\n idea?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n // Check if initialized\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\n` +\n `Run ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore propose \"));\n\n // Get the idea if not provided\n let ideaText = idea;\n if (!ideaText) {\n const input = await p.text({\n message: \"What do you want to build?\",\n placeholder: \"e.g., Add dark mode toggle to settings\",\n validate: (val) => {\n if (!val) return \"Please describe your idea\";\n return undefined;\n },\n });\n\n if (p.isCancel(input)) {\n p.cancel(\"Propose cancelled.\");\n process.exit(0);\n }\n\n ideaText = input as string;\n }\n\n // Generate a slug name\n const suggestedName = slugify(ideaText).slice(0, 50);\n const nameInput = await p.text({\n message: \"Change name (used as folder name):\",\n placeholder: suggestedName,\n defaultValue: suggestedName,\n validate: (val) => {\n if (!val) return \"Please enter a name\";\n if (!/^[a-z0-9-]+$/.test(val))\n return \"Use lowercase letters, numbers, and hyphens only\";\n return undefined;\n },\n });\n\n if (p.isCancel(nameInput)) {\n p.cancel(\"Propose cancelled.\");\n process.exit(0);\n }\n\n const changeName = (nameInput as string) || suggestedName;\n\n // Build the proposal content\n const proposalContent = `# Proposal: ${ideaText}\n\n## Motivation\n\n<!-- Why are we doing this? What problem does it solve? -->\n\n\n## Scope\n\n<!-- What is included and excluded from this change? -->\n\n### In Scope\n\n\n### Out of Scope\n\n\n## Context\n\n<!-- Any relevant context, links, or references -->\n\n\n## Success Criteria\n\n<!-- How do we know this is done? -->\n\n1. \n\n---\n\n*Proposed: ${new Date().toISOString().slice(0, 10)}*\n`;\n\n // Create the change\n const spinner = ora({\n text: \"Creating change...\",\n color: \"magenta\",\n }).start();\n\n try {\n const change = await createChange(projectRoot, changeName, proposalContent);\n spinner.succeed(colors.success(`Created change: ${changeName}`));\n\n const files = [\n `forgelore/changes/${changeName}/proposal.md`,\n `forgelore/changes/${changeName}/specs/requirements.md`,\n `forgelore/changes/${changeName}/specs/scenarios.md`,\n `forgelore/changes/${changeName}/design.md`,\n `forgelore/changes/${changeName}/tasks.md`,\n ];\n\n const summary = [\n `${icons.success} ${colors.white(\"Change created:\")} ${colors.primary(changeName)}`,\n \"\",\n `${colors.white(\"Files:\")}`,\n ...files.map((f) => ` ${icons.bullet} ${colors.muted(f)}`),\n \"\",\n `${colors.muted(\"Next steps:\")}`,\n ` 1. Fill in ${colors.primary(\"proposal.md\")} with motivation and scope`,\n ` 2. Define requirements in ${colors.primary(\"specs/requirements.md\")}`,\n ` 3. Add scenarios in ${colors.primary(\"specs/scenarios.md\")}`,\n ` 4. Describe approach in ${colors.primary(\"design.md\")}`,\n ` 5. Break into tasks in ${colors.primary(\"tasks.md\")}`,\n ];\n\n console.log(renderBox(summary.join(\"\\n\"), \"Proposed\", \"#7C3AED\"));\n } catch (err) {\n spinner.fail(colors.error(\"Failed to create change\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n\n p.outro(\n `Run ${colors.primary(\"forgelore clarify\")} ${colors.muted(changeName)} to refine requirements.`\n );\n}\n","/**\n * forgelore status command\n * Beautiful dashboard showing all changes, progress, and capabilities\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n readConfig,\n listCapabilities,\n getProjectSummary,\n} from \"@forgelore/core\";\nimport { renderBanner, renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients, statusColor, progressBar } from \"../ui/theme.js\";\n\nexport async function statusCommand(options?: { cwd?: string }): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n // Check if initialized\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\n` +\n `Run ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n console.log(renderBanner());\n\n const config = await readConfig(projectRoot);\n const summary = await getProjectSummary(projectRoot);\n const capabilities = await listCapabilities(projectRoot);\n\n // Header stats\n const statsLine = [\n `${colors.primary(String(summary.activeChanges))} active`,\n `${colors.success(String(summary.archivedChanges))} archived`,\n `${colors.secondary(String(summary.totalCapabilities))} capabilities`,\n `${colors.muted(\"mode:\")} ${colors.accent(config.mode)}`,\n ].join(colors.muted(\" \\u2502 \"));\n\n console.log(renderBox(statsLine, \"forgelore status\", \"#7C3AED\"));\n\n // Active changes table\n if (summary.changes.length > 0) {\n const table = new Table({\n head: [\n colors.bold(\"Change\"),\n colors.bold(\"Status\"),\n colors.bold(\"Tasks\"),\n colors.bold(\"Progress\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [30, 14, 10, 30],\n });\n\n for (const change of summary.changes) {\n const ts = change.taskSummary;\n const taskStr =\n ts.total > 0\n ? `${ts.passed}/${ts.total}`\n : colors.muted(\"none\");\n const progress =\n ts.total > 0 ? progressBar(ts.completionPercent) : colors.muted(\"--\");\n\n table.push([\n colors.white(change.name),\n statusColor(change.status),\n taskStr,\n progress,\n ]);\n }\n\n console.log(renderSection(\"Active Changes\", table.toString()));\n } else {\n console.log(\n renderSection(\n \"Active Changes\",\n ` ${colors.muted(\"No active changes.\")} Run ${colors.primary(\"forgelore propose\")} to create one.`\n )\n );\n }\n\n // Capabilities\n if (capabilities.length > 0) {\n const capTable = new Table({\n head: [\n colors.bold(\"Capability\"),\n colors.bold(\"Source\"),\n colors.bold(\"Archived\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [30, 25, 16],\n });\n\n for (const cap of capabilities.slice(0, 10)) {\n capTable.push([\n colors.white(cap.name),\n colors.muted(cap.sourceChange),\n colors.dim(cap.archivedAt.slice(0, 10)),\n ]);\n }\n\n const moreText =\n capabilities.length > 10\n ? `\\n ${colors.muted(`...and ${capabilities.length - 10} more. Run`)} ${colors.primary(\"forgelore capabilities\")} ${colors.muted(\"to see all.\")}`\n : \"\";\n\n console.log(\n renderSection(\"Capabilities\", capTable.toString() + moreText)\n );\n } else {\n console.log(\n renderSection(\n \"Capabilities\",\n ` ${colors.muted(\"No capabilities yet.\")} Archive a completed change to start building the knowledge base.`\n )\n );\n }\n\n // Global sync status\n if (config.mode === \"local+global\" || config.mode === \"global\") {\n const globalInfo = config.global\n ? ` ${icons.info} Source: ${colors.secondary(config.global.source)}\\n` +\n ` ${icons.info} Path: ${colors.muted(config.global.path)}\\n` +\n ` ${icons.info} Auto-sync: ${config.global.autoSync ? colors.success(\"enabled\") : colors.muted(\"disabled\")}`\n : ` ${colors.warning(\"Global spec repo not configured.\")}`;\n\n console.log(renderSection(\"Global Specs\", globalInfo));\n }\n}\n","/**\n * forgelore clarify command\n * Review and refine requirements for a change\n */\n\nimport * as p from \"@clack/prompts\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n readChangeFile,\n updateChangeStatus,\n getChangePath,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function clarifyCommand(\n changeName: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore clarify \"));\n\n let change;\n try {\n change = await readChange(projectRoot, changeName);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.\\nRun ${colors.primary(\"forgelore list\")} to see available changes.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // Show current state\n const proposal = await readChangeFile(projectRoot, changeName, \"proposal.md\");\n let requirements: string;\n try {\n requirements = await readChangeFile(projectRoot, changeName, \"specs/requirements.md\");\n } catch {\n requirements = \"(not yet defined)\";\n }\n\n let scenarios: string;\n try {\n scenarios = await readChangeFile(projectRoot, changeName, \"specs/scenarios.md\");\n } catch {\n scenarios = \"(not yet defined)\";\n }\n\n console.log(\n renderBox(\n [\n `${icons.info} Change: ${colors.primary(changeName)}`,\n `${icons.info} Status: ${colors.accent(change.status)}`,\n `${icons.info} Created: ${colors.muted(change.createdAt.slice(0, 10))}`,\n ].join(\"\\n\"),\n \"Change Details\"\n )\n );\n\n console.log(renderSection(\"Proposal\", colors.muted(proposal.slice(0, 500))));\n console.log(renderSection(\"Requirements\", colors.muted(requirements.slice(0, 500))));\n console.log(renderSection(\"Scenarios\", colors.muted(scenarios.slice(0, 500))));\n\n // Clarification checklist\n const checks = await p.group({\n proposalComplete: () =>\n p.confirm({\n message: \"Is the proposal well-defined with clear motivation and scope?\",\n initialValue: false,\n }),\n requirementsDefined: () =>\n p.confirm({\n message: \"Are functional and non-functional requirements specified?\",\n initialValue: false,\n }),\n scenariosCovered: () =>\n p.confirm({\n message: \"Are happy path, edge cases, and error scenarios defined?\",\n initialValue: false,\n }),\n readyForDesign: () =>\n p.confirm({\n message: \"Is this change ready for design and task breakdown?\",\n initialValue: false,\n }),\n });\n\n if (p.isCancel(checks)) {\n p.cancel(\"Clarify cancelled.\");\n process.exit(0);\n }\n\n const allReady = checks.proposalComplete && checks.requirementsDefined && checks.scenariosCovered && checks.readyForDesign;\n\n if (allReady) {\n await updateChangeStatus(projectRoot, changeName, \"planning\");\n console.log(\n renderBox(\n `${icons.success} Change ${colors.primary(changeName)} is ready for design.\\n` +\n `Status updated to ${colors.accent(\"planning\")}.\\n\\n` +\n `Next: Fill in ${colors.primary(\"design.md\")} and ${colors.primary(\"tasks.md\")}`,\n \"Ready\",\n \"#10B981\"\n )\n );\n } else {\n const incomplete = [];\n if (!checks.proposalComplete) incomplete.push(` ${icons.pending} Proposal needs refinement`);\n if (!checks.requirementsDefined) incomplete.push(` ${icons.pending} Requirements need specification`);\n if (!checks.scenariosCovered) incomplete.push(` ${icons.pending} Scenarios need coverage`);\n\n console.log(\n renderBox(\n `${icons.warning} Change ${colors.primary(changeName)} needs more clarification:\\n\\n` +\n incomplete.join(\"\\n\") +\n `\\n\\n${colors.muted(\"Edit the spec files and run\")} ${colors.primary(\"forgelore clarify \" + changeName)} ${colors.muted(\"again.\")}`,\n \"Needs Work\",\n \"#F59E0B\"\n )\n );\n }\n\n p.outro(colors.muted(\"Specs are the foundation. Take the time to get them right.\"));\n}\n","/**\n * forgelore list command\n * List all changes with status and progress\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n listChanges,\n} from \"@forgelore/core\";\nimport { summarizeTasks } from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, statusColor, progressBar } from \"../ui/theme.js\";\n\nexport async function listCommand(options?: {\n archived?: boolean;\n status?: string;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n let changes = await listChanges(projectRoot, options?.archived ?? false);\n\n // Filter by status if specified\n if (options?.status) {\n changes = changes.filter((c) => c.status === options.status);\n }\n\n if (changes.length === 0) {\n const msg = options?.status\n ? `No changes with status \"${options.status}\".`\n : \"No changes found.\";\n console.log(\n renderBox(\n `${icons.info} ${msg}\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"Changes\"\n )\n );\n return;\n }\n\n const table = new Table({\n head: [\n colors.bold(\"Name\"),\n colors.bold(\"Status\"),\n colors.bold(\"Tasks\"),\n colors.bold(\"Progress\"),\n colors.bold(\"Updated\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [28, 14, 10, 26, 14],\n });\n\n for (const change of changes) {\n const ts = summarizeTasks(change.tasks);\n const taskStr = ts.total > 0 ? `${ts.passed}/${ts.total}` : colors.muted(\"--\");\n const progress = ts.total > 0 ? progressBar(ts.completionPercent) : colors.muted(\"--\");\n const updated = colors.dim(change.updatedAt.slice(0, 10));\n\n table.push([\n colors.white(change.name),\n statusColor(change.status),\n taskStr,\n progress,\n updated,\n ]);\n }\n\n const title = options?.archived ? \"All Changes (including archived)\" : \"Active Changes\";\n console.log(renderSection(title, table.toString()));\n console.log(\n colors.muted(` ${changes.length} change${changes.length === 1 ? \"\" : \"s\"} found`)\n );\n}\n","/**\n * forgelore verify command\n * Structural verification of a change's spec completeness\n * NOTE: This does NOT call any LLM — it checks file existence and content structure\n */\n\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n readChangeFile,\n listChanges,\n getChangePath,\n fileExists,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\ninterface VerifyCheck {\n name: string;\n passed: boolean;\n message: string;\n}\n\nasync function verifyChange(\n projectRoot: string,\n changeName: string\n): Promise<VerifyCheck[]> {\n const checks: VerifyCheck[] = [];\n const changePath = getChangePath(projectRoot, changeName);\n\n // Check proposal.md exists and has content\n try {\n const proposal = await readChangeFile(projectRoot, changeName, \"proposal.md\");\n const hasContent = proposal.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Proposal\",\n passed: hasContent,\n message: hasContent\n ? \"proposal.md has content\"\n : \"proposal.md is mostly empty — fill in motivation and scope\",\n });\n } catch {\n checks.push({\n name: \"Proposal\",\n passed: false,\n message: \"proposal.md is missing\",\n });\n }\n\n // Check requirements.md\n try {\n const reqs = await readChangeFile(projectRoot, changeName, \"specs/requirements.md\");\n const hasContent = reqs.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Requirements\",\n passed: hasContent,\n message: hasContent\n ? \"requirements.md has content\"\n : \"requirements.md is mostly empty — define functional and non-functional requirements\",\n });\n } catch {\n checks.push({\n name: \"Requirements\",\n passed: false,\n message: \"specs/requirements.md is missing\",\n });\n }\n\n // Check scenarios.md\n try {\n const scenarios = await readChangeFile(projectRoot, changeName, \"specs/scenarios.md\");\n const hasContent = scenarios.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Scenarios\",\n passed: hasContent,\n message: hasContent\n ? \"scenarios.md has content\"\n : \"scenarios.md is mostly empty — define happy path, edge cases, error cases\",\n });\n } catch {\n checks.push({\n name: \"Scenarios\",\n passed: false,\n message: \"specs/scenarios.md is missing\",\n });\n }\n\n // Check design.md\n try {\n const design = await readChangeFile(projectRoot, changeName, \"design.md\");\n const hasContent = design.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Design\",\n passed: hasContent,\n message: hasContent\n ? \"design.md has content\"\n : \"design.md is mostly empty — describe technical approach\",\n });\n } catch {\n checks.push({\n name: \"Design\",\n passed: false,\n message: \"design.md is missing\",\n });\n }\n\n // Check tasks.md\n try {\n const tasks = await readChangeFile(projectRoot, changeName, \"tasks.md\");\n const hasContent = tasks.replace(/<!--.*?-->/gs, \"\").trim().length > 50;\n checks.push({\n name: \"Tasks\",\n passed: hasContent,\n message: hasContent\n ? \"tasks.md has content\"\n : \"tasks.md is mostly empty — break down implementation into tasks\",\n });\n } catch {\n checks.push({\n name: \"Tasks\",\n passed: false,\n message: \"tasks.md is missing\",\n });\n }\n\n return checks;\n}\n\nexport async function verifyCommand(\n changeName?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // If no change specified, verify all active changes\n const changesToVerify: string[] = [];\n if (changeName) {\n changesToVerify.push(changeName);\n } else {\n const changes = await listChanges(projectRoot, false);\n if (changes.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No active changes to verify.\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"Nothing to Verify\"\n )\n );\n return;\n }\n changesToVerify.push(...changes.map((c) => c.name));\n }\n\n let totalPassed = 0;\n let totalChecks = 0;\n\n for (const name of changesToVerify) {\n try {\n const checks = await verifyChange(projectRoot, name);\n const passed = checks.filter((c) => c.passed).length;\n totalPassed += passed;\n totalChecks += checks.length;\n\n const lines = checks.map(\n (c) =>\n ` ${c.passed ? icons.success : icons.error} ${colors.white(c.name)}: ${c.passed ? colors.muted(c.message) : colors.warning(c.message)}`\n );\n\n const allPassed = passed === checks.length;\n const borderColor = allPassed ? \"#10B981\" : \"#F59E0B\";\n\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${passed}/${checks.length} checks passed\\n\\n${lines.join(\"\\n\")}`,\n name,\n borderColor\n )\n );\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(name)} not found.`,\n name,\n \"#EF4444\"\n )\n );\n }\n }\n\n // Summary\n if (changesToVerify.length > 1) {\n const allPassed = totalPassed === totalChecks;\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${totalPassed}/${totalChecks} total checks passed across ${changesToVerify.length} changes`,\n \"Summary\",\n allPassed ? \"#10B981\" : \"#F59E0B\"\n )\n );\n }\n}\n","/**\n * forgelore archive command\n * Two-step archive: 1) write outcome.md, 2) move to archive + extract capabilities\n */\n\nimport * as p from \"@clack/prompts\";\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readChange,\n archiveChange,\n readOutcome,\n writeOutcome,\n getChangePath,\n} from \"@forgelore/core\";\nimport { renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function archiveCommand(\n changeName: string,\n options?: { skipOutcome?: boolean; cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n p.intro(gradients.brand(\" forgelore archive \"));\n\n let change;\n try {\n change = await readChange(projectRoot, changeName);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // Check if outcome.md already exists\n const changePath = getChangePath(projectRoot, changeName);\n const existingOutcome = await readOutcome(changePath);\n\n if (!existingOutcome && !options?.skipOutcome) {\n // Step 1: outcome.md needs to be created\n console.log(\n renderBox(\n [\n `${icons.info} Before archiving, an ${colors.primary(\"outcome.md\")} should be created.`,\n \"\",\n `This file captures:`,\n ` ${icons.bullet} What was built and the final state`,\n ` ${icons.bullet} Capabilities that emerged from this change`,\n ` ${icons.bullet} Lessons learned and patterns established`,\n \"\",\n `${colors.muted(\"An AI agent can generate this, or you can write it manually.\")}`,\n `${colors.muted(\"Create\")} ${colors.primary(`forgelore/changes/${changeName}/outcome.md`)} ${colors.muted(\"and run archive again.\")}`,\n ].join(\"\\n\"),\n \"Step 1: Outcome\",\n \"#F59E0B\"\n )\n );\n\n const proceed = await p.confirm({\n message: \"Create a placeholder outcome.md and continue archiving?\",\n initialValue: false,\n });\n\n if (p.isCancel(proceed) || !proceed) {\n p.cancel(\"Archive paused. Create outcome.md and run archive again.\");\n process.exit(0);\n }\n\n // Write placeholder outcome\n const placeholderOutcome = `# Outcome: ${changeName}\n\n## What Was Built\n\n<!-- Summary of what was implemented -->\n\n\n## Capabilities\n\n<!-- List capabilities that emerged from this change -->\n<!-- Format: - **Capability Name**: Description -->\n\n- \n\n## Lessons Learned\n\n<!-- What did we learn? Any patterns to document? -->\n\n\n## Files Changed\n\n<!-- Key files that were created or modified -->\n\n- \n\n---\n\n*Archived: ${new Date().toISOString().slice(0, 10)}*\n`;\n\n await writeOutcome(changePath, placeholderOutcome);\n console.log(` ${icons.success} Created placeholder outcome.md`);\n }\n\n // Step 2: Archive\n const confirmArchive = await p.confirm({\n message: `Archive \"${changeName}\"? This will move it to forgelore/changes/archive/`,\n initialValue: true,\n });\n\n if (p.isCancel(confirmArchive) || !confirmArchive) {\n p.cancel(\"Archive cancelled.\");\n process.exit(0);\n }\n\n const spinner = ora({\n text: \"Archiving change...\",\n color: \"magenta\",\n }).start();\n\n try {\n const archivePath = await archiveChange(projectRoot, changeName);\n spinner.succeed(colors.success(\"Change archived\"));\n\n console.log(\n renderBox(\n [\n `${icons.success} ${colors.white(\"Archived:\")} ${colors.primary(changeName)}`,\n `${icons.arrow} ${colors.muted(archivePath)}`,\n \"\",\n `${colors.muted(\"Next steps:\")}`,\n ` 1. Review ${colors.primary(\"outcome.md\")} and extract capabilities`,\n ` 2. Run ${colors.primary(\"forgelore capabilities\")} to view the knowledge base`,\n ` 3. Update ${colors.primary(\"forgelore/knowledge/architecture.md\")} if needed`,\n ].join(\"\\n\"),\n \"Archived\",\n \"#10B981\"\n )\n );\n } catch (err) {\n spinner.fail(colors.error(\"Failed to archive\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n\n p.outro(colors.muted(\"Knowledge captured. The spec lives on.\"));\n}\n","/**\n * forgelore sync command\n * Sync with global spec repository\n */\n\nimport ora from \"ora\";\nimport { resolve } from \"node:path\";\nimport { execSync } from \"node:child_process\";\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport {\n configExists,\n readConfig,\n} from \"@forgelore/core\";\nimport { renderBox } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\nexport async function syncCommand(options?: {\n force?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const config = await readConfig(projectRoot);\n\n if (config.mode === \"local\") {\n console.log(\n renderBox(\n `${icons.info} Spec mode is ${colors.primary(\"local\")}. No global repo to sync.\\n` +\n `Run ${colors.primary(\"forgelore config mode local+global\")} to enable global specs.`,\n \"No Sync Needed\"\n )\n );\n return;\n }\n\n if (!config.global?.source) {\n console.log(\n renderBox(\n `${icons.error} Global spec source not configured.\\n` +\n `Run ${colors.primary(\"forgelore config global.source <path-or-url>\")} to set it.`,\n \"Not Configured\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const source = config.global.source;\n const isGitUrl = source.startsWith(\"http://\") || source.startsWith(\"https://\") || source.startsWith(\"git@\");\n const targetPath = config.global.path;\n\n const spinner = ora({\n text: `Syncing from ${source}...`,\n color: \"magenta\",\n }).start();\n\n try {\n if (isGitUrl) {\n // Git clone or pull\n if (existsSync(targetPath)) {\n spinner.text = \"Pulling latest changes...\";\n execSync(\"git pull --ff-only\", { cwd: targetPath, stdio: \"pipe\" });\n spinner.succeed(colors.success(\"Global specs updated (git pull)\"));\n } else {\n spinner.text = \"Cloning global spec repo...\";\n mkdirSync(targetPath, { recursive: true });\n execSync(`git clone ${source} ${targetPath}`, { stdio: \"pipe\" });\n spinner.succeed(colors.success(\"Global specs cloned\"));\n }\n } else {\n // Filesystem path — just validate it exists\n if (existsSync(source)) {\n spinner.succeed(\n colors.success(`Global specs linked: ${colors.muted(source)}`)\n );\n } else {\n spinner.fail(\n colors.error(`Global spec path not found: ${source}`)\n );\n process.exit(1);\n }\n }\n\n console.log(\n renderBox(\n [\n `${icons.success} Global specs synced`,\n `${icons.info} Source: ${colors.secondary(source)}`,\n `${icons.info} Path: ${colors.muted(targetPath)}`,\n ].join(\"\\n\"),\n \"Sync Complete\",\n \"#10B981\"\n )\n );\n } catch (err) {\n spinner.fail(colors.error(\"Sync failed\"));\n if (err instanceof Error) {\n console.error(colors.muted(err.message));\n }\n process.exit(1);\n }\n}\n","/**\n * forgelore doctor command\n * Health check and diagnostics for forgelore configuration\n */\n\nimport ora from \"ora\";\nimport { resolve, join } from \"node:path\";\nimport { mkdir } from \"node:fs/promises\";\nimport {\n configExists,\n readConfig,\n fileExists,\n getForgeloreDir,\n listChanges,\n listCapabilities,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\ninterface HealthCheck {\n name: string;\n passed: boolean;\n message: string;\n fixable?: boolean;\n}\n\nexport async function doctorCommand(options?: {\n fix?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n const forgeloreDir = getForgeloreDir(projectRoot);\n const checks: HealthCheck[] = [];\n\n console.log(\n renderBox(\n `${icons.info} Running health checks...`,\n \"forgelore doctor\"\n )\n );\n\n // 1. Config exists\n const hasConfig = await configExists(projectRoot);\n checks.push({\n name: \"Configuration\",\n passed: hasConfig,\n message: hasConfig\n ? \"forgelore.json found\"\n : \"forgelore.json not found — run forgelore init\",\n });\n\n if (!hasConfig) {\n printResults(checks);\n return;\n }\n\n // 2. Config parseable\n let config;\n try {\n config = await readConfig(projectRoot);\n checks.push({\n name: \"Config Valid\",\n passed: true,\n message: `Config parsed (v${config.version}, mode: ${config.mode})`,\n });\n } catch (err) {\n checks.push({\n name: \"Config Valid\",\n passed: false,\n message: `Config parse error: ${err instanceof Error ? err.message : String(err)}`,\n });\n printResults(checks);\n return;\n }\n\n // 3. Directory structure\n const dirs = [\n { path: join(forgeloreDir, \"changes\"), name: \"changes/\" },\n { path: join(forgeloreDir, \"changes\", \"archive\"), name: \"changes/archive/\" },\n { path: join(forgeloreDir, \"knowledge\"), name: \"knowledge/\" },\n { path: join(forgeloreDir, \"knowledge\", \"capabilities\"), name: \"knowledge/capabilities/\" },\n { path: join(forgeloreDir, \"knowledge\", \"decisions\"), name: \"knowledge/decisions/\" },\n ];\n\n for (const dir of dirs) {\n const exists = await fileExists(dir.path);\n checks.push({\n name: `Dir: ${dir.name}`,\n passed: exists,\n message: exists ? `${dir.name} exists` : `${dir.name} missing`,\n fixable: true,\n });\n\n if (!exists && options?.fix) {\n await mkdir(dir.path, { recursive: true });\n }\n }\n\n // 4. Knowledge base files\n const knowledgeFiles = [\n { path: join(forgeloreDir, \"knowledge\", \"architecture.md\"), name: \"architecture.md\" },\n { path: join(forgeloreDir, \"knowledge\", \"patterns.md\"), name: \"patterns.md\" },\n { path: join(forgeloreDir, \"knowledge\", \"glossary.md\"), name: \"glossary.md\" },\n ];\n\n for (const file of knowledgeFiles) {\n const exists = await fileExists(file.path);\n checks.push({\n name: `KB: ${file.name}`,\n passed: exists,\n message: exists ? `${file.name} present` : `${file.name} missing`,\n });\n }\n\n // 5. Changes health\n try {\n const changes = await listChanges(projectRoot, false);\n checks.push({\n name: \"Active Changes\",\n passed: true,\n message: `${changes.length} active change${changes.length === 1 ? \"\" : \"s\"}`,\n });\n\n // Check for orphaned metadata\n for (const change of changes) {\n const hasProposal = await fileExists(join(change.path, \"proposal.md\"));\n if (!hasProposal) {\n checks.push({\n name: `Change: ${change.name}`,\n passed: false,\n message: `${change.name} has metadata but missing proposal.md`,\n });\n }\n }\n } catch {\n checks.push({\n name: \"Active Changes\",\n passed: false,\n message: \"Could not read changes directory\",\n });\n }\n\n // 6. Global sync (if applicable)\n if (config.mode !== \"local\" && config.global) {\n const globalExists = await fileExists(config.global.path);\n checks.push({\n name: \"Global Repo\",\n passed: globalExists,\n message: globalExists\n ? `Global specs available at ${config.global.path}`\n : `Global specs not found at ${config.global.path} — run forgelore sync`,\n });\n }\n\n printResults(checks, options?.fix);\n}\n\nfunction printResults(checks: HealthCheck[], didFix?: boolean): void {\n const passed = checks.filter((c) => c.passed).length;\n const total = checks.length;\n const allPassed = passed === total;\n\n const lines = checks.map(\n (c) =>\n ` ${c.passed ? icons.success : icons.error} ${colors.white(c.name)}: ${c.passed ? colors.muted(c.message) : colors.warning(c.message)}${!c.passed && c.fixable && didFix ? colors.success(\" (fixed)\") : \"\"}`\n );\n\n const borderColor = allPassed ? \"#10B981\" : passed > total / 2 ? \"#F59E0B\" : \"#EF4444\";\n\n console.log(\n renderBox(\n `${allPassed ? icons.success : icons.warning} ${passed}/${total} checks passed\\n\\n${lines.join(\"\\n\")}`,\n \"Results\",\n borderColor\n )\n );\n\n if (!allPassed && !didFix) {\n const fixable = checks.filter((c) => !c.passed && c.fixable).length;\n if (fixable > 0) {\n console.log(\n colors.muted(` Run ${colors.primary(\"forgelore doctor --fix\")} to auto-fix ${fixable} issue${fixable === 1 ? \"\" : \"s\"}.`)\n );\n }\n }\n}\n","/**\n * forgelore capabilities command\n * List all registered capabilities in the knowledge base\n */\n\nimport { resolve } from \"node:path\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n listCapabilities,\n} from \"@forgelore/core\";\nimport type { Capability } from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\nexport async function capabilitiesCommand(options?: {\n json?: boolean;\n cwd?: string;\n}): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const capabilities = await listCapabilities(projectRoot);\n\n if (capabilities.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No capabilities registered yet.\\n\\n` +\n `Capabilities are extracted when changes are archived.\\n` +\n `Archive a completed change with ${colors.primary(\"forgelore archive <change>\")} to start building\\nyour knowledge base.`,\n \"Capabilities\"\n )\n );\n return;\n }\n\n // JSON output\n if (options?.json) {\n console.log(JSON.stringify(capabilities, null, 2));\n return;\n }\n\n // Table output\n const table = new Table({\n head: [\n colors.bold(\"Name\"),\n colors.bold(\"Description\"),\n colors.bold(\"Source\"),\n colors.bold(\"Archived\"),\n colors.bold(\"Tags\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [22, 30, 18, 14, 16],\n wordWrap: true,\n });\n\n for (const cap of capabilities) {\n table.push([\n colors.white(cap.name),\n colors.muted(cap.description.slice(0, 60)),\n colors.secondary(cap.sourceChange),\n colors.dim(cap.archivedAt.slice(0, 10)),\n cap.tags?.length ? colors.accent(cap.tags.join(\", \")) : colors.muted(\"--\"),\n ]);\n }\n\n console.log(renderSection(\"Capabilities\", table.toString()));\n console.log(\n colors.muted(\n ` ${capabilities.length} capabilit${capabilities.length === 1 ? \"y\" : \"ies\"} registered`\n )\n );\n}\n","/**\n * forgelore config command\n * Get, set, or list configuration values\n */\n\nimport { resolve } from \"node:path\";\nimport {\n configExists,\n readConfig,\n getConfigValue,\n setConfigValue,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons } from \"../ui/theme.js\";\n\nexport async function configCommand(\n key?: string,\n value?: string,\n options?: { list?: boolean; cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n // List all config\n if (options?.list || (!key && !value)) {\n const config = await readConfig(projectRoot);\n const lines = formatObject(config, \"\");\n\n console.log(\n renderSection(\"Configuration\", lines.join(\"\\n\"))\n );\n return;\n }\n\n // Get value\n if (key && !value) {\n const val = await getConfigValue(projectRoot, key);\n if (val === undefined) {\n console.log(\n ` ${icons.error} Key ${colors.primary(key)} not found in config.`\n );\n process.exit(1);\n }\n\n if (typeof val === \"object\" && val !== null) {\n const lines = formatObject(val as Record<string, unknown>, \"\");\n console.log(renderSection(key, lines.join(\"\\n\")));\n } else {\n console.log(` ${colors.primary(key)} ${colors.muted(\"=\")} ${colors.white(String(val))}`);\n }\n return;\n }\n\n // Set value\n if (key && value) {\n // Parse value — try JSON, booleans, numbers, then string\n let parsed: unknown = value;\n if (value === \"true\") parsed = true;\n else if (value === \"false\") parsed = false;\n else if (/^\\d+$/.test(value)) parsed = parseInt(value, 10);\n else {\n try {\n parsed = JSON.parse(value);\n } catch {\n // keep as string\n }\n }\n\n await setConfigValue(projectRoot, key, parsed);\n console.log(\n ` ${icons.success} Set ${colors.primary(key)} ${colors.muted(\"=\")} ${colors.white(String(parsed))}`\n );\n }\n}\n\nfunction formatObject(\n obj: Record<string, unknown>,\n prefix: string\n): string[] {\n const lines: string[] = [];\n for (const [k, v] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${k}` : k;\n if (typeof v === \"object\" && v !== null && !Array.isArray(v)) {\n lines.push(` ${colors.muted(fullKey + \":\")}`);\n lines.push(...formatObject(v as Record<string, unknown>, fullKey));\n } else {\n lines.push(\n ` ${colors.primary(fullKey)} ${colors.muted(\"=\")} ${colors.white(String(v))}`\n );\n }\n }\n return lines;\n}\n","/**\n * forgelore diff command\n * Show structural drift between specs and current project state\n * NOTE: This is a structural check, not an LLM-powered analysis\n */\n\nimport { resolve, relative } from \"node:path\";\nimport { readdir, stat } from \"node:fs/promises\";\nimport Table from \"cli-table3\";\nimport {\n configExists,\n readConfig,\n listChanges,\n readChange,\n readChangeFile,\n getChangesDir,\n fileExists,\n} from \"@forgelore/core\";\nimport { renderBox, renderSection } from \"../ui/banner.js\";\nimport { colors, icons, gradients } from \"../ui/theme.js\";\n\ninterface DriftItem {\n type: string;\n severity: \"info\" | \"warning\" | \"critical\";\n message: string;\n}\n\nexport async function diffCommand(\n changeName?: string,\n options?: { cwd?: string }\n): Promise<void> {\n const projectRoot = resolve(options?.cwd || process.cwd());\n\n if (!(await configExists(projectRoot))) {\n console.log(\n renderBox(\n `${icons.error} forgelore is not initialized.\\nRun ${colors.primary(\"forgelore init\")} first.`,\n \"Not Initialized\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n\n const driftItems: DriftItem[] = [];\n\n if (changeName) {\n // Analyze a specific change\n try {\n const change = await readChange(projectRoot, changeName);\n await analyzeChangeDrift(projectRoot, changeName, driftItems);\n } catch {\n console.log(\n renderBox(\n `${icons.error} Change ${colors.primary(changeName)} not found.`,\n \"Not Found\",\n \"#EF4444\"\n )\n );\n process.exit(1);\n }\n } else {\n // Analyze all active changes\n const changes = await listChanges(projectRoot, false);\n\n if (changes.length === 0) {\n console.log(\n renderBox(\n `${icons.info} No active changes to analyze.\\nRun ${colors.primary(\"forgelore propose\")} to create one.`,\n \"No Changes\"\n )\n );\n return;\n }\n\n for (const change of changes) {\n await analyzeChangeDrift(projectRoot, change.name, driftItems);\n }\n }\n\n if (driftItems.length === 0) {\n console.log(\n renderBox(\n `${icons.success} No drift detected. Specs and implementation are in sync.`,\n \"All Clear\",\n \"#10B981\"\n )\n );\n return;\n }\n\n // Display drift items\n const table = new Table({\n head: [\n colors.bold(\"Severity\"),\n colors.bold(\"Type\"),\n colors.bold(\"Message\"),\n ].map(String),\n style: { head: [], border: [\"gray\"] },\n colWidths: [12, 20, 55],\n wordWrap: true,\n });\n\n for (const item of driftItems) {\n const sevColor =\n item.severity === \"critical\"\n ? colors.error\n : item.severity === \"warning\"\n ? colors.warning\n : colors.muted;\n\n table.push([\n sevColor(item.severity),\n colors.white(item.type),\n colors.muted(item.message),\n ]);\n }\n\n const critical = driftItems.filter((d) => d.severity === \"critical\").length;\n const warnings = driftItems.filter((d) => d.severity === \"warning\").length;\n const info = driftItems.filter((d) => d.severity === \"info\").length;\n\n const summaryParts = [];\n if (critical > 0) summaryParts.push(colors.error(`${critical} critical`));\n if (warnings > 0) summaryParts.push(colors.warning(`${warnings} warnings`));\n if (info > 0) summaryParts.push(colors.muted(`${info} info`));\n\n console.log(\n renderSection(\"Drift Report\", table.toString())\n );\n console.log(\n renderBox(\n `${critical > 0 ? icons.error : icons.warning} ${summaryParts.join(\", \")}`,\n \"Summary\",\n critical > 0 ? \"#EF4444\" : \"#F59E0B\"\n )\n );\n}\n\nasync function analyzeChangeDrift(\n projectRoot: string,\n changeName: string,\n items: DriftItem[]\n): Promise<void> {\n // Check for stale changes (proposed but no activity for 7+ days)\n try {\n const change = await readChange(projectRoot, changeName);\n const updatedAt = new Date(change.updatedAt);\n const daysSince = Math.floor(\n (Date.now() - updatedAt.getTime()) / (1000 * 60 * 60 * 24)\n );\n\n if (daysSince > 14 && change.status === \"proposed\") {\n items.push({\n type: \"stale-proposal\",\n severity: \"warning\",\n message: `\"${changeName}\" proposed ${daysSince} days ago with no progress`,\n });\n }\n\n if (daysSince > 7 && change.status === \"in-progress\") {\n items.push({\n type: \"stale-progress\",\n severity: \"info\",\n message: `\"${changeName}\" in progress for ${daysSince} days since last update`,\n });\n }\n\n // Check for empty spec files\n const specFiles = [\"proposal.md\", \"specs/requirements.md\", \"specs/scenarios.md\", \"design.md\", \"tasks.md\"];\n for (const file of specFiles) {\n try {\n const content = await readChangeFile(projectRoot, changeName, file);\n const stripped = content.replace(/<!--.*?-->/gs, \"\").trim();\n if (stripped.length < 30) {\n items.push({\n type: \"empty-spec\",\n severity: change.status === \"in-progress\" ? \"warning\" : \"info\",\n message: `\"${changeName}/${file}\" has minimal content`,\n });\n }\n } catch {\n items.push({\n type: \"missing-file\",\n severity: \"critical\",\n message: `\"${changeName}/${file}\" is missing`,\n });\n }\n }\n\n // Check for tasks with no progress if status is in-progress\n if (\n change.status === \"in-progress\" &&\n change.tasks.length > 0 &&\n change.tasks.every((t) => t.status === \"pending\")\n ) {\n items.push({\n type: \"no-task-progress\",\n severity: \"warning\",\n message: `\"${changeName}\" is in-progress but all ${change.tasks.length} tasks are still pending`,\n });\n }\n } catch {\n items.push({\n type: \"read-error\",\n severity: \"critical\",\n message: `Could not read change \"${changeName}\"`,\n });\n }\n}\n"],"mappings":"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","names":["chalk","gradient","gradient","chalk","chalk","p","ora","resolve","configExists","text","resolve","configExists","ora","resolve","configExists","resolve","configExists","p","resolve","configExists","resolve","configExists","resolve","Table","configExists","resolve","configExists","Table","resolve","configExists","readChangeFile","listChanges","getChangePath","getChangePath","readChangeFile","resolve","configExists","listChanges","p","ora","resolve","configExists","readChange","getChangePath","resolve","configExists","readChange","getChangePath","ora","ora","resolve","configExists","readConfig","resolve","configExists","readConfig","ora","resolve","mkdir","configExists","readConfig","fileExists","getForgeloreDir","listChanges","resolve","getForgeloreDir","configExists","readConfig","fileExists","mkdir","listChanges","resolve","Table","configExists","listCapabilities","resolve","configExists","listCapabilities","Table","resolve","configExists","readConfig","resolve","configExists","readConfig","resolve","Table","configExists","listChanges","readChange","readChangeFile","resolve","configExists","readChange","listChanges","Table","readChangeFile"]}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@forgelore/cli",
3
+ "version": "0.1.0",
4
+ "description": "Beautiful CLI for spec-driven development — forge knowledge, shape code",
5
+ "type": "module",
6
+ "bin": {
7
+ "forgelore": "./dist/index.js",
8
+ "forge": "./dist/index.js"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "scripts": {
12
+ "build": "tsup",
13
+ "dev": "tsup --watch",
14
+ "test": "vitest run",
15
+ "clean": "rm -rf dist"
16
+ },
17
+ "files": ["dist"],
18
+ "license": "MIT",
19
+ "dependencies": {
20
+ "@forgelore/core": "0.1.0",
21
+ "commander": "^13.1.0",
22
+ "chalk": "^5.4.0",
23
+ "gradient-string": "^3.0.0",
24
+ "ora": "^8.2.0",
25
+ "boxen": "^8.0.0",
26
+ "cli-table3": "^0.6.5",
27
+ "figures": "^6.1.0",
28
+ "@clack/prompts": "^0.10.0"
29
+ },
30
+ "devDependencies": {
31
+ "@types/gradient-string": "^1.1.6",
32
+ "tsup": "^8.4.0",
33
+ "typescript": "^5.8.0",
34
+ "vitest": "^3.1.0"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public",
38
+ "registry": "https://registry.npmjs.org/"
39
+ },
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/DxVapor/forgelore.git",
43
+ "directory": "packages/cli"
44
+ }
45
+ }