create-fornix 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4612 -0
- package/dist/index.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/cli/index.ts","../src/cli/commands/create.ts","../src/utils/result.ts","../src/scaffold/config-validator.ts","../src/scaffold/dependency-resolver.ts","../src/scaffold/structure-generator.ts","../src/scaffold/config-generators/astro-config.ts","../src/scaffold/config-generators/tailwind-config.ts","../src/scaffold/config-generators/palette-css.ts","../src/scaffold/block-placer.ts","../src/scaffold/content-wiring.ts","../src/scaffold/i18n-wiring.ts","../src/scaffold/agent-context-generator.ts","../src/scaffold/pipeline.ts","../src/cli/fixture-registry.ts","../src/prompts/manual-flow.ts","../src/scaffold/post-scaffold.ts","../src/ai/prompt-builder.ts","../src/ai/schemas.ts","../src/ai/rules.ts","../src/schemas/config.ts","../src/ai/conversation.ts","../src/ai/providers/openai-provider.ts","../src/ai/providers/ollama-provider.ts","../src/ai/providers/cloudflare-provider.ts","../src/ai/providers/mock-provider.ts","../src/ai/resolve-provider.ts","../src/cli/recipes.ts","../src/utils/project-name.ts","../src/cli/commands/add.ts","../src/cli/commands/remove.ts","../src/cli/commands/list.ts","../src/cli/commands/status.ts","../src/cli/commands/doctor.ts","../src/cli/commands/mcp.ts","../src/mcp/server.ts","../src/mcp/tools/list-blocks.ts","../src/mcp/tools/add-block.ts","../src/mcp/tools/remove-block.ts","../src/mcp/tools/get-content-schema.ts","../src/mcp/tools/validate-content.ts","../src/mcp/tools/get-project-status.ts","../src/mcp/tools/scaffold-project.ts"],"sourcesContent":["import { runMain } from \"citty\";\nimport { main } from \"./cli/index.js\";\n\nrunMain(main);\n","import { defineCommand } from \"citty\";\nimport { createCommand } from \"./commands/create.js\";\nimport { addCommand } from \"./commands/add.js\";\nimport { removeCommand } from \"./commands/remove.js\";\nimport { listCommand } from \"./commands/list.js\";\nimport { statusCommand } from \"./commands/status.js\";\nimport { doctorCommand } from \"./commands/doctor.js\";\nimport { mcpCommand } from \"./commands/mcp.js\";\n\nexport const main = defineCommand({\n meta: {\n name: \"fornix\",\n version: \"0.0.1\",\n description: \"Fornix — CLI-first Astro + Cloudflare project generator\",\n },\n subCommands: {\n create: createCommand,\n add: addCommand,\n remove: removeCommand,\n list: listCommand,\n status: statusCommand,\n doctor: doctorCommand,\n mcp: mcpCommand,\n },\n});\n","import { defineCommand } from \"citty\";\nimport { resolve, basename } from \"node:path\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { z } from \"zod\";\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport { scaffold, type ScaffoldInput } from \"../../scaffold/pipeline.js\";\nimport { isOk } from \"../../utils/result.js\";\nimport type { ResolvedConfig } from \"../../schemas/config.js\";\nimport type { Palette } from \"fornix-registry\";\nimport {\n FIXTURE_MANIFESTS,\n FIXTURE_BLOCK_SOURCES,\n FIXTURE_DEFAULT_CONTENT,\n loadAllPalettes,\n} from \"../fixture-registry.js\";\nimport { runManualFlow } from \"../../prompts/manual-flow.js\";\nimport { runPostScaffold } from \"../../scaffold/post-scaffold.js\";\nimport { runAIConversation } from \"../../ai/conversation.js\";\nimport type { BlockRegistry } from \"../../ai/prompt-builder.js\";\nimport type { AIProvider } from \"../../ai/provider.js\";\nimport { resolveProvider, type ProviderName } from \"../../ai/resolve-provider.js\";\nimport type { AIProvider as LegacyAIProvider } from \"../../ai/providers/mock-provider.js\";\nimport { RECIPES } from \"../recipes.js\";\nimport { validateProjectName, suggestProjectName } from \"../../utils/project-name.js\";\n\n// ── Constants ───────────────────────────────────────────\n\nconst DEFAULT_COLORS = {\n primary: \"#6366f1\",\n secondary: \"#818cf8\",\n accent: \"#c084fc\",\n background: \"#0f172a\",\n foreground: \"#f8fafc\",\n};\n\nconst DEFAULT_AI_DESCRIPTION = \"Build a fintech landing page with user authentication and a modern dark theme\";\n\nconst VALID_PROVIDER_NAMES: ReadonlyArray<string> = [\"openai\", \"ollama\", \"cloudflare\", \"mock\"];\n\n// ── Create Command ──────────────────────────────────────\n\nexport const createCommand = defineCommand({\n meta: {\n name: \"create\",\n description: \"Scaffold a new Fornix project\",\n },\n args: {\n dir: {\n type: \"positional\",\n description: \"Project directory (defaults to current directory)\",\n required: false,\n },\n ai: {\n type: \"boolean\",\n description: \"AI-assisted mode (default)\",\n default: true,\n },\n manual: {\n type: \"boolean\",\n description: \"Traditional interactive prompts\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Accept defaults, non-interactive\",\n default: false,\n },\n description: {\n type: \"string\",\n description: \"Project description for AI mode (used when --yes skips the prompt)\",\n },\n render: {\n type: \"string\",\n description: \"Set render mode: static, hybrid, server\",\n },\n deploy: {\n type: \"string\",\n description: \"Set deploy target: cloudflare, vercel, netlify, static\",\n },\n blocks: {\n type: \"string\",\n description: \"Comma-separated block names\",\n },\n database: {\n type: \"string\",\n description: \"Set database: none, d1, turso, astro-db, postgres\",\n },\n css: {\n type: \"string\",\n description: \"Set CSS engine: tailwind (default) or vanilla\",\n },\n locales: {\n type: \"string\",\n description: \"Comma-separated locale codes (e.g. en,es,ar)\",\n },\n palette: {\n type: \"string\",\n description: \"Use a pre-built palette by name\",\n },\n \"theme-switcher\": {\n type: \"boolean\",\n description: \"Include the theme switcher for runtime palette swapping\",\n default: false,\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would be generated without writing\",\n default: false,\n },\n install: {\n type: \"boolean\",\n description: \"Install dependencies after scaffold (use --no-install to skip)\",\n default: true,\n },\n git: {\n type: \"boolean\",\n description: \"Initialize git repo (use --no-git to skip)\",\n default: true,\n },\n provider: {\n type: \"string\",\n description: \"Force a specific AI provider\",\n },\n recipe: {\n type: \"string\",\n description: \"Use a preset recipe (saas, agency, docs)\",\n },\n verbose: {\n type: \"boolean\",\n description: \"Detailed output\",\n default: false,\n },\n },\n async run({ args }) {\n const allPalettes = loadAllPalettes();\n\n // Detect if explicit config flags were provided (for backwards compatibility)\n const hasExplicitFlags = !!(\n args.render || args.deploy || args.blocks || args.database ||\n args.css || args.locales || args.palette || args.recipe\n );\n\n // ── Interactive manual prompts (--manual without --yes) ──\n if (args.manual && !args.yes) {\n const defaultProjectName = args.dir ? basename(resolve(args.dir)) : \"my-project\";\n\n const config = await runManualFlow({\n defaultProjectName,\n manifests: FIXTURE_MANIFESTS,\n allPalettes,\n });\n\n if (!config) {\n process.exitCode = 0;\n return;\n }\n\n const projectDir = args.dir ? resolve(args.dir) : resolve(config.projectDir);\n const finalConfig = { ...config, projectDir } as ResolvedConfig;\n\n return runScaffold(finalConfig, allPalettes, args[\"dry-run\"] ?? false, args.verbose ?? false, !(args.install ?? true), !(args.git ?? true));\n }\n\n // ── Flag-driven mode (--manual --yes, or explicit config flags) ──\n if (args.manual || hasExplicitFlags) {\n return runFlagDrivenMode(args, allPalettes);\n }\n\n // ── AI mode (default — no --manual, no explicit config flags) ──\n return runAIMode(args, allPalettes);\n },\n});\n\n// ── AI Mode ─────────────────────────────────────────────\n\nasync function runAIMode(\n args: Record<string, unknown>,\n allPalettes: ReadonlyArray<Palette>,\n): Promise<void> {\n // 1. Validate and resolve provider\n const providerName = parseProviderName(args.provider);\n if (args.provider && !providerName) {\n console.error(pc.red(`\\u2716 Unknown provider: ${String(args.provider)}`));\n console.error(pc.dim(` Available: ${VALID_PROVIDER_NAMES.join(\", \")}`));\n process.exitCode = 1;\n return;\n }\n\n const legacyProvider = await resolveProvider({\n provider: providerName,\n skipOllamaDetect: false,\n });\n\n if (!legacyProvider) {\n showNoProviderGuide();\n process.exitCode = 1;\n return;\n }\n\n // 2. Adapt legacy provider to conversation interface\n const provider = adaptProvider(legacyProvider);\n\n // 3. Get project description\n const description = await getDescription(args);\n if (!description) {\n process.exitCode = 0;\n return;\n }\n\n // 4. Build registry\n const registry: BlockRegistry = {\n blocks: Object.values(FIXTURE_MANIFESTS),\n palettes: [...allPalettes],\n };\n\n // 5. Determine project directory and name\n const projectDir = resolve(String(args.dir ?? \".\"));\n const projectName = basename(projectDir);\n\n // ── Validate project name ──\n const nameResult = validateProjectName(projectName);\n if (!nameResult.ok) {\n console.error(pc.red(`✗ ${nameResult.error}`));\n process.exitCode = 1;\n return;\n }\n\n // 6. Run AI conversation\n const result = await runAIConversation({\n provider,\n registry,\n description,\n projectName,\n projectDir,\n });\n\n if (!result.ok) {\n console.error(pc.red(`\\u2716 AI conversation failed: ${result.error.message}`));\n process.exitCode = 1;\n return;\n }\n\n const config = result.value;\n\n // 7. Show summary and confirm (skip with --yes)\n if (!args.yes) {\n showAISummary(config);\n const confirmed = await p.confirm({\n message: \"Create this project?\",\n initialValue: true,\n });\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel(\"Operation cancelled.\");\n process.exitCode = 0;\n return;\n }\n }\n\n // 8. Scaffold\n return runScaffold(\n config,\n allPalettes,\n (args[\"dry-run\"] ?? false) === true,\n (args.verbose ?? false) === true,\n !((args.install ?? true) === true),\n !((args.git ?? true) === true),\n );\n}\n\n// ── Flag-Driven Mode ────────────────────────────────────\n\nfunction runFlagDrivenMode(\n args: Record<string, unknown>,\n allPalettes: ReadonlyArray<Palette>,\n): void {\n const projectDir = resolve(String(args.dir ?? \".\"));\n const projectName = basename(projectDir);\n\n // ── Validate project name ──\n const nameResult = validateProjectName(projectName);\n if (!nameResult.ok) {\n console.error(pc.red(`✗ ${nameResult.error}`));\n process.exitCode = 1;\n return;\n }\n\n // ── Apply Recipe overlay if provided ──\n const recipeName = args.recipe ? String(args.recipe) : undefined;\n let recipeOverlay: Partial<ResolvedConfig> = {};\n\n if (recipeName) {\n if (RECIPES[recipeName]) {\n recipeOverlay = RECIPES[recipeName];\n console.log(pc.green(`\\u2714 Using recipe: ${pc.bold(recipeName)}`));\n } else {\n console.error(pc.red(`\\u2716 Recipe \"${recipeName}\" not found.`));\n console.error(pc.dim(` Available: ${Object.keys(RECIPES).join(\", \")}`));\n process.exitCode = 1;\n return;\n }\n }\n\n const renderMode = (String(args.render ?? recipeOverlay.renderMode ?? \"static\")) as \"static\" | \"hybrid\" | \"server\";\n const deployTarget = (String(args.deploy ?? recipeOverlay.deployTarget ?? \"cloudflare\")) as \"cloudflare\" | \"vercel\" | \"netlify\" | \"static\";\n const database = (String(args.database ?? recipeOverlay.database ?? \"none\")) as \"none\" | \"d1\" | \"turso\" | \"astro-db\" | \"postgres\";\n const cssEngine = (String(args.css ?? recipeOverlay.cssEngine ?? \"tailwind\")) as \"tailwind\" | \"vanilla\";\n \n const localesRaw = String(args.locales ?? \"\");\n let locales = [\"en\"];\n let defaultLocale = \"en\";\n if (localesRaw) {\n locales = localesRaw.split(\",\").map((l) => l.trim()).filter(Boolean);\n defaultLocale = locales[0] ?? \"en\";\n } else if (recipeOverlay.locales) {\n locales = [...recipeOverlay.locales];\n defaultLocale = recipeOverlay.defaultLocale ?? locales[0] ?? \"en\";\n }\n\n const themeSwitcher = args[\"theme-switcher\"] !== undefined ? args[\"theme-switcher\"] === true : (recipeOverlay.themeSwitcher ?? false);\n\n // Parse blocks\n const blocksString = args.blocks ? String(args.blocks) : \"\";\n let blocks = recipeOverlay.blocks ? [...recipeOverlay.blocks] : [];\n if (blocksString) {\n const blockNames = blocksString.split(\",\").map((b) => b.trim()).filter(Boolean);\n blocks = blockNames.map((name) => ({ name, variant: \"default\" }));\n }\n\n // ── No blocks selected check ──\n if (blocks.length === 0) {\n console.error(pc.red(\"✗ No blocks selected.\"));\n console.error(pc.dim(\" Use --recipe saas for a pre-built set, or drop --manual to let AI choose blocks for you.\"));\n process.exitCode = 1;\n return;\n }\n\n // Resolve palette\n let paletteColors = recipeOverlay.palette ? { ...recipeOverlay.palette.colors } : { ...DEFAULT_COLORS };\n let palettePreset: string | undefined = recipeOverlay.palette?.preset;\n\n if (args.palette) {\n const paletteName = String(args.palette);\n const found = allPalettes.find((palette) => palette.name === paletteName);\n if (found) {\n paletteColors = { ...found.colors };\n palettePreset = found.name;\n } else {\n console.error(pc.red(`\\u2716 Palette \"${paletteName}\" not found in registry.`));\n console.error(pc.dim(` Available: ${allPalettes.map((palette) => palette.name).join(\", \")}`));\n process.exitCode = 1;\n return;\n }\n }\n\n const config: ResolvedConfig = {\n projectName,\n projectDir,\n renderMode,\n deployTarget,\n database,\n cssEngine,\n packageManager: \"pnpm\",\n blocks,\n locales,\n defaultLocale,\n palette: {\n ...(palettePreset ? { preset: palettePreset } : {}),\n colors: paletteColors,\n },\n themeSwitcher,\n createdWith: recipeName ? \"recipe\" : \"manual\",\n } as ResolvedConfig;\n\n return runScaffold(\n config,\n allPalettes,\n (args[\"dry-run\"] ?? false) === true,\n (args.verbose ?? false) === true,\n !((args.install ?? true) === true),\n !((args.git ?? true) === true),\n );\n}\n\n// ── Shared Scaffold Execution ───────────────────────────\n\nfunction runScaffold(\n config: ResolvedConfig,\n allPalettes: ReadonlyArray<Palette>,\n dryRun: boolean,\n verbose: boolean,\n skipInstall: boolean,\n skipGit: boolean,\n): void {\n const input: ScaffoldInput = {\n config,\n manifests: FIXTURE_MANIFESTS,\n blockSources: FIXTURE_BLOCK_SOURCES,\n blockDefaultContent: FIXTURE_DEFAULT_CONTENT,\n allPalettes,\n };\n\n const result = scaffold(input);\n\n if (!isOk(result)) {\n const errMsg = result.error.message;\n console.error(pc.red(`✗ Scaffold failed: ${errMsg}`));\n\n // Enhanced conflict messaging\n if (\"blockA\" in result.error && \"blockB\" in result.error) {\n const conflict = result.error as { blockA: string; blockB: string; reason?: string };\n console.error(pc.yellow(` Block '${conflict.blockA}' conflicts with '${conflict.blockB}'.`));\n console.error(pc.dim(\" Remove one of these blocks and try again.\"));\n }\n\n // Enhanced not-found messaging (network / registry)\n if (\"blockName\" in result.error) {\n const notFound = result.error as { blockName: string };\n console.error(pc.yellow(` Block '${notFound.blockName}' was not found in the registry.`));\n console.error(pc.dim(\" If you are offline, cached blocks will be used when available.\"));\n console.error(pc.dim(\" Run 'fornix list' to see available blocks.\"));\n }\n\n process.exitCode = 1;\n return;\n }\n\n // ── Dry run: show file tree ──\n if (dryRun) {\n console.log(pc.bold(\"\\n\\ud83d\\udccb Dry run \\u2014 files that would be created:\\n\"));\n const sortedFiles = Object.keys(result.value.files).sort();\n for (const file of sortedFiles) {\n console.log(pc.dim(\" \") + file);\n }\n console.log(pc.dim(`\\n Total: ${sortedFiles.length} files`));\n return;\n }\n\n // ── Write files to disk ──\n const files = result.value.files;\n let filesWritten = 0;\n\n for (const [relativePath, content] of Object.entries(files)) {\n const fullPath = join(config.projectDir, relativePath);\n const parentDir = join(fullPath, \"..\");\n mkdirSync(parentDir, { recursive: true });\n writeFileSync(fullPath, content, \"utf-8\");\n filesWritten++;\n\n if (verbose) {\n console.log(pc.dim(` created ${relativePath}`));\n }\n }\n\n // ── Post-scaffold hooks: deps, git, CLAUDE.md, success message ──\n runPostScaffold({\n config,\n resolvedBlockNames: result.value.resolvedBlockNames,\n filesWritten,\n verbose,\n skipInstall,\n skipGit,\n });\n}\n\n// ── Provider Adapter ────────────────────────────────────\n\n/**\n * Adapt a legacy provider (with Result-returning generate) to the\n * conversation module's AIProvider interface (with throwing generate).\n */\nfunction adaptProvider(legacy: LegacyAIProvider): AIProvider {\n return {\n name: legacy.name,\n async generate<T extends z.ZodType>(options: {\n system: string;\n prompt: string;\n schema: T;\n maxTokens?: number;\n }): Promise<z.infer<T>> {\n const result = await legacy.generate(options.prompt);\n if (!result.ok) {\n throw new Error(result.error.message);\n }\n return options.schema.parse(result.value) as z.infer<T>;\n },\n async *stream(): AsyncIterable<string> {\n yield \"\";\n },\n };\n}\n\n// ── Helpers ──────────────────────────────────────────────\n\nfunction parseProviderName(value: unknown): ProviderName | undefined {\n if (!value || typeof value !== \"string\") return undefined;\n if (VALID_PROVIDER_NAMES.includes(value)) {\n return value as ProviderName;\n }\n return undefined;\n}\n\nasync function getDescription(args: Record<string, unknown>): Promise<string | null> {\n if (args.yes) {\n return typeof args.description === \"string\" && args.description.length > 0\n ? args.description\n : DEFAULT_AI_DESCRIPTION;\n }\n\n p.intro(pc.bgCyan(pc.black(\" Fornix \\u2014 AI Mode \")));\n\n const input = await p.text({\n message: \"Describe the website you want to build:\",\n placeholder: \"e.g., A fintech landing page with user authentication and a modern dark theme\",\n validate(value) {\n if (!value.trim()) return \"Please describe what you want to build\";\n return undefined;\n },\n });\n\n if (p.isCancel(input)) {\n p.cancel(\"Operation cancelled.\");\n return null;\n }\n\n return String(input);\n}\n\nfunction showAISummary(config: ResolvedConfig): void {\n const lines: string[] = [];\n\n lines.push(`${pc.bold(\"Project:\")} ${config.projectName}`);\n lines.push(`${pc.bold(\"Render mode:\")} ${config.renderMode}`);\n lines.push(`${pc.bold(\"Deploy to:\")} ${config.deployTarget}`);\n lines.push(`${pc.bold(\"CSS engine:\")} ${config.cssEngine}`);\n\n const blockNames = config.blocks.map((b) => b.name);\n lines.push(`${pc.bold(\"Blocks:\")} ${blockNames.length > 0 ? blockNames.join(\", \") : pc.dim(\"(none)\")}`);\n lines.push(`${pc.bold(\"Locales:\")} ${config.locales.join(\", \")} (default: ${config.defaultLocale})`);\n\n if (config.palette.preset) {\n lines.push(`${pc.bold(\"Palette:\")} ${config.palette.preset}`);\n }\n\n if (config.themeSwitcher) {\n lines.push(`${pc.bold(\"Theme switcher:\")} ${pc.green(\"yes\")}`);\n }\n\n lines.push(`${pc.bold(\"Created with:\")} ${pc.cyan(\"AI\")}`);\n\n p.note(lines.join(\"\\n\"), \"AI-Generated Configuration\");\n}\n\nfunction showNoProviderGuide(): void {\n console.error(pc.red(\"\\n\\u2716 No AI provider found.\\n\"));\n console.error(\"To use AI mode, set up one of the following:\\n\");\n console.error(pc.bold(\" Option 1: OpenAI\"));\n console.error(\" export OPENAI_API_KEY=sk-...\\n\");\n console.error(pc.bold(\" Option 2: Ollama (free, local)\"));\n console.error(\" Install from https://ollama.com and run: ollama pull llama3.1\\n\");\n console.error(pc.bold(\" Option 3: Cloudflare Workers AI\"));\n console.error(\" export CLOUDFLARE_ACCOUNT_ID=... CLOUDFLARE_API_TOKEN=...\\n\");\n console.error(pc.dim(\" Or use manual mode: npx create-fornix --manual\\n\"));\n}\n","// ── Result Type ───────────────────────────────────────────\n\nexport type Result<T, E> = Ok<T> | Err<E>;\n\nexport interface Ok<T> {\n readonly ok: true;\n readonly value: T;\n}\n\nexport interface Err<E> {\n readonly ok: false;\n readonly error: E;\n}\n\n// ── Constructors ──────────────────────────────────────────\n\nexport function ok<T, E = never>(value: T): Result<T, E> {\n return { ok: true, value };\n}\n\nexport function err<T = never, E = unknown>(error: E): Result<T, E> {\n return { ok: false, error };\n}\n\n// ── Type Guards ───────────────────────────────────────────\n\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T> {\n return result.ok === true;\n}\n\nexport function isErr<T, E>(result: Result<T, E>): result is Err<E> {\n return result.ok === false;\n}\n\n// ── Unwrap ────────────────────────────────────────────────\n\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (isOk(result)) {\n return result.value;\n }\n const errorMessage =\n typeof result.error === \"string\"\n ? result.error\n : result.error instanceof Error\n ? result.error.message\n : JSON.stringify(result.error);\n throw new Error(errorMessage);\n}\n","import type { BlockManifest } from \"fornix-registry\";\nimport type { ResolvedConfig } from \"../schemas/config.js\";\nimport { ok, err, type Result } from \"../utils/result.js\";\n\n// ── Validation Error ──────────────────────────────────────\n\nexport interface ValidationError {\n readonly field: string;\n readonly message: string;\n}\n\n// ── Public API ────────────────────────────────────────────\n\nexport function validateConfig(\n config: ResolvedConfig,\n manifests: Readonly<Record<string, BlockManifest>>\n): Result<ResolvedConfig, ValidationError[]> {\n const errors: ValidationError[] = [];\n\n checkBlocksExist(config, manifests, errors);\n checkRequiredModes(config, manifests, errors);\n checkDatabaseRequiresServer(config, errors);\n checkDefaultLocaleInLocales(config, errors);\n\n if (errors.length > 0) {\n return err(errors);\n }\n\n return ok(config);\n}\n\n// ── Individual Checks ─────────────────────────────────────\n\nfunction checkBlocksExist(\n config: ResolvedConfig,\n manifests: Readonly<Record<string, BlockManifest>>,\n errors: ValidationError[]\n): void {\n for (const block of config.blocks) {\n if (!(block.name in manifests)) {\n errors.push({\n field: \"blocks\",\n message: `Block '${block.name}' not found in registry`,\n });\n }\n }\n}\n\nfunction checkRequiredModes(\n config: ResolvedConfig,\n manifests: Readonly<Record<string, BlockManifest>>,\n errors: ValidationError[]\n): void {\n if (config.renderMode === \"static\") {\n for (const block of config.blocks) {\n const manifest = manifests[block.name];\n if (manifest?.requiredMode === \"server\" || manifest?.requiredMode === \"hybrid\") {\n errors.push({\n field: \"blocks\",\n message: `Block '${block.name}' requires '${manifest.requiredMode}' rendering, but config uses 'static' mode`,\n });\n }\n }\n }\n}\n\nfunction checkDatabaseRequiresServer(\n config: ResolvedConfig,\n errors: ValidationError[]\n): void {\n if (config.database !== \"none\" && config.renderMode === \"static\") {\n errors.push({\n field: \"database\",\n message: `Database '${config.database}' requires server or hybrid rendering, but config uses 'static' mode`,\n });\n }\n}\n\nfunction checkDefaultLocaleInLocales(\n config: ResolvedConfig,\n errors: ValidationError[]\n): void {\n if (!config.locales.includes(config.defaultLocale)) {\n errors.push({\n field: \"defaultLocale\",\n message: `defaultLocale '${config.defaultLocale}' is not in the locales array [${config.locales.join(\", \")}]`,\n });\n }\n}\n","import type { BlockManifest } from \"fornix-registry\";\nimport { ok, err, type Result } from \"../utils/result.js\";\nimport type {\n CircularDependencyError,\n DependencyConflictError,\n BlockNotFoundError,\n} from \"../errors.js\";\n\n// ── Error Union ───────────────────────────────────────────\n\ntype DependencyError =\n | CircularDependencyError\n | DependencyConflictError\n | BlockNotFoundError;\n\n// ── Public API ────────────────────────────────────────────\n\nexport function resolveDependencies(\n selected: ReadonlyArray<string>,\n manifests: Readonly<Record<string, BlockManifest>>\n): Result<string[], DependencyError> {\n // Deduplicate\n const unique = [...new Set(selected)];\n\n // Verify all selected blocks exist\n for (const name of unique) {\n if (!(name in manifests)) {\n return err({\n kind: \"BlockNotFoundError\",\n message: `Block '${name}' not found in registry`,\n blockName: name,\n });\n }\n }\n\n // Collect all blocks (selected + transitive deps)\n const allBlocks = new Set<string>();\n const collectError = collectTransitiveDependencies(\n unique,\n manifests,\n allBlocks,\n new Set()\n );\n if (collectError !== undefined) {\n return err(collectError);\n }\n\n // Check conflicts\n const conflictError = detectConflicts(allBlocks, manifests);\n if (conflictError !== undefined) {\n return err(conflictError);\n }\n\n // Topological sort\n const sortResult = topologicalSort(allBlocks, manifests);\n if (sortResult === undefined) {\n // This shouldn't happen since we already checked for cycles,\n // but handle it defensively\n return err({\n kind: \"CircularDependencyError\",\n message: \"Unexpected circular dependency detected during sort\",\n chain: [],\n });\n }\n\n return ok(sortResult);\n}\n\n// ── Transitive Dependency Collection ──────────────────────\n\nfunction collectTransitiveDependencies(\n blocks: ReadonlyArray<string>,\n manifests: Readonly<Record<string, BlockManifest>>,\n collected: Set<string>,\n visiting: Set<string>\n): DependencyError | undefined {\n for (const name of blocks) {\n if (collected.has(name)) {\n continue;\n }\n\n if (visiting.has(name)) {\n return {\n kind: \"CircularDependencyError\",\n message: `Circular dependency detected involving '${name}'`,\n chain: [...visiting, name],\n };\n }\n\n if (!(name in manifests)) {\n return {\n kind: \"BlockNotFoundError\",\n message: `Block '${name}' not found in registry (required as dependency)`,\n blockName: name,\n };\n }\n\n visiting.add(name);\n\n const manifest = manifests[name];\n if (manifest.requires.length > 0) {\n const depError = collectTransitiveDependencies(\n manifest.requires,\n manifests,\n collected,\n visiting\n );\n if (depError !== undefined) {\n return depError;\n }\n }\n\n visiting.delete(name);\n collected.add(name);\n }\n\n return undefined;\n}\n\n// ── Conflict Detection ────────────────────────────────────\n\nfunction detectConflicts(\n blocks: ReadonlySet<string>,\n manifests: Readonly<Record<string, BlockManifest>>\n): DependencyConflictError | undefined {\n for (const name of blocks) {\n const manifest = manifests[name];\n for (const conflicting of manifest.conflicts) {\n if (blocks.has(conflicting)) {\n return {\n kind: \"DependencyConflictError\",\n message: `Block '${name}' conflicts with '${conflicting}'`,\n blockA: name,\n blockB: conflicting,\n };\n }\n }\n }\n return undefined;\n}\n\n// ── Topological Sort (Kahn's Algorithm) ───────────────────\n\nfunction topologicalSort(\n blocks: ReadonlySet<string>,\n manifests: Readonly<Record<string, BlockManifest>>\n): string[] | undefined {\n // Build in-degree map and adjacency list\n const inDegree = new Map<string, number>();\n const dependents = new Map<string, string[]>();\n\n for (const name of blocks) {\n if (!inDegree.has(name)) {\n inDegree.set(name, 0);\n }\n if (!dependents.has(name)) {\n dependents.set(name, []);\n }\n }\n\n for (const name of blocks) {\n const manifest = manifests[name];\n for (const dep of manifest.requires) {\n if (blocks.has(dep)) {\n inDegree.set(name, (inDegree.get(name) ?? 0) + 1);\n const list = dependents.get(dep) ?? [];\n list.push(name);\n dependents.set(dep, list);\n }\n }\n }\n\n // Collect nodes with zero in-degree\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) {\n queue.push(name);\n }\n }\n\n const sorted: string[] = [];\n\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(current);\n\n for (const dependent of dependents.get(current) ?? []) {\n const newDegree = (inDegree.get(dependent) ?? 1) - 1;\n inDegree.set(dependent, newDegree);\n if (newDegree === 0) {\n queue.push(dependent);\n }\n }\n }\n\n // If not all nodes processed, there's a cycle\n if (sorted.length !== blocks.size) {\n return undefined;\n }\n\n return sorted;\n}\n","import type { ResolvedConfig } from \"../schemas/config.js\";\n\nexport type FileMap = Record<string, string>;\n\n/**\n * Generates the base Astro project directory structure and core files.\n * Returns a map of relative file paths to string contents.\n */\nexport function generateStructure(config: ResolvedConfig): FileMap {\n const files: FileMap = {};\n\n // 1. package.json\n const adapterDeps = getAdapterDependencies(config);\n const pkg = {\n name: config.projectName,\n type: \"module\",\n version: \"0.0.1\",\n scripts: {\n dev: \"astro dev\",\n start: \"astro dev\",\n build: \"astro check && astro build\",\n preview: \"astro preview\",\n astro: \"astro\",\n },\n dependencies: {\n astro: \"^5.2.0\",\n \"@astrojs/check\": \"^0.9.0\",\n ...(config.cssEngine === \"tailwind\" && {\n tailwindcss: \"^4.0.0\",\n \"@tailwindcss/vite\": \"^4.0.0\",\n }),\n ...adapterDeps,\n },\n devDependencies: {\n typescript: \"^5.7.0\",\n },\n };\n files[\"package.json\"] = JSON.stringify(pkg, null, 2) + \"\\n\";\n\n // 2. tsconfig.json\n const tsconfig = {\n extends: \"astro/tsconfigs/strict\",\n compilerOptions: {\n jsx: \"preserve\",\n jsxImportSource: \"react\", // Even if not using React yet, good default for UI frameworks\n strictNullChecks: true,\n baseUrl: \".\",\n paths: {\n \"@/*\": [\"src/*\"],\n },\n },\n };\n files[\"tsconfig.json\"] = JSON.stringify(tsconfig, null, 2) + \"\\n\";\n\n // 3. .gitignore\n files[\".gitignore\"] = `\n# build output\ndist/\n.astro/\n\n# dependencies\nnode_modules/\n\n# logs\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n\n# environment variables\n.env\n.env.production\n.env.development\n\n# OS files\n.DS_Store\nThumbs.db\n`.trim() + \"\\n\";\n\n // 4. Base Astro file\n files[\"src/pages/index.astro\"] = `\n---\nimport Layout from '../layouts/Layout.astro';\n---\n<Layout title=\"Welcome to Astro.\">\n <main>\n <h1>Welcome to <span class=\"text-gradient\">${config.projectName}</span></h1>\n </main>\n</Layout>\n`.trim() + \"\\n\";\n\n // 5. Base Layout (needed by index.astro)\n files[\"src/layouts/Layout.astro\"] = `\n---\ninterface Props {\n title: string;\n}\nconst { title } = Astro.props;\n---\n<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"description\" content=\"Astro description\" />\n <meta name=\"viewport\" content=\"width=device-width\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\" />\n <meta name=\"generator\" content={Astro.generator} />\n <title>{title}</title>\n </head>\n <body>\n <slot />\n </body>\n</html>\n`.trim() + \"\\n\";\n\n // 6. Wrangler config if cloudflare\n if (config.deployTarget === \"cloudflare\") {\n // We use wrangler.json as the modern standard\n const wrangler = {\n name: config.projectName,\n compatibility_date: \"2025-02-14\",\n // ... Add observability/pages_build_output_dir as needed.\n // Basic structure:\n pages_build_output_dir: \"dist\",\n observability: {\n enabled: true,\n },\n };\n files[\"wrangler.json\"] = JSON.stringify(wrangler, null, 2) + \"\\n\";\n }\n\n return files;\n}\n\n// ── Adapter Dependencies ─────────────────────────────────\n\nfunction getAdapterDependencies(\n config: ResolvedConfig\n): Record<string, string> {\n if (config.renderMode === \"static\" && config.deployTarget === \"static\") {\n return {};\n }\n\n const adapterMap: Record<string, Record<string, string>> = {\n cloudflare: { \"@astrojs/cloudflare\": \"^12.0.0\" },\n vercel: { \"@astrojs/vercel\": \"^8.0.0\" },\n netlify: { \"@astrojs/netlify\": \"^6.0.0\" },\n };\n\n return adapterMap[config.deployTarget] ?? {};\n}\n","import { parseModule, generateCode, builders } from \"magicast\";\nimport type { ResolvedConfig } from \"../../schemas/config.js\";\nimport type { BlockManifest } from \"fornix-registry\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\n\n// ── Adapter Map ──────────────────────────────────────────\n\nconst ADAPTER_MAP: Record<string, { package: string; identifier: string }> = {\n cloudflare: { package: \"@astrojs/cloudflare\", identifier: \"cloudflare\" },\n vercel: { package: \"@astrojs/vercel\", identifier: \"vercel\" },\n netlify: { package: \"@astrojs/netlify\", identifier: \"netlify\" },\n};\n\n// ── Public API ───────────────────────────────────────────\n\nexport function generateAstroConfig(\n config: ResolvedConfig,\n blocks: ReadonlyArray<BlockManifest> = [],\n): Result<string, Error> {\n try {\n const module = parseModule(\"export default defineConfig({});\");\n\n module.imports.$add({\n from: \"astro/config\",\n imported: \"defineConfig\",\n local: \"defineConfig\",\n });\n\n const configObject = module.exports.default.$args[0];\n\n // Astro v5: only \"static\" (default) and \"server\" remain.\n // \"hybrid\" was removed — static now supports per-page prerender opt-out.\n if (config.renderMode === \"server\") {\n configObject.output = \"server\";\n }\n\n const adapter = ADAPTER_MAP[config.deployTarget];\n if (adapter) {\n module.imports.$add({\n from: adapter.package,\n imported: \"default\",\n local: adapter.identifier,\n });\n configObject.adapter = builders.functionCall(adapter.identifier);\n }\n\n if (config.locales.length >= 2) {\n configObject.i18n = {\n defaultLocale: config.defaultLocale,\n locales: config.locales,\n routing: {\n prefixDefaultLocale: false,\n },\n };\n }\n\n const hasMdx = blocks.some((b) => b.dependencies && b.dependencies[\"@astrojs/mdx\"]);\n if (hasMdx) {\n module.imports.$add({\n from: \"@astrojs/mdx\",\n imported: \"default\",\n local: \"mdx\",\n });\n \n configObject.integrations = configObject.integrations || [];\n configObject.integrations.push(builders.functionCall(\"mdx\"));\n }\n\n const { code } = generateCode(module);\n return ok(code);\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n return err(new Error(`Failed to generate astro.config.mjs: ${message}`));\n }\n}\n","import type { ResolvedConfig } from \"../../schemas/config.js\";\nimport { ok, type Result } from \"../../utils/result.js\";\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * Generates the Tailwind CSS v4 config file (CSS-based with @theme).\n * Returns null when cssEngine is not 'tailwind'.\n */\nexport function generateTailwindConfig(\n config: ResolvedConfig,\n): Result<string | null, Error> {\n if (config.cssEngine !== \"tailwind\") {\n return ok(null);\n }\n\n const themeBlock = [\n \"@theme {\",\n \" --color-primary: var(--color-primary);\",\n \" --color-secondary: var(--color-secondary);\",\n \" --color-accent: var(--color-accent);\",\n \" --color-background: var(--color-background);\",\n \" --color-foreground: var(--color-foreground);\",\n \"}\",\n ].join(\"\\n\");\n\n const lines = [\n '@import \"tailwindcss\";',\n \"\",\n `@source \"../src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}\";`,\n \"\",\n themeBlock,\n \"\",\n ];\n\n return ok(lines.join(\"\\n\"));\n}\n","import type { Palette } from \"fornix-registry\";\nimport type { PaletteConfig, PaletteColors } from \"../../schemas/config.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\n\n// ── Output Type ──────────────────────────────────────────\n\nexport interface PaletteCSSOutput {\n readonly files: Record<string, string>;\n readonly switcherScript?: string;\n}\n\n// ── Constants ────────────────────────────────────────────\n\nconst COLOR_TOKENS: ReadonlyArray<keyof PaletteColors> = [\n \"primary\",\n \"secondary\",\n \"accent\",\n \"background\",\n \"foreground\",\n];\n\nconst CURRENT_PATH = \"src/styles/palettes/_current.css\";\n\n// ── Public API ───────────────────────────────────────────\n\nexport function generatePaletteCSS(\n palette: PaletteConfig,\n themeSwitcher: boolean,\n allPalettes?: ReadonlyArray<Palette>,\n): Result<PaletteCSSOutput, Error> {\n try {\n const files: Record<string, string> = {};\n\n files[CURRENT_PATH] = buildPaletteFile(palette.colors);\n\n if (themeSwitcher && allPalettes && allPalettes.length > 0) {\n for (const registryPalette of allPalettes) {\n const path = `src/styles/palettes/${registryPalette.name}.css`;\n files[path] = buildPaletteFile(registryPalette.colors);\n }\n\n const paletteNames = allPalettes.map((palette) => palette.name);\n const script = buildSwitcherScript(paletteNames);\n\n return ok({ files, switcherScript: script });\n }\n\n return ok({ files });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : String(error);\n return err(new Error(`Failed to generate palette CSS: ${message}`));\n }\n}\n\n// ── Internals ────────────────────────────────────────────\n\nfunction buildPaletteFile(colors: PaletteColors): string {\n const properties = COLOR_TOKENS.map(\n (token) => ` --color-${token}: ${colors[token]};`,\n ).join(\"\\n\");\n\n return `:root {\\n${properties}\\n}\\n`;\n}\n\nfunction buildSwitcherScript(paletteNames: ReadonlyArray<string>): string {\n return `(function () {\n const PALETTES = ${JSON.stringify(paletteNames)};\n const STORAGE_KEY = \"fornix-palette\";\n\n function loadPalette(name) {\n const link = document.getElementById(\"fornix-palette-link\");\n if (link) {\n link.setAttribute(\"href\", \"/styles/palettes/\" + name + \".css\");\n }\n localStorage.setItem(STORAGE_KEY, name);\n }\n\n function getCurrentPalette() {\n return localStorage.getItem(STORAGE_KEY) || PALETTES[0];\n }\n\n document.addEventListener(\"DOMContentLoaded\", function () {\n const saved = getCurrentPalette();\n loadPalette(saved);\n });\n\n window.__fornixSwitchPalette = loadPalette;\n window.__fornixPalettes = PALETTES;\n})();\n`;\n}\n","import type { BlockManifest } from \"fornix-registry\";\nimport type { ResolvedConfig } from \"../schemas/config.js\";\nimport type { FileMap } from \"./structure-generator.js\";\nimport { ok, err, type Result } from \"../utils/result.js\";\n\n// ── Types ────────────────────────────────────────────────\n\n/**\n * Block source content: maps block name → (source filename → file content).\n */\nexport type BlockSourceMap = Readonly<\n Record<string, Readonly<Record<string, string>>>\n>;\n\n// ── Condition Context ────────────────────────────────────\n\ninterface ConditionContext {\n readonly renderMode: string;\n readonly deployTarget: string;\n readonly cssEngine: string;\n readonly database: string;\n}\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * Places block files into the correct project locations.\n * Reads each block's `files` array and maps source → destination,\n * evaluating `condition` fields against the resolved config.\n */\nexport function placeBlocks(\n blocks: ReadonlyArray<BlockManifest>,\n blockSources: BlockSourceMap,\n config: ResolvedConfig,\n): Result<FileMap, Error> {\n const files: FileMap = {};\n const context: ConditionContext = {\n renderMode: config.renderMode,\n deployTarget: config.deployTarget,\n cssEngine: config.cssEngine,\n database: config.database,\n };\n\n for (const block of blocks) {\n const sources = blockSources[block.name];\n if (!sources) {\n return err(\n new Error(\n `Block source content not found for '${block.name}'`,\n ),\n );\n }\n\n for (const file of block.files) {\n if (file.condition && !evaluateCondition(file.condition, context)) {\n continue;\n }\n\n const content = sources[file.source];\n if (content === undefined) {\n return err(\n new Error(\n `Source file '${file.source}' not found in block '${block.name}'`,\n ),\n );\n }\n\n files[file.destination] = content;\n }\n }\n\n return ok(files);\n}\n\n// ── Condition Evaluator ──────────────────────────────────\n\n/**\n * Evaluates a simple condition string against the config context.\n * Supports patterns like:\n * - `renderMode !== 'static'`\n * - `renderMode === 'server'`\n * - `deployTarget === 'cloudflare'`\n * - `cssEngine !== 'vanilla'`\n */\nfunction evaluateCondition(\n condition: string,\n context: ConditionContext,\n): boolean {\n const notEqualsMatch = condition.match(\n /^(\\w+)\\s*!==\\s*'([^']*)'$/,\n );\n if (notEqualsMatch) {\n const [, field, value] = notEqualsMatch;\n const contextValue = getContextValue(field as string, context);\n return contextValue !== value;\n }\n\n const equalsMatch = condition.match(\n /^(\\w+)\\s*===\\s*'([^']*)'$/,\n );\n if (equalsMatch) {\n const [, field, value] = equalsMatch;\n const contextValue = getContextValue(field as string, context);\n return contextValue === value;\n }\n\n return true;\n}\n\nfunction getContextValue(\n field: string,\n context: ConditionContext,\n): string | undefined {\n if (field in context) {\n return context[field as keyof ConditionContext];\n }\n return undefined;\n}\n","import type { BlockManifest, ContentSlot } from \"fornix-registry\";\nimport type { ResolvedConfig } from \"../schemas/config.js\";\nimport type { FileMap } from \"./structure-generator.js\";\nimport { ok, type Result } from \"../utils/result.js\";\n\n// ── Types ────────────────────────────────────────────────\n\n/**\n * Default content for blocks: maps block name → content object.\n */\nexport type BlockDefaultContent = Readonly<\n Record<string, Readonly<Record<string, unknown>>>\n>;\n\n// ── Content Subdirectory Map ─────────────────────────────\n\nconst TYPE_DIRECTORY: Record<string, string> = {\n section: \"sections\",\n integration: \"integrations\",\n feature: \"features\",\n layout: \"layouts\",\n};\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * Generates `src/content/config.ts` and places default content files\n * for all blocks that declare contentSlots in their AI metadata.\n *\n * - Single locale: content goes to `src/content/{type}/{block}.json`\n * - Multi-locale: content goes to `src/content/{locale}/{type}/{block}.json`\n */\nexport function wireContent(\n blocks: ReadonlyArray<BlockManifest>,\n defaultContent: BlockDefaultContent,\n config: ResolvedConfig,\n): Result<FileMap, Error> {\n const files: FileMap = {};\n const isMultiLocale = config.locales.length >= 2;\n\n const blocksWithContent = blocks.filter(\n (block) =>\n (block.ai?.contentSlots !== undefined &&\n Object.keys(block.ai.contentSlots).length > 0) ||\n (block.collections !== undefined && block.collections.length > 0)\n );\n\n if (blocksWithContent.length === 0) {\n return ok(files);\n }\n\n files[\"src/content/config.ts\"] = generateContentConfig(blocksWithContent);\n\n for (const block of blocksWithContent) {\n if (!block.ai?.contentSlots || Object.keys(block.ai.contentSlots).length === 0) {\n continue;\n }\n\n const subdirectory = TYPE_DIRECTORY[block.type] ?? block.type;\n const content = defaultContent[block.name] ?? buildDefaultFromSlots(block.ai.contentSlots);\n const jsonContent = JSON.stringify(content, null, 2) + \"\\n\";\n\n if (isMultiLocale) {\n for (const locale of config.locales) {\n const path = `src/content/${locale}/${subdirectory}/${block.name}.json`;\n files[path] = jsonContent;\n }\n } else {\n const path = `src/content/${subdirectory}/${block.name}.json`;\n files[path] = jsonContent;\n }\n }\n\n return ok(files);\n}\n\n// ── Content Config Generator ─────────────────────────────\n\nfunction generateContentConfig(\n blocks: ReadonlyArray<BlockManifest>,\n): string {\n const imports = [\n 'import { defineCollection, z } from \"astro:content\";',\n ];\n\n const collections: string[] = [];\n\n for (const block of blocks) {\n // 1. Process custom collections\n if (block.collections && block.collections.length > 0) {\n for (const col of block.collections) {\n const importName = `${block.name.replace(/-/g, \"\")}${col.name}Schema`;\n const importPath = col.schemaSource.replace(/\\.ts$/, \"\");\n imports.push(`import { schema as ${importName} } from \"${importPath}\";`);\n \n collections.push(\n ` \"${col.name}\": defineCollection({\\n type: \"${col.type}\",\\n schema: ${importName},\\n })`\n );\n }\n }\n\n // 2. Process data collections from AI slots\n const slots = block.ai?.contentSlots;\n if (slots && Object.keys(slots).length > 0) {\n const schemaFields = Object.entries(slots)\n .map(([name, slot]) => ` ${name}: ${zodTypeForSlot(slot)},`)\n .join(\"\\n\");\n\n collections.push(\n ` \"${block.name}\": defineCollection({\\n type: \"data\",\\n schema: z.object({\\n${schemaFields}\\n }),\\n })`,\n );\n }\n }\n\n const lines = [\n ...imports,\n \"\",\n \"export const collections = {\",\n collections.join(\",\\n\"),\n \"};\",\n \"\",\n ];\n\n return lines.join(\"\\n\");\n}\n\n// ── Zod Type Mapping ─────────────────────────────────────\n\nfunction zodTypeForSlot(slot: ContentSlot): string {\n switch (slot.type) {\n case \"string\":\n return \"z.string()\";\n case \"number\":\n return \"z.number()\";\n case \"boolean\":\n return \"z.boolean()\";\n case \"array\":\n return \"z.array(z.unknown())\";\n case \"object\":\n return \"z.record(z.unknown())\";\n }\n}\n\n// ── Default Content Builder ──────────────────────────────\n\nfunction buildDefaultFromSlots(\n slots: Readonly<Record<string, ContentSlot>>,\n): Record<string, unknown> {\n const content: Record<string, unknown> = {};\n\n for (const [name, slot] of Object.entries(slots)) {\n content[name] = defaultValueForType(slot.type);\n }\n\n return content;\n}\n\nfunction defaultValueForType(type: ContentSlot[\"type\"]): unknown {\n switch (type) {\n case \"string\":\n return \"\";\n case \"number\":\n return 0;\n case \"boolean\":\n return false;\n case \"array\":\n return [];\n case \"object\":\n return {};\n }\n}\n","import type { ResolvedConfig } from \"../schemas/config.js\";\nimport type { FileMap } from \"./structure-generator.js\";\nimport { ok, type Result } from \"../utils/result.js\";\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * When `locales.length >= 2`, scaffolds i18n infrastructure:\n * - `src/i18n/utils.ts` with `getLocale()` and `t()` helpers\n * - `src/pages/[locale]/index.astro` for locale-prefixed routing\n *\n * Returns an empty FileMap for single-locale projects.\n */\nexport function wireI18n(\n config: ResolvedConfig,\n): Result<FileMap, Error> {\n const files: FileMap = {};\n\n if (config.locales.length < 2) {\n return ok(files);\n }\n\n files[\"src/i18n/utils.ts\"] = generateI18nUtils(config);\n files[\"src/pages/[locale]/index.astro\"] = generateLocaleIndexPage(config);\n\n return ok(files);\n}\n\n// ── i18n Utils Generator ─────────────────────────────────\n\nfunction generateI18nUtils(config: ResolvedConfig): string {\n const localesArray = config.locales\n .map((locale) => `\"${locale}\"`)\n .join(\", \");\n\n return `export const locales = [${localesArray}] as const;\nexport type Locale = (typeof locales)[number];\nexport const defaultLocale: Locale = \"${config.defaultLocale}\";\n\n/**\n * Gets the current locale from the URL pathname.\n * Falls back to the default locale if not found.\n */\nexport function getLocale(pathname: string): Locale {\n const segments = pathname.split(\"/\").filter(Boolean);\n const candidate = segments[0];\n if (candidate && (locales as readonly string[]).includes(candidate)) {\n return candidate as Locale;\n }\n return defaultLocale;\n}\n\n/**\n * Simple translation lookup.\n * Given a translations record keyed by locale, returns the value\n * for the specified locale (or falls back to default).\n */\nexport function t<T>(\n translations: Record<Locale, T>,\n locale: Locale,\n): T {\n return translations[locale] ?? translations[defaultLocale];\n}\n`;\n}\n\n// ── Locale Index Page Generator ──────────────────────────\n\nfunction generateLocaleIndexPage(config: ResolvedConfig): string {\n return `---\nimport { locales } from \"../../i18n/utils\";\nimport Layout from \"../../layouts/Layout.astro\";\n\nexport function getStaticPaths() {\n return locales.map((locale) => ({ params: { locale } }));\n}\n\nconst { locale } = Astro.params;\n---\n<Layout title=\"${config.projectName}\">\n <main>\n <h1>${config.projectName}</h1>\n <p>Locale: {locale}</p>\n </main>\n</Layout>\n`;\n}\n","import type { BlockManifest } from \"fornix-registry\";\nimport type { ResolvedConfig } from \"../schemas/config.js\";\nimport type { FileMap } from \"./structure-generator.js\";\n\nfunction getI18nInfo(config: ResolvedConfig): string {\n if (config.locales.length >= 2) {\n return `\n### i18n\ni18n is enabled. The project supports the following locales: \\`${config.locales.join(\", \")}\\` with \\`${config.defaultLocale}\\` as default.\nContent is organized in locale-specific folders under \\`src/content/\\`:\n${config.locales.map((l: string) => `- \\`src/content/${l}/\\``).join(\"\\n\")}\n`;\n }\n return `\\n### Content\\nContent is located under \\`src/content/\\`.\\n`;\n}\n\nfunction getBlocksTable(blocks: ReadonlyArray<BlockManifest>): string {\n if (blocks.length === 0) return \"No blocks installed.\\n\";\n const rows = blocks.map(b => `| \\`${b.name}\\` | ${b.type} | ${b.description} |`).join(\"\\n\");\n return `| Block | Type | Description |\\n|-------|------|-------------|\\n${rows}\\n`;\n}\n\nexport function generateAgentContext(\n config: ResolvedConfig,\n blocks: ReadonlyArray<BlockManifest>,\n): FileMap {\n const i18nSection = getI18nInfo(config);\n const blocksTable = getBlocksTable(blocks);\n \n const content = `# Fornix Project: ${config.projectName}\n\n## Architecture\n- **Render Mode:** ${config.renderMode}\n- **Deploy Target:** ${config.deployTarget}\n- **Database:** ${config.database}\n- **CSS Engine:** ${config.cssEngine}\n- **Package Manager:** ${config.packageManager}\n\n## Installed Blocks\n${blocksTable}\n## Content & Locales\n${i18nSection}\n## CLI Commands\n- \\`npx create-fornix [dir]\\` — scaffold a new project (AI mode default, \\`--manual\\` for interactive)\n- \\`fornix add <block>\\` / \\`fornix remove <block>\\` — manage blocks\n- \\`fornix list\\` / \\`fornix status\\` — inspect registry and project\n- \\`fornix mcp serve\\` — MCP server for AI agent integration\n\n> **Note to AI Agents:** You should respect the Fornix architectural guidelines by updating JSON content for text changes, and interacting via MCP rather than modifying block structures ad hoc.\n`;\n\n const cursorContent = `---\ndescription: Fornix Project Architecture and Context\nglobs: *\n---\n${content}\n`;\n\n return {\n \"CLAUDE.md\": content,\n \".cursor/rules/fornix.mdc\": cursorContent,\n };\n}\n","import type { BlockManifest, Palette } from \"fornix-registry\";\nimport type { ResolvedConfig } from \"../schemas/config.js\";\nimport type { FileMap } from \"./structure-generator.js\";\nimport type { BlockSourceMap } from \"./block-placer.js\";\nimport type { BlockDefaultContent } from \"./content-wiring.js\";\nimport { ok, err, isOk, type Result } from \"../utils/result.js\";\nimport { validateConfig } from \"./config-validator.js\";\nimport { resolveDependencies } from \"./dependency-resolver.js\";\nimport { generateStructure } from \"./structure-generator.js\";\nimport { generateAstroConfig } from \"./config-generators/astro-config.js\";\nimport { generateTailwindConfig } from \"./config-generators/tailwind-config.js\";\nimport { generatePaletteCSS } from \"./config-generators/palette-css.js\";\nimport { placeBlocks } from \"./block-placer.js\";\nimport { wireContent } from \"./content-wiring.js\";\nimport { wireI18n } from \"./i18n-wiring.js\";\nimport { generateAgentContext } from \"./agent-context-generator.js\";\n\n// ── Types ────────────────────────────────────────────────\n\nexport interface ScaffoldInput {\n readonly config: ResolvedConfig;\n readonly manifests: Readonly<Record<string, BlockManifest>>;\n readonly blockSources: BlockSourceMap;\n readonly blockDefaultContent: BlockDefaultContent;\n readonly allPalettes: ReadonlyArray<Palette>;\n}\n\nexport interface ScaffoldResult {\n readonly files: FileMap;\n readonly resolvedBlockNames: ReadonlyArray<string>;\n}\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * Full scaffold pipeline: validates config, resolves dependencies,\n * generates project structure, config files, places blocks,\n * wires content and i18n, generates .env.example, and writes fornix.json.\n *\n * Pure function: config in → files out. No side effects.\n */\nexport function scaffold(\n input: ScaffoldInput,\n): Result<ScaffoldResult, Error> {\n const { config, manifests, blockSources, blockDefaultContent, allPalettes } = input;\n\n // 1. Validate config\n const validationResult = validateConfig(config, manifests);\n if (!isOk(validationResult)) {\n const messages = validationResult.error\n .map((validationError) => validationError.message)\n .join(\"; \");\n return err(new Error(`Config validation failed: ${messages}`));\n }\n\n // 2. Resolve dependencies\n const selectedBlockNames = config.blocks.map((block) => block.name);\n const dependencyResult = resolveDependencies(selectedBlockNames, manifests);\n if (!isOk(dependencyResult)) {\n return err(new Error(`Dependency resolution failed: ${dependencyResult.error.message}`));\n }\n const resolvedBlockNames = dependencyResult.value;\n\n // 3. Generate base structure\n const files: FileMap = {};\n const structureFiles = generateStructure(config);\n Object.assign(files, structureFiles);\n\n // 4. Resolve block manifests\n const resolvedManifests = resolvedBlockNames\n .filter((name) => manifests[name] !== undefined)\n .map((name) => manifests[name]);\n\n // 5. Generate astro.config.mjs\n const astroConfigResult = generateAstroConfig(config, resolvedManifests);\n if (!isOk(astroConfigResult)) {\n return err(astroConfigResult.error);\n }\n files[\"astro.config.mjs\"] = astroConfigResult.value;\n\n // 5. Generate tailwind config\n const tailwindResult = generateTailwindConfig(config);\n if (!isOk(tailwindResult)) {\n return err(tailwindResult.error);\n }\n if (tailwindResult.value !== null) {\n files[\"tailwind.css\"] = tailwindResult.value;\n }\n\n // 6. Generate palette CSS\n const paletteResult = generatePaletteCSS(\n config.palette,\n config.themeSwitcher,\n allPalettes.length > 0 ? allPalettes : undefined,\n );\n if (!isOk(paletteResult)) {\n return err(paletteResult.error);\n }\n Object.assign(files, paletteResult.value.files);\n if (paletteResult.value.switcherScript) {\n files[\"src/scripts/theme-switcher.js\"] = paletteResult.value.switcherScript;\n }\n\n // 7. Place block files\n\n const blockPlaceResult = placeBlocks(resolvedManifests, blockSources, config);\n if (!isOk(blockPlaceResult)) {\n return err(blockPlaceResult.error);\n }\n Object.assign(files, blockPlaceResult.value);\n\n // 8. Wire content collections\n const contentResult = wireContent(resolvedManifests, blockDefaultContent, config);\n if (!isOk(contentResult)) {\n return err(contentResult.error);\n }\n Object.assign(files, contentResult.value);\n\n // 9. Wire i18n\n const i18nResult = wireI18n(config);\n if (!isOk(i18nResult)) {\n return err(i18nResult.error);\n }\n Object.assign(files, i18nResult.value);\n\n // 10. Generate .env.example\n const envVars = collectEnvVars(resolvedManifests);\n if (envVars.length > 0) {\n files[\".env.example\"] = generateEnvExample(envVars);\n }\n\n // 11. Write fornix.json (ProjectManifest)\n files[\"fornix.json\"] = generateProjectManifest(config, resolvedManifests);\n\n // 12. Generate Agent Context (CLAUDE.md and .cursor/rules/fornix.mdc)\n const agentContextFiles = generateAgentContext(config, resolvedManifests);\n Object.assign(files, agentContextFiles);\n\n return ok({ files, resolvedBlockNames });\n}\n\n// ── .env.example Generator ───────────────────────────────\n\ninterface EnvVarEntry {\n readonly name: string;\n readonly description: string;\n readonly required: boolean;\n readonly blockName: string;\n}\n\nfunction collectEnvVars(\n blocks: ReadonlyArray<BlockManifest>,\n): EnvVarEntry[] {\n const entries: EnvVarEntry[] = [];\n const seen = new Set<string>();\n\n for (const block of blocks) {\n for (const envVar of block.envVars) {\n if (!seen.has(envVar.name)) {\n seen.add(envVar.name);\n entries.push({\n name: envVar.name,\n description: envVar.description,\n required: envVar.required,\n blockName: block.name,\n });\n }\n }\n }\n\n return entries;\n}\n\nfunction generateEnvExample(envVars: ReadonlyArray<EnvVarEntry>): string {\n const lines: string[] = [\n \"# Environment Variables\",\n \"# Generated by Fornix — fill in your values\",\n \"\",\n ];\n\n for (const envVar of envVars) {\n lines.push(`# ${envVar.description} (from ${envVar.blockName})`);\n lines.push(`${envVar.name}=`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\n// ── Project Manifest Generator ───────────────────────────\n\nfunction generateProjectManifest(\n config: ResolvedConfig,\n blocks: ReadonlyArray<BlockManifest>,\n): string {\n const now = new Date().toISOString();\n\n const manifest = {\n version: \"1.0.0\",\n createdAt: now,\n createdWith: config.createdWith,\n renderMode: config.renderMode,\n deployTarget: config.deployTarget,\n database: config.database,\n locales: config.locales,\n defaultLocale: config.defaultLocale,\n palette: config.palette,\n themeSwitcher: config.themeSwitcher,\n blocks: blocks.map((block) => ({\n name: block.name,\n version: block.version,\n variant: config.blocks.find((selection) => selection.name === block.name)?.variant ?? \"default\",\n installedAt: now,\n })),\n };\n\n return JSON.stringify(manifest, null, 2) + \"\\n\";\n}\n","/**\n * Hardcoded fixture manifests for the flag-driven scaffold.\n * This will be replaced by a real registry loader in a later phase.\n */\n\nimport type { BlockManifest, Palette } from \"fornix-registry\";\nimport type { BlockSourceMap } from \"../scaffold/block-placer.js\";\nimport type { BlockDefaultContent } from \"../scaffold/content-wiring.js\";\nimport { readFileSync, readdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// ── Block Manifests ─────────────────────────────────────\n\nfunction manifest(\n name: string,\n overrides: Partial<BlockManifest> = {},\n): BlockManifest {\n return {\n schemaVersion: 1,\n name,\n version: \"1.0.0\",\n type: \"section\",\n description: `Block ${name}`,\n category: \"general\",\n tags: [],\n dependencies: {},\n requires: [],\n conflicts: [],\n envVars: [],\n variants: [\"default\"],\n slots: [],\n files: [\n {\n source: `${name}.astro`,\n destination: `src/components/sections/${name}.astro`,\n },\n ],\n ...overrides,\n };\n}\n\nexport const FIXTURE_MANIFESTS: Record<string, BlockManifest> = {\n \"hero-gradient\": manifest(\"hero-gradient\", {\n category: \"hero\",\n ai: {\n whenToUse: \"Landing page hero with gradient background\",\n whenNotToUse: \"Internal pages\",\n pairsWith: [\"cta-simple\", \"features-grid\"],\n contentSlots: {\n headline: { type: \"string\", description: \"Main headline\" },\n subheadline: { type: \"string\", description: \"Sub headline\" },\n },\n },\n }),\n \"footer-minimal\": manifest(\"footer-minimal\", {\n category: \"footer\",\n }),\n \"cta-simple\": manifest(\"cta-simple\", {\n category: \"cta\",\n }),\n \"features-grid\": manifest(\"features-grid\", {\n category: \"features\",\n }),\n \"auth-better-auth\": manifest(\"auth-better-auth\", {\n type: \"integration\",\n category: \"auth\",\n requiredMode: \"server\",\n requires: [\"db-d1\"],\n envVars: [\n { name: \"AUTH_SECRET\", description: \"Auth secret key\", required: true },\n { name: \"GITHUB_CLIENT_ID\", description: \"GitHub OAuth client ID\", required: true },\n { name: \"GITHUB_CLIENT_SECRET\", description: \"GitHub OAuth client secret\", required: true },\n ],\n files: [\n { source: \"auth.ts\", destination: \"src/lib/auth.ts\" },\n { source: \"middleware.ts\", destination: \"src/middleware/auth.ts\" },\n { source: \"auth-api.ts\", destination: \"src/pages/api/auth/[...all].ts\" },\n { source: \"login.astro\", destination: \"src/pages/login.astro\" },\n { source: \"signup.astro\", destination: \"src/pages/signup.astro\" },\n ],\n }),\n \"db-d1\": manifest(\"db-d1\", {\n type: \"integration\",\n category: \"database\",\n requiredMode: \"server\",\n envVars: [\n { name: \"D1_DATABASE_ID\", description: \"Cloudflare D1 database ID\", required: true },\n ],\n files: [\n { source: \"db.ts\", destination: \"src/lib/db.ts\" },\n { source: \"schema.ts\", destination: \"src/lib/db-schema.ts\" },\n { source: \"drizzle.config.ts\", destination: \"drizzle.config.ts\" },\n { source: \"migrations/.gitkeep\", destination: \"drizzle/migrations/.gitkeep\" },\n ],\n }),\n \"blog-mdx\": manifest(\"blog-mdx\", {\n type: \"feature\",\n category: \"blog\",\n files: [\n { source: \"schema.ts\", destination: \"src/content/blog-schema.ts\" },\n { source: \"pages/index.astro\", destination: \"src/pages/blog/index.astro\" },\n { source: \"pages/[slug].astro\", destination: \"src/pages/blog/[slug].astro\" },\n { source: \"pages/rss.xml.ts\", destination: \"src/pages/rss.xml.ts\" }\n ],\n }),\n \"docs-collection\": manifest(\"docs-collection\", {\n type: \"feature\",\n category: \"docs\",\n files: [\n { source: \"schema.ts\", destination: \"src/content/docs-schema.ts\" },\n { source: \"pages/[...slug].astro\", destination: \"src/pages/docs/[...slug].astro\" }\n ],\n }),\n \"layout-marketing\": manifest(\"layout-marketing\", {\n type: \"layout\",\n category: \"marketing\",\n files: [\n { source: \"layout-marketing.astro\", destination: \"src/layouts/layout-marketing.astro\" },\n { source: \"default-content.json\", destination: \"src/content/layouts/layout-marketing.json\" }\n ],\n ai: {\n whenToUse: \"marketing pages\",\n whenNotToUse: \"dashboards\",\n pairsWith: [],\n contentSlots: {\n headerLinks: { type: \"array\" },\n footerText: { type: \"string\" }\n }\n }\n }),\n \"layout-docs\": manifest(\"layout-docs\", {\n type: \"layout\",\n category: \"docs\",\n files: [\n { source: \"layout-docs.astro\", destination: \"src/layouts/layout-docs.astro\" },\n { source: \"default-content.json\", destination: \"src/content/layouts/layout-docs.json\" }\n ],\n ai: {\n whenToUse: \"docs\",\n whenNotToUse: \"marketing\",\n pairsWith: [],\n contentSlots: {\n headerTitle: { type: \"string\" },\n footerText: { type: \"string\" }\n }\n }\n }),\n \"layout-dashboard\": manifest(\"layout-dashboard\", {\n type: \"layout\",\n category: \"dashboard\",\n requiredMode: \"server\",\n requires: [\"auth-better-auth\"],\n files: [\n { source: \"layout-dashboard.astro\", destination: \"src/layouts/layout-dashboard.astro\" },\n { source: \"default-content.json\", destination: \"src/content/layouts/layout-dashboard.json\" }\n ],\n ai: {\n whenToUse: \"dashboards\",\n whenNotToUse: \"marketing\",\n pairsWith: [],\n contentSlots: {\n sidebarLinks: { type: \"array\" },\n logoutText: { type: \"string\" }\n }\n }\n }),\n \"hero-video\": manifest(\"hero-video\"),\n \"features-bento\": manifest(\"features-bento\"),\n \"pricing-table\": manifest(\"pricing-table\"),\n \"faq-accordion\": manifest(\"faq-accordion\"),\n \"footer-rich\": manifest(\"footer-rich\"),\n \"testimonials-carousel\": manifest(\"testimonials-carousel\"),\n \"contact-form\": manifest(\"contact-form\"),\n \"hero-split\": manifest(\"hero-split\"),\n \"header-transparent\": manifest(\"header-transparent\"),\n \"cta-newsletter\": manifest(\"cta-newsletter\"),\n \"header-sticky\": manifest(\"header-sticky\"),\n};\n\n// ── Block Sources (stub file contents) ──────────────────\n\nexport const FIXTURE_BLOCK_SOURCES: BlockSourceMap = {\n \"hero-gradient\": {\n \"hero-gradient.astro\": `---\ninterface Props {\n headline?: string;\n subheadline?: string;\n}\nconst { headline = \"Welcome\", subheadline = \"\" } = Astro.props;\n---\n<section class=\"hero-gradient\">\n <h1>{headline}</h1>\n {subheadline && <p>{subheadline}</p>}\n</section>\n`,\n },\n \"footer-minimal\": {\n \"footer-minimal.astro\": `<footer class=\"footer-minimal\">\n <p>© {new Date().getFullYear()}</p>\n</footer>\n`,\n },\n \"cta-simple\": {\n \"cta-simple.astro\": `<section class=\"cta-simple\">\n <h2>Get Started</h2>\n <a href=\"#\" class=\"btn\">Start Now</a>\n</section>\n`,\n },\n \"features-grid\": {\n \"features-grid.astro\": `<section class=\"features-grid\">\n <h2>Features</h2>\n <div class=\"grid\"></div>\n</section>\n`,\n },\n \"auth-better-auth\": {\n \"auth.ts\": `import { getDb } from \"./db\";\n\ntype D1Database = any;\n\nexport function createAuth(d1: D1Database) {\n const db = getDb(d1);\n return { handler: (req: Request) => new Response(\"auth\") };\n}\n`,\n \"middleware.ts\": `import type { MiddlewareHandler } from \"astro\";\nimport { createAuth } from \"../lib/auth\";\n\nexport const authMiddleware: MiddlewareHandler = async (context, next) => {\n return next();\n};\n`,\n \"auth-api.ts\": `import type { APIRoute } from \"astro\";\nimport { createAuth } from \"../../../lib/auth\";\n\nexport const ALL: APIRoute = async (context) => {\n const d1 = (context.locals as Record<string, { env: { DB: any } }>).runtime.env.DB;\n const auth = createAuth(d1);\n return auth.handler(context.request);\n};\n`,\n \"login.astro\": `---\\n---\\n<main class=\"auth-page\"><h1>Login</h1></main>\\n`,\n \"signup.astro\": `---\\n---\\n<main class=\"auth-page\"><h1>Sign Up</h1></main>\\n`,\n },\n \"db-d1\": {\n \"db.ts\": `import * as schema from \"./db-schema\";\n\nexport type Database = any;\n\nexport function getDb(d1: any): Database {\n return schema;\n}\n`,\n \"schema.ts\": `// Database schema — define your tables here.\n// See: https://orm.drizzle.team/docs/sql-schema-declaration\nexport const users = {};\n`,\n \"drizzle.config.ts\": `export default {\n schema: \"./src/lib/db-schema.ts\",\n out: \"./drizzle/migrations\",\n dialect: \"sqlite\",\n} as any;\n`,\n \"migrations/.gitkeep\": \"\",\n },\n \"blog-mdx\": {\n \"schema.ts\": `import { z, defineCollection } from \"astro:content\";\\nexport const blog = defineCollection({ schema: z.any() });\\n`,\n \"pages/index.astro\": `---\n---\n<h1>Blog</h1>`,\n \"pages/[slug].astro\": `---\nexport function getStaticPaths() { return [{ params: { slug: '1' } }]; }\n---\n<h1>Post</h1>`,\n \"pages/rss.xml.ts\": `export const GET = () => new Response(\"RSS\");`\n },\n \"docs-collection\": {\n \"schema.ts\": `import { z, defineCollection } from \"astro:content\";\\nexport const docs = defineCollection({ schema: z.any() });\\n`,\n \"pages/[...slug].astro\": `---\nexport function getStaticPaths() { return [{ params: { slug: '1' } }]; }\n---\n<h1>Docs</h1>`\n },\n \"layout-marketing\": {\n \"layout-marketing.astro\": `---\n---\n<slot />`,\n \"default-content.json\": `{ \"headerLinks\": [], \"footerText\": \"\" }`\n },\n \"layout-docs\": {\n \"layout-docs.astro\": `---\n---\n<slot />`,\n \"default-content.json\": `{ \"headerTitle\": \"\", \"footerText\": \"\" }`\n },\n \"layout-dashboard\": {\n \"layout-dashboard.astro\": `---\n---\n<slot />`,\n \"default-content.json\": `{ \"sidebarLinks\": [], \"logoutText\": \"\" }`\n },\n \"hero-video\": { \"hero-video.astro\": \"<section>Hero Video</section>\\n\", },\n \"features-bento\": { \"features-bento.astro\": \"<section>Features Bento</section>\\n\", },\n \"pricing-table\": { \"pricing-table.astro\": \"<section>Pricing</section>\\n\", },\n \"faq-accordion\": { \"faq-accordion.astro\": \"<section>FAQ</section>\\n\", },\n \"footer-rich\": { \"footer-rich.astro\": \"<section>Footer</section>\\n\", },\n \"testimonials-carousel\": { \"testimonials-carousel.astro\": \"<section>Testimonials</section>\\n\", },\n \"contact-form\": { \"contact-form.astro\": \"<section>Contact</section>\\n\", },\n \"hero-split\": { \"hero-split.astro\": \"<section>Hero Split</section>\\n\", },\n \"header-transparent\": { \"header-transparent.astro\": \"<header>Transparent</header>\\n\", },\n \"cta-newsletter\": { \"cta-newsletter.astro\": \"<section>CTA</section>\\n\", },\n \"header-sticky\": { \"header-sticky.astro\": \"<header>Sticky</header>\\n\", },\n};\n\n// ── Block Default Content ───────────────────────────────\n\nexport const FIXTURE_DEFAULT_CONTENT: BlockDefaultContent = {};\n\n// ── Palette Loader ──────────────────────────────────────\n\n/**\n * Loads all palette JSON files from the fornix-registry palettes/ directory.\n * Falls back to an empty array if the directory isn't found.\n */\nexport function loadAllPalettes(): Palette[] {\n try {\n // Resolve the palettes directory relative to the fornix-registry package\n const registryPath = findRegistryPalettesDir();\n if (!registryPath) return [];\n\n const files = readdirSync(registryPath).filter((f) => f.endsWith(\".json\"));\n const palettes: Palette[] = [];\n\n for (const file of files) {\n try {\n const content = readFileSync(join(registryPath, file), \"utf-8\");\n palettes.push(JSON.parse(content) as Palette);\n } catch {\n // Skip malformed palette files\n }\n }\n\n return palettes;\n } catch {\n return [];\n }\n}\n\nfunction findRegistryPalettesDir(): string | null {\n try {\n // Try to resolve from the fornix-registry package\n const thisDir = dirname(fileURLToPath(import.meta.url));\n // Walk up to find the monorepo root, then into fornix-registry\n const monorepoRoot = join(thisDir, \"..\", \"..\", \"..\");\n const palettesDir = join(monorepoRoot, \"packages\", \"fornix-registry\", \"palettes\");\n readdirSync(palettesDir); // Throws if not found\n return palettesDir;\n } catch {\n return null;\n }\n}\n","/**\n * Interactive manual prompt flow using @clack/prompts.\n *\n * Prompt sequence:\n * 1. Project name\n * 2. Render mode\n * 3. Deploy target\n * 4. CSS engine\n * 5. Block selection (categorized)\n * 6. Locale selection\n * 7. Palette selection (browse pre-built, grouped by category)\n * 8. Theme switcher toggle\n * 9. Confirmation summary\n *\n * Output: ResolvedConfig (or null if cancelled)\n */\n\nimport * as p from \"@clack/prompts\";\nimport pc from \"picocolors\";\nimport type { ResolvedConfig } from \"../schemas/config.js\";\nimport type { BlockManifest, Palette } from \"fornix-registry\";\n\n// ── Types ───────────────────────────────────────────────\n\nexport interface ManualFlowInput {\n readonly defaultProjectName: string;\n readonly manifests: Readonly<Record<string, BlockManifest>>;\n readonly allPalettes: ReadonlyArray<Palette>;\n}\n\n// ── Public API ──────────────────────────────────────────\n\nexport async function runManualFlow(\n input: ManualFlowInput,\n): Promise<ResolvedConfig | null> {\n p.intro(pc.bgCyan(pc.black(\" Fornix — Create your project \")));\n\n // 1. Project name\n const projectName = await p.text({\n message: \"What is your project name?\",\n placeholder: input.defaultProjectName,\n defaultValue: input.defaultProjectName,\n validate(value) {\n if (!value.trim()) return \"Project name is required\";\n if (!/^[a-z0-9-]+$/i.test(value.trim())) {\n return \"Project name must only contain letters, numbers, and dashes\";\n }\n return undefined;\n },\n });\n if (p.isCancel(projectName)) return handleCancel();\n\n // 2. Render mode\n const renderMode = await p.select({\n message: \"Choose a render mode\",\n options: [\n { value: \"static\", label: \"Static (SSG)\", hint: \"Pre-built HTML, fastest\" },\n { value: \"hybrid\", label: \"Hybrid\", hint: \"Static by default, opt into SSR per page\" },\n { value: \"server\", label: \"Server (SSR)\", hint: \"Server-rendered on every request\" },\n ],\n });\n if (p.isCancel(renderMode)) return handleCancel();\n\n // 3. Deploy target\n const deployTarget = await p.select({\n message: \"Where will you deploy?\",\n options: [\n { value: \"cloudflare\", label: \"Cloudflare Pages\", hint: \"Recommended\" },\n { value: \"vercel\", label: \"Vercel\" },\n { value: \"netlify\", label: \"Netlify\" },\n { value: \"static\", label: \"Static hosting\", hint: \"No adapter needed\" },\n ],\n });\n if (p.isCancel(deployTarget)) return handleCancel();\n\n // 4. CSS engine\n const cssEngine = await p.select({\n message: \"Choose a CSS engine\",\n options: [\n { value: \"tailwind\", label: \"Tailwind CSS v4\", hint: \"Recommended\" },\n { value: \"vanilla\", label: \"Vanilla CSS\", hint: \"No framework\" },\n ],\n });\n if (p.isCancel(cssEngine)) return handleCancel();\n\n // 5. Block selection (categorized)\n const blockOptions = buildBlockOptions(input.manifests);\n let selectedBlocks: string[] = [];\n\n if (blockOptions.length > 0) {\n const blocks = await p.multiselect({\n message: \"Select blocks to include (space to toggle, enter to confirm)\",\n options: blockOptions,\n required: false,\n });\n if (p.isCancel(blocks)) return handleCancel();\n selectedBlocks = blocks as string[];\n }\n\n // 6. Locales\n const localesInput = await p.text({\n message: \"Locales (comma-separated, e.g. en,es,ar)\",\n placeholder: \"en\",\n defaultValue: \"en\",\n });\n if (p.isCancel(localesInput)) return handleCancel();\n\n const locales = (localesInput as string)\n .split(\",\")\n .map((l) => l.trim())\n .filter(Boolean);\n const defaultLocale = locales[0] ?? \"en\";\n\n // 7. Palette selection (grouped by category with separators)\n const paletteOptions = buildPaletteOptions(input.allPalettes);\n let selectedPalette: Palette | undefined;\n\n if (paletteOptions.length > 0) {\n const paletteChoice = await p.select({\n message: \"Choose a default color palette\",\n options: paletteOptions,\n });\n if (p.isCancel(paletteChoice)) return handleCancel();\n\n selectedPalette = input.allPalettes.find((pal) => pal.name === paletteChoice);\n }\n\n // 8. Theme switcher toggle (only if 2+ palettes available)\n let themeSwitcher = false;\n if (input.allPalettes.length >= 2) {\n const paletteCount = input.allPalettes.length;\n const switcherChoice = await p.confirm({\n message: `Enable theme switcher? (includes all ${paletteCount} registry palettes for runtime switching)`,\n initialValue: false,\n });\n if (p.isCancel(switcherChoice)) return handleCancel();\n themeSwitcher = switcherChoice as boolean;\n }\n\n // ── Build ResolvedConfig ──\n const config: ResolvedConfig = {\n projectName: (projectName as string).trim(),\n projectDir: `./${(projectName as string).trim()}`,\n renderMode: renderMode as \"static\" | \"hybrid\" | \"server\",\n deployTarget: deployTarget as \"cloudflare\" | \"vercel\" | \"netlify\" | \"static\",\n database: \"none\",\n cssEngine: cssEngine as \"tailwind\" | \"vanilla\",\n packageManager: \"pnpm\",\n blocks: selectedBlocks.map((name) => ({ name, variant: \"default\" })),\n locales,\n defaultLocale,\n palette: {\n ...(selectedPalette ? { preset: selectedPalette.name } : {}),\n colors: selectedPalette?.colors ?? {\n primary: \"#6366f1\",\n secondary: \"#818cf8\",\n accent: \"#c084fc\",\n background: \"#0f172a\",\n foreground: \"#f8fafc\",\n },\n },\n themeSwitcher,\n createdWith: \"manual\",\n } as ResolvedConfig;\n\n // 9. Confirmation summary\n p.note(\n buildSummary(config, selectedBlocks, selectedPalette),\n \"Project Summary\",\n );\n\n const confirmed = await p.confirm({\n message: \"Create this project?\",\n initialValue: true,\n });\n if (p.isCancel(confirmed) || !confirmed) return handleCancel();\n\n return config;\n}\n\n// ── Helpers ─────────────────────────────────────────────\n\nfunction handleCancel(): null {\n p.cancel(\"Operation cancelled.\");\n return null;\n}\n\nfunction buildBlockOptions(\n manifests: Readonly<Record<string, BlockManifest>>,\n): Array<{ value: string; label: string; hint?: string }> {\n const blocks = Object.values(manifests);\n\n // Group by category\n const categories = new Map<string, BlockManifest[]>();\n for (const block of blocks) {\n const category = block.category ?? \"other\";\n if (!categories.has(category)) {\n categories.set(category, []);\n }\n categories.get(category)!.push(block);\n }\n\n // Build flat options with category hints\n const options: Array<{ value: string; label: string; hint?: string }> = [];\n\n for (const [category, categoryBlocks] of categories) {\n for (const block of categoryBlocks) {\n options.push({\n value: block.name,\n label: `${block.name}`,\n hint: `${category} — ${block.description}`,\n });\n }\n }\n\n return options;\n}\n\nfunction buildPaletteOptions(\n palettes: ReadonlyArray<Palette>,\n): Array<{ value: string; label: string; hint?: string }> {\n if (palettes.length === 0) return [];\n\n // Sort palettes by category (alphabetical), then by display name within each category\n const sorted = [...palettes].sort((a, b) => {\n const catA = a.category ?? \"other\";\n const catB = b.category ?? \"other\";\n if (catA !== catB) return catA.localeCompare(catB);\n return a.displayName.localeCompare(b.displayName);\n });\n\n // Build options — category shown in hint, mode emoji in label\n return sorted.map((palette) => {\n const modeLabel = palette.mode === \"dark\" ? \"🌙\" : \"☀️\";\n const category = palette.category ?? \"other\";\n return {\n value: palette.name,\n label: `${modeLabel} ${palette.displayName}`,\n hint: `${category} · ${palette.colors.primary}`,\n };\n });\n}\n\nfunction buildSummary(\n config: ResolvedConfig,\n blockNames: ReadonlyArray<string>,\n palette: Palette | undefined,\n): string {\n const lines: string[] = [];\n\n lines.push(`${pc.bold(\"Project:\")} ${config.projectName}`);\n lines.push(`${pc.bold(\"Render mode:\")} ${config.renderMode}`);\n lines.push(`${pc.bold(\"Deploy to:\")} ${config.deployTarget}`);\n lines.push(`${pc.bold(\"CSS engine:\")} ${config.cssEngine}`);\n\n if (blockNames.length > 0) {\n lines.push(`${pc.bold(\"Blocks:\")} ${blockNames.join(\", \")}`);\n } else {\n lines.push(`${pc.bold(\"Blocks:\")} ${pc.dim(\"(none)\")}`);\n }\n\n lines.push(`${pc.bold(\"Locales:\")} ${config.locales.join(\", \")} (default: ${config.defaultLocale})`);\n\n if (palette) {\n lines.push(`${pc.bold(\"Palette:\")} ${palette.displayName} (${palette.mode})`);\n } else {\n lines.push(`${pc.bold(\"Palette:\")} ${pc.dim(\"default\")}`);\n }\n\n if (config.themeSwitcher) {\n lines.push(`${pc.bold(\"Theme switcher:\")} ${pc.green(\"yes\")} (all registry palettes included)`);\n } else {\n lines.push(`${pc.bold(\"Theme switcher:\")} ${pc.dim(\"no\")}`);\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Post-scaffold hooks: actions that run AFTER the pure scaffold pipeline\n * writes files to disk.\n *\n * - Install dependencies (pnpm/npm/bun)\n * - git init + initial commit\n * - Generate CLAUDE.md with project-specific context\n * - Print success box with next steps\n */\n\nimport { execSync } from \"node:child_process\";\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport type { ResolvedConfig } from \"../schemas/config.js\";\nimport pc from \"picocolors\";\n\n// ── Types ───────────────────────────────────────────────\n\nexport interface PostScaffoldInput {\n readonly config: ResolvedConfig;\n readonly resolvedBlockNames: ReadonlyArray<string>;\n readonly filesWritten: number;\n readonly verbose: boolean;\n readonly skipInstall?: boolean;\n readonly skipGit?: boolean;\n}\n\nexport interface PostScaffoldCallbacks {\n readonly onLog: (message: string) => void;\n readonly onWarn: (message: string) => void;\n}\n\n// ── Public API ──────────────────────────────────────────\n\nexport function runPostScaffold(\n input: PostScaffoldInput,\n callbacks?: PostScaffoldCallbacks,\n): void {\n const log = callbacks?.onLog ?? ((msg: string) => console.log(msg));\n const warn = callbacks?.onWarn ?? ((msg: string) => console.warn(msg));\n const { config, resolvedBlockNames, filesWritten, verbose } = input;\n const projectDir = config.projectDir;\n const projectName = basename(projectDir);\n\n // 1. Generate CLAUDE.md\n generateClaudeMd(projectDir, config, resolvedBlockNames);\n if (verbose) log(pc.dim(\" created CLAUDE.md\"));\n\n // 2. Install dependencies\n let installSuccess = false;\n if (!input.skipInstall) {\n installSuccess = installDependencies(projectDir, config.packageManager, verbose, log, warn);\n }\n\n // 3. Git init\n let gitSuccess = false;\n if (!input.skipGit) {\n gitSuccess = initGit(projectDir, verbose, log, warn);\n }\n\n // 4. Print success message\n log(\"\");\n log(pc.green(pc.bold(\"✔ Project created successfully!\")));\n log(\"\");\n log(` ${pc.bold(\"Project:\")} ${config.projectName}`);\n log(` ${pc.bold(\"Dir:\")} ${projectDir}`);\n log(` ${pc.bold(\"Render:\")} ${config.renderMode}`);\n log(` ${pc.bold(\"Deploy:\")} ${config.deployTarget}`);\n log(` ${pc.bold(\"CSS:\")} ${config.cssEngine}`);\n if (resolvedBlockNames.length > 0) {\n log(` ${pc.bold(\"Blocks:\")} ${resolvedBlockNames.join(\", \")}`);\n }\n if (config.locales.length > 1) {\n log(` ${pc.bold(\"Locales:\")} ${config.locales.join(\", \")} (default: ${config.defaultLocale})`);\n }\n if (config.palette.preset) {\n log(` ${pc.bold(\"Palette:\")} ${config.palette.preset}`);\n }\n log(` ${pc.bold(\"Files:\")} ${filesWritten} files written`);\n if (installSuccess) {\n log(` ${pc.bold(\"Deps:\")} ${pc.green(\"installed\")}`);\n }\n if (gitSuccess) {\n log(` ${pc.bold(\"Git:\")} ${pc.green(\"initialized\")}`);\n }\n log(\"\");\n log(pc.dim(\" Next steps:\"));\n log(pc.dim(` cd ${projectName}`));\n if (!installSuccess) {\n log(pc.dim(` ${config.packageManager} install`));\n }\n log(pc.dim(` ${config.packageManager} dev`));\n log(pc.dim(` fornix add <block>`));\n log(\"\");\n}\n\n// ── Dependency Installation ─────────────────────────────\n\nfunction installDependencies(\n projectDir: string,\n packageManager: string,\n verbose: boolean,\n log: (msg: string) => void,\n warn: (msg: string) => void,\n): boolean {\n try {\n log(pc.dim(\" Installing dependencies...\"));\n\n const cmd = `${packageManager} install`;\n execSync(cmd, {\n cwd: projectDir,\n stdio: verbose ? \"inherit\" : \"pipe\",\n timeout: 120_000,\n });\n\n return true;\n } catch {\n warn(pc.yellow(\" ⚠ Could not install dependencies automatically.\"));\n warn(pc.dim(` Run '${packageManager} install' manually.`));\n return false;\n }\n}\n\n// ── Git Init ────────────────────────────────────────────\n\nfunction initGit(\n projectDir: string,\n verbose: boolean,\n log: (msg: string) => void,\n warn: (msg: string) => void,\n): boolean {\n try {\n if (verbose) log(pc.dim(\" Initializing git repository...\"));\n\n execSync(\"git init\", {\n cwd: projectDir,\n stdio: \"pipe\",\n timeout: 10_000,\n });\n\n execSync(\"git add -A\", {\n cwd: projectDir,\n stdio: \"pipe\",\n timeout: 10_000,\n });\n\n execSync('git commit -m \"Initial commit — scaffolded by Fornix\"', {\n cwd: projectDir,\n stdio: \"pipe\",\n timeout: 10_000,\n });\n\n return true;\n } catch {\n warn(pc.yellow(\" ⚠ Could not initialize git repository.\"));\n warn(pc.dim(\" Run 'git init' manually.\"));\n return false;\n }\n}\n\n// ── CLAUDE.md Generation ────────────────────────────────\n\nfunction generateClaudeMd(\n projectDir: string,\n config: ResolvedConfig,\n blockNames: ReadonlyArray<string>,\n): void {\n const lines: string[] = [];\n\n lines.push(\"# CLAUDE.md\");\n lines.push(\"\");\n lines.push(\"Project context for AI assistants. Auto-generated by Fornix.\");\n lines.push(\"\");\n\n // Project overview\n lines.push(\"## Project Overview\");\n lines.push(\"\");\n lines.push(`- **Name:** ${config.projectName}`);\n lines.push(`- **Framework:** Astro`);\n lines.push(`- **Render mode:** ${config.renderMode}`);\n lines.push(`- **Deploy target:** ${config.deployTarget}`);\n lines.push(`- **CSS engine:** ${config.cssEngine}`);\n lines.push(`- **Package manager:** ${config.packageManager}`);\n lines.push(\"\");\n\n // Installed blocks\n if (blockNames.length > 0) {\n lines.push(\"## Installed Blocks\");\n lines.push(\"\");\n for (const name of blockNames) {\n const variant = config.blocks.find((b) => b.name === name)?.variant ?? \"default\";\n lines.push(`- \\`${name}\\` (variant: ${variant})`);\n }\n lines.push(\"\");\n }\n\n // i18n config\n if (config.locales.length > 1) {\n lines.push(\"## Internationalization\");\n lines.push(\"\");\n lines.push(`- **Locales:** ${config.locales.join(\", \")}`);\n lines.push(`- **Default locale:** ${config.defaultLocale}`);\n lines.push(\"- Content is organized per locale in `src/content/{locale}/`\");\n lines.push(\"- Routes are prefixed with `[locale]` parameter\");\n lines.push(\"\");\n }\n\n // Palette\n lines.push(\"## Styling\");\n lines.push(\"\");\n if (config.palette.preset) {\n lines.push(`- **Palette:** ${config.palette.preset}`);\n }\n lines.push(\"- Colors are defined as CSS custom properties in `src/styles/palettes/_current.css`\");\n lines.push(\"- Use `var(--color-primary)`, `var(--color-secondary)`, etc. for theming\");\n if (config.themeSwitcher) {\n lines.push(\"- **Theme switcher** is enabled — all registry palettes are available at runtime\");\n lines.push(\"- Palette CSS files are in `src/styles/palettes/`\");\n }\n lines.push(\"\");\n\n // Key commands\n lines.push(\"## Key Commands\");\n lines.push(\"\");\n lines.push(`- \\`${config.packageManager} dev\\` — start development server`);\n lines.push(`- \\`${config.packageManager} build\\` — build for production`);\n lines.push(\"- `fornix add <block>` — add a new block\");\n lines.push(\"- `fornix remove <block>` — remove a block\");\n lines.push(\"- `fornix status` — show project configuration\");\n lines.push(\"\");\n\n // Project structure\n lines.push(\"## File Structure\");\n lines.push(\"\");\n lines.push(\"```\");\n lines.push(\"src/\");\n lines.push(\"├── components/sections/ ← block components\");\n lines.push(\"├── content/ ← JSON/MD content (from blocks)\");\n lines.push(\"├── layouts/ ← page layouts\");\n lines.push(\"├── pages/ ← Astro pages (routes)\");\n lines.push(\"├── styles/ ← CSS and palette files\");\n if (config.renderMode === \"server\") {\n lines.push(\"├── middleware/ ← request middleware\");\n lines.push(\"├── lib/ ← server utilities\");\n lines.push(\"├── pages/api/ ← API endpoints\");\n }\n if (config.locales.length > 1) {\n lines.push(\"├── i18n/ ← translation utilities\");\n }\n lines.push(\"```\");\n lines.push(\"\");\n\n const content = lines.join(\"\\n\");\n writeFileSync(join(projectDir, \"CLAUDE.md\"), content, \"utf-8\");\n}\n","/**\n * System Prompt Builder\n *\n * Builds a dynamic system prompt from the block registry for the AI engine.\n * Includes all blocks with metadata, palette names, and constraint rules.\n */\n\nimport type { BlockManifest, Palette } from \"fornix-registry\";\n\n// ── Types ────────────────────────────────────────────────\n\nexport interface BlockRegistry {\n readonly blocks: ReadonlyArray<BlockManifest>;\n readonly palettes: ReadonlyArray<Palette>;\n}\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * Build the system prompt from the registry.\n * This prompt is injected as the system message for the AI engine.\n */\nexport function buildSystemPrompt(registry: BlockRegistry): string {\n const sections: string[] = [\n buildIdentity(),\n buildBlocksCatalog(registry.blocks),\n buildPalettesCatalog(registry.palettes),\n buildConstraintRules(registry.blocks),\n buildOutputInstructions(),\n ];\n\n return sections.join(\"\\n\\n\");\n}\n\n// ── Sections ─────────────────────────────────────────────\n\nfunction buildIdentity(): string {\n return `# Fornix AI Assistant\n\nYou are the Fornix AI assistant. You analyze user descriptions of websites and produce structured configuration for the Fornix scaffold engine.\n\nYour job:\n1. Understand what the user wants to build\n2. Select appropriate blocks from the available catalog\n3. Choose a palette that fits the brand and industry\n4. Determine the correct render mode, deploy target, and other settings\n5. Generate content for each block's content slots\n\nYou MUST only select blocks that exist in the catalog below. Never invent block names.`;\n}\n\nfunction buildBlocksCatalog(\n blocks: ReadonlyArray<BlockManifest>,\n): string {\n const lines: string[] = [\"# Available Blocks\\n\"];\n\n // Group by type\n const grouped = new Map<string, BlockManifest[]>();\n for (const block of blocks) {\n if (!grouped.has(block.type)) {\n grouped.set(block.type, []);\n }\n grouped.get(block.type)!.push(block);\n }\n\n for (const [type, typeBlocks] of grouped) {\n lines.push(`## ${type.toUpperCase()} Blocks\\n`);\n\n for (const block of typeBlocks) {\n lines.push(`### ${block.name}`);\n lines.push(`- **Description:** ${block.description}`);\n lines.push(`- **Category:** ${block.category}`);\n lines.push(`- **Tags:** ${block.tags.join(\", \") || \"none\"}`);\n\n if (block.ai) {\n lines.push(`- **When to use:** ${block.ai.whenToUse}`);\n lines.push(`- **When NOT to use:** ${block.ai.whenNotToUse}`);\n if (block.ai.pairsWith.length > 0) {\n lines.push(\n `- **Pairs with:** ${block.ai.pairsWith.join(\", \")}`,\n );\n }\n if (block.ai.contentSlots && Object.keys(block.ai.contentSlots).length > 0) {\n lines.push(`- **Content slots:**`);\n for (const [slotName, slot] of Object.entries(\n block.ai.contentSlots,\n )) {\n const desc = slot.description ? ` — ${slot.description}` : \"\";\n const maxLen = slot.maxLength\n ? ` (max ${slot.maxLength} chars)`\n : \"\";\n lines.push(` - \\`${slotName}\\` (${slot.type})${desc}${maxLen}`);\n }\n }\n }\n\n if (block.requires.length > 0) {\n lines.push(`- **Requires:** ${block.requires.join(\", \")}`);\n }\n if (block.conflicts.length > 0) {\n lines.push(`- **Conflicts with:** ${block.conflicts.join(\", \")}`);\n }\n if (block.requiredMode) {\n lines.push(`- **Required mode:** ${block.requiredMode}`);\n }\n if (Object.keys(block.dependencies).length > 0) {\n lines.push(\n `- **npm deps:** ${Object.keys(block.dependencies).join(\", \")}`,\n );\n }\n\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildPalettesCatalog(\n palettes: ReadonlyArray<Palette>,\n): string {\n const lines: string[] = [\"# Available Palettes\\n\"];\n lines.push(\n \"Select a palette that fits the brand, industry, and visual style.\\n\",\n );\n\n // Group by category\n const grouped = new Map<string, Palette[]>();\n for (const palette of palettes) {\n if (!grouped.has(palette.category)) {\n grouped.set(palette.category, []);\n }\n grouped.get(palette.category)!.push(palette);\n }\n\n for (const [category, categoryPalettes] of grouped) {\n const names = categoryPalettes\n .map(\n (p) =>\n `${p.displayName} (${p.mode})`,\n )\n .join(\", \");\n lines.push(`- **${category}:** ${names}`);\n }\n\n lines.push(\"\");\n lines.push(\"Palette names (use these exact values):\");\n for (const palette of palettes) {\n lines.push(`- \\`${palette.name}\\` — ${palette.displayName} (${palette.category}, ${palette.mode})`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildConstraintRules(\n blocks: ReadonlyArray<BlockManifest>,\n): string {\n const lines: string[] = [\"# Constraint Rules\\n\"];\n\n lines.push(\"## Render Modes\");\n lines.push(\"- `static` — Pre-rendered HTML, no server. Best for blogs, docs, landing pages.\");\n lines.push(\"- `hybrid` — Mix of static + server routes. Best for mostly-static sites with some dynamic features.\");\n lines.push(\"- `server` — Full server rendering. Required for auth, databases, real-time features.\\n\");\n\n // Collect server-required blocks\n const serverBlocks = blocks.filter((b) => b.requiredMode === \"server\");\n if (serverBlocks.length > 0) {\n lines.push(\"## Server-Required Blocks\");\n lines.push(\n \"These blocks REQUIRE `renderMode: 'server'`. Selecting them with static mode is invalid:\",\n );\n for (const block of serverBlocks) {\n lines.push(`- \\`${block.name}\\` (${block.requiredMode})`);\n }\n lines.push(\"\");\n }\n\n // Collect dependency chains\n const blocksWithDeps = blocks.filter((b) => b.requires.length > 0);\n if (blocksWithDeps.length > 0) {\n lines.push(\"## Block Dependencies\");\n lines.push(\n \"These blocks require other blocks to be included:\",\n );\n for (const block of blocksWithDeps) {\n lines.push(\n `- \\`${block.name}\\` requires: ${block.requires.map((r) => `\\`${r}\\``).join(\", \")}`,\n );\n }\n lines.push(\"\");\n }\n\n // Collect conflicts\n const blocksWithConflicts = blocks.filter(\n (b) => b.conflicts.length > 0,\n );\n if (blocksWithConflicts.length > 0) {\n lines.push(\"## Block Conflicts\");\n lines.push(\n \"These blocks cannot be used together:\",\n );\n for (const block of blocksWithConflicts) {\n lines.push(\n `- \\`${block.name}\\` conflicts with: ${block.conflicts.map((c) => `\\`${c}\\``).join(\", \")}`,\n );\n }\n lines.push(\"\");\n }\n\n lines.push(\"## Deterministic Rules (applied automatically)\");\n lines.push(\"The following rules are applied by the rules engine BEFORE your output:\");\n lines.push(\"- Auth or user accounts → `renderMode: server`, `auth-better-auth` + `db-d1` auto-added\");\n lines.push(\"- Payments or e-commerce → upgrade to `hybrid` if static, `payments-stripe` auto-added\");\n lines.push(\"- Blog with no dynamic content → `renderMode: static`, `blog-mdx` auto-added\");\n lines.push(\"- Cloudflare deploy target → `analytics-cf` auto-added\");\n lines.push(\"- Multiple languages → i18n mode enabled, locales set\");\n lines.push(\"- Theme switcher requested → `theme-switcher` block auto-added\");\n lines.push(\"\\nDo NOT include auto-added blocks in your recommendations. Focus on section and feature blocks.\");\n\n return lines.join(\"\\n\");\n}\n\nfunction buildOutputInstructions(): string {\n return `# Output Instructions\n\nReturn a structured IntentSchema object with these fields:\n- \\`siteType\\`: One of: landing-page, saas, agency, portfolio, blog, docs, ecommerce, dashboard, community, other\n- \\`industry\\`: The industry or niche\n- \\`brand\\`: { name, tagline?, description, targetAudience?, tone }\n- Boolean signals: needsAuth, needsPayments, needsBlog, needsDocs, needsDashboard, needsContactForm, needsNewsletter, hasDynamicContent, hasEcommerce, hasUserAccounts\n- \\`prefersDarkMode\\`: Whether the user prefers dark mode\n- \\`visualStyle\\`: One of: minimal, bold, glassmorphism, gradient, flat, neo-brutalist\n- \\`languages\\`: Array of language codes (e.g. ['en', 'ar'])\n- \\`palettePreference\\`: One of: custom, prebuilt, ai-generated, unspecified\n- \\`wantsThemeSwitcher\\`: Whether the user wants theme switching\n- \\`recommendedBlocks\\`: Array of { blockName, reason, confidence (0-1) }\n- \\`uncertainties\\`: Array of { topic, question, defaultAssumption }\n- \\`overallConfidence\\`: 0-1 score\n\nONLY recommend blocks that exist in the catalog above. Be precise with block names.`;\n}\n","import { z } from \"zod\";\n\n// ── Sub-schemas ───────────────────────────────────────────\n\nconst BrandSchema = z.object({\n name: z.string().min(1),\n tagline: z.string().optional(),\n description: z.string().min(1),\n targetAudience: z.string().optional(),\n tone: z.string().min(1),\n});\n\nconst RecommendedBlockSchema = z.object({\n blockName: z.string().min(1),\n reason: z.string().min(1),\n confidence: z.number().min(0).max(1),\n});\n\nconst UncertaintySchema = z.object({\n topic: z.string().min(1),\n question: z.string().min(1),\n defaultAssumption: z.string().min(1),\n});\n\n// ── Main Schema ───────────────────────────────────────────\n\nexport const IntentSchema = z.object({\n siteType: z.enum([\n \"landing-page\",\n \"saas\",\n \"agency\",\n \"portfolio\",\n \"blog\",\n \"docs\",\n \"ecommerce\",\n \"dashboard\",\n \"community\",\n \"other\",\n ]),\n industry: z.string().min(1),\n\n brand: BrandSchema,\n\n needsAuth: z.boolean(),\n needsPayments: z.boolean(),\n needsBlog: z.boolean(),\n needsDocs: z.boolean(),\n needsDashboard: z.boolean(),\n needsContactForm: z.boolean(),\n needsNewsletter: z.boolean(),\n\n hasDynamicContent: z.boolean(),\n hasEcommerce: z.boolean(),\n hasUserAccounts: z.boolean(),\n\n prefersDarkMode: z.boolean(),\n visualStyle: z.enum([\n \"minimal\",\n \"bold\",\n \"glassmorphism\",\n \"gradient\",\n \"flat\",\n \"neo-brutalist\",\n ]),\n\n languages: z.array(z.string().min(1)).default([]),\n palettePreference: z.enum([\"custom\", \"prebuilt\", \"ai-generated\", \"unspecified\"]),\n wantsThemeSwitcher: z.boolean(),\n\n recommendedBlocks: z.array(RecommendedBlockSchema),\n uncertainties: z.array(UncertaintySchema),\n overallConfidence: z.number().min(0).max(1),\n});\n\n// ── Derived Types ─────────────────────────────────────────\n\nexport type Intent = z.infer<typeof IntentSchema>;\nexport type Brand = z.infer<typeof BrandSchema>;\nexport type RecommendedBlock = z.infer<typeof RecommendedBlockSchema>;\nexport type Uncertainty = z.infer<typeof UncertaintySchema>;\n","/**\n * Rules Engine — deterministic rules that don't need AI.\n *\n * Runs on an Intent object (structured output from AI or manual input)\n * and mutates a MutableConfig to apply unambiguous decisions.\n *\n * Rules are idempotent: applying the same rules twice produces the same result.\n */\n\nimport { z } from \"zod\";\n\n// ── Intent Schema ────────────────────────────────────────\n\nexport const IntentSchema = z.object({\n siteType: z.enum([\n \"landing-page\",\n \"saas\",\n \"agency\",\n \"portfolio\",\n \"blog\",\n \"docs\",\n \"ecommerce\",\n \"dashboard\",\n \"community\",\n \"other\",\n ]),\n industry: z.string(),\n brand: z.object({\n name: z.string(),\n tagline: z.string().optional(),\n description: z.string(),\n targetAudience: z.string().optional(),\n tone: z.string(),\n }),\n needsAuth: z.boolean(),\n needsPayments: z.boolean(),\n needsBlog: z.boolean(),\n needsDocs: z.boolean(),\n needsDashboard: z.boolean(),\n needsContactForm: z.boolean(),\n needsNewsletter: z.boolean(),\n hasDynamicContent: z.boolean(),\n hasEcommerce: z.boolean(),\n hasUserAccounts: z.boolean(),\n prefersDarkMode: z.boolean(),\n visualStyle: z.enum([\n \"minimal\",\n \"bold\",\n \"glassmorphism\",\n \"gradient\",\n \"flat\",\n \"neo-brutalist\",\n ]),\n languages: z.array(z.string()),\n palettePreference: z.enum([\n \"custom\",\n \"prebuilt\",\n \"ai-generated\",\n \"unspecified\",\n ]),\n wantsThemeSwitcher: z.boolean(),\n recommendedBlocks: z.array(\n z.object({\n blockName: z.string(),\n reason: z.string(),\n confidence: z.number(),\n }),\n ),\n uncertainties: z.array(\n z.object({\n topic: z.string(),\n question: z.string(),\n defaultAssumption: z.string(),\n }),\n ),\n overallConfidence: z.number().min(0).max(1),\n});\n\nexport type Intent = z.infer<typeof IntentSchema>;\n\n// ── MutableConfig ────────────────────────────────────────\n\nexport interface MutableConfig {\n renderMode: \"static\" | \"hybrid\" | \"server\";\n deployTarget: \"cloudflare\" | \"vercel\" | \"netlify\" | \"static\";\n database: \"none\" | \"d1\" | \"turso\" | \"astro-db\" | \"postgres\";\n blocks: Array<{ name: string; variant: string }>;\n locales: string[];\n defaultLocale: string;\n themeSwitcher: boolean;\n}\n\n// ── Rule Type ────────────────────────────────────────────\n\ninterface Rule {\n readonly name: string;\n readonly apply: (intent: Readonly<Intent>, config: MutableConfig) => void;\n}\n\n// ── Individual Rules ─────────────────────────────────────\n\nfunction hasBlock(config: MutableConfig, name: string): boolean {\n return config.blocks.some((b) => b.name === name);\n}\n\nfunction addBlock(config: MutableConfig, name: string): void {\n if (!hasBlock(config, name)) {\n config.blocks.push({ name, variant: \"default\" });\n }\n}\n\nconst authRule: Rule = {\n name: \"auth\",\n apply(intent, config) {\n if (intent.needsAuth || intent.hasUserAccounts) {\n config.renderMode = \"server\";\n addBlock(config, \"db-d1\");\n addBlock(config, \"auth-better-auth\");\n }\n },\n};\n\nconst paymentsRule: Rule = {\n name: \"payments\",\n apply(intent, config) {\n if (intent.needsPayments || intent.hasEcommerce) {\n if (config.renderMode === \"static\") {\n config.renderMode = \"hybrid\";\n }\n addBlock(config, \"payments-stripe\");\n }\n },\n};\n\nconst blogRule: Rule = {\n name: \"blog\",\n apply(intent, config) {\n if (intent.needsBlog && !intent.hasDynamicContent) {\n config.renderMode = \"static\";\n addBlock(config, \"blog-mdx\");\n }\n },\n};\n\nconst cloudflareAnalyticsRule: Rule = {\n name: \"cloudflare-analytics\",\n apply(_intent, config) {\n if (config.deployTarget === \"cloudflare\") {\n addBlock(config, \"analytics-cf\");\n }\n },\n};\n\nconst i18nRule: Rule = {\n name: \"i18n\",\n apply(intent, config) {\n if (intent.languages.length >= 2) {\n config.locales = [...intent.languages];\n config.defaultLocale = intent.languages[0] as string;\n }\n },\n};\n\nconst themeSwitcherRule: Rule = {\n name: \"theme-switcher\",\n apply(intent, config) {\n if (intent.wantsThemeSwitcher) {\n config.themeSwitcher = true;\n addBlock(config, \"theme-switcher\");\n }\n },\n};\n\n// ── Rules Registry (ordered) ─────────────────────────────\n\nconst RULES: ReadonlyArray<Rule> = [\n authRule,\n paymentsRule,\n blogRule,\n cloudflareAnalyticsRule,\n i18nRule,\n themeSwitcherRule,\n];\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * Apply all deterministic rules to the mutable config based on the intent.\n * Rules are idempotent — calling applyRules twice has the same effect as once.\n */\nexport function applyRules(\n intent: Readonly<Intent>,\n config: MutableConfig,\n): void {\n for (const rule of RULES) {\n rule.apply(intent, config);\n }\n}\n\n/**\n * Create a fresh MutableConfig with sensible defaults.\n */\nexport function createDefaultConfig(\n overrides: Partial<MutableConfig> = {},\n): MutableConfig {\n return {\n renderMode: \"static\",\n deployTarget: \"cloudflare\",\n database: \"none\",\n blocks: [],\n locales: [\"en\"],\n defaultLocale: \"en\",\n themeSwitcher: false,\n ...overrides,\n };\n}\n","import { z } from \"zod\";\n\n// ── Sub-schemas ───────────────────────────────────────────\n\nconst BlockSelectionSchema = z.object({\n name: z.string().min(1),\n variant: z.string().min(1),\n});\n\nconst PaletteColorsSchema = z.object({\n primary: z.string().min(1),\n secondary: z.string().min(1),\n accent: z.string().min(1),\n background: z.string().min(1),\n foreground: z.string().min(1),\n});\n\nconst PaletteConfigSchema = z.object({\n preset: z.string().min(1).optional(),\n colors: PaletteColorsSchema,\n});\n\n// ── Main Schema ───────────────────────────────────────────\n\nexport const ResolvedConfigSchema = z\n .object({\n projectName: z.string().min(1),\n projectDir: z.string().min(1),\n renderMode: z.enum([\"static\", \"hybrid\", \"server\"]),\n deployTarget: z.enum([\"cloudflare\", \"vercel\", \"netlify\", \"static\"]),\n database: z.enum([\"none\", \"d1\", \"turso\", \"astro-db\", \"postgres\"]),\n cssEngine: z.enum([\"tailwind\", \"vanilla\"]),\n packageManager: z.enum([\"npm\", \"pnpm\", \"bun\"]),\n\n blocks: z.array(BlockSelectionSchema),\n\n locales: z\n .array(z.string().min(1))\n .transform((locales) => (locales.length === 0 ? [\"en\"] : locales)),\n defaultLocale: z.string().min(1),\n\n palette: PaletteConfigSchema,\n themeSwitcher: z.boolean().default(false),\n\n content: z.record(z.record(z.unknown())).optional(),\n createdWith: z.enum([\"ai\", \"manual\", \"recipe\", \"mcp\"]),\n })\n .refine(\n (config) => config.locales.includes(config.defaultLocale),\n {\n message: \"defaultLocale must be included in the locales array\",\n path: [\"defaultLocale\"],\n }\n );\n\n// ── Derived Type ──────────────────────────────────────────\n\nexport type ResolvedConfig = z.infer<typeof ResolvedConfigSchema>;\n\n// ── Sub-types ─────────────────────────────────────────────\n\nexport type BlockSelection = z.infer<typeof BlockSelectionSchema>;\nexport type PaletteColors = z.infer<typeof PaletteColorsSchema>;\nexport type PaletteConfig = z.infer<typeof PaletteConfigSchema>;\n","/**\n * AI Conversation Loop\n *\n * The full AI pipeline: analyze → clarify → resolve → content → palette.\n *\n * Flow:\n * 1. Analysis Phase — AI analyzes user description + full registry → Intent\n * 2. Clarification Phase — If confidence < 0.8 or uncertainties exist,\n * ask max 3 follow-up questions via @clack/prompts\n * 3. Resolution Phase — Intent → rules engine → ProposedConfig\n * 4. Content Generation Phase — Generate content for selected blocks\n * 5. Palette Selection — Pick from pre-built palettes or use AI-generated\n * 6. Final Assembly — ProposedConfig → validate → ResolvedConfig\n */\n\nimport type { AIProvider } from \"./provider.js\";\nimport type { BlockRegistry } from \"./prompt-builder.js\";\nimport { buildSystemPrompt } from \"./prompt-builder.js\";\nimport { IntentSchema, type Intent } from \"./schemas.js\";\nimport type { ProposedConfig, ContentMap, Question, Answer } from \"./types.js\";\nimport { applyRules, createDefaultConfig, type MutableConfig } from \"./rules.js\";\nimport { ResolvedConfigSchema, type ResolvedConfig } from \"../schemas/config.js\";\nimport type { Palette } from \"fornix-registry\";\nimport { ok, err, type Result } from \"../utils/result.js\";\nimport type { ProviderError } from \"../errors.js\";\n\n// ── Constants ────────────────────────────────────────────\n\nconst CONFIDENCE_THRESHOLD = 0.8;\nconst MAX_CLARIFICATION_ROUNDS = 3;\nconst BLOCK_CONFIDENCE_THRESHOLD = 0.7;\n\n// ── Conversation Error ───────────────────────────────────\n\nexport interface ConversationError {\n readonly kind: \"ProviderError\" | \"ValidationError\";\n readonly message: string;\n readonly provider: string;\n}\n\n// ── Options ──────────────────────────────────────────────\n\nexport interface ConversationOptions {\n readonly provider: AIProvider;\n readonly registry: BlockRegistry;\n readonly description: string;\n readonly projectName: string;\n readonly projectDir: string;\n /** Optional callback for asking follow-up questions. Omit for non-interactive mode. */\n readonly askQuestion?: (question: Question) => Promise<Answer>;\n}\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * Run the full AI conversation loop.\n *\n * Analyzes the user description, optionally clarifies ambiguities,\n * applies the rules engine, generates content, and produces a\n * validated ResolvedConfig.\n */\nexport async function runAIConversation(\n options: ConversationOptions,\n): Promise<Result<ResolvedConfig, ConversationError>> {\n const { provider, registry, description, projectName, projectDir } = options;\n\n // ── Step 1: Analysis ─────────────────────────────────\n const intentResult = await analyzeDescription(provider, registry, description);\n if (!intentResult.ok) {\n return intentResult;\n }\n let intent = intentResult.value;\n\n // ── Step 2: Clarification ────────────────────────────\n if (options.askQuestion && needsClarification(intent)) {\n const clarifiedIntent = await runClarificationLoop(\n provider,\n registry,\n intent,\n description,\n options.askQuestion,\n );\n if (!clarifiedIntent.ok) {\n return clarifiedIntent;\n }\n intent = clarifiedIntent.value;\n }\n\n // ── Step 3: Resolution (rules engine) ────────────────\n const mutableConfig = intentToMutableConfig(intent);\n applyRules(intent, mutableConfig);\n\n // ── Step 4: Filter rules-added blocks to registry ────\n filterBlocksToRegistry(mutableConfig, registry);\n\n // ── Step 5: Add AI-recommended blocks ────────────────\n addRecommendedBlocks(intent, mutableConfig, registry);\n\n // ── Step 6: Palette selection ────────────────────────\n const palette = selectPalette(intent, registry);\n\n // ── Step 7: Content generation ───────────────────────\n const content = generateContent(intent, mutableConfig, registry);\n\n // ── Step 8: Assemble ResolvedConfig ──────────────────\n return assembleConfig({\n projectName,\n projectDir,\n mutableConfig,\n palette,\n content,\n intent,\n });\n}\n\n// ── Step 1: Analysis ─────────────────────────────────────\n\nasync function analyzeDescription(\n provider: AIProvider,\n registry: BlockRegistry,\n description: string,\n): Promise<Result<Intent, ConversationError>> {\n const systemPrompt = buildSystemPrompt(registry);\n\n try {\n const intent = await provider.generate({\n system: systemPrompt,\n prompt: buildAnalysisPrompt(description),\n schema: IntentSchema,\n });\n return ok(intent);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : \"Unknown provider error\";\n return err({\n kind: \"ProviderError\",\n message: `Analysis failed: ${message}`,\n provider: provider.name,\n });\n }\n}\n\nfunction buildAnalysisPrompt(description: string): string {\n return [\n \"Analyze the following website description and produce a structured IntentSchema.\",\n \"\",\n \"## User Description\",\n description,\n \"\",\n \"## Instructions\",\n \"- Extract the site type, industry, and brand information\",\n \"- Identify which features are needed (auth, payments, blog, etc.)\",\n \"- Detect any language requirements for i18n\",\n \"- Recommend appropriate blocks from the catalog\",\n \"- Note any uncertainties that need clarification\",\n \"- Set overallConfidence based on how well you understand the requirements\",\n ].join(\"\\n\");\n}\n\n// ── Step 2: Clarification ────────────────────────────────\n\nfunction needsClarification(intent: Intent): boolean {\n return (\n intent.overallConfidence < CONFIDENCE_THRESHOLD ||\n intent.uncertainties.length > 0\n );\n}\n\nfunction extractQuestions(intent: Intent): ReadonlyArray<Question> {\n return intent.uncertainties.map((uncertainty, index) => ({\n id: `uncertainty-${index}`,\n topic: uncertainty.topic,\n question: uncertainty.question,\n defaultAnswer: uncertainty.defaultAssumption,\n }));\n}\n\nasync function runClarificationLoop(\n provider: AIProvider,\n registry: BlockRegistry,\n intent: Intent,\n originalDescription: string,\n askQuestion: (question: Question) => Promise<Answer>,\n): Promise<Result<Intent, ConversationError>> {\n let currentIntent = intent;\n let round = 0;\n\n while (round < MAX_CLARIFICATION_ROUNDS && needsClarification(currentIntent)) {\n const questions = extractQuestions(currentIntent);\n if (questions.length === 0) break;\n\n const answers: Answer[] = [];\n for (const question of questions) {\n const answer = await askQuestion(question);\n answers.push(answer);\n }\n\n // Re-analyze with the additional context from answers\n const clarificationContext = buildClarificationPrompt(\n originalDescription,\n currentIntent,\n answers,\n );\n\n const reanalysisResult = await analyzeDescription(\n provider,\n registry,\n clarificationContext,\n );\n\n if (!reanalysisResult.ok) {\n return reanalysisResult;\n }\n\n currentIntent = reanalysisResult.value;\n round++;\n }\n\n return ok(currentIntent);\n}\n\nfunction buildClarificationPrompt(\n originalDescription: string,\n intent: Intent,\n answers: ReadonlyArray<Answer>,\n): string {\n const answerLines = answers\n .map((answer) => `- ${answer.questionId}: ${answer.value}`)\n .join(\"\\n\");\n\n return [\n originalDescription,\n \"\",\n \"## Additional Context from Follow-up Questions\",\n answerLines,\n \"\",\n `## Previous Analysis`,\n `Site type: ${intent.siteType}, Industry: ${intent.industry}`,\n `Brand: ${intent.brand.name} — ${intent.brand.description}`,\n \"\",\n \"Please refine the analysis with this additional information.\",\n \"Increase overallConfidence if the answers resolve previous uncertainties.\",\n ].join(\"\\n\");\n}\n\n// ── Step 3: Intent → MutableConfig ───────────────────────\n\nfunction intentToMutableConfig(intent: Intent): MutableConfig {\n return createDefaultConfig({\n locales: intent.languages.length > 0 ? [...intent.languages] : [\"en\"],\n defaultLocale: intent.languages.length > 0 ? intent.languages[0] : \"en\",\n themeSwitcher: intent.wantsThemeSwitcher,\n });\n}\n\n// ── Step 4: Filter to Registry ───────────────────────────\n\n/**\n * Remove blocks added by the rules engine that don't exist in the registry.\n * The rules engine adds blocks like analytics-cf, payments-stripe, etc.\n * which may not be available in the current block registry.\n */\nfunction filterBlocksToRegistry(\n config: MutableConfig,\n registry: BlockRegistry,\n): void {\n const registryBlockNames = new Set(registry.blocks.map((b) => b.name));\n config.blocks = config.blocks.filter((b) => registryBlockNames.has(b.name));\n}\n\n// ── Step 5: Recommended Blocks ───────────────────────────\n\nfunction addRecommendedBlocks(\n intent: Intent,\n config: MutableConfig,\n registry: BlockRegistry,\n): void {\n const registryBlockNames = new Set(registry.blocks.map((b) => b.name));\n\n for (const recommendation of intent.recommendedBlocks) {\n if (\n recommendation.confidence >= BLOCK_CONFIDENCE_THRESHOLD &&\n registryBlockNames.has(recommendation.blockName) &&\n !config.blocks.some((b) => b.name === recommendation.blockName)\n ) {\n config.blocks.push({\n name: recommendation.blockName,\n variant: \"default\",\n });\n }\n }\n}\n\n// ── Step 5: Palette Selection ────────────────────────────\n\nfunction selectPalette(\n intent: Intent,\n registry: BlockRegistry,\n): { preset?: string; colors: { primary: string; secondary: string; accent: string; background: string; foreground: string } } {\n const palettes = registry.palettes;\n\n if (intent.palettePreference === \"prebuilt\" && palettes.length > 0) {\n const matched = findBestPalette(intent, palettes);\n return {\n preset: matched.name,\n colors: { ...matched.colors },\n };\n }\n\n if (intent.palettePreference === \"ai-generated\") {\n // For AI-generated palettes, generate colors based on brand context.\n // In the mock flow, we pick a palette that fits and mark it without preset.\n const matched = findBestPalette(intent, palettes);\n return {\n colors: { ...matched.colors },\n };\n }\n\n // Default: pick the best matching palette from registry\n if (palettes.length > 0) {\n const matched = findBestPalette(intent, palettes);\n return {\n preset: matched.name,\n colors: { ...matched.colors },\n };\n }\n\n // Absolute fallback\n return {\n colors: {\n primary: \"#3b82f6\",\n secondary: \"#6366f1\",\n accent: \"#8b5cf6\",\n background: \"#ffffff\",\n foreground: \"#1a1a2e\",\n },\n };\n}\n\nfunction findBestPalette(\n intent: Intent,\n palettes: ReadonlyArray<Palette>,\n): Palette {\n // Prefer dark mode palettes when the intent prefers dark mode\n const modePreference = intent.prefersDarkMode ? \"dark\" : \"light\";\n\n const modeMatched = palettes.filter((p) => p.mode === modePreference);\n const candidates = modeMatched.length > 0 ? modeMatched : palettes;\n\n // Try to match by industry keywords in palette name or category\n const industryLower = intent.industry.toLowerCase();\n const industryMatched = candidates.find(\n (p) =>\n p.name.includes(industryLower) ||\n p.category.toLowerCase().includes(industryLower),\n );\n\n if (industryMatched) {\n return industryMatched;\n }\n\n // Return first candidate with mode preference\n return candidates[0] as Palette;\n}\n\n// ── Step 6: Content Generation ───────────────────────────\n\nfunction generateContent(\n intent: Intent,\n config: MutableConfig,\n registry: BlockRegistry,\n): Record<string, Record<string, unknown>> | undefined {\n const selectedBlockNames = new Set(config.blocks.map((b) => b.name));\n const blocksWithContent = registry.blocks.filter(\n (b) =>\n selectedBlockNames.has(b.name) &&\n b.ai?.contentSlots &&\n Object.keys(b.ai.contentSlots).length > 0,\n );\n\n if (blocksWithContent.length === 0) {\n return undefined;\n }\n\n const content: Record<string, Record<string, unknown>> = {};\n const locales = config.locales;\n\n for (const block of blocksWithContent) {\n const slots = block.ai?.contentSlots;\n if (!slots) continue;\n\n const blockContent: Record<string, unknown> = {};\n\n for (const locale of locales) {\n const localeContent: Record<string, unknown> = {};\n\n for (const [slotName, slot] of Object.entries(slots)) {\n localeContent[slotName] = generateSlotContent(\n slotName,\n slot,\n intent,\n locale,\n );\n }\n\n blockContent[locale] = localeContent;\n }\n\n content[block.name] = blockContent;\n }\n\n return Object.keys(content).length > 0 ? content : undefined;\n}\n\nfunction generateSlotContent(\n slotName: string,\n slot: { type: string; description?: string; maxLength?: number; example?: unknown },\n intent: Intent,\n locale: string,\n): unknown {\n // Generate placeholder content based on slot type and brand context\n const brandName = intent.brand.name;\n const localeSuffix = locale !== \"en\" ? ` (${locale})` : \"\";\n\n switch (slot.type) {\n case \"string\": {\n if (slotName.includes(\"headline\") || slotName.includes(\"heading\") || slotName.includes(\"title\")) {\n return `${brandName} — ${intent.brand.tagline ?? intent.brand.description}${localeSuffix}`;\n }\n if (slotName.includes(\"button\") || slotName.includes(\"cta\")) {\n return `Get Started${localeSuffix}`;\n }\n if (slotName.includes(\"copyright\")) {\n return `© ${new Date().getFullYear()} ${brandName}. All rights reserved.${localeSuffix}`;\n }\n return `${slot.description ?? slotName}${localeSuffix}`;\n }\n case \"array\":\n return [];\n case \"number\":\n return 0;\n case \"boolean\":\n return false;\n case \"object\":\n return {};\n default:\n return slot.example ?? null;\n }\n}\n\n// ── Step 7: Assembly ─────────────────────────────────────\n\ninterface AssemblyInput {\n readonly projectName: string;\n readonly projectDir: string;\n readonly mutableConfig: MutableConfig;\n readonly palette: {\n readonly preset?: string;\n readonly colors: {\n readonly primary: string;\n readonly secondary: string;\n readonly accent: string;\n readonly background: string;\n readonly foreground: string;\n };\n };\n readonly content: Record<string, Record<string, unknown>> | undefined;\n readonly intent: Intent;\n}\n\nfunction assembleConfig(\n input: AssemblyInput,\n): Result<ResolvedConfig, ConversationError> {\n const raw = {\n projectName: input.projectName,\n projectDir: input.projectDir,\n renderMode: input.mutableConfig.renderMode,\n deployTarget: input.mutableConfig.deployTarget,\n database: input.mutableConfig.database,\n cssEngine: \"tailwind\" as const,\n packageManager: \"pnpm\" as const,\n blocks: input.mutableConfig.blocks.map((b) => ({\n name: b.name,\n variant: b.variant,\n })),\n locales: input.mutableConfig.locales,\n defaultLocale: input.mutableConfig.defaultLocale,\n palette: {\n preset: input.palette.preset,\n colors: { ...input.palette.colors },\n },\n themeSwitcher: input.mutableConfig.themeSwitcher,\n content: input.content,\n createdWith: \"ai\" as const,\n };\n\n const parsed = ResolvedConfigSchema.safeParse(raw);\n if (!parsed.success) {\n return err({\n kind: \"ValidationError\",\n message: `Config validation failed: ${parsed.error.message}`,\n provider: \"conversation\",\n });\n }\n\n return ok(parsed.data);\n}\n","/**\n * OpenAI Provider\n *\n * Uses the Vercel AI SDK with OpenAI's API for structured output generation.\n * Requires OPENAI_API_KEY environment variable.\n *\n * Dependencies (ai, @ai-sdk/openai) are lazily imported to avoid\n * breaking tests/builds when they aren't installed.\n */\n\nimport { IntentSchema, type Intent } from \"../rules.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\nimport type { AIProvider, ProviderError } from \"./mock-provider.js\";\n\nexport function createOpenAIProvider(apiKey?: string): AIProvider {\n const key = apiKey ?? process.env[\"OPENAI_API_KEY\"];\n\n return {\n name: \"openai\",\n async generate(\n prompt: string,\n systemPrompt?: string,\n ): Promise<Result<Intent, ProviderError>> {\n if (!key) {\n return err({\n kind: \"ProviderError\",\n message: \"OPENAI_API_KEY not set. Set it in your environment or pass it explicitly.\",\n prompt,\n });\n }\n\n try {\n // Lazy import to avoid breaking when ai SDK is not installed\n const { generateObject } = await import(\"ai\");\n const { openai } = await import(\"@ai-sdk/openai\");\n\n const result = await generateObject({\n model: openai(\"gpt-4o-mini\", { structuredOutputs: true }),\n schema: IntentSchema,\n system: systemPrompt ?? \"You are the Fornix AI assistant. Analyze the user's website description and produce a structured Intent object.\",\n prompt,\n maxTokens: 2000,\n });\n\n return ok(result.object);\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : \"Unknown OpenAI error\";\n return err({\n kind: \"ProviderError\",\n message: `OpenAI generation failed: ${message}`,\n prompt,\n });\n }\n },\n };\n}\n","/**\n * Ollama Provider\n *\n * Uses a local Ollama instance for AI generation.\n * Auto-detects Ollama on localhost:11434.\n * No API key required — fully local and free.\n */\n\nimport { IntentSchema, type Intent } from \"../rules.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\nimport type { AIProvider, ProviderError } from \"./mock-provider.js\";\n\nconst DEFAULT_OLLAMA_URL = \"http://localhost:11434\";\nconst DEFAULT_MODEL = \"llama3.1\";\n\nexport function createOllamaProvider(\n opts: { baseUrl?: string; model?: string } = {},\n): AIProvider {\n const baseUrl = opts.baseUrl ?? DEFAULT_OLLAMA_URL;\n const model = opts.model ?? DEFAULT_MODEL;\n\n return {\n name: \"ollama\",\n async generate(\n prompt: string,\n systemPrompt?: string,\n ): Promise<Result<Intent, ProviderError>> {\n try {\n const response = await fetch(`${baseUrl}/api/chat`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n model,\n stream: false,\n format: \"json\",\n messages: [\n {\n role: \"system\",\n content:\n (systemPrompt ?? \"You are the Fornix AI assistant.\") +\n \"\\n\\nYou MUST respond with a valid JSON object matching the IntentSchema. Do NOT include any text outside the JSON.\",\n },\n { role: \"user\", content: prompt },\n ],\n }),\n });\n\n if (!response.ok) {\n return err({\n kind: \"ProviderError\",\n message: `Ollama returned status ${response.status}: ${await response.text()}`,\n prompt,\n });\n }\n\n const data = (await response.json()) as {\n message?: { content?: string };\n };\n const content = data.message?.content;\n\n if (!content) {\n return err({\n kind: \"ProviderError\",\n message: \"Ollama returned empty response\",\n prompt,\n });\n }\n\n const parsed = JSON.parse(content) as unknown;\n const validated = IntentSchema.parse(parsed);\n return ok(validated);\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : \"Unknown Ollama error\";\n return err({\n kind: \"ProviderError\",\n message: `Ollama generation failed: ${message}`,\n prompt,\n });\n }\n },\n };\n}\n\n/**\n * Check if Ollama is running locally.\n */\nexport async function isOllamaRunning(\n baseUrl = DEFAULT_OLLAMA_URL,\n): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), 1000);\n const response = await fetch(baseUrl, { signal: controller.signal });\n clearTimeout(timeout);\n return response.ok;\n } catch {\n return false;\n }\n}\n","/**\n * Cloudflare Workers AI Provider\n *\n * Uses the Cloudflare Workers AI REST API for generation.\n * Free tier available for Cloudflare deployments.\n * Requires CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN.\n */\n\nimport { IntentSchema, type Intent } from \"../rules.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\nimport type { AIProvider, ProviderError } from \"./mock-provider.js\";\n\nconst DEFAULT_MODEL = \"@cf/meta/llama-3.1-8b-instruct\";\n\nexport function createCloudflareProvider(\n opts: { accountId?: string; apiToken?: string; model?: string } = {},\n): AIProvider {\n const accountId =\n opts.accountId ?? process.env[\"CLOUDFLARE_ACCOUNT_ID\"];\n const apiToken =\n opts.apiToken ?? process.env[\"CLOUDFLARE_API_TOKEN\"];\n const model = opts.model ?? DEFAULT_MODEL;\n\n return {\n name: \"cloudflare\",\n async generate(\n prompt: string,\n systemPrompt?: string,\n ): Promise<Result<Intent, ProviderError>> {\n if (!accountId || !apiToken) {\n return err({\n kind: \"ProviderError\",\n message:\n \"CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN must be set.\",\n prompt,\n });\n }\n\n try {\n const url = `https://api.cloudflare.com/client/v4/accounts/${accountId}/ai/run/${model}`;\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiToken}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n messages: [\n {\n role: \"system\",\n content:\n (systemPrompt ?? \"You are the Fornix AI assistant.\") +\n \"\\n\\nRespond with a valid JSON object matching the IntentSchema. No text outside JSON.\",\n },\n { role: \"user\", content: prompt },\n ],\n }),\n });\n\n if (!response.ok) {\n return err({\n kind: \"ProviderError\",\n message: `Cloudflare AI returned status ${response.status}: ${await response.text()}`,\n prompt,\n });\n }\n\n const data = (await response.json()) as {\n result?: { response?: string };\n };\n const content = data.result?.response;\n\n if (!content) {\n return err({\n kind: \"ProviderError\",\n message: \"Cloudflare AI returned empty response\",\n prompt,\n });\n }\n\n const parsed = JSON.parse(content) as unknown;\n const validated = IntentSchema.parse(parsed);\n return ok(validated);\n } catch (error: unknown) {\n const message =\n error instanceof Error\n ? error.message\n : \"Unknown Cloudflare AI error\";\n return err({\n kind: \"ProviderError\",\n message: `Cloudflare AI generation failed: ${message}`,\n prompt,\n });\n }\n },\n };\n}\n","/**\n * Mock AI Provider\n *\n * A test-only AI provider that matches prompt keywords to fixture responses.\n * Used for testing the AI flow without real API calls.\n */\n\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { IntentSchema, type Intent } from \"../rules.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\n\n// ── Types ────────────────────────────────────────────────\n\nexport interface AIProvider {\n readonly name: string;\n generate(prompt: string): Promise<Result<Intent, ProviderError>>;\n}\n\nexport interface ProviderError {\n readonly kind: \"ProviderError\";\n readonly message: string;\n readonly prompt: string;\n}\n\n// ── Fixture Map ──────────────────────────────────────────\n\ninterface FixtureEntry {\n readonly keywords: ReadonlyArray<string>;\n readonly filename: string;\n}\n\nconst FIXTURE_ENTRIES: ReadonlyArray<FixtureEntry> = [\n {\n keywords: [\"fintech\", \"finance\", \"banking\", \"financial\"],\n filename: \"fintech-landing.json\",\n },\n {\n keywords: [\"blog\", \"personal\", \"travel\", \"lifestyle\", \"writing\"],\n filename: \"personal-blog.json\",\n },\n {\n keywords: [\"saas\", \"dashboard\", \"project management\", \"productivity\", \"taskflow\"],\n filename: \"saas-dashboard.json\",\n },\n {\n keywords: [\"agency\", \"multilingual\", \"design agency\", \"boutique\", \"international\"],\n filename: \"multilingual-agency.json\",\n },\n {\n keywords: [\"portfolio\", \"freelance\", \"developer\", \"personal site\"],\n filename: \"portfolio.json\",\n },\n];\n\n// ── Mock Provider ────────────────────────────────────────\n\nexport function createMockProvider(): AIProvider {\n return {\n name: \"mock\",\n async generate(prompt: string): Promise<Result<Intent, ProviderError>> {\n const lowerPrompt = prompt.toLowerCase();\n\n const match = FIXTURE_ENTRIES.find((entry) =>\n entry.keywords.some((kw) => lowerPrompt.includes(kw)),\n );\n\n if (!match) {\n return err({\n kind: \"ProviderError\",\n message: `No fixture matched for prompt. Keywords tried: ${FIXTURE_ENTRIES.flatMap((e) => e.keywords).join(\", \")}`,\n prompt,\n });\n }\n\n const fixtureDir = resolveFixtureDir();\n const filePath = join(fixtureDir, match.filename);\n\n try {\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n const validated = IntentSchema.parse(parsed);\n return ok(validated);\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : \"Unknown parse error\";\n return err({\n kind: \"ProviderError\",\n message: `Failed to load fixture '${match.filename}': ${message}`,\n prompt,\n });\n }\n },\n };\n}\n\n// ── Helpers ──────────────────────────────────────────────\n\nfunction resolveFixtureDir(): string {\n const thisDir = dirname(fileURLToPath(import.meta.url));\n\n // Source layout: src/ai/providers/ → ../../.. → tests/fixtures/ai-responses/\n const fromSource = join(thisDir, \"..\", \"..\", \"..\", \"tests\", \"fixtures\", \"ai-responses\");\n if (existsSync(fromSource)) return fromSource;\n\n // Bundled layout: dist/ → .. → tests/fixtures/ai-responses/\n const fromDist = join(thisDir, \"..\", \"tests\", \"fixtures\", \"ai-responses\");\n if (existsSync(fromDist)) return fromDist;\n\n // Fallback to source path (will error on read, with a clear message)\n return fromSource;\n}\n\n/**\n * Load a specific fixture file by name (without .json extension).\n */\nexport function loadFixture(name: string): Intent {\n const fixtureDir = resolveFixtureDir();\n const filePath = join(fixtureDir, `${name}.json`);\n const raw = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(raw) as unknown;\n return IntentSchema.parse(parsed);\n}\n\n/**\n * List all available fixture names.\n */\nexport function listFixtureNames(): ReadonlyArray<string> {\n return FIXTURE_ENTRIES.map((e) =>\n e.filename.replace(\".json\", \"\"),\n );\n}\n","/**\n * Provider Resolution\n *\n * Resolves which AI provider to use based on:\n * 1. Explicit --provider flag\n * 2. Auto-detect local Ollama\n * 3. Check env vars: ANTHROPIC → OPENAI → CLOUDFLARE → OPENROUTER\n * 4. No provider found → return null\n */\n\nimport type { AIProvider } from \"./providers/mock-provider.js\";\nimport { createOpenAIProvider } from \"./providers/openai-provider.js\";\nimport { createOllamaProvider, isOllamaRunning } from \"./providers/ollama-provider.js\";\nimport { createCloudflareProvider } from \"./providers/cloudflare-provider.js\";\nimport { createMockProvider } from \"./providers/mock-provider.js\";\n\n// ── Types ────────────────────────────────────────────────\n\nexport type ProviderName =\n | \"openai\"\n | \"ollama\"\n | \"cloudflare\"\n | \"mock\";\n\nexport interface ResolveOptions {\n /** Explicit provider name (from --provider flag) */\n readonly provider?: ProviderName;\n /** Skip Ollama detection (for testing) */\n readonly skipOllamaDetect?: boolean;\n /** Custom environment variables (for testing) */\n readonly env?: Readonly<Record<string, string | undefined>>;\n}\n\n// ── Public API ───────────────────────────────────────────\n\n/**\n * Resolve which AI provider to use.\n *\n * Resolution order:\n * 1. Explicit --provider flag\n * 2. Auto-detect local Ollama (if running)\n * 3. Check env vars: OPENAI_API_KEY → CLOUDFLARE_ACCOUNT_ID+TOKEN\n * 4. No provider found → null\n */\nexport async function resolveProvider(\n opts: ResolveOptions = {},\n): Promise<AIProvider | null> {\n const env = opts.env ?? process.env;\n\n // 1. Explicit provider\n if (opts.provider) {\n return createProviderByName(opts.provider, env);\n }\n\n // 2. Auto-detect Ollama\n if (!opts.skipOllamaDetect) {\n const ollamaRunning = await isOllamaRunning();\n if (ollamaRunning) {\n return createOllamaProvider();\n }\n }\n\n // 3. Check env vars\n if (env[\"OPENAI_API_KEY\"]) {\n return createOpenAIProvider(env[\"OPENAI_API_KEY\"]);\n }\n\n if (env[\"CLOUDFLARE_ACCOUNT_ID\"] && env[\"CLOUDFLARE_API_TOKEN\"]) {\n return createCloudflareProvider({\n accountId: env[\"CLOUDFLARE_ACCOUNT_ID\"],\n apiToken: env[\"CLOUDFLARE_API_TOKEN\"],\n });\n }\n\n // 4. No provider found\n return null;\n}\n\n// ── Helpers ──────────────────────────────────────────────\n\nfunction createProviderByName(\n name: ProviderName,\n env: Readonly<Record<string, string | undefined>>,\n): AIProvider {\n switch (name) {\n case \"openai\":\n return createOpenAIProvider(env[\"OPENAI_API_KEY\"]);\n case \"ollama\":\n return createOllamaProvider();\n case \"cloudflare\":\n return createCloudflareProvider({\n accountId: env[\"CLOUDFLARE_ACCOUNT_ID\"],\n apiToken: env[\"CLOUDFLARE_API_TOKEN\"],\n });\n case \"mock\":\n return createMockProvider();\n }\n}\n","import type { ResolvedConfig } from \"../schemas/config.js\";\n\ntype RecipeConfig = Omit<ResolvedConfig, \"projectName\" | \"projectDir\" | \"createdWith\">;\n\nexport const RECIPES: Record<string, RecipeConfig> = {\n saas: {\n renderMode: \"server\",\n deployTarget: \"cloudflare\",\n database: \"d1\",\n cssEngine: \"tailwind\",\n packageManager: \"pnpm\",\n blocks: [\n { name: \"hero-video\", variant: \"default\" },\n { name: \"features-bento\", variant: \"default\" },\n { name: \"pricing-table\", variant: \"default\" },\n { name: \"faq-accordion\", variant: \"default\" },\n { name: \"footer-rich\", variant: \"default\" },\n { name: \"auth-better-auth\", variant: \"default\" },\n { name: \"db-d1\", variant: \"default\" },\n ],\n locales: [\"en\"],\n defaultLocale: \"en\",\n palette: {\n preset: \"obsidian\",\n colors: {\n primary: \"#818cf8\",\n secondary: \"#c084fc\",\n accent: \"#38bdf8\",\n background: \"#0f172a\",\n foreground: \"#f8fafc\",\n },\n },\n themeSwitcher: false,\n },\n agency: {\n renderMode: \"static\",\n deployTarget: \"cloudflare\",\n database: \"none\",\n cssEngine: \"tailwind\",\n packageManager: \"pnpm\",\n blocks: [\n { name: \"hero-gradient\", variant: \"default\" },\n { name: \"features-grid\", variant: \"default\" },\n { name: \"testimonials-carousel\", variant: \"default\" },\n { name: \"contact-form\", variant: \"default\" },\n { name: \"footer-rich\", variant: \"default\" },\n ],\n locales: [\"en\"],\n defaultLocale: \"en\",\n palette: {\n preset: \"ocean-breeze\",\n colors: {\n primary: \"#0ea5e9\",\n secondary: \"#38bdf8\",\n accent: \"#7dd3fc\",\n background: \"#0c4a6e\",\n foreground: \"#f0f9ff\",\n },\n },\n themeSwitcher: true,\n },\n docs: {\n renderMode: \"static\",\n deployTarget: \"cloudflare\",\n database: \"none\",\n cssEngine: \"tailwind\",\n packageManager: \"pnpm\",\n blocks: [\n { name: \"header-sticky\", variant: \"default\" },\n { name: \"docs-collection\", variant: \"default\" },\n { name: \"footer-minimal\", variant: \"default\" },\n ],\n locales: [\"en\"],\n defaultLocale: \"en\",\n palette: {\n preset: \"snow\",\n colors: {\n primary: \"#3b82f6\",\n secondary: \"#60a5fa\",\n accent: \"#93c5fd\",\n background: \"#ffffff\",\n foreground: \"#0f172a\",\n },\n },\n themeSwitcher: false,\n },\n blog: {\n renderMode: \"static\",\n deployTarget: \"cloudflare\",\n database: \"none\",\n cssEngine: \"tailwind\",\n packageManager: \"pnpm\",\n blocks: [\n { name: \"header-transparent\", variant: \"default\" },\n { name: \"hero-split\", variant: \"default\" },\n { name: \"blog-mdx\", variant: \"default\" },\n { name: \"cta-newsletter\", variant: \"default\" },\n { name: \"footer-rich\", variant: \"default\" },\n ],\n locales: [\"en\"],\n defaultLocale: \"en\",\n palette: {\n preset: \"corporate-blue\",\n colors: {\n primary: \"#1d4ed8\",\n secondary: \"#2563eb\",\n accent: \"#3b82f6\",\n background: \"#f8fafc\",\n foreground: \"#0f172a\",\n },\n },\n themeSwitcher: false,\n },\n portfolio: {\n renderMode: \"static\",\n deployTarget: \"cloudflare\",\n database: \"none\",\n cssEngine: \"tailwind\",\n packageManager: \"pnpm\",\n blocks: [\n { name: \"hero-gradient\", variant: \"default\" },\n { name: \"features-grid\", variant: \"default\" },\n { name: \"contact-form\", variant: \"default\" },\n { name: \"footer-minimal\", variant: \"default\" },\n ],\n locales: [\"en\"],\n defaultLocale: \"en\",\n palette: {\n preset: \"midnight\",\n colors: {\n primary: \"#6366f1\",\n secondary: \"#818cf8\",\n accent: \"#c084fc\",\n background: \"#0f172a\",\n foreground: \"#f8fafc\",\n },\n },\n themeSwitcher: false,\n },\n};\n","/**\n * Project Name Validation — ensures project names are valid npm package names.\n *\n * Rules:\n * - Lowercase only\n * - No spaces or special characters (except hyphens)\n * - Cannot start with a dot, hyphen, or number\n * - Must be non-empty\n */\n\nimport { ok, err, type Result } from \"./result.js\";\n\nconst VALID_NAME_RE = /^[a-z][a-z0-9-]*$/;\n\n/**\n * Validate that a project name is a valid npm-style package name.\n */\nexport function validateProjectName(name: string): Result<string, string> {\n if (!name || name.length === 0) {\n return err(\"Project name cannot be empty.\");\n }\n\n if (!VALID_NAME_RE.test(name)) {\n const suggestion = suggestProjectName(name);\n return err(\n `\"${name}\" is not a valid project name. Try: \"${suggestion}\" instead.`,\n );\n }\n\n return ok(name);\n}\n\n/**\n * Sanitize an invalid project name into a valid one.\n */\nexport function suggestProjectName(invalid: string): string {\n let name = invalid\n .toLowerCase()\n .replace(/[_\\s]+/g, \"-\") // underscores and spaces → hyphens\n .replace(/[^a-z0-9-]/g, \"\") // strip everything except a-z, 0-9, hyphens\n .replace(/-{2,}/g, \"-\") // collapse multiple hyphens\n .replace(/^[-.]/, \"\") // strip leading dot or hyphen\n .replace(/-$/, \"\"); // strip trailing hyphen\n\n if (!name || name.length === 0 || !/^[a-z]/.test(name)) {\n return \"my-project\";\n }\n\n return name;\n}\n","import { defineCommand } from \"citty\";\nimport pc from \"picocolors\";\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport type { BlockManifest } from \"fornix-registry\";\nimport {\n FIXTURE_MANIFESTS,\n FIXTURE_BLOCK_SOURCES,\n} from \"../fixture-registry.js\";\n\n// ── Types ────────────────────────────────────────────────\n\ninterface AddArgs {\n readonly block: string;\n readonly variant: string;\n readonly \"dry-run\": boolean;\n readonly verbose: boolean;\n}\n\ninterface FornixManifest {\n version: string;\n createdAt: string;\n renderMode: string;\n blocks: Array<{\n name: string;\n version: string;\n variant: string;\n installedAt: string;\n }>;\n [key: string]: unknown;\n}\n\n// ── Command Definition ───────────────────────────────────\n\nexport const addCommand = defineCommand({\n meta: {\n name: \"add\",\n description: \"Add a block to an existing Fornix project\",\n },\n args: {\n block: {\n type: \"positional\",\n description: \"Block name to add (e.g. hero-gradient, auth-better-auth)\",\n required: true,\n },\n variant: {\n type: \"string\",\n description: \"Block variant to use (defaults to 'default')\",\n default: \"default\",\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would change without writing\",\n default: false,\n },\n verbose: {\n type: \"boolean\",\n description: \"Detailed output\",\n default: false,\n },\n },\n run({ args }) {\n const typedArgs = args as unknown as AddArgs;\n const cwd = process.cwd();\n\n // 1. Read fornix.json\n const manifestPath = join(cwd, \"fornix.json\");\n if (!existsSync(manifestPath)) {\n console.error(\n pc.red(\"✗ No fornix.json found. Are you in a Fornix project?\"),\n );\n process.exit(1);\n }\n\n const manifestRaw = readFileSync(manifestPath, \"utf-8\");\n const manifest: FornixManifest = JSON.parse(manifestRaw);\n\n // 2. Look up block\n const blockName = typedArgs.block;\n const blockManifest = FIXTURE_MANIFESTS[blockName];\n if (!blockManifest) {\n console.error(pc.red(`✗ Block '${blockName}' not found in registry.`));\n console.error(\n pc.dim(\n ` Available: ${Object.keys(FIXTURE_MANIFESTS).join(\", \")}`,\n ),\n );\n process.exit(1);\n }\n\n // 3. Check if already installed\n const installedNames = new Set(manifest.blocks.map((b) => b.name));\n if (installedNames.has(blockName)) {\n console.log(\n pc.yellow(`⚠ Block '${blockName}' is already installed.`),\n );\n return;\n }\n\n // 4. Resolve dependencies\n const blocksToAdd = resolveDependencies(blockName, installedNames);\n\n // 5. Check mode compatibility\n for (const name of blocksToAdd) {\n const m = FIXTURE_MANIFESTS[name];\n if (m?.requiredMode && manifest.renderMode !== m.requiredMode) {\n console.error(\n pc.red(\n `✗ Block '${name}' requires '${m.requiredMode}' mode, but project uses '${manifest.renderMode}'.`,\n ),\n );\n process.exit(1);\n }\n }\n\n // 6. Place files\n const filesToWrite: Array<{ path: string; content: string }> = [];\n\n for (const name of blocksToAdd) {\n const bManifest = FIXTURE_MANIFESTS[name];\n const sources = FIXTURE_BLOCK_SOURCES[name];\n if (!bManifest || !sources) {\n console.error(pc.red(`✗ Source files not found for block '${name}'.`));\n process.exit(1);\n }\n\n for (const file of bManifest.files) {\n const content = sources[file.source];\n if (content === undefined) {\n console.error(\n pc.red(\n `✗ Source file '${file.source}' not found for block '${name}'.`,\n ),\n );\n process.exit(1);\n }\n\n filesToWrite.push({\n path: join(cwd, file.destination),\n content,\n });\n }\n }\n\n // 7. Dry run check\n if (typedArgs[\"dry-run\"]) {\n console.log(pc.bold(\"\\n Dry run — no files written\\n\"));\n for (const name of blocksToAdd) {\n const isDep = name !== blockName;\n console.log(\n ` ${isDep ? pc.dim(\"(dep)\") : pc.green(\"+\")} ${pc.bold(name)}`,\n );\n }\n console.log();\n for (const file of filesToWrite) {\n console.log(` ${pc.dim(\"→\")} ${file.path}`);\n }\n console.log();\n return;\n }\n\n // 8. Write files\n for (const file of filesToWrite) {\n mkdirSync(dirname(file.path), { recursive: true });\n writeFileSync(file.path, file.content);\n if (typedArgs.verbose) {\n console.log(` ${pc.dim(\"→\")} ${file.path}`);\n }\n }\n\n // 9. Update fornix.json\n const now = new Date().toISOString();\n for (const name of blocksToAdd) {\n const bManifest = FIXTURE_MANIFESTS[name];\n if (!bManifest) continue;\n manifest.blocks.push({\n name,\n version: bManifest.version,\n variant: name === blockName ? typedArgs.variant : \"default\",\n installedAt: now,\n });\n }\n\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n\n // 10. Print summary\n console.log();\n for (const name of blocksToAdd) {\n const isDep = name !== blockName;\n if (isDep) {\n console.log(\n ` ${pc.green(\"+\")} ${pc.bold(name)} ${pc.dim(\"(auto-added dependency)\")}`,\n );\n } else {\n console.log(` ${pc.green(\"+\")} ${pc.bold(name)}`);\n }\n }\n console.log(\n pc.dim(\n `\\n ${filesToWrite.length} files placed, fornix.json updated.`,\n ),\n );\n console.log();\n },\n});\n\n// ── Dependency Resolution ────────────────────────────────\n\nfunction resolveDependencies(\n blockName: string,\n installedNames: ReadonlySet<string>,\n): ReadonlyArray<string> {\n const result: string[] = [];\n const visited = new Set<string>();\n\n function walk(name: string): void {\n if (visited.has(name) || installedNames.has(name)) return;\n visited.add(name);\n\n const manifest = FIXTURE_MANIFESTS[name];\n if (!manifest) return;\n\n // Walk dependencies first (depth-first)\n for (const dep of manifest.requires) {\n walk(dep);\n }\n\n result.push(name);\n }\n\n walk(blockName);\n return result;\n}\n","import { defineCommand } from \"citty\";\nimport pc from \"picocolors\";\nimport { readFileSync, writeFileSync, existsSync, unlinkSync, readdirSync, rmdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport type { BlockManifest } from \"fornix-registry\";\nimport { FIXTURE_MANIFESTS } from \"../fixture-registry.js\";\n\n// ── Types ────────────────────────────────────────────────\n\ninterface RemoveArgs {\n readonly block: string;\n readonly \"dry-run\": boolean;\n readonly force: boolean;\n readonly verbose: boolean;\n}\n\ninterface FornixManifest {\n version: string;\n blocks: Array<{\n name: string;\n version: string;\n variant: string;\n installedAt: string;\n }>;\n [key: string]: unknown;\n}\n\n// ── Command Definition ───────────────────────────────────\n\nexport const removeCommand = defineCommand({\n meta: {\n name: \"remove\",\n description: \"Remove a block from an existing Fornix project\",\n },\n args: {\n block: {\n type: \"positional\",\n description: \"Block name to remove\",\n required: true,\n },\n \"dry-run\": {\n type: \"boolean\",\n description: \"Show what would change without writing\",\n default: false,\n },\n force: {\n type: \"boolean\",\n description: \"Force removal even if other blocks depend on this one\",\n default: false,\n },\n verbose: {\n type: \"boolean\",\n description: \"Detailed output\",\n default: false,\n },\n },\n run({ args }) {\n const typedArgs = args as unknown as RemoveArgs;\n const cwd = process.cwd();\n\n // 1. Read fornix.json\n const manifestPath = join(cwd, \"fornix.json\");\n if (!existsSync(manifestPath)) {\n console.error(\n pc.red(\"✗ No fornix.json found. Are you in a Fornix project?\"),\n );\n process.exit(1);\n }\n\n const manifestRaw = readFileSync(manifestPath, \"utf-8\");\n const manifest: FornixManifest = JSON.parse(manifestRaw);\n\n // 2. Check if block is installed\n const blockName = typedArgs.block;\n const installedNames = new Set(manifest.blocks.map((b) => b.name));\n\n if (!installedNames.has(blockName)) {\n console.log(\n pc.yellow(`⚠ Block '${blockName}' is not installed.`),\n );\n return;\n }\n\n // 3. Check for dependents\n const dependents = findDependents(blockName, installedNames);\n if (dependents.length > 0 && !typedArgs.force) {\n console.log(\n pc.yellow(\n `⚠ Block '${blockName}' is required by: ${dependents.join(\", \")}`,\n ),\n );\n console.log(\n pc.dim(\" Use --force to remove anyway, or remove dependent blocks first.\"),\n );\n return;\n }\n\n // 4. Get files to remove\n const blockManifest = FIXTURE_MANIFESTS[blockName];\n const filesToRemove: string[] = [];\n\n if (blockManifest) {\n for (const file of blockManifest.files) {\n const filePath = join(cwd, file.destination);\n if (existsSync(filePath)) {\n filesToRemove.push(filePath);\n }\n }\n }\n\n // 5. Dry run check\n if (typedArgs[\"dry-run\"]) {\n console.log(pc.bold(\"\\n Dry run — no files removed\\n\"));\n console.log(` ${pc.red(\"-\")} ${pc.bold(blockName)}`);\n for (const file of filesToRemove) {\n console.log(` ${pc.dim(\"×\")} ${file}`);\n }\n console.log();\n return;\n }\n\n // 6. Remove files\n for (const filePath of filesToRemove) {\n unlinkSync(filePath);\n if (typedArgs.verbose) {\n console.log(` ${pc.dim(\"×\")} ${filePath}`);\n }\n\n // Clean up empty parent directories\n tryRemoveEmptyDir(dirname(filePath), cwd);\n }\n\n // 7. Update fornix.json\n manifest.blocks = manifest.blocks.filter((b) => b.name !== blockName);\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n\n // 8. Print summary\n console.log();\n console.log(` ${pc.red(\"-\")} ${pc.bold(blockName)} removed`);\n if (dependents.length > 0) {\n console.log(\n pc.yellow(\n ` ⚠ Warning: ${dependents.join(\", \")} may no longer work correctly.`,\n ),\n );\n }\n console.log(\n pc.dim(\n `\\n ${filesToRemove.length} files removed, fornix.json updated.`,\n ),\n );\n console.log();\n },\n});\n\n// ── Helpers ──────────────────────────────────────────────\n\nfunction findDependents(\n blockName: string,\n installedNames: ReadonlySet<string>,\n): ReadonlyArray<string> {\n const dependents: string[] = [];\n\n for (const name of installedNames) {\n const manifest = FIXTURE_MANIFESTS[name];\n if (manifest && manifest.requires.includes(blockName)) {\n dependents.push(name);\n }\n }\n\n return dependents;\n}\n\nfunction tryRemoveEmptyDir(dirPath: string, rootPath: string): void {\n // Don't remove project root or above\n if (dirPath === rootPath || !dirPath.startsWith(rootPath)) return;\n\n try {\n const entries = readdirSync(dirPath);\n if (entries.length === 0) {\n rmdirSync(dirPath);\n // Recurse to clean parent\n tryRemoveEmptyDir(dirname(dirPath), rootPath);\n }\n } catch {\n // Ignore errors\n }\n}\n","import { defineCommand } from \"citty\";\nimport pc from \"picocolors\";\nimport type { BlockManifest } from \"fornix-registry\";\nimport {\n FIXTURE_MANIFESTS,\n} from \"../fixture-registry.js\";\n\n// ── Types ────────────────────────────────────────────────\n\ninterface ListArgs {\n readonly category?: string;\n readonly type?: string;\n readonly json: boolean;\n readonly verbose: boolean;\n}\n\n// ── Command Definition ───────────────────────────────────\n\nexport const listCommand = defineCommand({\n meta: {\n name: \"list\",\n description: \"List available blocks from the Fornix registry\",\n },\n args: {\n category: {\n type: \"string\",\n description: \"Filter blocks by category\",\n },\n type: {\n type: \"string\",\n description: \"Filter blocks by type (section, integration)\",\n },\n json: {\n type: \"boolean\",\n description: \"Output as JSON\",\n default: false,\n },\n verbose: {\n type: \"boolean\",\n description: \"Show full block details\",\n default: false,\n },\n },\n run({ args }) {\n const typedArgs = args as unknown as ListArgs;\n const blocks = getFilteredBlocks(typedArgs);\n\n if (blocks.length === 0) {\n console.log(pc.yellow(\"No blocks found matching your filters.\"));\n return;\n }\n\n if (typedArgs.json) {\n printJson(blocks);\n } else {\n printFormatted(blocks, typedArgs.verbose);\n }\n },\n});\n\n// ── Helpers ──────────────────────────────────────────────\n\nfunction getFilteredBlocks(args: ListArgs): ReadonlyArray<BlockManifest> {\n let blocks = Object.values(FIXTURE_MANIFESTS);\n\n if (args.type) {\n const filterType = args.type.toLowerCase();\n blocks = blocks.filter((b) => b.type === filterType);\n }\n\n if (args.category) {\n const filterCategory = args.category.toLowerCase();\n blocks = blocks.filter((b) => b.category === filterCategory);\n }\n\n return blocks.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction printJson(blocks: ReadonlyArray<BlockManifest>): void {\n const output = blocks.map((b) => ({\n name: b.name,\n type: b.type,\n category: b.category,\n description: b.description,\n tags: b.tags,\n requiredMode: b.requiredMode,\n requires: b.requires,\n }));\n console.log(JSON.stringify(output, null, 2));\n}\n\nfunction printFormatted(\n blocks: ReadonlyArray<BlockManifest>,\n verbose: boolean,\n): void {\n console.log();\n console.log(\n pc.bold(` 📦 Fornix Blocks`) +\n pc.dim(` (${blocks.length} available)`),\n );\n console.log();\n\n // Group by type\n const grouped = new Map<string, BlockManifest[]>();\n for (const block of blocks) {\n const type = block.type;\n if (!grouped.has(type)) {\n grouped.set(type, []);\n }\n grouped.get(type)!.push(block);\n }\n\n const typeIcons: Record<string, string> = {\n section: \"🧩\",\n integration: \"⚙️\",\n feature: \"✨\",\n layout: \"📐\",\n };\n\n for (const [type, typeBlocks] of grouped) {\n const icon = typeIcons[type] ?? \"📦\";\n console.log(\n ` ${icon} ${pc.bold(pc.cyan(type.toUpperCase()))} ${pc.dim(`(${typeBlocks.length})`)}`,\n );\n console.log();\n\n for (const block of typeBlocks) {\n const name = pc.bold(pc.white(block.name));\n const desc = pc.dim(block.description);\n const tags = block.tags.map((t) => pc.dim(`#${t}`)).join(\" \");\n\n console.log(` ${name}`);\n console.log(` ${desc}`);\n\n if (verbose) {\n console.log(` ${pc.dim(\"Category:\")} ${block.category}`);\n if (block.requiredMode) {\n console.log(\n ` ${pc.dim(\"Requires:\")} ${pc.yellow(block.requiredMode)} mode`,\n );\n }\n if (block.requires.length > 0) {\n console.log(\n ` ${pc.dim(\"Depends on:\")} ${block.requires.join(\", \")}`,\n );\n }\n if (Object.keys(block.dependencies).length > 0) {\n const deps = Object.entries(block.dependencies)\n .map(([k, v]) => `${k}@${v}`)\n .join(\", \");\n console.log(` ${pc.dim(\"npm deps:\")} ${deps}`);\n }\n }\n\n console.log(` ${tags}`);\n console.log();\n }\n }\n}\n","import { defineCommand } from \"citty\";\nimport pc from \"picocolors\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n// ── Types ────────────────────────────────────────────────\n\ninterface FornixManifest {\n readonly version: string;\n readonly createdAt: string;\n readonly createdWith?: string;\n readonly renderMode: string;\n readonly deployTarget: string;\n readonly database?: string;\n readonly locales?: ReadonlyArray<string>;\n readonly defaultLocale?: string;\n readonly palette?: string;\n readonly themeSwitcher?: boolean;\n readonly blocks: ReadonlyArray<{\n readonly name: string;\n readonly version: string;\n readonly variant: string;\n readonly installedAt: string;\n }>;\n}\n\ninterface StatusArgs {\n readonly json: boolean;\n readonly verbose: boolean;\n}\n\n// ── Command Definition ───────────────────────────────────\n\nexport const statusCommand = defineCommand({\n meta: {\n name: \"status\",\n description: \"Show current Fornix project configuration and installed blocks\",\n },\n args: {\n json: {\n type: \"boolean\",\n description: \"Output as JSON\",\n default: false,\n },\n verbose: {\n type: \"boolean\",\n description: \"Show full configuration details\",\n default: false,\n },\n },\n run({ args }) {\n const typedArgs = args as unknown as StatusArgs;\n const cwd = process.cwd();\n const manifestPath = join(cwd, \"fornix.json\");\n\n if (!existsSync(manifestPath)) {\n console.error(\n pc.red(\"✗ No fornix.json found in the current directory.\"),\n );\n console.error(\n pc.dim(\n \" Run this command from inside a Fornix project, or create one with: npx create-fornix\",\n ),\n );\n process.exit(1);\n }\n\n let manifest: FornixManifest;\n try {\n const raw = readFileSync(manifestPath, \"utf-8\");\n manifest = JSON.parse(raw) as FornixManifest;\n } catch {\n console.error(pc.red(\"✗ Failed to parse fornix.json.\"));\n process.exit(1);\n }\n\n if (typedArgs.json) {\n console.log(JSON.stringify(manifest, null, 2));\n return;\n }\n\n printStatus(manifest, typedArgs.verbose);\n },\n});\n\n// ── Formatted Output ─────────────────────────────────────\n\nfunction printStatus(manifest: FornixManifest, verbose: boolean): void {\n console.log();\n console.log(pc.bold(\" 📋 Fornix Project Status\"));\n console.log();\n\n console.log(\n ` ${pc.dim(\"Render mode:\")} ${pc.bold(pc.cyan(manifest.renderMode))}`,\n );\n console.log(\n ` ${pc.dim(\"Deploy target:\")} ${pc.bold(pc.cyan(manifest.deployTarget))}`,\n );\n\n if (manifest.palette) {\n console.log(\n ` ${pc.dim(\"Palette:\")} ${pc.bold(manifest.palette)}`,\n );\n }\n\n if (manifest.locales && manifest.locales.length > 0) {\n const localeStr = manifest.locales.join(\", \");\n const defaultStr = manifest.defaultLocale\n ? ` ${pc.dim(`(default: ${manifest.defaultLocale})`)}`\n : \"\";\n console.log(\n ` ${pc.dim(\"Locales:\")} ${localeStr}${defaultStr}`,\n );\n }\n\n if (manifest.database && manifest.database !== \"none\") {\n console.log(\n ` ${pc.dim(\"Database:\")} ${manifest.database}`,\n );\n }\n\n if (manifest.themeSwitcher !== undefined) {\n console.log(\n ` ${pc.dim(\"Theme switcher:\")} ${manifest.themeSwitcher ? \"enabled\" : \"disabled\"}`,\n );\n }\n\n if (verbose && manifest.createdWith) {\n console.log(\n ` ${pc.dim(\"Created with:\")} ${manifest.createdWith}`,\n );\n console.log(\n ` ${pc.dim(\"Created at:\")} ${manifest.createdAt}`,\n );\n }\n\n console.log();\n console.log(\n ` ${pc.bold(\"Installed blocks\")} ${pc.dim(`(${manifest.blocks.length})`)}`,\n );\n console.log();\n\n if (manifest.blocks.length === 0) {\n console.log(\n pc.dim(\" No blocks installed. Add one with: fornix add <block>\"),\n );\n } else {\n for (const block of manifest.blocks) {\n const variant =\n block.variant !== \"default\" ? pc.dim(` [${block.variant}]`) : \"\";\n console.log(\n ` ${pc.green(\"●\")} ${pc.bold(block.name)}${variant} ${pc.dim(`v${block.version}`)}`,\n );\n if (verbose) {\n console.log(\n ` ${pc.dim(\"Installed:\")} ${block.installedAt}`,\n );\n }\n }\n }\n\n console.log();\n}\n","import { defineCommand } from \"citty\";\nimport pc from \"picocolors\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { BlockManifest } from \"fornix-registry\";\nimport { FIXTURE_MANIFESTS } from \"../fixture-registry.js\";\n\ninterface FornixManifest {\n readonly version: string;\n readonly createdAt: string;\n readonly createdWith?: string;\n readonly renderMode: string;\n readonly deployTarget: string;\n readonly database?: string;\n readonly locales?: ReadonlyArray<string>;\n readonly defaultLocale?: string;\n readonly palette?: string;\n readonly themeSwitcher?: boolean;\n readonly blocks: ReadonlyArray<{\n readonly name: string;\n readonly version: string;\n readonly variant: string;\n readonly installedAt: string;\n }>;\n}\n\nexport const doctorCommand = defineCommand({\n meta: {\n name: \"doctor\",\n description: \"Diagnose common issues in a Fornix project\",\n },\n args: {\n json: {\n type: \"boolean\",\n description: \"Output as JSON\",\n default: false,\n },\n },\n run({ args }) {\n const cwd = process.cwd();\n const manifestPath = join(cwd, \"fornix.json\");\n let hasErrors = false;\n const errors: string[] = [];\n\n function reportError(msg: string) {\n hasErrors = true;\n errors.push(msg);\n if (!args.json) {\n console.error(pc.red(`✗ ${msg}`));\n }\n }\n\n // ── Check 1: Missing fornix.json ──────────────\n if (!existsSync(manifestPath)) {\n reportError(\"No fornix.json found in the current directory.\");\n if (args.json) {\n console.log(JSON.stringify({ healthy: false, errors }));\n }\n process.exit(1);\n }\n\n let manifest: FornixManifest;\n try {\n const raw = readFileSync(manifestPath, \"utf-8\");\n manifest = JSON.parse(raw) as FornixManifest;\n } catch {\n reportError(\"Failed to parse fornix.json.\");\n if (args.json) {\n console.log(JSON.stringify({ healthy: false, errors }));\n }\n process.exit(1);\n }\n\n const isMultiLocale = manifest.locales && manifest.locales.length >= 2;\n const locales = isMultiLocale ? manifest.locales! : [\"\"];\n\n const installedBlocks = new Set(manifest.blocks.map((b) => b.name));\n\n // ── Check 2: Missing installed block files ──────────────\n for (const block of manifest.blocks) {\n const bManifest = FIXTURE_MANIFESTS[block.name];\n if (bManifest) {\n for (const file of bManifest.files) {\n const filePath = join(cwd, file.destination);\n if (!existsSync(filePath)) {\n reportError(`Missing expected file for installed block '${block.name}': ${file.destination}`);\n }\n }\n }\n }\n\n // ── Check 3: Orphaned block files ──────────────\n for (const [name, bManifest] of Object.entries(FIXTURE_MANIFESTS)) {\n if (!installedBlocks.has(name)) {\n // Block is not installed, but do its files exist?\n const foundOrphaned = bManifest.files.some((file) => {\n return existsSync(join(cwd, file.destination));\n });\n\n if (foundOrphaned) {\n reportError(`Orphaned block files detected for '${name}'. The block is not in fornix.json.`);\n }\n }\n }\n\n // ── Check 4: Broken content collection references ──────────────\n let requiresContentConfig = false;\n const missingContentFiles: string[] = [];\n\n for (const block of manifest.blocks) {\n const bManifest = FIXTURE_MANIFESTS[block.name];\n if (!bManifest) continue;\n\n const hasContentSlots = bManifest.ai?.contentSlots && Object.keys(bManifest.ai.contentSlots).length > 0;\n const hasCollections = bManifest.collections && bManifest.collections.length > 0;\n\n if (hasContentSlots || hasCollections) {\n requiresContentConfig = true;\n }\n\n if (hasContentSlots) {\n const subdirectory = getCategory(bManifest.type);\n for (const locale of locales) {\n let pathFragment = `src/content/${subdirectory}/${bManifest.name}.json`;\n if (locale !== \"\") {\n pathFragment = `src/content/${locale}/${subdirectory}/${bManifest.name}.json`;\n }\n if (!existsSync(join(cwd, pathFragment))) {\n missingContentFiles.push(pathFragment);\n }\n }\n }\n }\n\n if (requiresContentConfig) {\n if (!existsSync(join(cwd, \"src/content/config.ts\"))) {\n reportError(\"Missing expected file: src/content/config.ts\");\n }\n }\n\n for (const missing of missingContentFiles) {\n reportError(`Broken content reference: missing ${missing}`);\n }\n\n\n if (hasErrors) {\n if (args.json) {\n console.log(JSON.stringify({ healthy: false, errors }));\n } else {\n console.log();\n console.log(pc.yellow(\"Run 'fornix add <block>' to repair missing blocks or 'fornix remove <block>' to clean orphaned files.\"));\n }\n process.exit(1);\n } else {\n if (args.json) {\n console.log(JSON.stringify({ healthy: true, errors: [] }));\n } else {\n console.log(pc.green(\"✓ Project is healthy!\"));\n }\n }\n },\n});\n\nfunction getCategory(type: string) {\n switch (type) {\n case \"section\": return \"sections\";\n case \"integration\": return \"integrations\";\n case \"feature\": return \"features\";\n case \"layout\": return \"layouts\";\n default: return type;\n }\n}\n","import { defineCommand } from \"citty\";\nimport { FornixMCPServer } from \"../../mcp/server.js\";\n\nconst serveCommand = defineCommand({\n meta: {\n name: \"serve\",\n description: \"Start the Fornix MCP Server over stdio\",\n },\n async run() {\n console.error(\"Starting Fornix MCP Server...\");\n const mcpServer = new FornixMCPServer();\n await mcpServer.start();\n console.error(\"Fornix MCP Server running on stdio.\");\n },\n});\n\nexport const mcpCommand = defineCommand({\n meta: {\n name: \"mcp\",\n description: \"Manage and run the Model Context Protocol (MCP) server\",\n },\n subCommands: {\n serve: serveCommand,\n },\n});\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { listBlocks } from \"./tools/list-blocks.js\";\nimport { addBlock } from \"./tools/add-block.js\";\nimport { removeBlock } from \"./tools/remove-block.js\";\nimport { getContentSchema } from \"./tools/get-content-schema.js\";\nimport { validateContent } from \"./tools/validate-content.js\";\nimport { getProjectStatus } from \"./tools/get-project-status.js\";\nimport { scaffoldProject } from \"./tools/scaffold-project.js\";\nimport { FIXTURE_MANIFESTS } from \"../cli/fixture-registry.js\";\nimport { ok, err, type Result } from \"../utils/result.js\";\n\n// ── Tool Metadata ───────────────────────────────────────────\n\ninterface ToolDefinition {\n readonly name: string;\n readonly description: string;\n readonly inputSchema: {\n readonly type: \"object\";\n readonly properties: Record<string, unknown>;\n readonly required?: ReadonlyArray<string>;\n };\n}\n\nconst TOOL_DEFINITIONS: ReadonlyArray<ToolDefinition> = [\n {\n name: \"list_blocks\",\n description: \"List available blocks from the Fornix registry\",\n inputSchema: {\n type: \"object\",\n properties: {\n type: { type: \"string\", description: \"Filter by block type (section, integration, feature, layout)\" },\n category: { type: \"string\", description: \"Filter by category\" },\n search: { type: \"string\", description: \"Search term to filter blocks\" },\n },\n },\n },\n {\n name: \"add_block\",\n description: \"Add a block to an existing Fornix project\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Block name to add\" },\n variant: { type: \"string\", description: \"Block variant (default: 'default')\" },\n projectDirectory: { type: \"string\", description: \"Path to the Fornix project directory\" },\n },\n required: [\"name\", \"projectDirectory\"],\n },\n },\n {\n name: \"remove_block\",\n description: \"Remove a block from an existing Fornix project\",\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\", description: \"Block name to remove\" },\n force: { type: \"boolean\", description: \"Force removal even if other blocks depend on it\" },\n projectDirectory: { type: \"string\", description: \"Path to the Fornix project directory\" },\n },\n required: [\"name\", \"projectDirectory\"],\n },\n },\n {\n name: \"get_content_schema\",\n description: \"Get the content slot schema for a block collection\",\n inputSchema: {\n type: \"object\",\n properties: {\n collection: { type: \"string\", description: \"Block/collection name\" },\n },\n required: [\"collection\"],\n },\n },\n {\n name: \"update_content\",\n description: \"Modify content entries for a block collection\",\n inputSchema: {\n type: \"object\",\n properties: {\n collection: { type: \"string\", description: \"Block/collection name\" },\n entry: { type: \"string\", description: \"Entry identifier\" },\n data: { type: \"object\", description: \"Content data to set\" },\n },\n required: [\"collection\", \"data\"],\n },\n },\n {\n name: \"validate_content\",\n description: \"Validate content data against a block's content schema\",\n inputSchema: {\n type: \"object\",\n properties: {\n collection: { type: \"string\", description: \"Block/collection name\" },\n data: { type: \"object\", description: \"Content data to validate\" },\n },\n required: [\"collection\", \"data\"],\n },\n },\n {\n name: \"get_project_status\",\n description: \"Get the current Fornix project configuration and installed blocks\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectDirectory: { type: \"string\", description: \"Path to the Fornix project directory\" },\n },\n required: [\"projectDirectory\"],\n },\n },\n {\n name: \"scaffold_project\",\n description: \"Scaffold a complete Fornix project from a natural language description\",\n inputSchema: {\n type: \"object\",\n properties: {\n description: { type: \"string\", description: \"Natural language description of the project\" },\n projectDirectory: { type: \"string\", description: \"Path to create the project in\" },\n renderMode: { type: \"string\", description: \"Render mode: static, hybrid, server\" },\n deployTarget: { type: \"string\", description: \"Deploy target: cloudflare, vercel, netlify, static\" },\n blocks: { type: \"array\", items: { type: \"string\" }, description: \"Block names to include\" },\n locales: { type: \"array\", items: { type: \"string\" }, description: \"Locale codes\" },\n },\n required: [\"description\", \"projectDirectory\"],\n },\n },\n];\n\n// ── Server ──────────────────────────────────────────────────\n\nexport class FornixMCPServer {\n public server: Server;\n\n private registeredTools: string[] = [];\n private registeredResources: string[] = [];\n\n constructor() {\n this.server = new Server(\n {\n name: \"fornix-mcp\",\n version: \"0.0.1\",\n },\n {\n capabilities: {\n resources: {},\n tools: {},\n },\n },\n );\n\n this.registerTools();\n this.registerResources();\n this.setupHandlers();\n }\n\n private registerTools(): void {\n this.registeredTools = TOOL_DEFINITIONS.map(\n (definition) => definition.name,\n );\n }\n\n private registerResources(): void {\n this.registeredResources = [\n \"fornix://registry\",\n \"fornix://project/config\",\n ];\n }\n\n private setupHandlers(): void {\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: TOOL_DEFINITIONS.map((definition) => ({\n name: definition.name,\n description: definition.description,\n inputSchema: definition.inputSchema,\n })),\n };\n });\n\n this.server.setRequestHandler(\n CallToolRequestSchema,\n async (request) => {\n const toolName = request.params.name;\n const args = (request.params.arguments ?? {}) as Record<\n string,\n unknown\n >;\n\n const result = await this.executeTool(toolName, args);\n\n if (!result.ok) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: JSON.stringify({ error: result.error.message }),\n },\n ],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: result.value,\n },\n ],\n };\n },\n );\n\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: this.registeredResources.map((uri) => ({\n uri,\n name: uri,\n description: `Fornix MCP Resource: ${uri}`,\n })),\n };\n });\n\n this.server.setRequestHandler(\n ReadResourceRequestSchema,\n async (request) => {\n const uri = request.params.uri;\n\n if (uri === \"fornix://registry\") {\n const blocks = Object.values(FIXTURE_MANIFESTS).map((manifest) => ({\n name: manifest.name,\n type: manifest.type,\n category: manifest.category,\n description: manifest.description,\n }));\n\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(blocks, null, 2),\n },\n ],\n };\n }\n\n if (uri === \"fornix://project/config\") {\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify({\n message:\n \"Use get_project_status tool with a projectDirectory to read project config.\",\n }),\n },\n ],\n };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n },\n );\n }\n\n /**\n * Execute a tool by name with the given arguments.\n * Exposed as a public method for testing without MCP transport.\n */\n public async callTool(\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<Result<string, Error>> {\n return this.executeTool(toolName, args);\n }\n\n private async executeTool(\n toolName: string,\n args: Record<string, unknown>,\n ): Promise<Result<string, Error>> {\n switch (toolName) {\n case \"list_blocks\": {\n const result = listBlocks({\n type: args.type as string | undefined,\n category: args.category as string | undefined,\n search: args.search as string | undefined,\n });\n if (!result.ok) return err(result.error);\n return ok(JSON.stringify(result.value, null, 2));\n }\n\n case \"add_block\": {\n const result = addBlock({\n name: args.name as string,\n variant: args.variant as string | undefined,\n projectDirectory: args.projectDirectory as string,\n });\n if (!result.ok) return err(result.error);\n return ok(JSON.stringify(result.value, null, 2));\n }\n\n case \"remove_block\": {\n const result = removeBlock({\n name: args.name as string,\n force: args.force as boolean | undefined,\n projectDirectory: args.projectDirectory as string,\n });\n if (!result.ok) return err(result.error);\n return ok(JSON.stringify(result.value, null, 2));\n }\n\n case \"get_content_schema\": {\n const result = getContentSchema({\n collection: args.collection as string,\n });\n if (!result.ok) return err(result.error);\n return ok(JSON.stringify(result.value, null, 2));\n }\n\n case \"update_content\": {\n // update_content validates then returns the data as-is for now.\n // Full content update requires filesystem writes to content files,\n // which is deferred to a later phase.\n const validationResult = validateContent({\n collection: args.collection as string,\n data: args.data as Record<string, unknown>,\n });\n if (!validationResult.ok) return err(validationResult.error);\n if (!validationResult.value.valid) {\n return ok(\n JSON.stringify({\n updated: false,\n errors: validationResult.value.errors,\n }),\n );\n }\n return ok(\n JSON.stringify({\n updated: true,\n collection: args.collection,\n data: args.data,\n }),\n );\n }\n\n case \"validate_content\": {\n const result = validateContent({\n collection: args.collection as string,\n data: args.data as Record<string, unknown>,\n });\n if (!result.ok) return err(result.error);\n return ok(JSON.stringify(result.value, null, 2));\n }\n\n case \"get_project_status\": {\n const result = getProjectStatus({\n projectDirectory: args.projectDirectory as string,\n });\n if (!result.ok) return err(result.error);\n return ok(JSON.stringify(result.value, null, 2));\n }\n\n case \"scaffold_project\": {\n const result = scaffoldProject({\n description: args.description as string,\n projectDirectory: args.projectDirectory as string,\n renderMode: args.renderMode as\n | \"static\"\n | \"hybrid\"\n | \"server\"\n | undefined,\n deployTarget: args.deployTarget as\n | \"cloudflare\"\n | \"vercel\"\n | \"netlify\"\n | \"static\"\n | undefined,\n blocks: args.blocks as string[] | undefined,\n locales: args.locales as string[] | undefined,\n });\n if (!result.ok) return err(result.error);\n return ok(JSON.stringify(result.value, null, 2));\n }\n\n default:\n return err(new Error(`Unknown tool: ${toolName}`));\n }\n }\n\n // Exposed for TDD checks\n public getRegisteredTools(): string[] {\n return this.registeredTools;\n }\n\n public getRegisteredResources(): string[] {\n return this.registeredResources;\n }\n\n public async start(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n }\n}\n","import type { BlockManifest } from \"fornix-registry\";\nimport { FIXTURE_MANIFESTS } from \"../../cli/fixture-registry.js\";\nimport { ok, type Result } from \"../../utils/result.js\";\n\n// ── Input ───────────────────────────────────────────────────\n\nexport interface ListBlocksInput {\n readonly type?: string;\n readonly category?: string;\n readonly search?: string;\n}\n\n// ── Output ──────────────────────────────────────────────────\n\nexport interface ListBlocksEntry {\n readonly name: string;\n readonly type: string;\n readonly category: string;\n readonly description: string;\n readonly tags: ReadonlyArray<string>;\n readonly requiredMode?: string;\n readonly requires: ReadonlyArray<string>;\n}\n\n// ── Implementation ──────────────────────────────────────────\n\nexport function listBlocks(\n input: ListBlocksInput,\n): Result<ReadonlyArray<ListBlocksEntry>, Error> {\n let blocks: ReadonlyArray<BlockManifest> = Object.values(FIXTURE_MANIFESTS);\n\n if (input.type) {\n const filterType = input.type.toLowerCase();\n blocks = blocks.filter((block) => block.type === filterType);\n }\n\n if (input.category) {\n const filterCategory = input.category.toLowerCase();\n blocks = blocks.filter((block) => block.category === filterCategory);\n }\n\n if (input.search) {\n const searchTerm = input.search.toLowerCase();\n blocks = blocks.filter(\n (block) =>\n block.name.includes(searchTerm) ||\n block.description.toLowerCase().includes(searchTerm) ||\n block.tags.some((tag) => tag.includes(searchTerm)),\n );\n }\n\n const entries: ListBlocksEntry[] = blocks\n .map((block) => ({\n name: block.name,\n type: block.type,\n category: block.category,\n description: block.description,\n tags: block.tags,\n requiredMode: block.requiredMode,\n requires: block.requires,\n }))\n .sort((a, b) => a.name.localeCompare(b.name));\n\n return ok(entries);\n}\n","import type { BlockManifest } from \"fornix-registry\";\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport {\n FIXTURE_MANIFESTS,\n FIXTURE_BLOCK_SOURCES,\n} from \"../../cli/fixture-registry.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\n\n// ── Input ───────────────────────────────────────────────────\n\nexport interface AddBlockInput {\n readonly name: string;\n readonly variant?: string;\n readonly projectDirectory: string;\n}\n\n// ── Output ──────────────────────────────────────────────────\n\nexport interface AddBlockOutput {\n readonly addedBlocks: ReadonlyArray<string>;\n readonly filesCreated: number;\n}\n\n// ── Manifest Shape ──────────────────────────────────────────\n\ninterface FornixManifest {\n version: string;\n blocks: Array<{\n name: string;\n version: string;\n variant: string;\n installedAt: string;\n }>;\n renderMode: string;\n [key: string]: unknown;\n}\n\n// ── Implementation ──────────────────────────────────────────\n\nexport function addBlock(\n input: AddBlockInput,\n): Result<AddBlockOutput, Error> {\n const { name, variant = \"default\", projectDirectory } = input;\n\n // 1. Read fornix.json\n const manifestPath = join(projectDirectory, \"fornix.json\");\n if (!existsSync(manifestPath)) {\n return err(\n new Error(\"No fornix.json found. Not a Fornix project directory.\"),\n );\n }\n\n let manifest: FornixManifest;\n try {\n const raw = readFileSync(manifestPath, \"utf-8\");\n manifest = JSON.parse(raw) as FornixManifest;\n } catch {\n return err(new Error(\"Failed to parse fornix.json.\"));\n }\n\n // 2. Look up block\n const blockManifest = FIXTURE_MANIFESTS[name];\n if (!blockManifest) {\n return err(\n new Error(\n `Block '${name}' not found in registry. Available: ${Object.keys(FIXTURE_MANIFESTS).join(\", \")}`,\n ),\n );\n }\n\n // 3. Check if already installed\n const installedNames = new Set(manifest.blocks.map((block) => block.name));\n if (installedNames.has(name)) {\n return ok({ addedBlocks: [], filesCreated: 0 });\n }\n\n // 4. Resolve dependencies\n const blocksToAdd = resolveDependencies(name, installedNames);\n\n // 5. Check mode compatibility\n for (const blockName of blocksToAdd) {\n const dependencyManifest = FIXTURE_MANIFESTS[blockName];\n if (\n dependencyManifest?.requiredMode &&\n manifest.renderMode !== dependencyManifest.requiredMode\n ) {\n return err(\n new Error(\n `Block '${blockName}' requires '${dependencyManifest.requiredMode}' mode, but project uses '${manifest.renderMode}'.`,\n ),\n );\n }\n }\n\n // 6. Place files\n let filesCreated = 0;\n for (const blockName of blocksToAdd) {\n const blockDef = FIXTURE_MANIFESTS[blockName];\n const sources = FIXTURE_BLOCK_SOURCES[blockName];\n if (!blockDef || !sources) {\n return err(\n new Error(`Source files not found for block '${blockName}'.`),\n );\n }\n\n for (const file of blockDef.files) {\n const content = sources[file.source];\n if (content === undefined) {\n return err(\n new Error(\n `Source file '${file.source}' not found for block '${blockName}'.`,\n ),\n );\n }\n\n const filePath = join(projectDirectory, file.destination);\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, content);\n filesCreated++;\n }\n }\n\n // 7. Update fornix.json\n const now = new Date().toISOString();\n for (const blockName of blocksToAdd) {\n const blockDef = FIXTURE_MANIFESTS[blockName];\n if (!blockDef) continue;\n manifest.blocks.push({\n name: blockName,\n version: blockDef.version,\n variant: blockName === name ? variant : \"default\",\n installedAt: now,\n });\n }\n\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n\n return ok({ addedBlocks: blocksToAdd, filesCreated });\n}\n\n// ── Dependency Resolution ───────────────────────────────────\n\nfunction resolveDependencies(\n blockName: string,\n installedNames: ReadonlySet<string>,\n): ReadonlyArray<string> {\n const result: string[] = [];\n const visited = new Set<string>();\n\n function walk(currentName: string): void {\n if (visited.has(currentName) || installedNames.has(currentName)) return;\n visited.add(currentName);\n\n const manifest = FIXTURE_MANIFESTS[currentName];\n if (!manifest) return;\n\n for (const dependency of manifest.requires) {\n walk(dependency);\n }\n\n result.push(currentName);\n }\n\n walk(blockName);\n return result;\n}\n","import {\n readFileSync,\n writeFileSync,\n existsSync,\n unlinkSync,\n readdirSync,\n rmdirSync,\n} from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { FIXTURE_MANIFESTS } from \"../../cli/fixture-registry.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\n\n// ── Input ───────────────────────────────────────────────────\n\nexport interface RemoveBlockInput {\n readonly name: string;\n readonly force?: boolean;\n readonly projectDirectory: string;\n}\n\n// ── Output ──────────────────────────────────────────────────\n\nexport interface RemoveBlockOutput {\n readonly removedBlock: string;\n readonly filesRemoved: number;\n readonly dependentsWarning: ReadonlyArray<string>;\n}\n\n// ── Manifest Shape ──────────────────────────────────────────\n\ninterface FornixManifest {\n version: string;\n blocks: Array<{\n name: string;\n version: string;\n variant: string;\n installedAt: string;\n }>;\n [key: string]: unknown;\n}\n\n// ── Implementation ──────────────────────────────────────────\n\nexport function removeBlock(\n input: RemoveBlockInput,\n): Result<RemoveBlockOutput, Error> {\n const { name, force = false, projectDirectory } = input;\n\n // 1. Read fornix.json\n const manifestPath = join(projectDirectory, \"fornix.json\");\n if (!existsSync(manifestPath)) {\n return err(\n new Error(\"No fornix.json found. Not a Fornix project directory.\"),\n );\n }\n\n let manifest: FornixManifest;\n try {\n const raw = readFileSync(manifestPath, \"utf-8\");\n manifest = JSON.parse(raw) as FornixManifest;\n } catch {\n return err(new Error(\"Failed to parse fornix.json.\"));\n }\n\n // 2. Check if block is installed\n const installedNames = new Set(manifest.blocks.map((block) => block.name));\n if (!installedNames.has(name)) {\n return err(new Error(`Block '${name}' is not installed.`));\n }\n\n // 3. Check for dependents\n const dependents = findDependents(name, installedNames);\n if (dependents.length > 0 && !force) {\n return err(\n new Error(\n `Block '${name}' is required by: ${dependents.join(\", \")}. Use force to remove anyway.`,\n ),\n );\n }\n\n // 4. Get files to remove\n const blockManifest = FIXTURE_MANIFESTS[name];\n const filesToRemove: string[] = [];\n\n if (blockManifest) {\n for (const file of blockManifest.files) {\n const filePath = join(projectDirectory, file.destination);\n if (existsSync(filePath)) {\n filesToRemove.push(filePath);\n }\n }\n }\n\n // 5. Remove files\n for (const filePath of filesToRemove) {\n unlinkSync(filePath);\n tryRemoveEmptyDirectory(dirname(filePath), projectDirectory);\n }\n\n // 6. Update fornix.json\n manifest.blocks = manifest.blocks.filter((block) => block.name !== name);\n writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + \"\\n\");\n\n return ok({\n removedBlock: name,\n filesRemoved: filesToRemove.length,\n dependentsWarning: dependents,\n });\n}\n\n// ── Helpers ─────────────────────────────────────────────────\n\nfunction findDependents(\n blockName: string,\n installedNames: ReadonlySet<string>,\n): ReadonlyArray<string> {\n const dependents: string[] = [];\n\n for (const installedName of installedNames) {\n const manifest = FIXTURE_MANIFESTS[installedName];\n if (manifest && manifest.requires.includes(blockName)) {\n dependents.push(installedName);\n }\n }\n\n return dependents;\n}\n\nfunction tryRemoveEmptyDirectory(\n directoryPath: string,\n rootPath: string,\n): void {\n if (directoryPath === rootPath || !directoryPath.startsWith(rootPath)) return;\n\n try {\n const entries = readdirSync(directoryPath);\n if (entries.length === 0) {\n rmdirSync(directoryPath);\n tryRemoveEmptyDirectory(dirname(directoryPath), rootPath);\n }\n } catch {\n // Ignore errors — directory may not exist or not be empty\n }\n}\n","import type { ContentSlot } from \"fornix-registry\";\nimport { FIXTURE_MANIFESTS } from \"../../cli/fixture-registry.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\n\n// ── Input ───────────────────────────────────────────────────\n\nexport interface GetContentSchemaInput {\n readonly collection: string;\n}\n\n// ── Output ──────────────────────────────────────────────────\n\nexport interface GetContentSchemaOutput {\n readonly collection: string;\n readonly slots: Readonly<Record<string, ContentSlot>>;\n}\n\n// ── Implementation ──────────────────────────────────────────\n\nexport function getContentSchema(\n input: GetContentSchemaInput,\n): Result<GetContentSchemaOutput, Error> {\n const { collection } = input;\n\n const manifest = FIXTURE_MANIFESTS[collection];\n if (!manifest) {\n return err(\n new Error(`Collection '${collection}' not found in registry.`),\n );\n }\n\n const contentSlots = manifest.ai?.contentSlots;\n if (!contentSlots || Object.keys(contentSlots).length === 0) {\n return err(\n new Error(\n `Block '${collection}' does not define content slots.`,\n ),\n );\n }\n\n return ok({\n collection,\n slots: contentSlots,\n });\n}\n","import { z } from \"zod\";\nimport { FIXTURE_MANIFESTS } from \"../../cli/fixture-registry.js\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\n\n// ── Input ───────────────────────────────────────────────────\n\nexport interface ValidateContentInput {\n readonly collection: string;\n readonly data: Record<string, unknown>;\n}\n\n// ── Output ──────────────────────────────────────────────────\n\nexport interface ValidateContentOutput {\n readonly valid: boolean;\n readonly errors: ReadonlyArray<string>;\n}\n\n// ── Implementation ──────────────────────────────────────────\n\nexport function validateContent(\n input: ValidateContentInput,\n): Result<ValidateContentOutput, Error> {\n const { collection, data } = input;\n\n // Find the block manifest\n const manifest = FIXTURE_MANIFESTS[collection];\n if (!manifest) {\n return err(\n new Error(\n `Collection '${collection}' not found in registry.`,\n ),\n );\n }\n\n const contentSlots = manifest.ai?.contentSlots;\n if (!contentSlots || Object.keys(contentSlots).length === 0) {\n return err(\n new Error(\n `Block '${collection}' does not define content slots.`,\n ),\n );\n }\n\n // Build a Zod schema from the content slots\n const schemaShape: Record<string, z.ZodTypeAny> = {};\n for (const [slotName, slot] of Object.entries(contentSlots)) {\n schemaShape[slotName] = zodTypeForSlot(slot.type);\n }\n const schema = z.object(schemaShape);\n\n // Validate\n const parseResult = schema.safeParse(data);\n if (parseResult.success) {\n return ok({ valid: true, errors: [] });\n }\n\n const errors = parseResult.error.issues.map(\n (issue) => `${issue.path.join(\".\")}: ${issue.message}`,\n );\n\n return ok({ valid: false, errors });\n}\n\n// ── Helpers ─────────────────────────────────────────────────\n\nfunction zodTypeForSlot(slotType: string): z.ZodTypeAny {\n switch (slotType) {\n case \"string\":\n return z.string();\n case \"number\":\n return z.number();\n case \"boolean\":\n return z.boolean();\n case \"array\":\n return z.array(z.unknown());\n case \"object\":\n return z.record(z.unknown());\n default:\n return z.unknown();\n }\n}\n","import { readFileSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { ok, err, type Result } from \"../../utils/result.js\";\n\n// ── Input ───────────────────────────────────────────────────\n\nexport interface GetProjectStatusInput {\n readonly projectDirectory: string;\n}\n\n// ── Output ──────────────────────────────────────────────────\n\nexport interface ProjectStatusOutput {\n readonly version: string;\n readonly createdAt: string;\n readonly createdWith: string;\n readonly renderMode: string;\n readonly deployTarget: string;\n readonly database: string;\n readonly locales: ReadonlyArray<string>;\n readonly defaultLocale: string;\n readonly palette: unknown;\n readonly themeSwitcher: boolean;\n readonly blocks: ReadonlyArray<{\n readonly name: string;\n readonly version: string;\n readonly variant: string;\n readonly installedAt: string;\n }>;\n}\n\n// ── Implementation ──────────────────────────────────────────\n\nexport function getProjectStatus(\n input: GetProjectStatusInput,\n): Result<ProjectStatusOutput, Error> {\n const manifestPath = join(input.projectDirectory, \"fornix.json\");\n\n if (!existsSync(manifestPath)) {\n return err(\n new Error(\"No fornix.json found. Not a Fornix project directory.\"),\n );\n }\n\n try {\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as Record<string, unknown>;\n\n const blocks = manifest.blocks as Array<{\n name: string;\n version: string;\n variant: string;\n installedAt: string;\n }>;\n\n return ok({\n version: manifest.version as string,\n createdAt: manifest.createdAt as string,\n createdWith: manifest.createdWith as string,\n renderMode: manifest.renderMode as string,\n deployTarget: manifest.deployTarget as string,\n database: (manifest.database as string) ?? \"none\",\n locales: (manifest.locales as string[]) ?? [\"en\"],\n defaultLocale: (manifest.defaultLocale as string) ?? \"en\",\n palette: manifest.palette,\n themeSwitcher: (manifest.themeSwitcher as boolean) ?? false,\n blocks: blocks ?? [],\n });\n } catch {\n return err(new Error(\"Failed to parse fornix.json.\"));\n }\n}\n","import { mkdirSync, writeFileSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport { scaffold, type ScaffoldInput } from \"../../scaffold/pipeline.js\";\nimport type { ResolvedConfig } from \"../../schemas/config.js\";\nimport {\n FIXTURE_MANIFESTS,\n FIXTURE_BLOCK_SOURCES,\n FIXTURE_DEFAULT_CONTENT,\n loadAllPalettes,\n} from \"../../cli/fixture-registry.js\";\nimport { ok, err, isOk, type Result } from \"../../utils/result.js\";\n\n// ── Constants ───────────────────────────────────────────────\n\nconst DEFAULT_COLORS = {\n primary: \"#6366f1\",\n secondary: \"#818cf8\",\n accent: \"#c084fc\",\n background: \"#0f172a\",\n foreground: \"#f8fafc\",\n};\n\n// ── Input ───────────────────────────────────────────────────\n\nexport interface ScaffoldProjectInput {\n readonly description: string;\n readonly projectDirectory: string;\n readonly renderMode?: \"static\" | \"hybrid\" | \"server\";\n readonly deployTarget?: \"cloudflare\" | \"vercel\" | \"netlify\" | \"static\";\n readonly blocks?: ReadonlyArray<string>;\n readonly locales?: ReadonlyArray<string>;\n}\n\n// ── Output ──────────────────────────────────────────────────\n\nexport interface ScaffoldProjectOutput {\n readonly projectDirectory: string;\n readonly filesCreated: number;\n readonly blocks: ReadonlyArray<string>;\n}\n\n// ── Implementation ──────────────────────────────────────────\n\nexport function scaffoldProject(\n input: ScaffoldProjectInput,\n): Result<ScaffoldProjectOutput, Error> {\n const {\n projectDirectory,\n renderMode = \"static\",\n deployTarget = \"cloudflare\",\n blocks = [],\n locales = [\"en\"],\n } = input;\n\n const projectName = basename(projectDirectory);\n const blockSelections = blocks.map((name) => ({ name, variant: \"default\" }));\n const allPalettes = loadAllPalettes();\n\n const config: ResolvedConfig = {\n projectName,\n projectDir: projectDirectory,\n renderMode,\n deployTarget,\n database: \"none\",\n cssEngine: \"tailwind\",\n packageManager: \"pnpm\",\n blocks: blockSelections,\n locales: locales.length > 0 ? [...locales] : [\"en\"],\n defaultLocale: locales[0] ?? \"en\",\n palette: {\n colors: { ...DEFAULT_COLORS },\n },\n themeSwitcher: false,\n createdWith: \"mcp\",\n };\n\n const scaffoldInput: ScaffoldInput = {\n config,\n manifests: FIXTURE_MANIFESTS,\n blockSources: FIXTURE_BLOCK_SOURCES,\n blockDefaultContent: FIXTURE_DEFAULT_CONTENT,\n allPalettes,\n };\n\n const result = scaffold(scaffoldInput);\n if (!isOk(result)) {\n return err(result.error);\n }\n\n // Write files to disk\n const files = result.value.files;\n let filesCreated = 0;\n\n for (const [relativePath, content] of Object.entries(files)) {\n const fullPath = join(projectDirectory, relativePath);\n const parentDirectory = join(fullPath, \"..\");\n mkdirSync(parentDirectory, { recursive: true });\n writeFileSync(fullPath, content, \"utf-8\");\n filesCreated++;\n }\n\n return ok({\n projectDirectory,\n filesCreated,\n blocks: result.value.resolvedBlockNames,\n });\n}\n"],"mappings":"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","names":["defineCommand","basename","mkdirSync","writeFileSync","join","p","pc","manifest","manifest","palette","manifest","join","pc","p","z","IntentSchema","z","p","IntentSchema","IntentSchema","DEFAULT_MODEL","IntentSchema","readFileSync","join","dirname","fileURLToPath","join","readFileSync","IntentSchema","dirname","fileURLToPath","basename","pc","join","mkdirSync","writeFileSync","defineCommand","pc","readFileSync","writeFileSync","existsSync","mkdirSync","join","dirname","defineCommand","join","existsSync","pc","readFileSync","manifest","resolveDependencies","mkdirSync","dirname","writeFileSync","defineCommand","pc","readFileSync","writeFileSync","existsSync","readdirSync","join","dirname","defineCommand","join","existsSync","pc","readFileSync","manifest","dirname","writeFileSync","readdirSync","defineCommand","pc","defineCommand","pc","defineCommand","pc","readFileSync","existsSync","join","manifest","defineCommand","pc","readFileSync","existsSync","join","defineCommand","join","pc","existsSync","manifest","readFileSync","defineCommand","readFileSync","writeFileSync","existsSync","mkdirSync","join","dirname","addBlock","join","existsSync","manifest","readFileSync","resolveDependencies","mkdirSync","dirname","writeFileSync","readFileSync","writeFileSync","existsSync","unlinkSync","readdirSync","rmdirSync","join","dirname","join","existsSync","manifest","readFileSync","findDependents","unlinkSync","dirname","writeFileSync","readdirSync","rmdirSync","manifest","z","manifest","zodTypeForSlot","z","readFileSync","existsSync","join","join","existsSync","readFileSync","manifest","mkdirSync","writeFileSync","join","basename","DEFAULT_COLORS","basename","join","mkdirSync","writeFileSync","manifest","addBlock","defineCommand","defineCommand"]}
|