@genart-dev/cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/render.ts","../src/util/load-sketch.ts","../src/util/apply-overrides.ts","../src/util/parse-wait.ts","../src/capture/browser.ts","../src/commands/info.ts","../src/commands/validate.ts","../src/commands/init.ts","../src/commands/export.ts","../src/commands/batch.ts","../src/util/parse-seeds.ts","../src/util/parse-sweep.ts","../src/util/naming.ts","../src/commands/montage.ts","../src/commands/import.ts","../src/detect/renderer.ts","../src/commands/video.ts","../src/video/interpolate.ts","../src/video/ffmpeg.ts","../src/video/time-inject.ts","../src/commands/agent/index.ts","../src/commands/agent/stdio.ts","../src/commands/agent/http.ts","../src/commands/agent/sidecar.ts","../src/commands/agent/install.ts","../src/commands/agent/clients.ts","../src/commands/agent/doctor.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { renderCommand } from \"./commands/render.js\";\nimport { infoCommand } from \"./commands/info.js\";\nimport { validateCommand } from \"./commands/validate.js\";\nimport { initCommand } from \"./commands/init.js\";\nimport { exportCommand } from \"./commands/export.js\";\nimport { batchCommand } from \"./commands/batch.js\";\nimport { montageCommand } from \"./commands/montage.js\";\nimport { importCommand } from \"./commands/import.js\";\nimport { videoCommand } from \"./commands/video.js\";\nimport { agentCommand } from \"./commands/agent/index.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"genart\")\n .description(\"CLI for genart.dev — render, batch, montage, import, validate, export, and scaffold generative art sketches\")\n .version(\"0.1.0\");\n\nprogram.addCommand(renderCommand);\nprogram.addCommand(infoCommand);\nprogram.addCommand(validateCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(exportCommand);\nprogram.addCommand(batchCommand);\nprogram.addCommand(montageCommand);\nprogram.addCommand(importCommand);\nprogram.addCommand(videoCommand);\nprogram.addCommand(agentCommand);\n\nprogram.parse();\n","import { Command } from \"commander\";\nimport { resolve, basename, extname } from \"node:path\";\nimport { writeFile } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createDefaultRegistry } from \"@genart-dev/core\";\nimport { loadSketch } from \"../util/load-sketch.js\";\nimport { applyOverrides, type SketchOverrides } from \"../util/apply-overrides.js\";\nimport { parseWait } from \"../util/parse-wait.js\";\nimport { captureHtml, closeBrowser } from \"../capture/browser.js\";\n\nexport const renderCommand = new Command(\"render\")\n .description(\"Render a .genart sketch to an image\")\n .argument(\"<file>\", \"Path to .genart file\")\n .option(\"--wait <duration>\", \"How long to let the sketch animate before capture\", \"500ms\")\n .option(\"--seed <n>\", \"Override seed\", Number)\n .option(\"--params <json>\", \"Override parameters (JSON object)\")\n .option(\"--colors <json>\", \"Override color palette (JSON array of hex strings)\")\n .option(\"--width <n>\", \"Override canvas width\", Number)\n .option(\"--height <n>\", \"Override canvas height\", Number)\n .option(\"--preset <name>\", \"Use a canvas preset\")\n .option(\"--format <fmt>\", \"Output format: png, jpeg, webp\", \"png\")\n .option(\"--quality <n>\", \"Lossy compression quality (0-100)\", Number, 80)\n .option(\"--scale <n>\", \"Pixel density multiplier\", Number, 1)\n .option(\"-o, --output <path>\", \"Output file path\")\n .action(async (file: string, opts) => {\n const spinner = ora(\"Loading sketch...\").start();\n\n try {\n const filePath = resolve(file);\n const sketch = await loadSketch(filePath);\n\n // Build overrides\n const overrides: SketchOverrides = {};\n if (opts.seed !== undefined) overrides.seed = opts.seed as number;\n if (opts.width !== undefined) overrides.width = opts.width as number;\n if (opts.height !== undefined) overrides.height = opts.height as number;\n if (opts.preset) overrides.preset = opts.preset as string;\n if (opts.params) {\n overrides.params = JSON.parse(opts.params as string) as Record<string, number>;\n }\n if (opts.colors) {\n overrides.colors = JSON.parse(opts.colors as string) as string[];\n }\n\n const modified = applyOverrides(sketch, overrides);\n\n // Generate HTML\n spinner.text = \"Generating standalone HTML...\";\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(modified.renderer.type);\n const html = adapter.generateStandaloneHTML(modified);\n\n // Capture\n const waitMs = parseWait(opts.wait as string);\n const format = opts.format as \"png\" | \"jpeg\" | \"webp\";\n\n spinner.text = `Rendering (${modified.canvas.width}×${modified.canvas.height}, wait ${waitMs}ms)...`;\n const result = await captureHtml({\n html,\n width: modified.canvas.width,\n height: modified.canvas.height,\n waitMs,\n format,\n quality: opts.quality as number,\n scale: opts.scale as number,\n });\n\n // Write output\n const outputPath = resolve(\n (opts.output as string) ?? `${basename(filePath, extname(filePath))}.${format}`,\n );\n await writeFile(outputPath, result.bytes);\n\n spinner.succeed(\n chalk.green(`Rendered ${modified.canvas.width}×${modified.canvas.height} → ${outputPath}`),\n );\n } catch (err) {\n spinner.fail(chalk.red(`Render failed: ${(err as Error).message}`));\n process.exitCode = 1;\n } finally {\n await closeBrowser();\n }\n });\n","/**\n * Load and parse a .genart file from disk.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { parseGenart, type SketchDefinition } from \"@genart-dev/format\";\n\nexport async function loadSketch(filePath: string): Promise<SketchDefinition> {\n const raw = await readFile(filePath, \"utf-8\");\n const json: unknown = JSON.parse(raw);\n return parseGenart(json);\n}\n","/**\n * Apply CLI overrides (seed, params, colors, width, height, preset) to a sketch definition.\n * Returns a new object — does not mutate the original.\n */\n\nimport {\n resolvePreset,\n type SketchDefinition,\n type SketchState,\n type CanvasSpec,\n} from \"@genart-dev/format\";\n\nexport interface SketchOverrides {\n seed?: number;\n params?: Record<string, number>;\n colors?: string[];\n width?: number;\n height?: number;\n preset?: string;\n}\n\nexport function applyOverrides(\n sketch: SketchDefinition,\n overrides: SketchOverrides,\n): SketchDefinition {\n let canvas: CanvasSpec = { ...sketch.canvas };\n let state: SketchState = { ...sketch.state, params: { ...sketch.state.params } };\n\n // Preset overrides width/height\n if (overrides.preset) {\n const dims = resolvePreset(overrides.preset);\n canvas = { ...canvas, preset: overrides.preset, width: dims.width, height: dims.height };\n }\n\n // Explicit width/height override preset\n if (overrides.width !== undefined) canvas = { ...canvas, width: overrides.width };\n if (overrides.height !== undefined) canvas = { ...canvas, height: overrides.height };\n\n // Seed override\n if (overrides.seed !== undefined) {\n state = { ...state, seed: overrides.seed };\n }\n\n // Params override (merge with existing)\n if (overrides.params) {\n state = { ...state, params: { ...state.params, ...overrides.params } };\n }\n\n // Colors override (replace palette array)\n if (overrides.colors) {\n state = { ...state, colorPalette: overrides.colors };\n }\n\n return { ...sketch, canvas, state };\n}\n","/**\n * Parse a wait/duration string into milliseconds.\n * Accepts: \"500\", \"500ms\", \"2s\", \"1.5s\"\n */\nexport function parseWait(value: string): number {\n const trimmed = value.trim().toLowerCase();\n\n if (trimmed.endsWith(\"ms\")) {\n return Math.max(0, Number(trimmed.slice(0, -2)));\n }\n if (trimmed.endsWith(\"s\")) {\n return Math.max(0, Number(trimmed.slice(0, -1)) * 1000);\n }\n\n // Bare number = ms\n const num = Number(trimmed);\n if (Number.isNaN(num)) {\n throw new Error(`Invalid wait value: \"${value}\". Use \"500ms\" or \"2s\".`);\n }\n return Math.max(0, num);\n}\n","/**\n * Headless capture — renders standalone HTML to an image using puppeteer-core\n * with system Chrome detection. No bundled Chromium download.\n */\n\nimport type { Browser, Page } from \"puppeteer-core\";\nimport puppeteer from \"puppeteer-core\";\nimport { existsSync } from \"node:fs\";\n\n/** Common Chrome/Chromium install paths by platform. */\nconst CHROME_PATHS: Record<string, string[]> = {\n darwin: [\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\",\n \"/Applications/Chromium.app/Contents/MacOS/Chromium\",\n \"/Applications/Brave Browser.app/Contents/MacOS/Brave Browser\",\n \"/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge\",\n ],\n linux: [\n \"/usr/bin/google-chrome\",\n \"/usr/bin/google-chrome-stable\",\n \"/usr/bin/chromium\",\n \"/usr/bin/chromium-browser\",\n \"/snap/bin/chromium\",\n ],\n win32: [\n \"C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n \"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe\",\n ],\n};\n\n/** Detect system Chrome/Chromium install path. */\nexport function findChromePath(): string | undefined {\n // 1. Env var override\n const envPath = process.env[\"GENART_CHROME_PATH\"];\n if (envPath && existsSync(envPath)) return envPath;\n\n // 2. Platform-specific paths\n const paths = CHROME_PATHS[process.platform];\n if (!paths) return undefined;\n\n for (const p of paths) {\n if (existsSync(p)) return p;\n }\n\n return undefined;\n}\n\n/** Shared browser instance (lazy singleton). */\nlet browserInstance: Browser | null = null;\n\n/** Get or launch the shared headless browser. */\nasync function getBrowser(): Promise<Browser> {\n if (browserInstance?.connected) {\n return browserInstance;\n }\n\n const executablePath = findChromePath();\n if (!executablePath) {\n throw new Error(\n \"No Chrome/Chromium found. Install Google Chrome or set GENART_CHROME_PATH.\\n\" +\n \" macOS: brew install --cask google-chrome\\n\" +\n \" Linux: sudo apt install google-chrome-stable\\n\" +\n \" Or: GENART_CHROME_PATH=/path/to/chrome genart render ...\",\n );\n }\n\n browserInstance = await puppeteer.launch({\n headless: true,\n executablePath,\n args: [\n \"--no-sandbox\",\n \"--disable-setuid-sandbox\",\n \"--disable-gpu\",\n \"--disable-dev-shm-usage\",\n ],\n });\n\n return browserInstance;\n}\n\n/** Options for capturing a screenshot of an HTML page. */\nexport interface CaptureOptions {\n html: string;\n width: number;\n height: number;\n /** Time in ms to wait after page load before capture (default: 500). */\n waitMs?: number;\n /** Image format (default: \"png\"). */\n format?: \"png\" | \"jpeg\" | \"webp\";\n /** Lossy compression quality 0-100 (default: 80). */\n quality?: number;\n /** Device pixel ratio (default: 1). */\n scale?: number;\n}\n\n/** Result of a headless capture. */\nexport interface CaptureResult {\n bytes: Uint8Array;\n mimeType: string;\n width: number;\n height: number;\n}\n\n/**\n * Render an HTML string to an image using headless Chrome.\n */\nexport async function captureHtml(options: CaptureOptions): Promise<CaptureResult> {\n const {\n html,\n width,\n height,\n waitMs = 500,\n format = \"png\",\n quality = 80,\n scale = 1,\n } = options;\n\n const browser = await getBrowser();\n const page: Page = await browser.newPage();\n\n try {\n await page.setViewport({ width, height, deviceScaleFactor: scale });\n await page.setContent(html, { waitUntil: \"domcontentloaded\", timeout: 30_000 });\n\n // Wait for the sketch to render\n if (waitMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n\n const screenshotType = format === \"webp\" ? \"webp\" : format;\n const buffer = await page.screenshot({\n type: screenshotType,\n clip: { x: 0, y: 0, width, height },\n ...(screenshotType !== \"png\" ? { quality } : {}),\n });\n\n const bytes = new Uint8Array(buffer);\n const mimeType = `image/${format}`;\n\n return { bytes, mimeType, width, height };\n } finally {\n await page.close();\n }\n}\n\n/**\n * Create and return a new page with the given viewport.\n * The caller manages the page lifecycle (must close it when done).\n * Used by the video command for direct page access (time injection).\n */\nexport async function getPage(\n width: number,\n height: number,\n scale = 1,\n): Promise<Page> {\n const browser = await getBrowser();\n const page = await browser.newPage();\n await page.setViewport({ width, height, deviceScaleFactor: scale });\n return page;\n}\n\n/** Close the shared browser instance. */\nexport async function closeBrowser(): Promise<void> {\n if (browserInstance) {\n await browserInstance.close();\n browserInstance = null;\n }\n}\n","import { Command } from \"commander\";\nimport { resolve } from \"node:path\";\nimport chalk from \"chalk\";\nimport { loadSketch } from \"../util/load-sketch.js\";\nimport type { SketchDefinition } from \"@genart-dev/format\";\n\nfunction formatDate(iso: string): string {\n return iso.slice(0, 10);\n}\n\nfunction formatHumanReadable(filePath: string, sketch: SketchDefinition): string {\n const lines: string[] = [];\n lines.push(chalk.bold(filePath));\n\n const pad = (label: string) => ` ${chalk.dim(label.padEnd(14))}`;\n\n lines.push(`${pad(\"Title:\")}${sketch.title}`);\n if (sketch.subtitle) lines.push(`${pad(\"Subtitle:\")}${sketch.subtitle}`);\n lines.push(`${pad(\"Renderer:\")}${sketch.renderer.type}${sketch.renderer.version ? ` ${sketch.renderer.version}` : \"\"}`);\n lines.push(`${pad(\"Canvas:\")}${sketch.canvas.width}×${sketch.canvas.height}${sketch.canvas.preset ? ` (${sketch.canvas.preset})` : \"\"}`);\n lines.push(`${pad(\"Seed:\")}${sketch.state.seed}`);\n\n if (sketch.parameters.length > 0) {\n const paramStr = sketch.parameters\n .map((p) => {\n const val = sketch.state.params[p.key];\n return `${p.key} (${val ?? p.default})`;\n })\n .join(\", \");\n lines.push(`${pad(\"Parameters:\")}${paramStr}`);\n }\n\n if (sketch.colors.length > 0) {\n const palette = sketch.state.colorPalette;\n const colorStr = Array.isArray(palette) && palette.length > 0\n ? palette.join(\", \")\n : sketch.colors.map((c) => c.default).join(\", \");\n lines.push(`${pad(\"Colors:\")}${colorStr}`);\n }\n\n if (sketch.skills && sketch.skills.length > 0) {\n lines.push(`${pad(\"Skills:\")}${sketch.skills.join(\", \")}`);\n }\n\n lines.push(`${pad(\"Created:\")}${formatDate(sketch.created)}`);\n lines.push(`${pad(\"Modified:\")}${formatDate(sketch.modified)}`);\n\n if (sketch.agent) lines.push(`${pad(\"Agent:\")}${sketch.agent}`);\n\n return lines.join(\"\\n\");\n}\n\nfunction formatTable(entries: Array<{ path: string; sketch: SketchDefinition }>): string {\n const header = [\"File\", \"Title\", \"Renderer\", \"Canvas\", \"Seed\", \"Params\", \"Colors\"].join(\"\\t\");\n const rows = entries.map(({ path: p, sketch }) => {\n return [\n p,\n sketch.title,\n sketch.renderer.type,\n `${sketch.canvas.width}×${sketch.canvas.height}`,\n String(sketch.state.seed),\n String(sketch.parameters.length),\n String(sketch.colors.length),\n ].join(\"\\t\");\n });\n return [header, ...rows].join(\"\\n\");\n}\n\nexport const infoCommand = new Command(\"info\")\n .description(\"Inspect .genart sketch metadata\")\n .argument(\"<files...>\", \"Path(s) to .genart file(s)\")\n .option(\"--json\", \"Machine-readable JSON output\")\n .option(\"--table\", \"Tabular output for multiple files\")\n .action(async (files: string[], opts) => {\n try {\n const entries: Array<{ path: string; sketch: SketchDefinition }> = [];\n\n for (const file of files) {\n const filePath = resolve(file);\n const sketch = await loadSketch(filePath);\n entries.push({ path: filePath, sketch });\n }\n\n if (opts.json) {\n const data = entries.length === 1\n ? entries[0]!.sketch\n : entries.map((e) => ({ file: e.path, ...e.sketch }));\n console.log(JSON.stringify(data, null, 2));\n } else if (opts.table) {\n console.log(formatTable(entries));\n } else {\n for (const entry of entries) {\n console.log(formatHumanReadable(entry.path, entry.sketch));\n if (entries.length > 1) console.log();\n }\n }\n } catch (err) {\n console.error(chalk.red(`Error: ${(err as Error).message}`));\n process.exitCode = 1;\n }\n });\n","import { Command } from \"commander\";\nimport { resolve } from \"node:path\";\nimport { stat, readdir } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport { createDefaultRegistry } from \"@genart-dev/core\";\nimport { loadSketch } from \"../util/load-sketch.js\";\n\nasync function resolveFiles(inputs: string[]): Promise<string[]> {\n const files: string[] = [];\n\n for (const input of inputs) {\n const p = resolve(input);\n const info = await stat(p);\n if (info.isDirectory()) {\n const entries = await readdir(p);\n for (const entry of entries) {\n if (entry.endsWith(\".genart\")) {\n files.push(resolve(p, entry));\n }\n }\n } else {\n files.push(p);\n }\n }\n\n return files;\n}\n\nexport const validateCommand = new Command(\"validate\")\n .description(\"Validate .genart files\")\n .argument(\"<paths...>\", \"Path(s) to .genart file(s) or directories\")\n .option(\"--strict\", \"Also run adapter.validate() on algorithm source\")\n .action(async (paths: string[], opts) => {\n let hasErrors = false;\n\n try {\n const files = await resolveFiles(paths);\n\n if (files.length === 0) {\n console.error(chalk.yellow(\"No .genart files found.\"));\n process.exitCode = 1;\n return;\n }\n\n const registry = opts.strict ? createDefaultRegistry() : null;\n\n for (const filePath of files) {\n try {\n const sketch = await loadSketch(filePath);\n\n if (opts.strict && registry) {\n const adapter = registry.resolve(sketch.renderer.type);\n const result = adapter.validate(sketch.algorithm);\n if (!result.valid) {\n console.error(chalk.red(`✗ ${filePath}`));\n for (const err of result.errors) {\n console.error(chalk.red(` ${err}`));\n }\n hasErrors = true;\n continue;\n }\n }\n\n console.log(chalk.green(`✓ ${filePath}`));\n } catch (err) {\n console.error(chalk.red(`✗ ${filePath}`));\n console.error(chalk.red(` ${(err as Error).message}`));\n hasErrors = true;\n }\n }\n } catch (err) {\n console.error(chalk.red(`Error: ${(err as Error).message}`));\n hasErrors = true;\n }\n\n if (hasErrors) {\n process.exitCode = 1;\n }\n });\n","import { Command } from \"commander\";\nimport { resolve } from \"node:path\";\nimport { writeFile } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createDefaultRegistry } from \"@genart-dev/core\";\nimport {\n serializeGenart,\n CANVAS_PRESETS,\n resolvePreset,\n type RendererType,\n type SketchDefinition,\n} from \"@genart-dev/format\";\n\nconst RENDERER_TYPES: RendererType[] = [\"p5\", \"canvas2d\", \"three\", \"glsl\", \"svg\"];\n\nfunction slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport const initCommand = new Command(\"init\")\n .description(\"Scaffold a new .genart sketch file\")\n .argument(\"[name]\", \"Sketch name / title\")\n .option(\"--renderer <type>\", `Renderer type: ${RENDERER_TYPES.join(\", \")}`)\n .option(\"--preset <name>\", \"Canvas preset\", \"square-600\")\n .option(\"--title <string>\", \"Sketch title\")\n .action(async (name: string | undefined, opts) => {\n const spinner = ora(\"\").start();\n spinner.stop();\n\n try {\n let rendererType: RendererType;\n let preset: string;\n let title: string;\n\n // Determine renderer\n if (opts.renderer) {\n rendererType = opts.renderer as RendererType;\n if (!RENDERER_TYPES.includes(rendererType)) {\n throw new Error(\n `Invalid renderer \"${rendererType}\". Choose from: ${RENDERER_TYPES.join(\", \")}`,\n );\n }\n } else {\n // Interactive prompt\n const { default: inquirer } = await import(\"inquirer\");\n const answers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"renderer\",\n message: \"Renderer type:\",\n choices: RENDERER_TYPES.map((t) => ({ name: t, value: t })),\n },\n ]);\n rendererType = answers.renderer as RendererType;\n }\n\n // Determine title\n if (opts.title) {\n title = opts.title as string;\n } else if (name) {\n title = name;\n } else {\n const { default: inquirer } = await import(\"inquirer\");\n const answers = await inquirer.prompt([\n {\n type: \"input\",\n name: \"title\",\n message: \"Sketch title:\",\n default: \"Untitled Sketch\",\n },\n ]);\n title = answers.title as string;\n }\n\n // Determine preset\n if (opts.preset) {\n preset = opts.preset as string;\n } else {\n const { default: inquirer } = await import(\"inquirer\");\n const choices = CANVAS_PRESETS.map((p) => ({\n name: `${p.id} (${p.width}×${p.height})`,\n value: p.id,\n }));\n const answers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"preset\",\n message: \"Canvas preset:\",\n choices,\n default: \"square-600\",\n },\n ]);\n preset = answers.preset as string;\n }\n\n const dims = resolvePreset(preset);\n\n // Get algorithm template from adapter\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(rendererType);\n const algorithm = adapter.getAlgorithmTemplate();\n\n const id = slugify(title);\n const now = new Date().toISOString();\n\n const sketch: SketchDefinition = {\n genart: \"1.0\",\n id,\n title,\n created: now,\n modified: now,\n renderer: { type: rendererType },\n canvas: { preset, width: dims.width, height: dims.height },\n parameters: [],\n colors: [],\n state: {\n seed: Math.floor(Math.random() * 10000),\n params: {},\n colorPalette: [],\n },\n algorithm,\n };\n\n const outputPath = resolve(`${id}.genart`);\n const json = serializeGenart(sketch);\n await writeFile(outputPath, json, \"utf-8\");\n\n console.log(chalk.green(`✓ Created ${outputPath}`));\n console.log(chalk.dim(` Renderer: ${rendererType}`));\n console.log(chalk.dim(` Canvas: ${dims.width}×${dims.height} (${preset})`));\n } catch (err) {\n console.error(chalk.red(`Error: ${(err as Error).message}`));\n process.exitCode = 1;\n }\n });\n","import { Command } from \"commander\";\nimport { resolve, basename, extname } from \"node:path\";\nimport { writeFile } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createDefaultRegistry } from \"@genart-dev/core\";\nimport { loadSketch } from \"../util/load-sketch.js\";\nimport { applyOverrides, type SketchOverrides } from \"../util/apply-overrides.js\";\nimport { parseWait } from \"../util/parse-wait.js\";\nimport { captureHtml, closeBrowser } from \"../capture/browser.js\";\n\nexport const exportCommand = new Command(\"export\")\n .description(\"Export sketch as HTML, image, or algorithm source\")\n .argument(\"<file>\", \"Path to .genart file\")\n .option(\"--format <fmt>\", \"Export format: html, png, jpeg, webp, algorithm\", \"html\")\n .option(\"--wait <duration>\", \"Render wait time (for image formats)\", \"500ms\")\n .option(\"--seed <n>\", \"Override seed\", Number)\n .option(\"--params <json>\", \"Override parameters (JSON object)\")\n .option(\"--colors <json>\", \"Override color palette (JSON array)\")\n .option(\"--width <n>\", \"Override canvas width\", Number)\n .option(\"--height <n>\", \"Override canvas height\", Number)\n .option(\"--preset <name>\", \"Use a canvas preset\")\n .option(\"--quality <n>\", \"Lossy compression quality (0-100)\", Number, 80)\n .option(\"--scale <n>\", \"Pixel density multiplier\", Number, 1)\n .option(\"-o, --output <path>\", \"Output file path\")\n .action(async (file: string, opts) => {\n const spinner = ora(\"Loading sketch...\").start();\n\n try {\n const filePath = resolve(file);\n const sketch = await loadSketch(filePath);\n\n // Build overrides\n const overrides: SketchOverrides = {};\n if (opts.seed !== undefined) overrides.seed = opts.seed as number;\n if (opts.width !== undefined) overrides.width = opts.width as number;\n if (opts.height !== undefined) overrides.height = opts.height as number;\n if (opts.preset) overrides.preset = opts.preset as string;\n if (opts.params) {\n overrides.params = JSON.parse(opts.params as string) as Record<string, number>;\n }\n if (opts.colors) {\n overrides.colors = JSON.parse(opts.colors as string) as string[];\n }\n\n const modified = applyOverrides(sketch, overrides);\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(modified.renderer.type);\n\n const format = opts.format as string;\n const baseName = basename(filePath, extname(filePath));\n\n let outputPath: string;\n let content: string | Uint8Array;\n\n if (format === \"html\") {\n spinner.text = \"Generating standalone HTML...\";\n content = adapter.generateStandaloneHTML(modified);\n outputPath = resolve((opts.output as string) ?? `${baseName}.html`);\n } else if (format === \"algorithm\") {\n spinner.text = \"Extracting algorithm...\";\n content = modified.algorithm;\n const ext = modified.renderer.type === \"glsl\" ? \"glsl\" : \"js\";\n outputPath = resolve((opts.output as string) ?? `${baseName}.${ext}`);\n } else if (format === \"png\" || format === \"jpeg\" || format === \"webp\") {\n spinner.text = `Rendering ${format}...`;\n const html = adapter.generateStandaloneHTML(modified);\n const waitMs = parseWait(opts.wait as string);\n\n const result = await captureHtml({\n html,\n width: modified.canvas.width,\n height: modified.canvas.height,\n waitMs,\n format,\n quality: opts.quality as number,\n scale: opts.scale as number,\n });\n\n content = result.bytes;\n outputPath = resolve((opts.output as string) ?? `${baseName}.${format}`);\n } else {\n throw new Error(`Unsupported export format: \"${format}\". Use: html, png, jpeg, webp, algorithm`);\n }\n\n await writeFile(outputPath, content, typeof content === \"string\" ? \"utf-8\" : undefined);\n spinner.succeed(chalk.green(`Exported → ${outputPath}`));\n } catch (err) {\n spinner.fail(chalk.red(`Export failed: ${(err as Error).message}`));\n process.exitCode = 1;\n } finally {\n await closeBrowser();\n }\n });\n","import { Command } from \"commander\";\nimport { resolve, basename, extname } from \"node:path\";\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createDefaultRegistry } from \"@genart-dev/core\";\nimport { loadSketch } from \"../util/load-sketch.js\";\nimport { applyOverrides, type SketchOverrides } from \"../util/apply-overrides.js\";\nimport { parseWait } from \"../util/parse-wait.js\";\nimport { parseSeeds } from \"../util/parse-seeds.js\";\nimport { parseSweep, cartesianProduct, type SweepSpec } from \"../util/parse-sweep.js\";\nimport { formatOutputName } from \"../util/naming.js\";\nimport { captureHtml, closeBrowser } from \"../capture/browser.js\";\n\ninterface ManifestEntry {\n file: string;\n seed: number;\n params: Record<string, number>;\n path: string;\n width: number;\n height: number;\n format: string;\n}\n\n/**\n * Collect repeatable --sweep flags into an array.\n * Commander calls this for each --sweep value.\n */\nfunction collectSweeps(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n\nexport const batchCommand = new Command(\"batch\")\n .description(\"Generate many renders from one sketch — seed ranges, parameter sweeps\")\n .argument(\"<files...>\", \"Path(s) to .genart file(s)\")\n .option(\"--seeds <range>\", \"Seed range or list (e.g. 1-100, 1,5,42)\")\n .option(\"--sweep <spec>\", \"Parameter sweep (repeatable, e.g. amplitude=0:1:0.1)\", collectSweeps, [])\n .option(\"--random <n>\", \"Generate N random seed + param combinations\", Number)\n .option(\"--matrix\", \"Cartesian product of seeds × sweeps\")\n .option(\"--concurrency <n>\", \"Parallel captures\", Number, 4)\n .option(\"--naming <pattern>\", \"Output naming pattern: {id}, {seed}, {index}, {params}\", \"{id}-{seed}\")\n .option(\"--manifest\", \"Write manifest.json with per-render metadata\")\n .option(\"--wait <duration>\", \"Render wait time\", \"500ms\")\n .option(\"--width <n>\", \"Override canvas width\", Number)\n .option(\"--height <n>\", \"Override canvas height\", Number)\n .option(\"--preset <name>\", \"Use a canvas preset\")\n .option(\"--format <fmt>\", \"Output format: png, jpeg, webp\", \"png\")\n .option(\"--quality <n>\", \"Lossy compression quality (0-100)\", Number, 80)\n .option(\"--scale <n>\", \"Pixel density multiplier\", Number, 1)\n .option(\"--colors <json>\", \"Override color palette (JSON array)\")\n .option(\"-o, --output-dir <dir>\", \"Output directory\", \".\")\n .action(async (files: string[], opts) => {\n const spinner = ora(\"Preparing batch...\").start();\n\n try {\n const outputDir = resolve(opts.outputDir as string);\n await mkdir(outputDir, { recursive: true });\n\n const waitMs = parseWait(opts.wait as string);\n const format = opts.format as \"png\" | \"jpeg\" | \"webp\";\n const concurrency = opts.concurrency as number;\n const namingPattern = opts.naming as string;\n const registry = createDefaultRegistry();\n\n const manifest: ManifestEntry[] = [];\n let totalRendered = 0;\n\n for (const file of files) {\n const filePath = resolve(file);\n const sketch = await loadSketch(filePath);\n const sketchId = sketch.id ?? basename(filePath, extname(filePath));\n\n // Build base overrides (non-seed, non-param)\n const baseOverrides: SketchOverrides = {};\n if (opts.width !== undefined) baseOverrides.width = opts.width as number;\n if (opts.height !== undefined) baseOverrides.height = opts.height as number;\n if (opts.preset) baseOverrides.preset = opts.preset as string;\n if (opts.colors) {\n baseOverrides.colors = JSON.parse(opts.colors as string) as string[];\n }\n\n // Generate job list: array of { seed, params }\n const jobs = generateJobs(opts, sketch.state.seed);\n\n spinner.text = `Batch: ${jobs.length} render${jobs.length === 1 ? \"\" : \"s\"} for ${basename(filePath)}`;\n\n // Process in concurrency-limited batches\n for (let i = 0; i < jobs.length; i += concurrency) {\n const chunk = jobs.slice(i, i + concurrency);\n\n const promises = chunk.map(async (job, chunkIdx) => {\n const idx = i + chunkIdx;\n const overrides: SketchOverrides = {\n ...baseOverrides,\n seed: job.seed,\n ...(Object.keys(job.params).length > 0 ? { params: job.params } : {}),\n };\n\n const modified = applyOverrides(sketch, overrides);\n const adapter = registry.resolve(modified.renderer.type);\n const html = adapter.generateStandaloneHTML(modified);\n\n const result = await captureHtml({\n html,\n width: modified.canvas.width,\n height: modified.canvas.height,\n waitMs,\n format,\n quality: opts.quality as number,\n scale: opts.scale as number,\n });\n\n const fileName = formatOutputName(namingPattern, {\n id: sketchId,\n seed: job.seed,\n index: idx,\n params: job.params,\n format,\n });\n const outputPath = resolve(outputDir, fileName);\n await writeFile(outputPath, result.bytes);\n\n manifest.push({\n file: basename(filePath),\n seed: job.seed,\n params: job.params,\n path: outputPath,\n width: modified.canvas.width,\n height: modified.canvas.height,\n format,\n });\n\n return outputPath;\n });\n\n await Promise.all(promises);\n totalRendered += chunk.length;\n spinner.text = `Batch: ${totalRendered}/${jobs.length} rendered`;\n }\n }\n\n // Write manifest if requested\n if (opts.manifest) {\n const manifestPath = resolve(outputDir, \"manifest.json\");\n await writeFile(manifestPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n // Also write to stdout for piping\n console.log(JSON.stringify(manifest));\n }\n\n spinner.succeed(\n chalk.green(`Batch complete: ${totalRendered} render${totalRendered === 1 ? \"\" : \"s\"}`),\n );\n } catch (err) {\n spinner.fail(chalk.red(`Batch failed: ${(err as Error).message}`));\n process.exitCode = 1;\n } finally {\n await closeBrowser();\n }\n });\n\nfunction generateJobs(\n opts: Record<string, unknown>,\n defaultSeed: number,\n): Array<{ seed: number; params: Record<string, number> }> {\n const seeds = opts.seeds\n ? parseSeeds(opts.seeds as string)\n : [defaultSeed];\n\n const sweeps: SweepSpec[] = (opts.sweep as string[]).map(parseSweep);\n\n // Random mode: generate N random combinations\n if (opts.random) {\n const n = opts.random as number;\n const jobs: Array<{ seed: number; params: Record<string, number> }> = [];\n\n for (let i = 0; i < n; i++) {\n const seed = Math.floor(Math.random() * 100_000);\n const params: Record<string, number> = {};\n for (const sweep of sweeps) {\n params[sweep.key] = sweep.min + Math.random() * (sweep.max - sweep.min);\n // Round to step precision\n params[sweep.key] = Math.round(params[sweep.key]! / sweep.step) * sweep.step;\n params[sweep.key] = Math.round(params[sweep.key]! * 1e10) / 1e10;\n }\n jobs.push({ seed, params });\n }\n\n return jobs;\n }\n\n // Matrix mode: cartesian product of seeds × sweeps\n if (opts.matrix || sweeps.length > 0) {\n return cartesianProduct(seeds, sweeps);\n }\n\n // Default: just seeds\n return seeds.map((seed) => ({ seed, params: {} }));\n}\n","/**\n * Parse seed range/list strings into arrays of seed numbers.\n * Accepts: \"1-100\", \"1,5,42,99\", \"1-5,10,20-25\"\n */\nexport function parseSeeds(value: string): number[] {\n const seeds: number[] = [];\n\n for (const part of value.split(\",\")) {\n const trimmed = part.trim();\n if (trimmed.includes(\"-\")) {\n const [startStr, endStr] = trimmed.split(\"-\");\n const start = Number(startStr);\n const end = Number(endStr);\n if (Number.isNaN(start) || Number.isNaN(end) || start > end) {\n throw new Error(`Invalid seed range: \"${trimmed}\". Use \"1-100\".`);\n }\n for (let i = start; i <= end; i++) {\n seeds.push(i);\n }\n } else {\n const n = Number(trimmed);\n if (Number.isNaN(n) || !Number.isInteger(n)) {\n throw new Error(`Invalid seed value: \"${trimmed}\". Must be an integer.`);\n }\n seeds.push(n);\n }\n }\n\n if (seeds.length === 0) {\n throw new Error(`No seeds parsed from: \"${value}\"`);\n }\n\n return seeds;\n}\n","/**\n * Parse a parameter sweep string into structured sweep data.\n * Accepts: \"amplitude=0:1:0.1\" → { key: \"amplitude\", min: 0, max: 1, step: 0.1, values: [0, 0.1, 0.2, ...] }\n */\nexport interface SweepSpec {\n key: string;\n min: number;\n max: number;\n step: number;\n values: number[];\n}\n\nexport function parseSweep(value: string): SweepSpec {\n const match = value.match(/^([^=]+)=([^:]+):([^:]+):(.+)$/);\n if (!match) {\n throw new Error(\n `Invalid sweep format: \"${value}\". Use \"param=min:max:step\" (e.g. \"amplitude=0:1:0.1\").`,\n );\n }\n\n const [, key, minStr, maxStr, stepStr] = match;\n const min = Number(minStr);\n const max = Number(maxStr);\n const step = Number(stepStr);\n\n if (Number.isNaN(min) || Number.isNaN(max) || Number.isNaN(step)) {\n throw new Error(`Invalid numeric values in sweep: \"${value}\".`);\n }\n if (step <= 0) {\n throw new Error(`Sweep step must be positive: \"${value}\".`);\n }\n if (min > max) {\n throw new Error(`Sweep min must be ≤ max: \"${value}\".`);\n }\n\n const values: number[] = [];\n // Use epsilon-based comparison to handle floating point\n for (let v = min; v <= max + step * 0.001; v += step) {\n values.push(Math.round(v * 1e10) / 1e10);\n }\n // Ensure we don't exceed max\n if (values.length > 0 && values[values.length - 1]! > max) {\n values.pop();\n }\n\n return { key: key!, min, max, step, values };\n}\n\n/**\n * Generate the cartesian product of seed list × sweep value lists.\n * Returns array of { seed, params } combos.\n */\nexport function cartesianProduct(\n seeds: number[],\n sweeps: SweepSpec[],\n): Array<{ seed: number; params: Record<string, number> }> {\n if (sweeps.length === 0) {\n return seeds.map((seed) => ({ seed, params: {} }));\n }\n\n // Build all param combinations from sweeps\n const paramCombos = sweepProduct(sweeps);\n\n const results: Array<{ seed: number; params: Record<string, number> }> = [];\n for (const seed of seeds) {\n for (const params of paramCombos) {\n results.push({ seed, params });\n }\n }\n\n return results;\n}\n\nfunction sweepProduct(sweeps: SweepSpec[]): Array<Record<string, number>> {\n if (sweeps.length === 0) return [{}];\n\n const [first, ...rest] = sweeps;\n const restCombos = sweepProduct(rest);\n const results: Array<Record<string, number>> = [];\n\n for (const value of first!.values) {\n for (const combo of restCombos) {\n results.push({ [first!.key]: value, ...combo });\n }\n }\n\n return results;\n}\n","/**\n * Generate output filenames from a naming pattern.\n * Supported tokens: {id}, {seed}, {index}, {params}\n */\n\nexport interface NamingContext {\n id: string;\n seed: number;\n index: number;\n params: Record<string, number>;\n format: string;\n}\n\nexport function formatOutputName(pattern: string, ctx: NamingContext): string {\n let result = pattern;\n\n result = result.replace(/\\{id\\}/g, ctx.id);\n result = result.replace(/\\{seed\\}/g, String(ctx.seed));\n result = result.replace(/\\{index\\}/g, String(ctx.index).padStart(4, \"0\"));\n\n if (result.includes(\"{params}\")) {\n const paramStr = Object.entries(ctx.params)\n .map(([k, v]) => `${k}=${v}`)\n .join(\"_\");\n result = result.replace(/\\{params\\}/g, paramStr || \"default\");\n }\n\n return `${result}.${ctx.format}`;\n}\n","import { Command } from \"commander\";\nimport { resolve, basename } from \"node:path\";\nimport { readFile, readdir, writeFile, stat } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\n\ninterface MontageEntry {\n path: string;\n seed?: number;\n params?: Record<string, number>;\n index: number;\n}\n\nexport const montageCommand = new Command(\"montage\")\n .description(\"Compose a grid of images into a single montage\")\n .argument(\"<source>\", \"Directory of images, or - for manifest JSON on stdin\")\n .option(\"--columns <n>\", \"Grid columns\", Number)\n .option(\"--rows <n>\", \"Grid rows\", Number)\n .option(\"--tile-size <WxH>\", \"Force tile dimensions (e.g. 200x200)\")\n .option(\"--gap <px>\", \"Gap between tiles\", Number, 2)\n .option(\"--padding <px>\", \"Outer padding\", Number, 0)\n .option(\"--background <hex>\", \"Background color\", \"#0A0A0A\")\n .option(\"--label <mode>\", \"Label tiles: seed, params, filename, index, none\", \"none\")\n .option(\"--label-color <hex>\", \"Label text color\", \"#999999\")\n .option(\"--label-font-size <px>\", \"Label font size\", Number, 11)\n .option(\"--sort <key>\", \"Sort: seed, name, param:<key>\")\n .option(\"-o, --output <path>\", \"Output file\", \"montage.png\")\n .action(async (source: string, opts) => {\n const spinner = ora(\"Preparing montage...\").start();\n\n try {\n // Try to load sharp\n let sharp: typeof import(\"sharp\");\n try {\n sharp = (await import(\"sharp\")).default;\n } catch {\n throw new Error(\n `sharp is required for montage composition but is not installed.\\n` +\n ` Install it: npm install sharp\\n` +\n ` Or: pnpm add sharp`,\n );\n }\n\n // Gather image entries\n let entries: MontageEntry[];\n\n if (source === \"-\") {\n // Read manifest JSON from stdin\n const input = await readStdin();\n const manifest = JSON.parse(input) as Array<{\n path: string;\n seed?: number;\n params?: Record<string, number>;\n }>;\n entries = manifest.map((m, i) => ({\n path: m.path,\n seed: m.seed,\n params: m.params,\n index: i,\n }));\n } else {\n // Read images from directory\n const dir = resolve(source);\n const dirStat = await stat(dir);\n\n if (!dirStat.isDirectory()) {\n throw new Error(`Not a directory: ${dir}`);\n }\n\n const files = await readdir(dir);\n const imageFiles = files\n .filter((f) => /\\.(png|jpe?g|webp)$/i.test(f))\n .sort();\n\n entries = imageFiles.map((f, i) => ({\n path: resolve(dir, f),\n index: i,\n }));\n }\n\n if (entries.length === 0) {\n throw new Error(\"No images found for montage.\");\n }\n\n // Sort if requested\n sortEntries(entries, opts.sort as string | undefined);\n\n // Load images\n spinner.text = `Loading ${entries.length} image${entries.length === 1 ? \"\" : \"s\"}...`;\n\n const images = await Promise.all(\n entries.map(async (entry) => {\n const buffer = await readFile(entry.path);\n const metadata = await sharp(buffer).metadata();\n return {\n entry,\n buffer,\n width: metadata.width!,\n height: metadata.height!,\n };\n }),\n );\n\n // Determine tile dimensions\n let tileWidth: number;\n let tileHeight: number;\n\n if (opts.tileSize) {\n const [w, h] = (opts.tileSize as string).split(\"x\").map(Number);\n tileWidth = w!;\n tileHeight = h!;\n } else {\n // Use first image dimensions\n tileWidth = images[0]!.width;\n tileHeight = images[0]!.height;\n }\n\n // Determine grid dimensions\n const count = images.length;\n let columns: number;\n let rows: number;\n\n if (opts.columns) {\n columns = opts.columns as number;\n rows = Math.ceil(count / columns);\n } else if (opts.rows) {\n rows = opts.rows as number;\n columns = Math.ceil(count / rows);\n } else {\n columns = Math.ceil(Math.sqrt(count));\n rows = Math.ceil(count / columns);\n }\n\n const gap = opts.gap as number;\n const padding = opts.padding as number;\n const background = opts.background as string;\n\n const totalWidth = padding * 2 + columns * tileWidth + (columns - 1) * gap;\n const totalHeight = padding * 2 + rows * tileHeight + (rows - 1) * gap;\n\n spinner.text = `Composing ${columns}×${rows} grid (${totalWidth}×${totalHeight})...`;\n\n // Build composite\n const composites: Array<{\n input: Buffer;\n left: number;\n top: number;\n }> = [];\n\n for (let i = 0; i < images.length; i++) {\n const col = i % columns;\n const row = Math.floor(i / columns);\n const left = padding + col * (tileWidth + gap);\n const top = padding + row * (tileHeight + gap);\n\n // Resize if needed\n let tileBuffer: Buffer;\n if (images[i]!.width !== tileWidth || images[i]!.height !== tileHeight) {\n tileBuffer = await sharp(images[i]!.buffer)\n .resize(tileWidth, tileHeight, { fit: \"cover\" })\n .toBuffer();\n } else {\n tileBuffer = Buffer.from(images[i]!.buffer);\n }\n\n composites.push({ input: tileBuffer, left, top });\n }\n\n // Create montage canvas and composite tiles\n const montageBuffer = await sharp({\n create: {\n width: totalWidth,\n height: totalHeight,\n channels: 4,\n background: hexToRgba(background),\n },\n })\n .composite(composites)\n .png()\n .toBuffer();\n\n const outputPath = resolve(opts.output as string);\n await writeFile(outputPath, montageBuffer);\n\n spinner.succeed(\n chalk.green(\n `Montage: ${count} tile${count === 1 ? \"\" : \"s\"} → ${columns}×${rows} grid (${totalWidth}×${totalHeight}) → ${outputPath}`,\n ),\n );\n } catch (err) {\n spinner.fail(chalk.red(`Montage failed: ${(err as Error).message}`));\n process.exitCode = 1;\n }\n });\n\nfunction readStdin(): Promise<string> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n process.stdin.setEncoding(\"utf-8\");\n process.stdin.on(\"data\", (chunk) => (data += chunk));\n process.stdin.on(\"end\", () => resolve(data));\n process.stdin.on(\"error\", reject);\n });\n}\n\nfunction sortEntries(entries: MontageEntry[], sortKey: string | undefined): void {\n if (!sortKey) return;\n\n if (sortKey === \"seed\") {\n entries.sort((a, b) => (a.seed ?? 0) - (b.seed ?? 0));\n } else if (sortKey === \"name\") {\n entries.sort((a, b) => basename(a.path).localeCompare(basename(b.path)));\n } else if (sortKey.startsWith(\"param:\")) {\n const paramKey = sortKey.slice(6);\n entries.sort((a, b) => {\n const va = a.params?.[paramKey] ?? 0;\n const vb = b.params?.[paramKey] ?? 0;\n return va - vb;\n });\n }\n}\n\nfunction hexToRgba(hex: string): { r: number; g: number; b: number; alpha: number } {\n const h = hex.replace(\"#\", \"\");\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n alpha: 1,\n };\n}\n","import { Command } from \"commander\";\nimport { resolve, basename, extname } from \"node:path\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createDefaultRegistry } from \"@genart-dev/core\";\nimport {\n serializeGenart,\n resolvePreset,\n CANVAS_PRESETS,\n type RendererType,\n type SketchDefinition,\n type ParamDef,\n type ColorDef,\n} from \"@genart-dev/format\";\nimport {\n detectRenderer,\n detectParams,\n detectColorCount,\n detectCanvasSize,\n} from \"../detect/renderer.js\";\n\nconst RENDERER_TYPES: RendererType[] = [\"p5\", \"canvas2d\", \"three\", \"glsl\", \"svg\"];\n\nfunction slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nexport const importCommand = new Command(\"import\")\n .description(\"Convert a source file (.js, .glsl) into a .genart sketch\")\n .argument(\"<files...>\", \"Source file(s) to import\")\n .option(\"--renderer <type>\", \"Force renderer type (skip auto-detection)\")\n .option(\"--preset <name>\", \"Canvas preset\", \"square-600\")\n .option(\"--title <string>\", \"Sketch title (skip prompt)\")\n .option(\"--seed <n>\", \"Initial seed\", Number)\n .option(\"-y, --non-interactive\", \"Accept all defaults, skip prompts\")\n .option(\"--batch\", \"Process multiple files non-interactively\")\n .option(\"--dry-run\", \"Show what would be generated without writing\")\n .option(\"-o, --output <path>\", \"Output path (single file only)\")\n .action(async (files: string[], opts) => {\n const nonInteractive = !!(opts.nonInteractive || opts.batch);\n\n try {\n for (const file of files) {\n await importFile(file, opts, nonInteractive);\n }\n } catch (err) {\n console.error(chalk.red(`Import failed: ${(err as Error).message}`));\n process.exitCode = 1;\n }\n });\n\nasync function importFile(\n file: string,\n opts: Record<string, unknown>,\n nonInteractive: boolean,\n): Promise<void> {\n const spinner = ora(`Importing ${basename(file)}...`).start();\n\n const filePath = resolve(file);\n const source = await readFile(filePath, \"utf-8\");\n const ext = extname(filePath).toLowerCase();\n\n // Detect renderer\n let rendererType: RendererType;\n\n if (opts.renderer) {\n rendererType = opts.renderer as RendererType;\n if (!RENDERER_TYPES.includes(rendererType)) {\n spinner.fail(chalk.red(`Invalid renderer: ${rendererType}`));\n throw new Error(`Invalid renderer \"${rendererType}\". Choose from: ${RENDERER_TYPES.join(\", \")}`);\n }\n spinner.text = `Renderer: ${rendererType} (specified)`;\n } else {\n // Auto-detect from source\n const detection = detectRenderer(source);\n\n if (detection) {\n spinner.text = `Detected renderer: ${detection.type} (${detection.confidence})`;\n\n if (detection.confidence === \"low\" && !nonInteractive) {\n // Prompt for confirmation\n spinner.stop();\n const { default: inquirer } = await import(\"inquirer\");\n const answers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"renderer\",\n message: `Low-confidence detection: ${detection.type}. Confirm or choose:`,\n choices: RENDERER_TYPES.map((t) => ({ name: t, value: t })),\n default: detection.type,\n },\n ]);\n rendererType = answers.renderer as RendererType;\n spinner.start();\n } else {\n rendererType = detection.type;\n }\n } else {\n // Fallback: use file extension or prompt\n if (ext === \".glsl\" || ext === \".frag\" || ext === \".vert\") {\n rendererType = \"glsl\";\n } else if (nonInteractive) {\n rendererType = \"p5\"; // default\n } else {\n spinner.stop();\n const { default: inquirer } = await import(\"inquirer\");\n const answers = await inquirer.prompt([\n {\n type: \"list\",\n name: \"renderer\",\n message: \"Could not detect renderer type. Please choose:\",\n choices: RENDERER_TYPES.map((t) => ({ name: t, value: t })),\n },\n ]);\n rendererType = answers.renderer as RendererType;\n spinner.start();\n }\n }\n }\n\n // Validate algorithm\n spinner.text = \"Validating algorithm...\";\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(rendererType);\n const validation = adapter.validate(source);\n\n if (!validation.valid) {\n spinner.warn(chalk.yellow(`Validation warnings for ${rendererType}:`));\n for (const error of validation.errors) {\n console.error(chalk.yellow(` - ${error}`));\n }\n }\n\n // Detect metadata from source\n const detectedParams = detectParams(source);\n const detectedColorCount = detectColorCount(source);\n const detectedSize = detectCanvasSize(source);\n\n // Build title\n let title: string;\n if (opts.title) {\n title = opts.title as string;\n } else if (nonInteractive) {\n title = basename(filePath, extname(filePath))\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n } else {\n spinner.stop();\n const { default: inquirer } = await import(\"inquirer\");\n const answers = await inquirer.prompt([\n {\n type: \"input\",\n name: \"title\",\n message: \"Sketch title:\",\n default: basename(filePath, extname(filePath))\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase()),\n },\n ]);\n title = answers.title as string;\n spinner.start();\n }\n\n // Determine canvas\n const preset = opts.preset as string;\n let canvasWidth: number;\n let canvasHeight: number;\n\n if (detectedSize && !opts.preset) {\n canvasWidth = detectedSize.width;\n canvasHeight = detectedSize.height;\n } else {\n const dims = resolvePreset(preset);\n canvasWidth = dims.width;\n canvasHeight = dims.height;\n }\n\n // Build parameter definitions\n const parameters: ParamDef[] = detectedParams.map((key) => ({\n key,\n label: key.charAt(0).toUpperCase() + key.slice(1),\n min: 0,\n max: 1,\n step: 0.01,\n default: 0.5,\n }));\n\n // Build color definitions\n const colors: ColorDef[] = [];\n const defaultColors = [\"#FF6B35\", \"#004E89\", \"#F7C59F\", \"#1A936F\", \"#C6DABF\"];\n for (let i = 0; i < detectedColorCount; i++) {\n colors.push({\n key: `color${i}`,\n label: `Color ${i + 1}`,\n default: defaultColors[i % defaultColors.length]!,\n });\n }\n\n const seed = (opts.seed as number) ?? Math.floor(Math.random() * 10000);\n const id = slugify(title);\n const now = new Date().toISOString();\n\n const sketch: SketchDefinition = {\n genart: \"1.0\",\n id,\n title,\n created: now,\n modified: now,\n renderer: { type: rendererType },\n canvas: {\n preset: detectedSize ? undefined : preset,\n width: canvasWidth,\n height: canvasHeight,\n },\n parameters,\n colors,\n state: {\n seed,\n params: Object.fromEntries(parameters.map((p) => [p.key, p.default])),\n colorPalette: colors.map((c) => c.default),\n },\n algorithm: source,\n };\n\n if (opts.dryRun) {\n spinner.stop();\n console.log(chalk.dim(\"--- Dry run (would write): ---\"));\n console.log(serializeGenart(sketch));\n return;\n }\n\n const outputPath = (opts.output as string)\n ? resolve(opts.output as string)\n : resolve(`${id}.genart`);\n const json = serializeGenart(sketch);\n await writeFile(outputPath, json, \"utf-8\");\n\n spinner.succeed(chalk.green(`✓ Imported → ${outputPath}`));\n console.log(chalk.dim(` Renderer: ${rendererType}`));\n console.log(chalk.dim(` Canvas: ${canvasWidth}×${canvasHeight}`));\n if (detectedParams.length > 0) {\n console.log(chalk.dim(` Parameters: ${detectedParams.join(\", \")}`));\n }\n if (detectedColorCount > 0) {\n console.log(chalk.dim(` Colors: ${detectedColorCount} slot${detectedColorCount > 1 ? \"s\" : \"\"}`));\n }\n}\n","/**\n * Auto-detect renderer type from algorithm source code.\n * Returns detected type with confidence level.\n */\n\nimport type { RendererType } from \"@genart-dev/format\";\n\nexport interface DetectionResult {\n type: RendererType;\n confidence: \"high\" | \"medium\" | \"low\";\n signals: string[];\n}\n\nexport function detectRenderer(source: string): DetectionResult | null {\n const results: Array<DetectionResult & { score: number }> = [];\n\n // GLSL detection — check first since it's most distinct\n const glslSignals: string[] = [];\n if (/^\\s*#version\\s+/m.test(source)) glslSignals.push(\"#version directive\");\n if (/void\\s+main\\s*\\(\\s*\\)/.test(source)) glslSignals.push(\"void main()\");\n if (/gl_Frag(Color|Coord)/i.test(source)) glslSignals.push(\"gl_Frag* builtins\");\n if (/\\b(uniform|varying|attribute)\\s+/m.test(source)) glslSignals.push(\"GLSL qualifiers\");\n if (/\\b(vec[234]|mat[234]|sampler2D)\\b/.test(source)) glslSignals.push(\"GLSL types\");\n if (glslSignals.length >= 2) {\n results.push({\n type: \"glsl\",\n confidence: glslSignals.length >= 3 ? \"high\" : \"medium\",\n signals: glslSignals,\n score: glslSignals.length * 10,\n });\n }\n\n // p5 detection\n const p5Signals: string[] = [];\n if (/function\\s+sketch\\s*\\(\\s*p\\s*[,)]/.test(source)) p5Signals.push(\"sketch(p, ...) signature\");\n if (/p\\.(setup|draw|createCanvas)\\b/.test(source)) p5Signals.push(\"p5 instance methods\");\n if (/p\\.(background|fill|stroke|ellipse|rect|line|vertex|bezier)\\b/.test(source)) p5Signals.push(\"p5 drawing API\");\n if (/p\\.(random|noise|map|lerp|constrain)\\b/.test(source)) p5Signals.push(\"p5 math utilities\");\n if (/p\\.(push|pop|translate|rotate|scale)\\b/.test(source)) p5Signals.push(\"p5 transforms\");\n if (/p\\.randomSeed\\b/.test(source)) p5Signals.push(\"p5 randomSeed\");\n if (p5Signals.length >= 2) {\n results.push({\n type: \"p5\",\n confidence: p5Signals.length >= 3 ? \"high\" : \"medium\",\n signals: p5Signals,\n score: p5Signals.length * 10,\n });\n }\n\n // Canvas2D detection\n const canvas2dSignals: string[] = [];\n if (/function\\s+sketch\\s*\\(\\s*ctx\\s*[,)]/.test(source)) canvas2dSignals.push(\"sketch(ctx, ...) signature\");\n if (/ctx\\.(fillRect|strokeRect|clearRect)\\b/.test(source)) canvas2dSignals.push(\"Canvas2D rect methods\");\n if (/ctx\\.(beginPath|moveTo|lineTo|arc|closePath)\\b/.test(source)) canvas2dSignals.push(\"Canvas2D path API\");\n if (/ctx\\.(fillStyle|strokeStyle|lineWidth|globalAlpha)\\b/.test(source)) canvas2dSignals.push(\"Canvas2D style props\");\n if (/ctx\\.(save|restore|translate|rotate|scale)\\b/.test(source)) canvas2dSignals.push(\"Canvas2D transforms\");\n if (canvas2dSignals.length >= 2) {\n results.push({\n type: \"canvas2d\",\n confidence: canvas2dSignals.length >= 3 ? \"high\" : \"medium\",\n signals: canvas2dSignals,\n score: canvas2dSignals.length * 10,\n });\n }\n\n // Three.js detection\n const threeSignals: string[] = [];\n if (/\\bTHREE\\b/.test(source)) threeSignals.push(\"THREE namespace\");\n if (/new\\s+THREE\\.\\w+/.test(source)) threeSignals.push(\"THREE constructor calls\");\n if (/THREE\\.(Scene|PerspectiveCamera|WebGLRenderer|Mesh|BoxGeometry|SphereGeometry)\\b/.test(source)) threeSignals.push(\"THREE core classes\");\n if (/THREE\\.(MeshBasicMaterial|MeshStandardMaterial|ShaderMaterial)\\b/.test(source)) threeSignals.push(\"THREE materials\");\n if (/THREE\\.(Vector[23]|Color|Euler)\\b/.test(source)) threeSignals.push(\"THREE math types\");\n if (threeSignals.length >= 2) {\n results.push({\n type: \"three\",\n confidence: threeSignals.length >= 3 ? \"high\" : \"medium\",\n signals: threeSignals,\n score: threeSignals.length * 10,\n });\n }\n\n // SVG detection\n const svgSignals: string[] = [];\n if (/document\\.createElementNS\\s*\\(\\s*[\"']http:\\/\\/www\\.w3\\.org\\/2000\\/svg[\"']/.test(source)) svgSignals.push(\"SVG namespace createElement\");\n if (/\\.(setAttribute|getAttribute)\\s*\\(\\s*[\"'](d|viewBox|fill|stroke|transform)[\"']/.test(source)) svgSignals.push(\"SVG attribute methods\");\n if (/\\b(path|circle|rect|line|polygon|polyline|ellipse|g|svg)\\b/.test(source) && /createElementNS|innerHTML/.test(source)) svgSignals.push(\"SVG element names\");\n if (/\\bM\\s*[\\d.-]+[\\s,]+[\\d.-]+.*[LQCZ]/i.test(source)) svgSignals.push(\"SVG path data\");\n if (svgSignals.length >= 1) {\n results.push({\n type: \"svg\",\n confidence: svgSignals.length >= 2 ? \"high\" : svgSignals.length >= 1 ? \"medium\" : \"low\",\n signals: svgSignals,\n score: svgSignals.length * 10,\n });\n }\n\n if (results.length === 0) return null;\n\n // Return highest scoring match\n results.sort((a, b) => b.score - a.score);\n const best = results[0]!;\n return { type: best.type, confidence: best.confidence, signals: best.signals };\n}\n\n/**\n * Detect parameters referenced in source code.\n * Looks for state.PARAMS.xxx patterns.\n */\nexport function detectParams(source: string): string[] {\n const keys = new Set<string>();\n const regex = /(?:state\\.PARAMS|PARAMS)\\.(\\w+)/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(source)) !== null) {\n keys.add(match[1]!);\n }\n return [...keys];\n}\n\n/**\n * Detect color slot count from source.\n * Looks for state.COLORS[n] or COLORS.xxx patterns.\n */\nexport function detectColorCount(source: string): number {\n const indexRefs = new Set<number>();\n const keyRefs = new Set<string>();\n\n // COLORS[0], COLORS[1], etc.\n const indexRegex = /(?:state\\.COLORS|COLORS)\\[(\\d+)\\]/g;\n let match: RegExpExecArray | null;\n while ((match = indexRegex.exec(source)) !== null) {\n indexRefs.add(Number(match[1]));\n }\n\n // COLORS.background, COLORS.primary, etc.\n const keyRegex = /(?:state\\.COLORS|COLORS)\\.(\\w+)/g;\n while ((match = keyRegex.exec(source)) !== null) {\n keyRefs.add(match[1]!);\n }\n\n return Math.max(indexRefs.size, keyRefs.size);\n}\n\n/**\n * Detect canvas dimensions from source code.\n * Looks for createCanvas(w, h) calls.\n */\nexport function detectCanvasSize(source: string): { width: number; height: number } | null {\n const match = source.match(/createCanvas\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\n if (match) {\n return { width: Number(match[1]), height: Number(match[2]) };\n }\n return null;\n}\n","import { Command } from \"commander\";\nimport { resolve, basename, extname } from \"node:path\";\nimport { stat } from \"node:fs/promises\";\nimport chalk from \"chalk\";\nimport ora from \"ora\";\nimport { createDefaultRegistry } from \"@genart-dev/core\";\nimport { loadSketch } from \"../util/load-sketch.js\";\nimport { applyOverrides, type SketchOverrides } from \"../util/apply-overrides.js\";\nimport { parseWait } from \"../util/parse-wait.js\";\nimport { getPage, closeBrowser } from \"../capture/browser.js\";\nimport {\n parseAnimate,\n interpolateParams,\n collectAnimates,\n EASINGS,\n type AnimateSpec,\n} from \"../video/interpolate.js\";\nimport { findFfmpeg, buildFfmpegArgs, spawnFfmpeg } from \"../video/ffmpeg.js\";\nimport { injectTimeOffset } from \"../video/time-inject.js\";\n\nexport const videoCommand = new Command(\"video\")\n .description(\"Render a video from an animated sketch\")\n .argument(\"<file>\", \"Path to .genart file\")\n .requiredOption(\"--duration <seconds>\", \"Video duration in seconds\", Number)\n .option(\"--fps <n>\", \"Frames per second\", Number, 30)\n .option(\"--format <fmt>\", \"Output format: mp4, webm, gif\", \"mp4\")\n .option(\"--codec <name>\", \"Video codec: h264, h265, vp9\", \"h264\")\n .option(\"--quality <n>\", \"Encoding quality (0-100)\", Number, 75)\n .option(\n \"--animate <spec>\",\n \"Interpolate parameter: param=start:end (repeatable)\",\n collectAnimates,\n [],\n )\n .option(\"--easing <fn>\", \"Easing function: linear, ease-in, ease-out, ease-in-out\", \"linear\")\n .option(\"--loop <n>\", \"GIF loop count (0=infinite)\", Number, 0)\n .option(\"--concurrency <n>\", \"Parallel frame captures\", Number, 4)\n .option(\"--wait <duration>\", \"Init wait before time injection\", \"200ms\")\n .option(\"--seed <n>\", \"Override seed\", Number)\n .option(\"--params <json>\", \"Override parameters (JSON object)\")\n .option(\"--colors <json>\", \"Override color palette (JSON array)\")\n .option(\"--width <n>\", \"Override canvas width\", Number)\n .option(\"--height <n>\", \"Override canvas height\", Number)\n .option(\"--preset <name>\", \"Use a canvas preset\")\n .option(\"-o, --output <path>\", \"Output file path\")\n .action(async (file: string, opts) => {\n const spinner = ora(\"Loading sketch...\").start();\n\n try {\n // Load and configure sketch\n const filePath = resolve(file);\n const sketch = await loadSketch(filePath);\n\n // Reject SVG renderer\n if (sketch.renderer.type === \"svg\") {\n throw new Error(\n \"SVG sketches are static and cannot be animated. \" +\n \"The video command requires an animated renderer (p5, canvas2d, three, glsl).\",\n );\n }\n\n // Build overrides\n const overrides: SketchOverrides = {};\n if (opts.seed !== undefined) overrides.seed = opts.seed as number;\n if (opts.width !== undefined) overrides.width = opts.width as number;\n if (opts.height !== undefined) overrides.height = opts.height as number;\n if (opts.preset) overrides.preset = opts.preset as string;\n if (opts.params) {\n overrides.params = JSON.parse(opts.params as string) as Record<string, number>;\n }\n if (opts.colors) {\n overrides.colors = JSON.parse(opts.colors as string) as string[];\n }\n\n const modified = applyOverrides(sketch, overrides);\n const registry = createDefaultRegistry();\n const adapter = registry.resolve(modified.renderer.type);\n\n // Detect ffmpeg\n spinner.text = \"Detecting ffmpeg...\";\n const ffmpegPath = findFfmpeg();\n\n // Parse animation specs\n const animateSpecs: AnimateSpec[] = (opts.animate as string[]).map(parseAnimate);\n const easingName = opts.easing as string;\n const easing = EASINGS[easingName];\n if (!easing) {\n throw new Error(\n `Unknown easing function: \"${easingName}\". ` +\n `Available: ${Object.keys(EASINGS).join(\", \")}`,\n );\n }\n\n // Calculate frame count\n const duration = opts.duration as number;\n const fps = opts.fps as number;\n const totalFrames = Math.ceil(duration * fps);\n const concurrency = opts.concurrency as number;\n const initWaitMs = parseWait(opts.wait as string);\n\n // Determine output path\n const format = opts.format as \"mp4\" | \"webm\" | \"gif\";\n const outputPath = resolve(\n (opts.output as string) ??\n `${basename(filePath, extname(filePath))}.${format}`,\n );\n\n // Spawn ffmpeg\n spinner.text = `Video: starting ffmpeg (${totalFrames} frames, ${fps}fps)...`;\n const ffmpegArgs = buildFfmpegArgs({\n output: outputPath,\n width: modified.canvas.width,\n height: modified.canvas.height,\n fps,\n format,\n codec: opts.codec as string,\n quality: opts.quality as number,\n loop: opts.loop as number,\n });\n const ffmpegProc = spawnFfmpeg(ffmpegPath, ffmpegArgs);\n\n // Collect ffmpeg stderr for error reporting\n let ffmpegStderr = \"\";\n ffmpegProc.stderr?.on(\"data\", (chunk: Buffer) => {\n ffmpegStderr += chunk.toString();\n });\n\n // Frame capture loop (chunk-based parallel)\n const hasAnimatedParams = animateSpecs.length > 0;\n let framesRendered = 0;\n\n for (let i = 0; i < totalFrames; i += concurrency) {\n const chunkSize = Math.min(concurrency, totalFrames - i);\n const frameIndices = Array.from({ length: chunkSize }, (_, j) => i + j);\n\n // Capture frames in parallel\n const frames = await Promise.all(\n frameIndices.map(async (frameIdx) => {\n const t = totalFrames <= 1 ? 0 : frameIdx / (totalFrames - 1);\n const timeOffsetMs = (frameIdx / fps) * 1000;\n\n // Apply animated params for this frame\n let frameSketch = modified;\n if (hasAnimatedParams) {\n const animatedParams = interpolateParams(animateSpecs, t, easing);\n frameSketch = applyOverrides(modified, { params: animatedParams });\n }\n\n const html = adapter.generateStandaloneHTML(frameSketch);\n\n // Create page, load, wait, inject time, capture\n const page = await getPage(\n frameSketch.canvas.width,\n frameSketch.canvas.height,\n );\n\n try {\n await page.setContent(html, {\n waitUntil: \"domcontentloaded\",\n timeout: 30_000,\n });\n\n // Wait for sketch to initialize\n if (initWaitMs > 0) {\n await new Promise((resolve) => setTimeout(resolve, initWaitMs));\n }\n\n // Inject time offset (after init so sketch has real start-time refs)\n if (timeOffsetMs > 0) {\n await injectTimeOffset(page, timeOffsetMs);\n // Wait one rAF cycle for the sketch to render at new time\n await page.evaluate(\n () =>\n new Promise<void>((resolve) =>\n requestAnimationFrame(() => resolve()),\n ),\n );\n }\n\n const buffer = await page.screenshot({\n type: \"png\",\n clip: {\n x: 0,\n y: 0,\n width: frameSketch.canvas.width,\n height: frameSketch.canvas.height,\n },\n });\n\n return new Uint8Array(buffer);\n } finally {\n await page.close();\n }\n }),\n );\n\n // Write frames to ffmpeg stdin IN ORDER\n for (const frame of frames) {\n const canWrite = ffmpegProc.stdin!.write(frame);\n if (!canWrite) {\n await new Promise<void>((resolve) =>\n ffmpegProc.stdin!.once(\"drain\", resolve),\n );\n }\n }\n\n framesRendered += chunkSize;\n const pct = Math.round((framesRendered / totalFrames) * 100);\n spinner.text = `Video: ${framesRendered}/${totalFrames} frames (${pct}%)`;\n }\n\n // Close ffmpeg stdin and wait for exit\n ffmpegProc.stdin!.end();\n\n const exitCode = await new Promise<number>((resolve, reject) => {\n ffmpegProc.on(\"close\", (code) => resolve(code ?? 0));\n ffmpegProc.on(\"error\", reject);\n });\n\n if (exitCode !== 0) {\n throw new Error(\n `ffmpeg exited with code ${exitCode}:\\n${ffmpegStderr.slice(-500)}`,\n );\n }\n\n // Report success\n const fileSize = (await stat(outputPath)).size;\n const sizeMB = (fileSize / (1024 * 1024)).toFixed(1);\n spinner.succeed(\n chalk.green(\n `Video: ${modified.canvas.width}×${modified.canvas.height}, ` +\n `${totalFrames} frames, ${duration}s → ${outputPath} (${sizeMB} MB)`,\n ),\n );\n } catch (err) {\n spinner.fail(chalk.red(`Video failed: ${(err as Error).message}`));\n process.exitCode = 1;\n } finally {\n await closeBrowser();\n }\n });\n","/**\n * Parameter animation interpolation and easing functions for video rendering.\n */\n\n/** A single parameter animation specification. */\nexport interface AnimateSpec {\n key: string;\n start: number;\n end: number;\n}\n\n/** An easing function mapping [0,1] → [0,1]. */\nexport type EasingFn = (t: number) => number;\n\n/** Available easing functions. */\nexport const EASINGS: Record<string, EasingFn> = {\n linear: (t) => t,\n \"ease-in\": (t) => t * t,\n \"ease-out\": (t) => t * (2 - t),\n \"ease-in-out\": (t) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n};\n\n/**\n * Parse an --animate flag value: \"param=start:end\"\n * @example parseAnimate(\"amplitude=0:1\") → { key: \"amplitude\", start: 0, end: 1 }\n */\nexport function parseAnimate(value: string): AnimateSpec {\n const eqIdx = value.indexOf(\"=\");\n if (eqIdx < 1) {\n throw new Error(\n `Invalid --animate format: \"${value}\". Expected \"param=start:end\"`,\n );\n }\n\n const key = value.slice(0, eqIdx);\n const range = value.slice(eqIdx + 1);\n const parts = range.split(\":\");\n\n if (parts.length !== 2) {\n throw new Error(\n `Invalid --animate range: \"${value}\". Expected \"param=start:end\"`,\n );\n }\n\n const start = Number(parts[0]);\n const end = Number(parts[1]);\n\n if (Number.isNaN(start) || Number.isNaN(end)) {\n throw new Error(\n `Invalid --animate values: \"${value}\". Start and end must be numbers`,\n );\n }\n\n return { key, start, end };\n}\n\n/**\n * Interpolate animated parameters at a normalized time t ∈ [0, 1].\n * Returns a record of parameter key → interpolated value.\n */\nexport function interpolateParams(\n specs: AnimateSpec[],\n t: number,\n easing: EasingFn,\n): Record<string, number> {\n const easedT = easing(Math.max(0, Math.min(1, t)));\n const result: Record<string, number> = {};\n\n for (const spec of specs) {\n result[spec.key] = spec.start + (spec.end - spec.start) * easedT;\n }\n\n return result;\n}\n\n/**\n * Collect repeatable --animate flags into an array.\n * Commander calls this for each --animate value.\n */\nexport function collectAnimates(value: string, prev: string[]): string[] {\n return [...prev, value];\n}\n","/**\n * ffmpeg detection, argument building, and process management for video encoding.\n */\n\nimport { execSync, spawn, type ChildProcess } from \"node:child_process\";\n\n/** Options for building ffmpeg command arguments. */\nexport interface FfmpegOptions {\n output: string;\n width: number;\n height: number;\n fps: number;\n format: \"mp4\" | \"webm\" | \"gif\";\n codec: string;\n quality: number;\n loop: number;\n}\n\n/**\n * Find the ffmpeg binary path.\n * Checks GENART_FFMPEG_PATH env var first, then system PATH via `which`.\n */\nexport function findFfmpeg(): string {\n const envPath = process.env[\"GENART_FFMPEG_PATH\"];\n if (envPath) return envPath;\n\n try {\n return execSync(\"which ffmpeg\", { encoding: \"utf-8\" }).trim();\n } catch {\n throw new Error(\n \"ffmpeg not found. Install ffmpeg or set GENART_FFMPEG_PATH.\\n\" +\n \" macOS: brew install ffmpeg\\n\" +\n \" Linux: sudo apt install ffmpeg\\n\" +\n \" Or: GENART_FFMPEG_PATH=/path/to/ffmpeg genart video ...\",\n );\n }\n}\n\n/**\n * Convert a quality value (0–100) to a CRF value for the given codec.\n * Higher quality = lower CRF (better quality).\n */\nexport function qualityToCrf(quality: number, codec: string): number {\n const maxCrf = codec === \"libvpx-vp9\" ? 63 : 51;\n return Math.round(((100 - quality) * maxCrf) / 100);\n}\n\n/** Map user-facing codec name to ffmpeg codec identifier. */\nfunction resolveCodec(codec: string): string {\n const map: Record<string, string> = {\n h264: \"libx264\",\n h265: \"libx265\",\n vp9: \"libvpx-vp9\",\n };\n return map[codec] ?? codec;\n}\n\n/**\n * Build ffmpeg command-line arguments for encoding piped PNG frames.\n */\nexport function buildFfmpegArgs(opts: FfmpegOptions): string[] {\n const args: string[] = [\n // Input: piped PNG frames\n \"-f\", \"image2pipe\",\n \"-framerate\", String(opts.fps),\n \"-i\", \"pipe:0\",\n // Overwrite output\n \"-y\",\n ];\n\n if (opts.format === \"gif\") {\n // Simple single-pass GIF encoding\n args.push(\"-vf\", `fps=${opts.fps}`);\n if (opts.loop !== undefined) {\n args.push(\"-loop\", String(opts.loop));\n }\n } else {\n const ffCodec = resolveCodec(opts.codec);\n const crf = qualityToCrf(opts.quality, ffCodec);\n\n args.push(\"-c:v\", ffCodec, \"-crf\", String(crf));\n\n if (ffCodec === \"libx264\" || ffCodec === \"libx265\") {\n args.push(\"-pix_fmt\", \"yuv420p\");\n }\n if (ffCodec === \"libx264\") {\n args.push(\"-movflags\", \"+faststart\");\n }\n }\n\n args.push(opts.output);\n return args;\n}\n\n/**\n * Spawn an ffmpeg process with the given arguments.\n * Stdin is piped for frame data; stdout/stderr are piped for capture.\n */\nexport function spawnFfmpeg(ffmpegPath: string, args: string[]): ChildProcess {\n return spawn(ffmpegPath, args, {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n}\n","/**\n * Time offset injection for video frame capture.\n *\n * Monkey-patches performance.now(), Date.now(), and requestAnimationFrame\n * in the browser page so animated sketches render at the desired time offset.\n */\n\nimport type { Page } from \"puppeteer-core\";\n\n/**\n * Build the JavaScript string that patches timing APIs with the given offset.\n * Exported for testing — the video command uses injectTimeOffset() directly.\n */\nexport function buildTimeOffsetScript(offsetMs: number): string {\n return `\n (() => {\n const __OFFSET = ${offsetMs};\n const __origPerfNow = performance.now.bind(performance);\n const __origDateNow = Date.now.bind(Date);\n const __origRAF = window.requestAnimationFrame.bind(window);\n performance.now = () => __origPerfNow() + __OFFSET;\n Date.now = () => __origDateNow() + __OFFSET;\n window.requestAnimationFrame = (cb) => __origRAF((ts) => cb(ts + __OFFSET));\n })();\n `;\n}\n\n/**\n * Inject a time offset into the page's timing APIs.\n * Call this AFTER the page has loaded and the sketch has initialized\n * (so the sketch captures real start-time references).\n */\nexport async function injectTimeOffset(\n page: Page,\n offsetMs: number,\n): Promise<void> {\n await page.evaluate(buildTimeOffsetScript(offsetMs));\n}\n","/**\n * genart agent — MCP server and agent configuration command group.\n */\n\nimport { Command } from \"commander\";\nimport { stdioCommand } from \"./stdio.js\";\nimport { httpCommand } from \"./http.js\";\nimport { sidecarCommand } from \"./sidecar.js\";\nimport { installCommand } from \"./install.js\";\nimport { doctorCommand } from \"./doctor.js\";\n\nexport const agentCommand = new Command(\"agent\")\n .description(\"MCP server and agent configuration\");\n\nagentCommand.addCommand(stdioCommand);\nagentCommand.addCommand(httpCommand);\nagentCommand.addCommand(sidecarCommand);\nagentCommand.addCommand(installCommand);\nagentCommand.addCommand(doctorCommand);\n","/**\n * genart agent stdio — MCP server over stdio transport.\n * Replaces the standalone genart-mcp binary.\n */\n\nimport { Command } from \"commander\";\n\nexport const stdioCommand = new Command(\"stdio\")\n .description(\"Start MCP server over stdio transport\")\n .option(\"--base-path <dir>\", \"Base directory for file operations\", process.cwd())\n .action(async (opts) => {\n const { EditorState, createServer } = await import(\"@genart-dev/mcp-server/lib\");\n const { StdioServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/stdio.js\"\n );\n\n const state = new EditorState();\n if (opts.basePath) {\n state.basePath = opts.basePath as string;\n }\n\n const server = createServer(state);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(\"[genart] MCP server connected (stdio)\");\n });\n","/**\n * genart agent http — MCP server over local HTTP with StreamableHTTP transport.\n * Allows multiple clients to connect to a persistent local server.\n */\n\nimport { Command } from \"commander\";\nimport {\n createServer as createHttpServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport chalk from \"chalk\";\n\nexport const httpCommand = new Command(\"http\")\n .description(\"Start MCP server over HTTP (StreamableHTTP transport)\")\n .option(\"--port <n>\", \"Port to listen on\", Number, 3333)\n .option(\"--host <addr>\", \"Host to bind to\", \"127.0.0.1\")\n .option(\"--base-path <dir>\", \"Base directory for file operations\", process.cwd())\n .option(\"--cors\", \"Enable CORS headers for browser access\")\n .action(async (opts) => {\n const { EditorState, createServer } = await import(\"@genart-dev/mcp-server/lib\");\n const { StreamableHTTPServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/streamableHttp.js\"\n );\n\n const port = opts.port as number;\n const host = opts.host as string;\n const enableCors = opts.cors as boolean | undefined;\n\n const state = new EditorState();\n if (opts.basePath) {\n state.basePath = opts.basePath as string;\n }\n\n const mcpServer = createServer(state);\n const transport = new StreamableHTTPServerTransport({\n sessionIdGenerator: () => \"local\",\n });\n\n await mcpServer.connect(transport);\n\n const httpServer = createHttpServer(\n async (req: IncomingMessage, res: ServerResponse) => {\n // CORS headers\n if (enableCors) {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, DELETE, OPTIONS\");\n res.setHeader(\n \"Access-Control-Allow-Headers\",\n \"Content-Type, Mcp-Session-Id\",\n );\n res.setHeader(\"Access-Control-Expose-Headers\", \"Mcp-Session-Id\");\n }\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(enableCors ? 204 : 405);\n res.end();\n return;\n }\n\n if (req.url === \"/health\") {\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ status: \"ok\" }));\n return;\n }\n\n if (req.url === \"/mcp\") {\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n req.on(\"end\", async () => {\n const raw = Buffer.concat(chunks).toString();\n const body = raw ? JSON.parse(raw) : undefined;\n try {\n await transport.handleRequest(req, res, body);\n } catch (err) {\n console.error(\"[genart] handleRequest error:\", err);\n if (!res.writableEnded) {\n res.writeHead(500);\n res.end(JSON.stringify({ error: \"Internal server error\" }));\n }\n }\n });\n return;\n }\n\n res.writeHead(404);\n res.end();\n },\n );\n\n httpServer.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n console.error(\n chalk.red(`Port ${port} is already in use.`) +\n \"\\n\" +\n chalk.dim(`Try: genart agent http --port ${port + 1}`),\n );\n process.exitCode = 1;\n } else {\n console.error(chalk.red(`Server error: ${err.message}`));\n process.exitCode = 1;\n }\n });\n\n httpServer.listen(port, host, () => {\n console.log(\n chalk.green(`MCP server listening on http://${host}:${port}/mcp`),\n );\n if (enableCors) {\n console.log(chalk.dim(\"CORS enabled\"));\n }\n });\n\n // Graceful shutdown\n const shutdown = async () => {\n console.log(chalk.dim(\"\\nShutting down...\"));\n httpServer.close();\n try {\n await mcpServer.close();\n } catch {\n // Ignore close errors\n }\n process.exit(0);\n };\n\n process.on(\"SIGINT\", shutdown);\n process.on(\"SIGTERM\", shutdown);\n });\n","/**\n * genart agent sidecar — MCP server over stdio with IPC mutation forwarding.\n * Used by the Electron desktop app to receive real-time mutation notifications.\n */\n\nimport { Command } from \"commander\";\n\nexport const sidecarCommand = new Command(\"sidecar\")\n .description(\"Start MCP server in sidecar mode (stdio + IPC mutations)\")\n .option(\"--base-path <dir>\", \"Base directory for file operations\", process.cwd())\n .action(async (opts) => {\n // Set sidecar env BEFORE importing mcp-server (isSidecarMode() checks this)\n process.env[\"GENART_SIDECAR\"] = \"1\";\n\n const { EditorState, createServer } = await import(\"@genart-dev/mcp-server/lib\");\n const { StdioServerTransport } = await import(\n \"@modelcontextprotocol/sdk/server/stdio.js\"\n );\n\n const state = new EditorState();\n if (opts.basePath) {\n state.basePath = opts.basePath as string;\n }\n\n const server = createServer(state);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n console.error(\"[genart] MCP server connected (sidecar)\");\n });\n","/**\n * genart agent install — auto-configure MCP for supported AI clients.\n */\n\nimport { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport {\n CLIENTS,\n findClient,\n getConfigPath,\n detectGenartBin,\n isInPath,\n readClientConfig,\n writeClientConfig,\n getNestedValue,\n setNestedValue,\n deleteNestedValue,\n} from \"./clients.js\";\n\nexport const installCommand = new Command(\"install\")\n .description(\"Configure MCP for an AI client\")\n .argument(\"[client]\", \"Client to configure (claude, codex, cursor, vscode, gemini, opencode, kiro, windsurf)\")\n .option(\"--all\", \"Configure all detected clients\")\n .option(\"--remove\", \"Remove genart configuration\")\n .option(\"--dry-run\", \"Preview changes without writing\")\n .option(\"--npx\", \"Force npx invocation instead of global binary\")\n .action(async (clientArg: string | undefined, opts) => {\n const isRemove = opts.remove as boolean | undefined;\n const isDryRun = opts.dryRun as boolean | undefined;\n const forceNpx = opts.npx as boolean | undefined;\n const installAll = opts.all as boolean | undefined;\n\n // Determine which clients to configure\n let targets: typeof CLIENTS;\n\n if (installAll) {\n // --all: configure every client that has its binary installed\n targets = CLIENTS.filter((c) => isInPath(c.binaryName));\n if (targets.length === 0) {\n console.log(chalk.yellow(\"No supported AI clients detected in PATH.\"));\n console.log(\n chalk.dim(\n \"Supported: \" + CLIENTS.map((c) => c.id).join(\", \"),\n ),\n );\n return;\n }\n } else if (clientArg) {\n const client = findClient(clientArg);\n if (!client) {\n console.error(\n chalk.red(`Unknown client: ${clientArg}`) +\n \"\\n\" +\n chalk.dim(\n \"Available: \" + CLIENTS.map((c) => c.id).join(\", \"),\n ),\n );\n process.exitCode = 1;\n return;\n }\n targets = [client];\n } else {\n console.error(\n chalk.red(\"Specify a client or use --all\") +\n \"\\n\" +\n chalk.dim(\"Usage: genart agent install <client>\") +\n \"\\n\" +\n chalk.dim(\" genart agent install --all\") +\n \"\\n\\n\" +\n chalk.dim(\"Available: \" + CLIENTS.map((c) => c.id).join(\", \")),\n );\n process.exitCode = 1;\n return;\n }\n\n // Build the genart entry\n const bin = forceNpx\n ? { command: \"npx\", args: [\"-y\", \"@genart-dev/cli\", \"agent\", \"stdio\"] }\n : detectGenartBin();\n\n const entry = { command: bin.command, args: bin.args };\n\n for (const client of targets) {\n const configPath = getConfigPath(client);\n\n try {\n if (isRemove) {\n await removeClient(client, configPath, isDryRun);\n } else {\n await installClient(client, configPath, entry, isDryRun);\n }\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === \"EACCES\") {\n console.error(\n chalk.red(`Permission denied: ${configPath}`) +\n \"\\n\" +\n chalk.dim(\"Check file permissions and try again.\"),\n );\n } else {\n console.error(\n chalk.red(`Failed to configure ${client.name}: ${(err as Error).message}`),\n );\n }\n process.exitCode = 1;\n }\n }\n });\n\nasync function installClient(\n client: (typeof CLIENTS)[number],\n configPath: string,\n entry: Record<string, unknown>,\n isDryRun?: boolean,\n): Promise<void> {\n const config = await readClientConfig(client);\n\n // Navigate to servers key and set genart entry\n let servers = getNestedValue(config, client.serversKey) as\n | Record<string, unknown>\n | undefined;\n if (!servers || typeof servers !== \"object\") {\n servers = {};\n setNestedValue(config, client.serversKey, servers);\n }\n servers[\"genart\"] = entry;\n\n if (isDryRun) {\n console.log(chalk.dim(`[dry-run] ${client.name} (${configPath}):`));\n if (client.format === \"toml\") {\n const { stringify } = await import(\"smol-toml\");\n console.log(chalk.dim(stringify(config)));\n } else {\n console.log(chalk.dim(JSON.stringify(config, null, 2)));\n }\n return;\n }\n\n await writeClientConfig(client, config);\n console.log(\n chalk.green(`Configured ${client.name}`) +\n chalk.dim(` (${configPath})`),\n );\n}\n\nasync function removeClient(\n client: (typeof CLIENTS)[number],\n configPath: string,\n isDryRun?: boolean,\n): Promise<void> {\n const config = await readClientConfig(client);\n const servers = getNestedValue(config, client.serversKey) as\n | Record<string, unknown>\n | undefined;\n\n if (!servers || !(\"genart\" in servers)) {\n console.log(chalk.dim(`${client.name}: not configured, nothing to remove`));\n return;\n }\n\n deleteNestedValue(config, client.serversKey, \"genart\");\n\n if (isDryRun) {\n console.log(chalk.dim(`[dry-run] Would remove genart from ${client.name} (${configPath})`));\n return;\n }\n\n await writeClientConfig(client, config);\n console.log(\n chalk.green(`Removed genart from ${client.name}`) +\n chalk.dim(` (${configPath})`),\n );\n}\n","/**\n * Client config registry + read/write helpers.\n * Defines supported AI clients and their MCP configuration locations.\n */\n\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { execSync } from \"node:child_process\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { parse as parseToml, stringify as stringifyToml } from \"smol-toml\";\n\n/** Static definition for a supported AI client. */\nexport interface ClientDefinition {\n /** CLI argument id (e.g. \"claude\"). */\n readonly id: string;\n /** Display name (e.g. \"Claude Code\"). */\n readonly name: string;\n /** Config file path relative to home dir. */\n readonly configRelPath: string;\n /** Config file format. */\n readonly format: \"json\" | \"toml\";\n /** Dot-delimited key path to the MCP servers map (e.g. \"mcp.servers\"). */\n readonly serversKey: string;\n /** Binary name for PATH detection. */\n readonly binaryName: string;\n}\n\n/** Registry of supported AI clients. */\nexport const CLIENTS: ClientDefinition[] = [\n {\n id: \"claude\",\n name: \"Claude Code\",\n configRelPath: \".claude.json\",\n format: \"json\",\n serversKey: \"mcpServers\",\n binaryName: \"claude\",\n },\n {\n id: \"codex\",\n name: \"Codex CLI\",\n configRelPath: \".codex/config.toml\",\n format: \"toml\",\n serversKey: \"mcp_servers\",\n binaryName: \"codex\",\n },\n {\n id: \"cursor\",\n name: \"Cursor\",\n configRelPath: \".cursor/mcp.json\",\n format: \"json\",\n serversKey: \"mcpServers\",\n binaryName: \"cursor\",\n },\n {\n id: \"vscode\",\n name: \"VS Code\",\n configRelPath:\n process.platform === \"darwin\"\n ? \"Library/Application Support/Code/User/settings.json\"\n : process.platform === \"win32\"\n ? \"AppData/Roaming/Code/User/settings.json\"\n : \".config/Code/User/settings.json\",\n format: \"json\",\n serversKey: \"mcp.servers\",\n binaryName: \"code\",\n },\n {\n id: \"gemini\",\n name: \"Gemini CLI\",\n configRelPath: \".gemini/settings.json\",\n format: \"json\",\n serversKey: \"mcpServers\",\n binaryName: \"gemini\",\n },\n {\n id: \"opencode\",\n name: \"OpenCode\",\n configRelPath: \".config/opencode/opencode.json\",\n format: \"json\",\n serversKey: \"mcp\",\n binaryName: \"opencode\",\n },\n {\n id: \"kiro\",\n name: \"Kiro\",\n configRelPath: \".kiro/settings/mcp.json\",\n format: \"json\",\n serversKey: \"mcpServers\",\n binaryName: \"kiro\",\n },\n {\n id: \"windsurf\",\n name: \"Windsurf\",\n configRelPath: \".codeium/windsurf/mcp_config.json\",\n format: \"json\",\n serversKey: \"mcpServers\",\n binaryName: \"windsurf\",\n },\n];\n\n/** Find a client definition by id. */\nexport function findClient(id: string): ClientDefinition | undefined {\n return CLIENTS.find((c) => c.id === id);\n}\n\n/** Get the absolute config path for a client. */\nexport function getConfigPath(client: ClientDefinition): string {\n return join(homedir(), client.configRelPath);\n}\n\n/** Check if a binary exists in PATH. */\nexport function isInPath(binary: string): boolean {\n try {\n const cmd = process.platform === \"win32\" ? `where.exe ${binary}` : `which ${binary}`;\n execSync(cmd, { stdio: \"pipe\" });\n return true;\n } catch {\n return false;\n }\n}\n\n/** Detect how to invoke genart: direct binary or npx fallback. */\nexport function detectGenartBin(): { command: string; args: string[] } {\n if (isInPath(\"genart\")) {\n return { command: \"genart\", args: [\"agent\", \"stdio\"] };\n }\n return { command: \"npx\", args: [\"-y\", \"@genart-dev/cli\", \"agent\", \"stdio\"] };\n}\n\n/** Get a nested value from an object by dot-delimited path. */\nexport function getNestedValue(\n obj: Record<string, unknown>,\n dotPath: string,\n): unknown {\n const parts = dotPath.split(\".\");\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== \"object\") {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\n/** Set a nested value in an object by dot-delimited path. Creates intermediate objects. */\nexport function setNestedValue(\n obj: Record<string, unknown>,\n dotPath: string,\n value: unknown,\n): void {\n const parts = dotPath.split(\".\");\n let current: Record<string, unknown> = obj;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (!current[part] || typeof current[part] !== \"object\") {\n current[part] = {};\n }\n current = current[part] as Record<string, unknown>;\n }\n current[parts[parts.length - 1]!] = value;\n}\n\n/** Delete a nested value by dot-delimited path. Cleans up empty parent containers. */\nexport function deleteNestedValue(\n obj: Record<string, unknown>,\n dotPath: string,\n childKey: string,\n): void {\n const servers = getNestedValue(obj, dotPath) as Record<string, unknown> | undefined;\n if (!servers || typeof servers !== \"object\") return;\n delete servers[childKey];\n\n // Clean up empty containers\n if (Object.keys(servers).length === 0) {\n const parts = dotPath.split(\".\");\n if (parts.length === 1) {\n delete obj[parts[0]!];\n } else {\n const parentPath = parts.slice(0, -1).join(\".\");\n const lastKey = parts[parts.length - 1]!;\n const parent = getNestedValue(obj, parentPath) as Record<string, unknown> | undefined;\n if (parent) {\n delete parent[lastKey];\n }\n }\n }\n}\n\n/** Read a JSON config file. Returns {} on ENOENT. */\nexport async function readJsonConfig(path: string): Promise<Record<string, unknown>> {\n try {\n const raw = await readFile(path, \"utf-8\");\n return JSON.parse(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw err;\n }\n}\n\n/** Write a JSON config file. Creates parent directories. */\nexport async function writeJsonConfig(\n path: string,\n data: Record<string, unknown>,\n): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/** Read a TOML config file. Returns {} on ENOENT. */\nexport async function readTomlConfig(path: string): Promise<Record<string, unknown>> {\n try {\n const raw = await readFile(path, \"utf-8\");\n return parseToml(raw) as Record<string, unknown>;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw err;\n }\n}\n\n/** Write a TOML config file. Creates parent directories. */\nexport async function writeTomlConfig(\n path: string,\n data: Record<string, unknown>,\n): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n await writeFile(path, stringifyToml(data) + \"\\n\", \"utf-8\");\n}\n\n/** Read a client config (dispatches JSON vs TOML). */\nexport async function readClientConfig(\n client: ClientDefinition,\n): Promise<Record<string, unknown>> {\n const path = getConfigPath(client);\n return client.format === \"toml\" ? readTomlConfig(path) : readJsonConfig(path);\n}\n\n/** Write a client config (dispatches JSON vs TOML). */\nexport async function writeClientConfig(\n client: ClientDefinition,\n data: Record<string, unknown>,\n): Promise<void> {\n const path = getConfigPath(client);\n return client.format === \"toml\"\n ? writeTomlConfig(path, data)\n : writeJsonConfig(path, data);\n}\n\n/** Check if genart is already configured in a client. */\nexport async function isConfigured(client: ClientDefinition): Promise<boolean> {\n const config = await readClientConfig(client);\n const servers = getNestedValue(config, client.serversKey);\n if (!servers || typeof servers !== \"object\") return false;\n return \"genart\" in (servers as Record<string, unknown>);\n}\n","/**\n * genart agent doctor — diagnose genart MCP setup.\n * Checks dependencies, client configurations, and optional tools.\n */\n\nimport { Command } from \"commander\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport chalk from \"chalk\";\nimport { findChromePath } from \"../../capture/browser.js\";\nimport { CLIENTS, isInPath, isConfigured } from \"./clients.js\";\n\nexport const doctorCommand = new Command(\"doctor\")\n .description(\"Diagnose genart MCP setup\")\n .action(async () => {\n console.log(\"\\n Checking genart MCP setup...\\n\");\n\n let warnings = 0;\n\n // 1. CLI version\n const pkgPath = join(import.meta.dirname, \"../../../package.json\");\n let version = \"unknown\";\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\")) as { version: string };\n version = pkg.version;\n } catch {\n // Fallback — running from source\n version = \"0.1.0\";\n }\n printCheck(true, `@genart-dev/cli installed (v${version})`);\n\n // 2. MCP server availability\n let mcpVersion = \"\";\n try {\n const mcpPkgPath = require.resolve(\"@genart-dev/mcp-server/package.json\", {\n paths: [process.cwd(), import.meta.dirname],\n });\n const mcpPkg = JSON.parse(readFileSync(mcpPkgPath, \"utf-8\")) as { version: string };\n mcpVersion = mcpPkg.version;\n printCheck(true, `@genart-dev/mcp-server resolved (v${mcpVersion})`);\n } catch {\n // Try dynamic import as fallback\n try {\n await import(\"@genart-dev/mcp-server/lib\");\n printCheck(true, \"@genart-dev/mcp-server resolved\");\n } catch {\n printCheck(false, \"@genart-dev/mcp-server not found\");\n warnings++;\n }\n }\n\n // 3. Chrome availability\n const chromePath = findChromePath();\n if (chromePath) {\n printCheck(true, `Chrome available (${chromePath})`);\n } else {\n printWarning(\"Chrome not found (render/capture commands unavailable)\");\n warnings++;\n }\n\n // 4. ffmpeg availability\n if (isInPath(\"ffmpeg\")) {\n printCheck(true, \"ffmpeg available\");\n } else {\n printWarning(\"ffmpeg not installed (video command unavailable)\");\n warnings++;\n }\n\n // 5. sharp availability\n try {\n await import(\"sharp\");\n printCheck(true, \"sharp available\");\n } catch {\n printWarning(\"sharp not installed (montage command unavailable)\");\n warnings++;\n }\n\n // 6. Client configurations\n console.log(\"\\n Client configurations:\\n\");\n\n for (const client of CLIENTS) {\n const installed = isInPath(client.binaryName);\n const configured = await isConfigured(client).catch(() => false);\n\n if (configured) {\n printCheck(true, `${client.name} \\u2014 configured`);\n } else if (installed) {\n printWarning(\n `${client.name} \\u2014 installed but not configured (run: genart agent install ${client.id})`,\n );\n warnings++;\n } else {\n printNotInstalled(`${client.name} \\u2014 not installed`);\n }\n }\n\n console.log(\"\");\n\n process.exitCode = warnings > 0 ? 1 : 0;\n });\n\nfunction printCheck(pass: boolean, message: string): void {\n const icon = pass ? chalk.green(\"\\u2713\") : chalk.red(\"\\u2717\");\n console.log(` ${icon} ${message}`);\n}\n\nfunction printWarning(message: string): void {\n console.log(` ${chalk.yellow(\"!\")} ${message}`);\n}\n\nfunction printNotInstalled(message: string): void {\n console.log(` ${chalk.dim(\"\\u25CB\")} ${chalk.dim(message)}`);\n}\n"],"mappings":"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","names":["Command","resolve","Command","resolve","chalk","chalk","Command","resolve","Command","resolve","chalk","createDefaultRegistry","resolve","Command","chalk","createDefaultRegistry","Command","resolve","writeFile","chalk","ora","createDefaultRegistry","resolvePreset","Command","resolve","basename","extname","writeFile","chalk","ora","createDefaultRegistry","Command","ora","resolve","createDefaultRegistry","basename","extname","writeFile","chalk","Command","resolve","basename","extname","writeFile","chalk","ora","createDefaultRegistry","Command","ora","resolve","createDefaultRegistry","basename","extname","writeFile","chalk","Command","resolve","basename","readFile","readdir","writeFile","stat","chalk","ora","Command","resolve","basename","extname","readFile","writeFile","chalk","ora","createDefaultRegistry","serializeGenart","resolvePreset","RENDERER_TYPES","slugify","Command","chalk","ora","basename","resolve","readFile","extname","createDefaultRegistry","resolvePreset","serializeGenart","writeFile","Command","resolve","basename","extname","stat","chalk","ora","createDefaultRegistry","Command","ora","resolve","createDefaultRegistry","basename","extname","stat","chalk","Command","Command","Command","chalk","Command","Command","chalk","readFile","writeFile","mkdir","execSync","Command","chalk","Command","join","chalk","Command","join","chalk","Command","Command"]}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@genart-dev/cli",
3
+ "version": "0.2.0",
4
+ "description": "Command-line interface for genart.dev — render, validate, export, and scaffold generative art sketches",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "genart": "./dist/index.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": {
14
+ "types": "./dist/index.d.ts",
15
+ "default": "./dist/index.js"
16
+ }
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "license": "MIT",
23
+ "author": {
24
+ "name": "genart.dev",
25
+ "email": "support@genart.dev",
26
+ "url": "https://genart.dev"
27
+ },
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/genart-dev/cli.git"
31
+ },
32
+ "homepage": "https://genart.dev",
33
+ "keywords": [
34
+ "genart",
35
+ "generative-art",
36
+ "cli",
37
+ "render",
38
+ "p5",
39
+ "three",
40
+ "glsl",
41
+ "svg",
42
+ "canvas2d"
43
+ ],
44
+ "publishConfig": {
45
+ "access": "public"
46
+ },
47
+ "scripts": {
48
+ "build": "tsup",
49
+ "test": "vitest run",
50
+ "test:watch": "vitest",
51
+ "clean": "rm -rf dist",
52
+ "prepublishOnly": "pnpm build"
53
+ },
54
+ "dependencies": {
55
+ "@genart-dev/core": "^0.1.0",
56
+ "@genart-dev/format": "^0.1.0",
57
+ "@genart-dev/mcp-server": "^0.1.0",
58
+ "@modelcontextprotocol/sdk": "^1.12.0",
59
+ "chalk": "^5.4.1",
60
+ "commander": "^13.1.0",
61
+ "inquirer": "^12.4.0",
62
+ "ora": "^8.2.0",
63
+ "puppeteer-core": "^24.0.0",
64
+ "smol-toml": "^1.3.1"
65
+ },
66
+ "devDependencies": {
67
+ "@types/node": "^22.0.0",
68
+ "tsup": "^8.3.6",
69
+ "typescript": "^5.7.3",
70
+ "vitest": "^3.0.5"
71
+ }
72
+ }