@agent-scope/cli 1.0.2 → 1.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.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/program.ts","../src/browser.ts","../src/manifest-commands.ts","../src/manifest-formatter.ts","../src/render-commands.ts","../src/component-bundler.ts","../src/render-formatter.ts","../src/tree-formatter.ts","../src/report-formatter.ts","../src/cli.ts"],"sourcesContent":["/**\n * @agent-scope/cli — program factory\n *\n * Builds the Commander.js program tree without executing it.\n * This separation allows the library to be tested without side effects.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { generateTest, loadTrace } from \"@agent-scope/playwright\";\nimport { Command } from \"commander\";\nimport { browserCapture, writeReportToFile } from \"./browser.js\";\nimport { createManifestCommand } from \"./manifest-commands.js\";\nimport { createRenderCommand } from \"./render-commands.js\";\nimport { buildStructuredReport, formatReport } from \"./report-formatter.js\";\nimport { formatTree } from \"./tree-formatter.js\";\n\nexport interface ScopeCLIOptions {\n version?: string;\n}\n\n/** Build and return the Scope CLI program */\nexport function createProgram(options: ScopeCLIOptions = {}): Command {\n const program = new Command(\"scope\")\n .version(options.version ?? \"0.1.0\")\n .description(\"Scope — React instrumentation toolkit\");\n\n // ── capture ─────────────────────────────────────────────────────────────\n program\n .command(\"capture <url>\")\n .description(\"Capture a React component tree from a live URL and output as JSON\")\n .option(\"-o, --output <path>\", \"Write JSON to file instead of stdout\")\n .option(\"--pretty\", \"Pretty-print JSON output (default: minified)\", false)\n .option(\"--timeout <ms>\", \"Max wait time for React to mount (ms)\", \"10000\")\n .option(\"--wait <ms>\", \"Additional wait after page load before capture (ms)\", \"0\")\n .action(\n async (\n url: string,\n opts: {\n output?: string;\n pretty: boolean;\n timeout: string;\n wait: string;\n },\n ) => {\n try {\n const { report } = await browserCapture({\n url,\n timeout: Number.parseInt(opts.timeout, 10),\n wait: Number.parseInt(opts.wait, 10),\n });\n\n if (opts.output !== undefined) {\n writeReportToFile(report, opts.output, opts.pretty);\n process.stderr.write(`Captured to ${opts.output}\\n`);\n } else {\n const json = opts.pretty ? JSON.stringify(report, null, 2) : JSON.stringify(report);\n process.stdout.write(`${json}\\n`);\n }\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n\n // ── tree ─────────────────────────────────────────────────────────────────\n program\n .command(\"tree <url>\")\n .description(\"Display the React component tree from a live URL\")\n .option(\"--depth <n>\", \"Max depth to display (default: unlimited)\")\n .option(\"--show-props\", \"Include prop names next to components\", false)\n .option(\"--show-hooks\", \"Show hook counts per component\", false)\n .option(\"--timeout <ms>\", \"Max wait time for React to mount (ms)\", \"10000\")\n .option(\"--wait <ms>\", \"Additional wait after page load before capture (ms)\", \"0\")\n .action(\n async (\n url: string,\n opts: {\n depth?: string;\n showProps: boolean;\n showHooks: boolean;\n timeout: string;\n wait: string;\n },\n ) => {\n try {\n const { report } = await browserCapture({\n url,\n timeout: Number.parseInt(opts.timeout, 10),\n wait: Number.parseInt(opts.wait, 10),\n });\n\n const maxDepth = opts.depth !== undefined ? Number.parseInt(opts.depth, 10) : undefined;\n\n const tree = formatTree(report.tree, {\n maxDepth,\n showProps: opts.showProps,\n showHooks: opts.showHooks,\n });\n\n process.stdout.write(`${tree}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n\n // ── report ───────────────────────────────────────────────────────────────\n program\n .command(\"report <url>\")\n .description(\"Capture and display a human-readable summary of a React app\")\n .option(\"--json\", \"Output as structured JSON instead of human-readable text\", false)\n .option(\"--timeout <ms>\", \"Max wait time for React to mount (ms)\", \"10000\")\n .option(\"--wait <ms>\", \"Additional wait after page load before capture (ms)\", \"0\")\n .action(\n async (\n url: string,\n opts: {\n json: boolean;\n timeout: string;\n wait: string;\n },\n ) => {\n try {\n const { report } = await browserCapture({\n url,\n timeout: Number.parseInt(opts.timeout, 10),\n wait: Number.parseInt(opts.wait, 10),\n });\n\n if (opts.json) {\n const structured = buildStructuredReport(report);\n process.stdout.write(`${JSON.stringify(structured, null, 2)}\\n`);\n } else {\n const summary = formatReport(report);\n process.stdout.write(`${summary}\\n`);\n }\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n\n // ── generate (existing command — preserved) ──────────────────────────────\n program\n .command(\"generate\")\n .description(\"Generate a Playwright test from a Scope trace file\")\n .argument(\"<trace>\", \"Path to a serialized Scope trace (.json)\")\n .option(\"-o, --output <path>\", \"Output file path\", \"scope.spec.ts\")\n .option(\"-d, --description <text>\", \"Test description\")\n .action((tracePath: string, opts: { output: string; description?: string }) => {\n const raw = readFileSync(tracePath, \"utf-8\");\n const trace = loadTrace(raw);\n const source = generateTest(trace, {\n description: opts.description,\n outputPath: opts.output,\n });\n process.stdout.write(`${source}\\n`);\n });\n\n // ── manifest ─────────────────────────────────────────────────────────────\n program.addCommand(createManifestCommand());\n\n // ── render ───────────────────────────────────────────────────────────────\n program.addCommand(createRenderCommand());\n\n return program;\n}\n","/**\n * browser.ts\n *\n * Shared browser launch + capture logic used by capture/tree/report commands.\n * Uses Playwright directly to launch headless Chromium, inject the Scope\n * runtime IIFE bundle, wait for React to mount, and call capture().\n *\n * The browser-entry bundle is provided by @agent-scope/playwright, which handles:\n * - Vite react-refresh compatibility (renderers proxy Map)\n * - Async first-commit awaiting (React 18 scheduler)\n */\n\nimport { writeFileSync } from \"node:fs\";\nimport type { PageReport } from \"@agent-scope/core\";\nimport { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport { chromium } from \"playwright\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface BrowserCaptureOptions {\n /** URL to navigate to */\n url: string;\n /** Max time (ms) to wait for React to mount. Default: 10000 */\n timeout?: number;\n /** Additional wait (ms) after page load before capturing. Default: 0 */\n wait?: number;\n}\n\nexport interface BrowserCaptureResult {\n report: PageReport;\n}\n\n// ---------------------------------------------------------------------------\n// Main capture function\n// ---------------------------------------------------------------------------\n\n/**\n * Launch a headless browser, navigate to the given URL, inject the Scope\n * runtime, wait for React to mount, call capture(), and return the PageReport.\n */\nexport async function browserCapture(\n options: BrowserCaptureOptions,\n): Promise<BrowserCaptureResult> {\n const { url, timeout = 10_000, wait = 0 } = options;\n\n const browser = await chromium.launch({ headless: true });\n\n try {\n const context = await browser.newContext();\n const page = await context.newPage();\n\n // Inject the @agent-scope/playwright browser-entry bundle before any page scripts run.\n // This bundle correctly handles:\n // 1. Vite react-refresh preamble (renderers proxy Map)\n // 2. React 18 async first-commit awaiting\n await page.addInitScript({ content: getBrowserEntryScript() });\n\n // Navigate and wait for network idle\n await page.goto(url, {\n waitUntil: \"networkidle\",\n timeout: timeout + 5_000,\n });\n\n // Wait for the capture function to be available (bundle injects it synchronously)\n await page.waitForFunction(\n () => {\n return (\n typeof (window as Window & { __SCOPE_CAPTURE__?: unknown }).__SCOPE_CAPTURE__ ===\n \"function\" &&\n (document.readyState === \"complete\" || document.readyState === \"interactive\")\n );\n },\n { timeout },\n );\n\n // Additional wait if requested\n if (wait > 0) {\n await page.waitForTimeout(wait);\n }\n\n // Call the injected capture function — awaits first React commit internally\n const raw = await page.evaluate(async () => {\n const win = window as Window & { __SCOPE_CAPTURE__?: () => Promise<unknown> };\n if (typeof win.__SCOPE_CAPTURE__ !== \"function\") {\n throw new Error(\"Scope runtime not injected\");\n }\n return win.__SCOPE_CAPTURE__();\n });\n\n if (\n raw !== null &&\n typeof raw === \"object\" &&\n \"error\" in raw &&\n typeof (raw as Record<string, unknown>).error === \"string\"\n ) {\n throw new Error(`Scope capture failed: ${(raw as Record<string, unknown>).error as string}`);\n }\n\n const report = { ...(raw as Omit<PageReport, \"route\">), route: null } as PageReport;\n return { report };\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Write a PageReport to a file as JSON.\n */\nexport function writeReportToFile(report: PageReport, outputPath: string, pretty: boolean): void {\n const json = pretty ? JSON.stringify(report, null, 2) : JSON.stringify(report);\n writeFileSync(outputPath, json, \"utf-8\");\n}\n","/**\n * @agent-scope/cli — manifest sub-commands\n *\n * Registers the `scope manifest` command group with four sub-commands:\n * - `scope manifest list`\n * - `scope manifest get <name>`\n * - `scope manifest query`\n * - `scope manifest generate`\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { generateManifest, type Manifest } from \"@agent-scope/manifest\";\nimport { Command } from \"commander\";\nimport {\n formatGetJson,\n formatGetTable,\n formatListJson,\n formatListTable,\n formatQueryJson,\n formatQueryTable,\n isTTY,\n type ListRow,\n matchGlob,\n type QueryRow,\n} from \"./manifest-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\n\n/**\n * Load a manifest from the given path (default: `.reactscope/manifest.json`).\n * Throws with a helpful message if the file is missing.\n */\nexport function loadManifest(manifestPath: string = MANIFEST_PATH): Manifest {\n const absPath = resolve(process.cwd(), manifestPath);\n if (!existsSync(absPath)) {\n throw new Error(`Manifest not found at ${absPath}.\\nRun \\`scope manifest generate\\` first.`);\n }\n const raw = readFileSync(absPath, \"utf-8\");\n return JSON.parse(raw) as Manifest;\n}\n\n/**\n * Decide whether to output as JSON or table based on `--format` flag and TTY.\n */\nfunction resolveFormat(formatFlag: string | undefined): \"json\" | \"table\" {\n if (formatFlag === \"json\") return \"json\";\n if (formatFlag === \"table\") return \"table\";\n return isTTY() ? \"table\" : \"json\";\n}\n\n// ---------------------------------------------------------------------------\n// manifest list\n// ---------------------------------------------------------------------------\n\nfunction registerList(manifestCmd: Command): void {\n manifestCmd\n .command(\"list\")\n .description(\"List all components in the manifest\")\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .option(\"--filter <glob>\", \"Filter components by name glob pattern\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action((opts: { format?: string; filter?: string; manifest: string }) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const format = resolveFormat(opts.format);\n\n let entries = Object.entries(manifest.components);\n\n // Apply --filter glob\n if (opts.filter !== undefined) {\n const filterPattern = opts.filter ?? \"\";\n entries = entries.filter(([name]) => matchGlob(filterPattern, name));\n }\n\n const rows: ListRow[] = entries.map(([name, descriptor]) => ({\n name,\n file: descriptor.filePath,\n complexityClass: descriptor.complexityClass,\n hookCount: descriptor.detectedHooks.length,\n contextCount: descriptor.requiredContexts.length,\n }));\n\n const output = format === \"json\" ? formatListJson(rows) : formatListTable(rows);\n\n process.stdout.write(`${output}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// manifest get\n// ---------------------------------------------------------------------------\n\nfunction registerGet(manifestCmd: Command): void {\n manifestCmd\n .command(\"get <name>\")\n .description(\"Get full details of a single component by name\")\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action((name: string, opts: { format?: string; manifest: string }) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const format = resolveFormat(opts.format);\n\n const descriptor = manifest.components[name];\n if (descriptor === undefined) {\n const available = Object.keys(manifest.components).slice(0, 5).join(\", \");\n const hint = Object.keys(manifest.components).length > 5 ? \", …\" : \"\";\n throw new Error(\n `Component \"${name}\" not found in manifest.\\nAvailable: ${available}${hint}`,\n );\n }\n\n const output =\n format === \"json\" ? formatGetJson(name, descriptor) : formatGetTable(name, descriptor);\n\n process.stdout.write(`${output}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// manifest query\n// ---------------------------------------------------------------------------\n\nfunction registerQuery(manifestCmd: Command): void {\n manifestCmd\n .command(\"query\")\n .description(\"Query components by attributes\")\n .option(\"--context <name>\", \"Find components consuming a context\")\n .option(\"--hook <name>\", \"Find components using a specific hook\")\n .option(\"--complexity <class>\", \"Filter by complexity class: simple or complex\")\n .option(\"--side-effects\", \"Find components with any side effects\", false)\n .option(\"--has-fetch\", \"Find components with fetch calls\", false)\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n (opts: {\n context?: string;\n hook?: string;\n complexity?: string;\n sideEffects: boolean;\n hasFetch: boolean;\n format?: string;\n manifest: string;\n }) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const format = resolveFormat(opts.format);\n\n // Build query description for display\n const queryParts: string[] = [];\n if (opts.context !== undefined) queryParts.push(`context=${opts.context}`);\n if (opts.hook !== undefined) queryParts.push(`hook=${opts.hook}`);\n if (opts.complexity !== undefined) queryParts.push(`complexity=${opts.complexity}`);\n if (opts.sideEffects) queryParts.push(\"side-effects\");\n if (opts.hasFetch) queryParts.push(\"has-fetch\");\n\n if (queryParts.length === 0) {\n process.stderr.write(\n \"No query flags specified. Use --context, --hook, --complexity, --side-effects, or --has-fetch.\\n\",\n );\n process.exit(1);\n }\n\n const queryDesc = queryParts.join(\", \");\n\n let entries = Object.entries(manifest.components);\n\n // Apply filters\n if (opts.context !== undefined) {\n const ctx = opts.context;\n entries = entries.filter(([, d]) => d.requiredContexts.includes(ctx));\n }\n\n if (opts.hook !== undefined) {\n const hook = opts.hook;\n entries = entries.filter(([, d]) => d.detectedHooks.includes(hook));\n }\n\n if (opts.complexity !== undefined) {\n const cls = opts.complexity;\n entries = entries.filter(([, d]) => d.complexityClass === cls);\n }\n\n if (opts.sideEffects) {\n entries = entries.filter(([, d]) => {\n const se = d.sideEffects;\n return (\n se.fetches.length > 0 ||\n se.timers ||\n se.subscriptions.length > 0 ||\n se.globalListeners\n );\n });\n }\n\n if (opts.hasFetch) {\n entries = entries.filter(([, d]) => d.sideEffects.fetches.length > 0);\n }\n\n const rows: QueryRow[] = entries.map(([name, d]) => ({\n name,\n file: d.filePath,\n complexityClass: d.complexityClass,\n hooks: d.detectedHooks.join(\", \") || \"—\",\n contexts: d.requiredContexts.join(\", \") || \"—\",\n }));\n\n const output =\n format === \"json\" ? formatQueryJson(rows) : formatQueryTable(rows, queryDesc);\n\n process.stdout.write(`${output}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// manifest generate\n// ---------------------------------------------------------------------------\n\nfunction registerGenerate(manifestCmd: Command): void {\n manifestCmd\n .command(\"generate\")\n .description(\n \"Generate the component manifest from source and write to .reactscope/manifest.json\",\n )\n .option(\"--root <path>\", \"Project root directory (default: cwd)\")\n .option(\"--output <path>\", \"Output path for manifest.json\", MANIFEST_PATH)\n .option(\"--include <globs>\", \"Comma-separated glob patterns to include\")\n .option(\"--exclude <globs>\", \"Comma-separated glob patterns to exclude\")\n .action(async (opts: { root?: string; output: string; include?: string; exclude?: string }) => {\n try {\n const rootDir = resolve(process.cwd(), opts.root ?? \".\");\n const outputPath = resolve(process.cwd(), opts.output);\n\n const include = opts.include?.split(\",\").map((s) => s.trim());\n const exclude = opts.exclude?.split(\",\").map((s) => s.trim());\n\n process.stderr.write(`Scanning ${rootDir} for React components...\\n`);\n\n const manifest = await generateManifest({\n rootDir,\n ...(include !== undefined && { include }),\n ...(exclude !== undefined && { exclude }),\n });\n\n const componentCount = Object.keys(manifest.components).length;\n process.stderr.write(`Found ${componentCount} components.\\n`);\n\n // Ensure output directory exists\n const outputDir = outputPath.replace(/\\/[^/]+$/, \"\");\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n process.stderr.write(`Manifest written to ${outputPath}\\n`);\n process.stdout.write(`${outputPath}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Public factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create and return the `manifest` command group (does not attach to any\n * parent — caller is responsible for mounting it).\n */\nexport function createManifestCommand(): Command {\n const manifestCmd = new Command(\"manifest\").description(\n \"Query and explore the component manifest\",\n );\n\n registerList(manifestCmd);\n registerGet(manifestCmd);\n registerQuery(manifestCmd);\n registerGenerate(manifestCmd);\n\n return manifestCmd;\n}\n","/**\n * @agent-scope/cli — manifest formatters\n *\n * Utilities for rendering ComponentDescriptor data as human-readable tables\n * or structured JSON, depending on whether stdout is a TTY.\n */\n\nimport type { ComplexityClass, ComponentDescriptor, SideEffects } from \"@agent-scope/manifest\";\n\n// ---------------------------------------------------------------------------\n// TTY detection\n// ---------------------------------------------------------------------------\n\n/**\n * Returns `true` when stdout is connected to an interactive terminal.\n * When piped (e.g. `scope manifest list | jq`), returns `false`.\n */\nexport function isTTY(): boolean {\n return process.stdout.isTTY === true;\n}\n\n// ---------------------------------------------------------------------------\n// Table rendering helpers\n// ---------------------------------------------------------------------------\n\nfunction pad(value: string, width: number): string {\n return value.length >= width ? value.slice(0, width) : value + \" \".repeat(width - value.length);\n}\n\nfunction buildTable(headers: string[], rows: string[][]): string {\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").length)),\n );\n\n const divider = colWidths.map((w) => \"-\".repeat(w)).join(\" \");\n const headerRow = headers.map((h, i) => pad(h, colWidths[i] ?? 0)).join(\" \");\n const dataRows = rows.map((row) =>\n row.map((cell, i) => pad(cell ?? \"\", colWidths[i] ?? 0)).join(\" \"),\n );\n\n return [headerRow, divider, ...dataRows].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// manifest list\n// ---------------------------------------------------------------------------\n\nexport interface ListRow {\n name: string;\n file: string;\n complexityClass: ComplexityClass;\n hookCount: number;\n contextCount: number;\n}\n\nexport function formatListTable(rows: ListRow[]): string {\n if (rows.length === 0) return \"No components found.\";\n\n const headers = [\"NAME\", \"FILE\", \"COMPLEXITY\", \"HOOKS\", \"CONTEXTS\"];\n const tableRows = rows.map((r) => [\n r.name,\n r.file,\n r.complexityClass,\n String(r.hookCount),\n String(r.contextCount),\n ]);\n\n return buildTable(headers, tableRows);\n}\n\nexport function formatListJson(rows: ListRow[]): string {\n return JSON.stringify(rows, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// manifest get\n// ---------------------------------------------------------------------------\n\nfunction formatSideEffects(se: SideEffects): string {\n const parts: string[] = [];\n if (se.fetches.length > 0) parts.push(`fetches: ${se.fetches.join(\", \")}`);\n if (se.timers) parts.push(\"timers\");\n if (se.subscriptions.length > 0) parts.push(`subscriptions: ${se.subscriptions.join(\", \")}`);\n if (se.globalListeners) parts.push(\"globalListeners\");\n return parts.length > 0 ? parts.join(\" | \") : \"none\";\n}\n\nexport function formatGetTable(name: string, descriptor: ComponentDescriptor): string {\n const propNames = Object.keys(descriptor.props);\n\n const lines: string[] = [\n `Component: ${name}`,\n ` File: ${descriptor.filePath}`,\n ` Export: ${descriptor.exportType}`,\n ` Display Name: ${descriptor.displayName}`,\n ` Complexity: ${descriptor.complexityClass}`,\n ` Memoized: ${descriptor.memoized}`,\n ` Forwarded Ref: ${descriptor.forwardedRef}`,\n ` HOC Wrappers: ${descriptor.hocWrappers.join(\", \") || \"none\"}`,\n ` Hooks: ${descriptor.detectedHooks.join(\", \") || \"none\"}`,\n ` Contexts: ${descriptor.requiredContexts.join(\", \") || \"none\"}`,\n ` Composes: ${descriptor.composes.join(\", \") || \"none\"}`,\n ` Composed By: ${descriptor.composedBy.join(\", \") || \"none\"}`,\n ` Side Effects: ${formatSideEffects(descriptor.sideEffects)}`,\n \"\",\n ` Props (${propNames.length}):`,\n ];\n\n if (propNames.length === 0) {\n lines.push(\" (none)\");\n } else {\n for (const propName of propNames) {\n const p = descriptor.props[propName];\n if (p === undefined) continue;\n const req = p.required ? \"required\" : \"optional\";\n const def = p.default !== undefined ? ` [default: ${p.default}]` : \"\";\n const vals = p.values !== undefined ? ` (${p.values.join(\" | \")})` : \"\";\n lines.push(` ${propName}: ${p.rawType}${vals} — ${req}${def}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatGetJson(name: string, descriptor: ComponentDescriptor): string {\n return JSON.stringify({ name, ...descriptor }, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// manifest query\n// ---------------------------------------------------------------------------\n\nexport interface QueryRow {\n name: string;\n file: string;\n complexityClass: ComplexityClass;\n hooks: string;\n contexts: string;\n}\n\nexport function formatQueryTable(rows: QueryRow[], queryDesc: string): string {\n if (rows.length === 0) return `No components match: ${queryDesc}`;\n\n const headers = [\"NAME\", \"FILE\", \"COMPLEXITY\", \"HOOKS\", \"CONTEXTS\"];\n const tableRows = rows.map((r) => [r.name, r.file, r.complexityClass, r.hooks, r.contexts]);\n\n return `Query: ${queryDesc}\\n\\n${buildTable(headers, tableRows)}`;\n}\n\nexport function formatQueryJson(rows: QueryRow[]): string {\n return JSON.stringify(rows, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// Glob matching\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal glob matcher supporting `*` (any chars except `/`) and `**` (any chars).\n * Only used for `--filter` on component names.\n */\nexport function matchGlob(pattern: string, value: string): boolean {\n // Escape regex special chars except *\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"§GLOBSTAR§\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/§GLOBSTAR§/g, \".*\");\n const regex = new RegExp(`^${regexStr}$`, \"i\");\n return regex.test(value);\n}\n","/**\n * @agent-scope/cli — render commands\n *\n * Provides three sub-commands under `scope render`:\n *\n * scope render <component> — single component render\n * scope render matrix <component> — matrix (Cartesian product) render\n * scope render all — full-project batch render\n *\n * Routing:\n * - All components → BrowserPool (Playwright, real DOM rendering)\n * - Props passed via --props JSON are forwarded to the component\n * - esbuild bundles the component + its deps into a self-contained IIFE\n *\n * All three commands load the manifest to discover components and their\n * file paths. The manifest must be generated first with\n * `scope manifest generate`.\n *\n * ## TTY vs Pipe output\n *\n * When stdout is a TTY (interactive terminal), commands write PNG files and\n * print a one-line human-readable summary. When stdout is piped, commands\n * emit structured JSON for programmatic consumers. The --format flag always\n * overrides auto-detection.\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { MatrixAxis, MatrixRenderer, MatrixResult, RenderResult } from \"@agent-scope/render\";\nimport {\n ALL_CONTEXT_IDS,\n ALL_STRESS_IDS,\n BrowserPool,\n contextAxis,\n RenderMatrix,\n SatoriRenderer,\n safeRender,\n stressAxis,\n} from \"@agent-scope/render\";\nimport { Command } from \"commander\";\nimport { buildComponentHarness } from \"./component-bundler.js\";\nimport { loadManifest } from \"./manifest-commands.js\";\nimport {\n formatMatrixCsv,\n formatMatrixHtml,\n formatMatrixJson,\n formatRenderJson,\n formatSummaryText,\n isTTY,\n parseViewport,\n renderProgressBar,\n} from \"./render-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\nconst DEFAULT_OUTPUT_DIR = \".reactscope/renders\";\n\n// ---------------------------------------------------------------------------\n// BrowserPool singleton (lazy-initialised, shared across renders in one run)\n// ---------------------------------------------------------------------------\n\nlet _pool: BrowserPool | null = null;\n\nasync function getPool(viewportWidth: number, viewportHeight: number): Promise<BrowserPool> {\n if (_pool === null) {\n _pool = new BrowserPool({\n size: { browsers: 1, pagesPerBrowser: 4 },\n viewportWidth,\n viewportHeight,\n });\n await _pool.init();\n }\n return _pool;\n}\n\nasync function shutdownPool(): Promise<void> {\n if (_pool !== null) {\n await _pool.close();\n _pool = null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Renderer factory — replaces the stub\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a MatrixRenderer-compatible adapter that uses BrowserPool + esbuild\n * to produce real screenshots of the component.\n *\n * @param filePath - Absolute path to the component source file\n * @param componentName - Component name (used to resolve named exports)\n * @param viewportWidth - Viewport width in pixels\n * @param viewportHeight - Viewport height in pixels\n */\nfunction buildRenderer(\n filePath: string,\n componentName: string,\n viewportWidth: number,\n viewportHeight: number,\n): MatrixRenderer & { _satori: SatoriRenderer } {\n // Keep a SatoriRenderer reference to satisfy the existing type contract.\n // It is not used for actual rendering but satisfies TS structural checks.\n const satori = new SatoriRenderer({\n defaultViewport: { width: viewportWidth, height: viewportHeight },\n });\n\n return {\n _satori: satori,\n async renderCell(\n props: Record<string, unknown>,\n _complexityClass?: import(\"@agent-scope/manifest\").ComplexityClass,\n ): Promise<RenderResult> {\n const startMs = performance.now();\n\n const pool = await getPool(viewportWidth, viewportHeight);\n\n // Build HTML harness with bundled component + props\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n );\n\n // Acquire a Playwright page from the pool\n const slot = await pool.acquire();\n const { page } = slot;\n\n try {\n // Load the harness — this is a real navigation (setContent)\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\n // Wait for our render signal (set by the harness script)\n await page.waitForFunction(\n () => {\n const w = window as Window & {\n __SCOPE_RENDER_COMPLETE__?: boolean;\n __SCOPE_RENDER_ERROR__?: string;\n };\n return w.__SCOPE_RENDER_COMPLETE__ === true;\n },\n { timeout: 15_000 },\n );\n\n // Check for render errors\n const renderError = await page.evaluate(() => {\n return (\n (\n window as Window & {\n __SCOPE_RENDER_ERROR__?: string;\n }\n ).__SCOPE_RENDER_ERROR__ ?? null\n );\n });\n\n if (renderError !== null) {\n throw new Error(`Component render error: ${renderError}`);\n }\n\n const renderTimeMs = performance.now() - startMs;\n\n // Screenshot the component root element\n const rootLocator = page.locator(\"[data-reactscope-root]\");\n const boundingBox = await rootLocator.boundingBox();\n\n if (boundingBox === null || boundingBox.width === 0 || boundingBox.height === 0) {\n throw new Error(\n `Component \"${componentName}\" rendered with zero bounding box — it may be invisible or not mounted`,\n );\n }\n\n // Apply padding + enforce minimums so tiny components (e.g. icons) produce\n // a readable screenshot rather than a pixel-tight 16×18 crop.\n const PAD = 24;\n const MIN_W = 320;\n const MIN_H = 200;\n\n const clipX = Math.max(0, boundingBox.x - PAD);\n const clipY = Math.max(0, boundingBox.y - PAD);\n const rawW = boundingBox.width + PAD * 2;\n const rawH = boundingBox.height + PAD * 2;\n const clipW = Math.max(rawW, MIN_W);\n const clipH = Math.max(rawH, MIN_H);\n\n // Clamp to viewport dimensions to avoid Playwright out-of-bounds errors.\n // Use the known viewport dimensions rather than page.viewportSize() so this\n // works correctly in test environments where the page mock may not implement it.\n const safeW = Math.min(clipW, viewportWidth - clipX);\n const safeH = Math.min(clipH, viewportHeight - clipY);\n\n const screenshot = await page.screenshot({\n clip: { x: clipX, y: clipY, width: safeW, height: safeH },\n type: \"png\",\n });\n\n // Collect basic computed styles from the root child\n const computedStyles: Record<string, Record<string, string>> = {};\n const styles = await page.evaluate((sel: string) => {\n const el = document.querySelector(sel);\n if (el === null) return {} as Record<string, string>;\n const computed = window.getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of [\n \"display\",\n \"width\",\n \"height\",\n \"color\",\n \"backgroundColor\",\n \"fontSize\",\n \"fontFamily\",\n \"padding\",\n \"margin\",\n ]) {\n out[prop] = computed.getPropertyValue(prop);\n }\n return out;\n }, \"[data-reactscope-root] > *\");\n computedStyles[\"[data-reactscope-root] > *\"] = styles;\n\n return {\n screenshot,\n width: Math.round(safeW),\n height: Math.round(safeH),\n renderTimeMs,\n computedStyles,\n };\n } finally {\n pool.release(slot);\n }\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// scope render <component>\n// ---------------------------------------------------------------------------\n\nfunction registerRenderSingle(renderCmd: Command): void {\n renderCmd\n .command(\"component <component>\", { isDefault: true })\n .description(\"Render a single component to PNG or JSON\")\n .option(\"--props <json>\", 'Inline props JSON, e.g. \\'{\"variant\":\"primary\"}\\'')\n .option(\"--viewport <WxH>\", \"Viewport size e.g. 1280x720\", \"375x812\")\n .option(\"--theme <name>\", \"Theme name from the token system\")\n .option(\"-o, --output <path>\", \"Write PNG to file instead of stdout\")\n .option(\"--format <fmt>\", \"Output format: png or json (default: auto)\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n async (\n componentName: string,\n opts: {\n props?: string;\n viewport: string;\n theme?: string;\n output?: string;\n format?: string;\n manifest: string;\n },\n ) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const descriptor = manifest.components[componentName];\n if (descriptor === undefined) {\n const available = Object.keys(manifest.components).slice(0, 5).join(\", \");\n throw new Error(\n `Component \"${componentName}\" not found in manifest.\\nAvailable: ${available}`,\n );\n }\n\n // Parse props\n let props: Record<string, unknown> = {};\n if (opts.props !== undefined) {\n try {\n props = JSON.parse(opts.props) as Record<string, unknown>;\n } catch {\n throw new Error(`Invalid props JSON: ${opts.props}`);\n }\n }\n\n // Parse viewport\n const { width, height } = parseViewport(opts.viewport);\n\n // Resolve component file path\n const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n // Build renderer\n const renderer = buildRenderer(filePath, componentName, width, height);\n\n process.stderr.write(\n `Rendering ${componentName} [${descriptor.complexityClass}] at ${width}×${height}…\\n`,\n );\n\n const outcome = await safeRender(\n () => renderer.renderCell(props, descriptor.complexityClass),\n {\n props,\n sourceLocation: {\n file: descriptor.filePath,\n line: descriptor.loc.start,\n column: 0,\n },\n },\n );\n\n await shutdownPool();\n\n if (outcome.crashed) {\n process.stderr.write(`✗ Render failed: ${outcome.error.message}\\n`);\n const hintList = outcome.error.heuristicFlags.join(\", \");\n if (hintList.length > 0) {\n process.stderr.write(` Hints: ${hintList}\\n`);\n }\n process.exit(1);\n }\n\n const result = outcome.result;\n\n // Determine output format\n // --output always means \"write PNG to that path\"\n // --format explicit overrides auto-detection\n // TTY with no flags → write PNG to default dir, print summary\n // Pipe with no flags → emit JSON to stdout\n\n if (opts.output !== undefined) {\n // Explicit output path — always write PNG\n const outPath = resolve(process.cwd(), opts.output);\n writeFileSync(outPath, result.screenshot);\n process.stdout.write(\n `✓ ${componentName} → ${opts.output} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n return;\n }\n\n const fmt = resolveSingleFormat(opts.format);\n\n if (fmt === \"json\") {\n const json = formatRenderJson(componentName, props, result);\n process.stdout.write(`${JSON.stringify(json, null, 2)}\\n`);\n } else if (fmt === \"file\") {\n // TTY default: write PNG to .reactscope/renders/<component>.png\n const dir = resolve(process.cwd(), DEFAULT_OUTPUT_DIR);\n mkdirSync(dir, { recursive: true });\n const outPath = resolve(dir, `${componentName}.png`);\n writeFileSync(outPath, result.screenshot);\n const relPath = `${DEFAULT_OUTPUT_DIR}/${componentName}.png`;\n process.stdout.write(\n `✓ ${componentName} → ${relPath} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n } else {\n // fmt === \"png\" — explicit --format png, write to default file\n const dir = resolve(process.cwd(), DEFAULT_OUTPUT_DIR);\n mkdirSync(dir, { recursive: true });\n const outPath = resolve(dir, `${componentName}.png`);\n writeFileSync(outPath, result.screenshot);\n const relPath = `${DEFAULT_OUTPUT_DIR}/${componentName}.png`;\n process.stdout.write(\n `✓ ${componentName} → ${relPath} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n }\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// scope render matrix <component>\n// ---------------------------------------------------------------------------\n\nfunction registerRenderMatrix(renderCmd: Command): void {\n renderCmd\n .command(\"matrix <component>\")\n .description(\"Render a component across a matrix of prop axes\")\n .option(\"--axes <spec>\", \"Axis definitions e.g. 'variant:primary,secondary size:sm,md,lg'\")\n .option(\n \"--contexts <ids>\",\n \"Composition context IDs, comma-separated (e.g. centered,rtl,sidebar)\",\n )\n .option(\"--stress <ids>\", \"Stress preset IDs, comma-separated (e.g. text.long,text.unicode)\")\n .option(\"--sprite <path>\", \"Write sprite sheet PNG to file\")\n .option(\"--format <fmt>\", \"Output format: json|png|html|csv (default: auto)\")\n .option(\"--concurrency <n>\", \"Max parallel renders\", \"8\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n async (\n componentName: string,\n opts: {\n axes?: string;\n contexts?: string;\n stress?: string;\n sprite?: string;\n format?: string;\n concurrency: string;\n manifest: string;\n },\n ) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const descriptor = manifest.components[componentName];\n if (descriptor === undefined) {\n const available = Object.keys(manifest.components).slice(0, 5).join(\", \");\n throw new Error(\n `Component \"${componentName}\" not found in manifest.\\nAvailable: ${available}`,\n );\n }\n\n const concurrency = Math.max(1, parseInt(opts.concurrency, 10) || 8);\n const { width, height } = { width: 375, height: 812 };\n\n // Resolve component file path\n const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n const renderer = buildRenderer(filePath, componentName, width, height);\n\n // Build axes\n const axes: MatrixAxis[] = [];\n\n if (opts.axes !== undefined) {\n // Parse \"variant:primary,secondary size:sm,md,lg\"\n const axisSpecs = opts.axes.trim().split(/\\s+/);\n for (const spec of axisSpecs) {\n const colonIdx = spec.indexOf(\":\");\n if (colonIdx < 0) {\n throw new Error(`Invalid axis spec \"${spec}\". Expected format: name:val1,val2,...`);\n }\n const name = spec.slice(0, colonIdx);\n const values = spec\n .slice(colonIdx + 1)\n .split(\",\")\n .map((v) => v.trim());\n if (name.length === 0 || values.length === 0) {\n throw new Error(`Invalid axis spec \"${spec}\"`);\n }\n axes.push({ name, values });\n }\n }\n\n if (opts.contexts !== undefined) {\n const ids = opts.contexts.split(\",\").map((s) => s.trim());\n const validIds = new Set<string>(ALL_CONTEXT_IDS);\n for (const id of ids) {\n if (!validIds.has(id)) {\n throw new Error(\n `Unknown context ID \"${id}\". Available: ${ALL_CONTEXT_IDS.join(\", \")}`,\n );\n }\n }\n const cAxis = contextAxis(ids as Parameters<typeof contextAxis>[0]);\n axes.push({ name: cAxis.name, values: cAxis.values });\n }\n\n if (opts.stress !== undefined) {\n const ids = opts.stress.split(\",\").map((s) => s.trim());\n for (const id of ids) {\n try {\n const sAxis = stressAxis(id as Parameters<typeof stressAxis>[0]);\n axes.push({ name: sAxis.name, values: sAxis.values });\n } catch {\n throw new Error(\n `Unknown stress preset \"${id}\". Available: ${ALL_STRESS_IDS.join(\", \")}`,\n );\n }\n }\n }\n\n if (axes.length === 0) {\n throw new Error(\n \"No axes defined. Use --axes, --contexts, or --stress to specify matrix dimensions.\",\n );\n }\n\n process.stderr.write(\n `Rendering matrix for ${componentName}: ${axes.map((a) => `${a.name}(${a.values.length})`).join(\" × \")}…\\n`,\n );\n\n const matrix = new RenderMatrix(renderer, axes, {\n complexityClass: descriptor.complexityClass,\n concurrency,\n });\n const result: MatrixResult = await matrix.render();\n\n await shutdownPool();\n\n process.stderr.write(\n `Done. ${result.stats.totalCells} cells, avg ${result.stats.avgRenderTimeMs.toFixed(1)}ms\\n`,\n );\n\n // Sprite sheet — explicit --sprite flag always writes to that path\n if (opts.sprite !== undefined) {\n const { SpriteSheetGenerator } = await import(\"@agent-scope/render\");\n const gen = new SpriteSheetGenerator();\n const sheet = await gen.generate(result);\n const spritePath = resolve(process.cwd(), opts.sprite);\n writeFileSync(spritePath, sheet.png);\n process.stderr.write(`Sprite sheet saved to ${spritePath}\\n`);\n }\n\n // Output format resolution\n // TTY with no --format and no --sprite → write sprite sheet to default path, print summary\n // Pipe with no --format → JSON\n // Explicit --format → honour it\n const fmt = resolveMatrixFormat(opts.format, opts.sprite !== undefined);\n\n if (fmt === \"file\") {\n // TTY default: sprite sheet to .reactscope/renders/<component>-matrix.png\n const { SpriteSheetGenerator } = await import(\"@agent-scope/render\");\n const gen = new SpriteSheetGenerator();\n const sheet = await gen.generate(result);\n const dir = resolve(process.cwd(), DEFAULT_OUTPUT_DIR);\n mkdirSync(dir, { recursive: true });\n const outPath = resolve(dir, `${componentName}-matrix.png`);\n writeFileSync(outPath, sheet.png);\n const relPath = `${DEFAULT_OUTPUT_DIR}/${componentName}-matrix.png`;\n process.stdout.write(\n `✓ ${componentName} matrix (${result.stats.totalCells} cells) → ${relPath} (${result.stats.wallClockTimeMs.toFixed(0)}ms total)\\n`,\n );\n } else if (fmt === \"json\") {\n process.stdout.write(`${JSON.stringify(formatMatrixJson(result), null, 2)}\\n`);\n } else if (fmt === \"png\") {\n if (opts.sprite !== undefined) {\n // Already written above\n } else {\n const { SpriteSheetGenerator } = await import(\"@agent-scope/render\");\n const gen = new SpriteSheetGenerator();\n const sheet = await gen.generate(result);\n process.stdout.write(sheet.png);\n }\n } else if (fmt === \"html\") {\n process.stdout.write(formatMatrixHtml(componentName, result));\n } else if (fmt === \"csv\") {\n process.stdout.write(formatMatrixCsv(componentName, result));\n }\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// scope render all\n// ---------------------------------------------------------------------------\n\nfunction registerRenderAll(renderCmd: Command): void {\n renderCmd\n .command(\"all\")\n .description(\"Render all components from the manifest\")\n .option(\"--concurrency <n>\", \"Max parallel renders\", \"4\")\n .option(\"--output-dir <dir>\", \"Output directory for renders\", DEFAULT_OUTPUT_DIR)\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .option(\"--format <fmt>\", \"Output format: json|png (default: png)\", \"png\")\n .action(\n async (opts: {\n concurrency: string;\n outputDir: string;\n manifest: string;\n format: string;\n }) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const componentNames = Object.keys(manifest.components);\n const total = componentNames.length;\n\n if (total === 0) {\n process.stderr.write(\"No components found in manifest.\\n\");\n return;\n }\n\n const concurrency = Math.max(1, parseInt(opts.concurrency, 10) || 4);\n const outputDir = resolve(process.cwd(), opts.outputDir);\n mkdirSync(outputDir, { recursive: true });\n const rootDir = process.cwd();\n\n process.stderr.write(`Rendering ${total} components (concurrency: ${concurrency})…\\n`);\n\n const results: Array<{\n name: string;\n renderTimeMs: number;\n success: boolean;\n errorMessage?: string;\n }> = [];\n\n let completed = 0;\n\n const renderOne = async (name: string): Promise<void> => {\n const descriptor = manifest.components[name];\n if (descriptor === undefined) return;\n\n const filePath = resolve(rootDir, descriptor.filePath);\n const renderer = buildRenderer(filePath, name, 375, 812);\n\n const outcome = await safeRender(\n () => renderer.renderCell({}, descriptor.complexityClass),\n {\n props: {},\n sourceLocation: {\n file: descriptor.filePath,\n line: descriptor.loc.start,\n column: 0,\n },\n },\n );\n\n completed++;\n const pct = Math.round((completed / total) * 100);\n process.stderr.write(`${renderProgressBar(completed, total, name, pct)}\\r`);\n\n if (outcome.crashed) {\n results.push({\n name,\n renderTimeMs: 0,\n success: false,\n errorMessage: outcome.error.message,\n });\n // Write an error JSON alongside\n const errPath = resolve(outputDir, `${name}.error.json`);\n writeFileSync(\n errPath,\n JSON.stringify(\n {\n component: name,\n errorMessage: outcome.error.message,\n heuristicFlags: outcome.error.heuristicFlags,\n propsAtCrash: outcome.error.propsAtCrash,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n const result = outcome.result;\n results.push({ name, renderTimeMs: result.renderTimeMs, success: true });\n\n // Write PNG\n const pngPath = resolve(outputDir, `${name}.png`);\n writeFileSync(pngPath, result.screenshot);\n\n // Write JSON\n const jsonPath = resolve(outputDir, `${name}.json`);\n writeFileSync(jsonPath, JSON.stringify(formatRenderJson(name, {}, result), null, 2));\n\n // On TTY, print a per-component one-liner to stdout\n if (isTTY()) {\n process.stdout.write(\n `✓ ${name} → ${opts.outputDir}/${name}.png (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n }\n };\n\n // Concurrency pool\n let nextIdx = 0;\n const worker = async (): Promise<void> => {\n while (nextIdx < componentNames.length) {\n const i = nextIdx++;\n const name = componentNames[i];\n if (name !== undefined) {\n await renderOne(name);\n }\n }\n };\n\n const workers: Promise<void>[] = [];\n for (let w = 0; w < Math.min(concurrency, total); w++) {\n workers.push(worker());\n }\n await Promise.all(workers);\n\n await shutdownPool();\n\n process.stderr.write(\"\\n\");\n\n // Summary always goes to stderr (it's metadata); stdout is for\n // per-component one-liners on TTY or JSON on pipe\n const summary = formatSummaryText(results, outputDir);\n process.stderr.write(`${summary}\\n`);\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Format resolution helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the output format for `scope render <component>`.\n *\n * Priority:\n * 1. Explicit --format flag\n * 2. TTY → \"file\" (write PNG to default path, print one-liner)\n * 3. Pipe → \"json\" (emit structured JSON for programmatic consumers)\n */\nfunction resolveSingleFormat(formatFlag: string | undefined): \"file\" | \"json\" | \"png\" {\n if (formatFlag !== undefined) {\n const lower = formatFlag.toLowerCase();\n if (lower !== \"png\" && lower !== \"json\") {\n throw new Error(`Unknown format \"${formatFlag}\". Allowed: png, json`);\n }\n return lower;\n }\n return isTTY() ? \"file\" : \"json\";\n}\n\n/**\n * Resolve the output format for `scope render matrix <component>`.\n *\n * Priority:\n * 1. Explicit --format flag\n * 2. TTY and --sprite not already handled → \"file\" (write sprite sheet to default path)\n * 3. Pipe → \"json\"\n */\nfunction resolveMatrixFormat(\n formatFlag: string | undefined,\n spriteAlreadyWritten: boolean,\n): \"file\" | \"json\" | \"png\" | \"html\" | \"csv\" {\n if (formatFlag !== undefined) {\n const lower = formatFlag.toLowerCase();\n const allowed = [\"json\", \"png\", \"html\", \"csv\"] as const;\n if (!(allowed as readonly string[]).includes(lower)) {\n throw new Error(`Unknown format \"${formatFlag}\". Allowed: ${allowed.join(\", \")}`);\n }\n return lower as \"json\" | \"png\" | \"html\" | \"csv\";\n }\n if (isTTY() && !spriteAlreadyWritten) {\n return \"file\";\n }\n return \"json\";\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates and returns the `render` command group with three sub-commands:\n * - `scope render <component>` (default)\n * - `scope render matrix <component>`\n * - `scope render all`\n */\nexport function createRenderCommand(): Command {\n const renderCmd = new Command(\"render\").description(\n \"Render components to PNG or JSON via esbuild + BrowserPool\",\n );\n\n registerRenderSingle(renderCmd);\n registerRenderMatrix(renderCmd);\n registerRenderAll(renderCmd);\n\n return renderCmd;\n}\n","/**\n * component-bundler.ts\n *\n * Bundles a React component source file into a self-contained IIFE using\n * esbuild, then wraps it in an HTML harness that Playwright can load via\n * page.setContent().\n *\n * Design\n * ------\n * 1. A thin wrapper entry (via esbuild stdin) imports the real component file,\n * resolves the default or named export, and renders it into #scope-root via\n * ReactDOM.createRoot(). All dependencies (react, react-dom, …) are bundled\n * inline — no CDN, no network.\n *\n * 2. esbuild format \"iife\" wraps everything in (function(){ … })() so the\n * script can be embedded as a plain <script> tag (no type=\"module\" needed,\n * no blob-URL import tricks required).\n *\n * 3. After React finishes rendering, the script sets\n * window.__SCOPE_RENDER_COMPLETE__ = true (or __SCOPE_RENDER_ERROR__).\n * The caller waits on this flag via page.waitForFunction().\n */\n\nimport { dirname } from \"node:path\";\nimport * as esbuild from \"esbuild\";\n\n// ---------------------------------------------------------------------------\n// HTML harness builder\n// ---------------------------------------------------------------------------\n\n/**\n * Bundle the component at `filePath` and return a complete HTML page that\n * renders it with `props`. Suitable for page.setContent().\n *\n * @param filePath - Absolute path to the component source file\n * @param componentName - The export name to try first (for named exports).\n * Falls back to `default` and first function found.\n * @param props - Props to pass to the component\n * @param viewportWidth - Used in the viewport meta tag\n */\nexport async function buildComponentHarness(\n filePath: string,\n componentName: string,\n props: Record<string, unknown>,\n viewportWidth: number,\n): Promise<string> {\n const bundledScript = await bundleComponentToIIFE(filePath, componentName, props);\n return wrapInHtml(bundledScript, viewportWidth);\n}\n\n// ---------------------------------------------------------------------------\n// esbuild bundling\n// ---------------------------------------------------------------------------\n\n/**\n * Build the wrapper + component into a single IIFE script string.\n * The IIFE handles rendering and signals completion via globals.\n */\nasync function bundleComponentToIIFE(\n filePath: string,\n componentName: string,\n props: Record<string, unknown>,\n): Promise<string> {\n // Safely encode props — avoid </script> injection\n const propsJson = JSON.stringify(props).replace(/<\\/script>/gi, \"<\\\\/script>\");\n\n // The wrapper entry: import component, pick export, render, signal done.\n // We use the filePath as an absolute import — esbuild handles this via absWorkingDir.\n const wrapperCode = /* ts */ `\nimport * as __scopeMod from ${JSON.stringify(filePath)};\nimport { createRoot } from \"react-dom/client\";\nimport { createElement } from \"react\";\n\n(function scopeRenderHarness() {\n var Component =\n __scopeMod[\"default\"] ||\n __scopeMod[${JSON.stringify(componentName)}] ||\n (Object.values(__scopeMod).find(\n function(v) { return typeof v === \"function\" && /^[A-Z]/.test(v.name || \"\"); }\n ));\n\n if (!Component) {\n window.__SCOPE_RENDER_ERROR__ =\n \"No renderable component found. Checked: default, \" +\n ${JSON.stringify(componentName)} + \", and PascalCase named exports. \" +\n \"Available exports: \" + Object.keys(__scopeMod).join(\", \");\n window.__SCOPE_RENDER_COMPLETE__ = true;\n return;\n }\n\n try {\n var props = ${propsJson};\n var rootEl = document.getElementById(\"scope-root\");\n if (!rootEl) {\n window.__SCOPE_RENDER_ERROR__ = \"#scope-root element not found\";\n window.__SCOPE_RENDER_COMPLETE__ = true;\n return;\n }\n createRoot(rootEl).render(createElement(Component, props));\n // Use requestAnimationFrame to let React flush the render\n requestAnimationFrame(function() {\n window.__SCOPE_RENDER_COMPLETE__ = true;\n });\n } catch (err) {\n window.__SCOPE_RENDER_ERROR__ = err instanceof Error ? err.message : String(err);\n window.__SCOPE_RENDER_COMPLETE__ = true;\n }\n})();\n`;\n\n const result = await esbuild.build({\n stdin: {\n contents: wrapperCode,\n // Resolve relative imports (within the component's dir)\n resolveDir: dirname(filePath),\n loader: \"tsx\",\n sourcefile: \"__scope_harness__.tsx\",\n },\n bundle: true,\n format: \"iife\",\n write: false,\n platform: \"browser\",\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n target: \"es2020\",\n // Bundle everything — no externals\n external: [],\n define: {\n \"process.env.NODE_ENV\": '\"development\"',\n global: \"globalThis\",\n },\n logLevel: \"silent\",\n // Suppress \"React must be in scope\" warnings from old JSX (we use automatic)\n banner: {\n js: \"/* @agent-scope/cli component harness */\",\n },\n });\n\n if (result.errors.length > 0) {\n const msg = result.errors\n .map((e) => `${e.text}${e.location ? ` (${e.location.file}:${e.location.line})` : \"\"}`)\n .join(\"\\n\");\n throw new Error(`esbuild failed to bundle component:\\n${msg}`);\n }\n\n const outputFile = result.outputFiles?.[0];\n if (outputFile === undefined || outputFile.text.length === 0) {\n throw new Error(\"esbuild produced no output\");\n }\n\n return outputFile.text;\n}\n\n// ---------------------------------------------------------------------------\n// HTML template\n// ---------------------------------------------------------------------------\n\nfunction wrapInHtml(bundledScript: string, viewportWidth: number): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=${viewportWidth}, initial-scale=1.0\" />\n <style>\n *, *::before, *::after { box-sizing: border-box; }\n html, body { margin: 0; padding: 0; background: #fff; font-family: system-ui, sans-serif; }\n #scope-root { display: inline-block; min-width: 1px; min-height: 1px; }\n </style>\n</head>\n<body>\n <div id=\"scope-root\" data-reactscope-root></div>\n <script>${bundledScript}</script>\n</body>\n</html>`;\n}\n","/**\n * @agent-scope/cli — render output formatters\n *\n * Formats RenderResult, MatrixResult, and batch render summaries in:\n * - JSON (full structured data)\n * - PNG (raw Buffer or file write)\n * - HTML (visual grid with embedded base64 images)\n * - CSV (flat table: component, axis values, render time, compliance %)\n *\n * Also provides:\n * - progress bar rendering for `scope render all`\n * - viewport string parsing (e.g. \"1280x720\")\n */\n\nimport type { MatrixCell, MatrixResult, RenderResult } from \"@agent-scope/render\";\n\n// ---------------------------------------------------------------------------\n// Re-export TTY helper (reused from manifest-formatter)\n// ---------------------------------------------------------------------------\n\nexport { isTTY } from \"./manifest-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Viewport parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a viewport string such as \"1280x720\" into `{ width, height }`.\n * Throws if the format is invalid or values are non-positive.\n */\nexport function parseViewport(spec: string): { width: number; height: number } {\n const lower = spec.toLowerCase();\n const match = /^(\\d+)[x×](\\d+)$/.exec(lower);\n if (!match) {\n throw new Error(`Invalid viewport \"${spec}\". Expected format: WIDTHxHEIGHT (e.g. 1280x720)`);\n }\n const width = parseInt(match[1] ?? \"0\", 10);\n const height = parseInt(match[2] ?? \"0\", 10);\n if (width <= 0 || height <= 0) {\n throw new Error(`Viewport dimensions must be positive integers, got: ${spec}`);\n }\n return { width, height };\n}\n\n// ---------------------------------------------------------------------------\n// Single render JSON\n// ---------------------------------------------------------------------------\n\nexport interface RenderJsonOutput {\n component: string;\n props: Record<string, unknown>;\n width: number;\n height: number;\n renderTimeMs: number;\n computedStyles: Record<string, Record<string, string>>;\n screenshot?: string; // base64-encoded PNG\n dom?: RenderResult[\"dom\"];\n console?: RenderResult[\"console\"];\n accessibility?: RenderResult[\"accessibility\"];\n}\n\n/**\n * Format a single `RenderResult` as a structured JSON-serialisable object.\n * The screenshot is base64-encoded for portability.\n */\nexport function formatRenderJson(\n componentName: string,\n props: Record<string, unknown>,\n result: RenderResult,\n): RenderJsonOutput {\n return {\n component: componentName,\n props,\n width: result.width,\n height: result.height,\n renderTimeMs: result.renderTimeMs,\n computedStyles: result.computedStyles,\n screenshot: result.screenshot.toString(\"base64\"),\n dom: result.dom,\n console: result.console,\n accessibility: result.accessibility,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix JSON\n// ---------------------------------------------------------------------------\n\nexport interface MatrixJsonOutput {\n axes: Array<{ name: string; values: string[] }>;\n stats: {\n totalCells: number;\n totalRenderTimeMs: number;\n avgRenderTimeMs: number;\n minRenderTimeMs: number;\n maxRenderTimeMs: number;\n wallClockTimeMs: number;\n };\n cells: Array<{\n index: number;\n axisIndices: number[];\n props: Record<string, unknown>;\n renderTimeMs: number;\n width: number;\n height: number;\n screenshot: string; // base64\n }>;\n}\n\n/**\n * Format a `MatrixResult` as a structured JSON-serialisable object.\n */\nexport function formatMatrixJson(result: MatrixResult): MatrixJsonOutput {\n return {\n axes: result.axes.map((axis) => ({\n name: axis.name,\n values: axis.values.map((v) => String(v)),\n })),\n stats: { ...result.stats },\n cells: result.cells.map((cell: MatrixCell) => ({\n index: cell.index,\n axisIndices: cell.axisIndices,\n props: cell.props,\n renderTimeMs: cell.result.renderTimeMs,\n width: cell.result.width,\n height: cell.result.height,\n screenshot: cell.result.screenshot.toString(\"base64\"),\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix HTML\n// ---------------------------------------------------------------------------\n\n/**\n * Format a `MatrixResult` as an HTML visual grid with embedded images.\n *\n * Each cell is rendered as an `<img>` tag with the screenshot embedded\n * as a data URI, with prop labels displayed beneath each cell.\n */\nexport function formatMatrixHtml(componentName: string, result: MatrixResult): string {\n const cellsHtml = result.cells\n .map((cell: MatrixCell) => {\n const b64 = cell.result.screenshot.toString(\"base64\");\n const propLabel = escapeHtml(\n Object.entries(cell.props)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(\", \"),\n );\n return ` <div class=\"cell\">\n <img src=\"data:image/png;base64,${b64}\" alt=\"${propLabel}\" width=\"${cell.result.width}\" height=\"${cell.result.height}\" />\n <div class=\"label\">${propLabel}</div>\n <div class=\"meta\">${cell.result.renderTimeMs.toFixed(1)}ms</div>\n </div>`;\n })\n .join(\"\\n\");\n\n const axesDesc = result.axes\n .map((a) => `${a.name}: ${a.values.map((v) => String(v)).join(\", \")}`)\n .join(\" | \");\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${escapeHtml(componentName)} — Render Matrix</title>\n <style>\n body { font-family: system-ui, sans-serif; background: #f8fafc; margin: 0; padding: 24px; }\n h1 { font-size: 1.25rem; color: #1e293b; margin-bottom: 8px; }\n .axes { font-size: 0.8rem; color: #64748b; margin-bottom: 20px; }\n .grid { display: flex; flex-wrap: wrap; gap: 16px; }\n .cell { background: #fff; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; }\n .cell img { display: block; }\n .label { padding: 6px 8px; font-size: 0.75rem; color: #374151; border-top: 1px solid #f1f5f9; }\n .meta { padding: 2px 8px 6px; font-size: 0.7rem; color: #94a3b8; }\n .stats { margin-top: 24px; font-size: 0.8rem; color: #64748b; }\n </style>\n</head>\n<body>\n <h1>${escapeHtml(componentName)} — Render Matrix</h1>\n <div class=\"axes\">Axes: ${escapeHtml(axesDesc)}</div>\n <div class=\"grid\">\n${cellsHtml}\n </div>\n <div class=\"stats\">\n ${result.stats.totalCells} cells ·\n avg ${result.stats.avgRenderTimeMs.toFixed(1)}ms ·\n min ${result.stats.minRenderTimeMs.toFixed(1)}ms ·\n max ${result.stats.maxRenderTimeMs.toFixed(1)}ms ·\n wall ${result.stats.wallClockTimeMs.toFixed(0)}ms\n </div>\n</body>\n</html>\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Matrix CSV\n// ---------------------------------------------------------------------------\n\n/**\n * Format a `MatrixResult` as a flat CSV table.\n *\n * Columns: component, [axis name columns...], renderTimeMs\n */\nexport function formatMatrixCsv(componentName: string, result: MatrixResult): string {\n const axisNames = result.axes.map((a) => a.name);\n const headers = [\"component\", ...axisNames, \"renderTimeMs\", \"width\", \"height\"];\n\n const rows = result.cells.map((cell: MatrixCell) => {\n const axisVals = result.axes.map((_, i) => {\n const axisIdx = cell.axisIndices[i];\n const axis = result.axes[i];\n if (axisIdx === undefined || axis === undefined) return \"\";\n const val = axis.values[axisIdx];\n return val !== undefined ? csvEscape(String(val)) : \"\";\n });\n return [\n csvEscape(componentName),\n ...axisVals,\n cell.result.renderTimeMs.toFixed(3),\n String(cell.result.width),\n String(cell.result.height),\n ].join(\",\");\n });\n\n return `${[headers.join(\",\"), ...rows].join(\"\\n\")}\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Progress bar\n// ---------------------------------------------------------------------------\n\n/**\n * Render an ASCII progress bar suitable for terminal output.\n *\n * Output format:\n * Rendering 42/128 components... [=====> ] 33%\n */\nexport function renderProgressBar(\n completed: number,\n total: number,\n currentName: string,\n pct: number,\n barWidth = 20,\n): string {\n const filled = Math.round((pct / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = \"=\".repeat(Math.max(0, filled - 1)) + (filled > 0 ? \">\" : \"\") + \" \".repeat(empty);\n const nameSlice = currentName.slice(0, 25).padEnd(25);\n return `Rendering ${completed}/${total} ${nameSlice} [${bar}] ${pct}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Batch summary\n// ---------------------------------------------------------------------------\n\nexport interface BatchRenderSummaryItem {\n name: string;\n renderTimeMs: number;\n success: boolean;\n errorMessage?: string;\n}\n\n/**\n * Format a human-readable summary of a `scope render all` run.\n */\nexport function formatSummaryText(results: BatchRenderSummaryItem[], outputDir: string): string {\n const total = results.length;\n const passed = results.filter((r) => r.success).length;\n const failed = total - passed;\n const successTimes = results.filter((r) => r.success).map((r) => r.renderTimeMs);\n const avgMs =\n successTimes.length > 0 ? successTimes.reduce((a, b) => a + b, 0) / successTimes.length : 0;\n\n const lines: string[] = [\n \"─\".repeat(60),\n `Render Summary`,\n \"─\".repeat(60),\n ` Total components : ${total}`,\n ` Passed : ${passed}`,\n ` Failed : ${failed}`,\n ` Avg render time : ${avgMs.toFixed(1)}ms`,\n ` Output dir : ${outputDir}`,\n ];\n\n if (failed > 0) {\n lines.push(\"\", \" Failed components:\");\n for (const r of results) {\n if (!r.success) {\n lines.push(` ✗ ${r.name}: ${r.errorMessage ?? \"unknown error\"}`);\n }\n }\n }\n\n lines.push(\"─\".repeat(60));\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction csvEscape(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n","/**\n * tree-formatter.ts\n *\n * Formats a ComponentNode tree as an ASCII tree string similar to the `tree`\n * command — but for React components.\n *\n * Example output:\n * App\n * ├── Layout\n * │ ├── Header\n * │ │ └── Logo\n * │ └── Main\n * │ └── Content\n * └── Footer\n */\n\nimport type { ComponentNode } from \"@agent-scope/core\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TreeFormatOptions {\n /** Maximum depth to display. Undefined = unlimited. */\n maxDepth?: number;\n /** Include prop names next to each component. Default: false */\n showProps?: boolean;\n /** Show hook count per component. Default: false */\n showHooks?: boolean;\n /** Whether to include host (DOM) elements. Default: false */\n showHost?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Box-drawing constants\n// ---------------------------------------------------------------------------\n\nconst BRANCH = \"├── \";\nconst LAST_BRANCH = \"└── \";\nconst VERTICAL = \"│ \";\nconst EMPTY = \" \";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build a human-readable label for a component node.\n */\nfunction buildLabel(node: ComponentNode, options: TreeFormatOptions): string {\n const parts: string[] = [node.name];\n\n // Append component type badges\n if (node.type === \"memo\") {\n parts.push(\"[memo]\");\n } else if (node.type === \"forward_ref\") {\n parts.push(\"[forwardRef]\");\n } else if (node.type === \"class\") {\n parts.push(\"[class]\");\n }\n\n // Prop names\n if (options.showProps === true) {\n const props = node.props;\n if (\n props.type === \"object\" &&\n \"entries\" in props &&\n Array.isArray((props as Record<string, unknown>).entries)\n ) {\n const entries = (props as Record<string, unknown[]>).entries as Array<{\n key: string;\n value: unknown;\n }>;\n const propNames = entries\n .map((e) => e.key)\n .filter((k) => k !== \"children\")\n .slice(0, 4);\n if (propNames.length > 0) {\n parts.push(`{${propNames.join(\", \")}}`);\n }\n } else if (props.type === \"undefined\" || props.type === \"null\") {\n // no props — nothing to show\n } else {\n // Simple preview from the serialized value\n const preview = props.preview;\n if (preview && preview !== \"[object Object]\") {\n parts.push(preview);\n }\n }\n }\n\n // Hook counts\n if (options.showHooks === true && node.state.length > 0) {\n const hookCounts = new Map<string, number>();\n for (const hook of node.state) {\n const label = hook.name ?? hook.type;\n hookCounts.set(label, (hookCounts.get(label) ?? 0) + 1);\n }\n const summary = Array.from(hookCounts.entries())\n .map(([k, v]) => (v > 1 ? `${k}×${v}` : k))\n .join(\", \");\n parts.push(`[${summary}]`);\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Recursively render a node and its children into an array of lines.\n */\nfunction renderNode(\n node: ComponentNode,\n prefix: string,\n isLast: boolean,\n depth: number,\n options: TreeFormatOptions,\n lines: string[],\n): void {\n // Skip host elements unless explicitly requested\n if (node.type === \"host\" && options.showHost !== true) {\n // Still recurse into children so we don't lose user components inside DOM nodes\n const visibleChildren = getVisibleChildren(node, options);\n for (let i = 0; i < visibleChildren.length; i++) {\n const child = visibleChildren[i];\n if (child !== undefined) {\n renderNode(child, prefix, i === visibleChildren.length - 1, depth, options, lines);\n }\n }\n return;\n }\n\n const connector = isLast ? LAST_BRANCH : BRANCH;\n const label = buildLabel(node, options);\n lines.push(`${prefix}${connector}${label}`);\n\n // Stop recursing if we've hit maxDepth\n if (options.maxDepth !== undefined && depth >= options.maxDepth) {\n const childCount = countVisibleDescendants(node, options);\n if (childCount > 0) {\n const nextPrefix = prefix + (isLast ? EMPTY : VERTICAL);\n lines.push(`${nextPrefix}${LAST_BRANCH}… (${childCount} more)`);\n }\n return;\n }\n\n const visibleChildren = getVisibleChildren(node, options);\n const nextPrefix = prefix + (isLast ? EMPTY : VERTICAL);\n\n for (let i = 0; i < visibleChildren.length; i++) {\n const child = visibleChildren[i];\n if (child !== undefined) {\n renderNode(child, nextPrefix, i === visibleChildren.length - 1, depth + 1, options, lines);\n }\n }\n}\n\n/**\n * Filter node children according to display options.\n */\nfunction getVisibleChildren(node: ComponentNode, options: TreeFormatOptions): ComponentNode[] {\n if (options.showHost === true) {\n return node.children;\n }\n // When not showing host, collect effective visible children:\n // host children are replaced by their own visible children (recursively).\n return flattenHostChildren(node.children, options);\n}\n\nfunction flattenHostChildren(\n children: ComponentNode[],\n options: TreeFormatOptions,\n): ComponentNode[] {\n const result: ComponentNode[] = [];\n for (const child of children) {\n if (child.type === \"host\") {\n result.push(...flattenHostChildren(child.children, options));\n } else {\n result.push(child);\n }\n }\n return result;\n}\n\n/**\n * Count how many visible (non-host) descendants a node has.\n */\nfunction countVisibleDescendants(node: ComponentNode, options: TreeFormatOptions): number {\n let count = 0;\n for (const child of node.children) {\n if (child.type !== \"host\" || options.showHost === true) {\n count += 1;\n }\n count += countVisibleDescendants(child, options);\n }\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Format a ComponentNode tree as an ASCII tree string.\n *\n * The root node is printed without any connector prefix; all children use\n * box-drawing characters.\n *\n * @example\n * ```ts\n * const output = formatTree(report.tree, { maxDepth: 3, showHooks: true });\n * process.stdout.write(output + \"\\n\");\n * ```\n */\nexport function formatTree(root: ComponentNode, options: TreeFormatOptions = {}): string {\n const lines: string[] = [];\n\n // Root node label (no prefix/connector)\n if (root.type !== \"host\" || options.showHost === true) {\n lines.push(buildLabel(root, options));\n\n if (options.maxDepth === 0) {\n const childCount = countVisibleDescendants(root, options);\n if (childCount > 0) {\n lines.push(`${LAST_BRANCH}… (${childCount} more)`);\n }\n } else {\n const visibleChildren = getVisibleChildren(root, options);\n for (let i = 0; i < visibleChildren.length; i++) {\n const child = visibleChildren[i];\n if (child !== undefined) {\n renderNode(child, \"\", i === visibleChildren.length - 1, 1, options, lines);\n }\n }\n }\n } else {\n // Root is a host element and showHost is false — just render children\n const visibleChildren = getVisibleChildren(root, options);\n for (let i = 0; i < visibleChildren.length; i++) {\n const child = visibleChildren[i];\n if (child !== undefined) {\n renderNode(child, \"\", i === visibleChildren.length - 1, 1, options, lines);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Count the total number of component nodes in a tree (excluding host elements\n * unless `countHost` is true).\n */\nexport function countNodes(node: ComponentNode, countHost = false): number {\n let count = countHost || node.type !== \"host\" ? 1 : 0;\n for (const child of node.children) {\n count += countNodes(child, countHost);\n }\n return count;\n}\n\n/**\n * Compute the maximum depth of a component tree.\n */\nexport function treeDepth(node: ComponentNode): number {\n if (node.children.length === 0) return 0;\n return 1 + Math.max(...node.children.map(treeDepth));\n}\n","/**\n * report-formatter.ts\n *\n * Produces human-readable summary reports from a PageReport.\n *\n * Example output:\n * Scope Report for http://localhost:5173\n * ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n * Components: 24 total (18 function, 4 memo, 2 forwardRef)\n * Max depth: 6\n * Hooks: 42 total (12 useState, 8 useEffect, ...)\n * Error boundaries: 2\n * Suspense boundaries: 1 (1 resolved)\n * Console entries: 3 (1 warn, 2 error)\n * Capture time: 45ms\n */\n\nimport type { ComponentNode, PageReport } from \"@agent-scope/core\";\nimport { treeDepth } from \"./tree-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Analysis helpers\n// ---------------------------------------------------------------------------\n\ninterface ComponentStats {\n total: number;\n byType: Record<string, number>;\n}\n\ninterface HookStats {\n total: number;\n byType: Record<string, number>;\n}\n\n/** Walk the component tree and collect type counts. */\nfunction collectComponentStats(root: ComponentNode): ComponentStats {\n const byType: Record<string, number> = {};\n\n function walk(node: ComponentNode): void {\n if (node.type !== \"host\") {\n byType[node.type] = (byType[node.type] ?? 0) + 1;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n\n walk(root);\n\n const total = Object.values(byType).reduce((s, n) => s + n, 0);\n return { total, byType };\n}\n\n/** Walk the component tree and collect hook type counts. */\nfunction collectHookStats(root: ComponentNode): HookStats {\n const byType: Record<string, number> = {};\n\n function walk(node: ComponentNode): void {\n for (const hook of node.state) {\n const label = hook.name ?? hook.type;\n byType[label] = (byType[label] ?? 0) + 1;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n\n walk(root);\n\n const total = Object.values(byType).reduce((s, n) => s + n, 0);\n return { total, byType };\n}\n\n/**\n * Count error-boundary components (components named \"ErrorBoundary\" or class\n * components that appear to handle errors — best-effort from static names).\n */\nfunction countErrorBoundaries(root: ComponentNode): number {\n let count = 0;\n\n function walk(node: ComponentNode): void {\n if (\n node.type === \"class\" &&\n (node.name.toLowerCase().includes(\"error\") || node.name.toLowerCase().includes(\"boundary\"))\n ) {\n count += 1;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n\n walk(root);\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\n/** Right-pad a string to `width` characters. */\nfunction pad(s: string, width: number): string {\n return s.padEnd(width, \" \");\n}\n\n/** Render a key–value row with consistent alignment. */\nfunction row(label: string, value: string, labelWidth = 22): string {\n return `${pad(label, labelWidth)}${value}`;\n}\n\n/** Render a horizontal rule using ━ characters. */\nfunction rule(width: number): string {\n return \"━\".repeat(width);\n}\n\n/** Format a number-keyed record as \"(n typeA, m typeB, ...)\" */\nfunction formatBreakdown(byType: Record<string, number>, limit = 5): string {\n const entries = Object.entries(byType)\n .sort(([, a], [, b]) => b - a) // descending\n .slice(0, limit);\n\n if (entries.length === 0) return \"\";\n return `(${entries.map(([k, v]) => `${v} ${k}`).join(\", \")})`;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface ReportFormatOptions {\n /** Output as JSON instead of human-readable text. Default: false */\n json?: boolean;\n}\n\n/**\n * Format a PageReport as a human-readable summary string.\n */\nexport function formatReport(report: PageReport, options: ReportFormatOptions = {}): string {\n if (options.json === true) {\n return JSON.stringify(report, null, 2);\n }\n\n const url = report.url;\n const title = `Scope Report for ${url}`;\n const ruleWidth = Math.min(Math.max(title.length, 40), 72);\n\n const componentStats = collectComponentStats(report.tree);\n const hookStats = collectHookStats(report.tree);\n const maxDepth = treeDepth(report.tree);\n\n // Error boundaries — combine from tree walk + captured errors\n const errorBoundaries = countErrorBoundaries(report.tree);\n\n // Suspense breakdown\n const suspendedCount = report.suspenseBoundaries.filter((b) => b.isSuspended).length;\n const resolvedCount = report.suspenseBoundaries.length - suspendedCount;\n\n // Console breakdown\n const consoleLevels: Record<string, number> = {};\n for (const entry of report.consoleEntries) {\n consoleLevels[entry.level] = (consoleLevels[entry.level] ?? 0) + 1;\n }\n\n // Component type display names\n const typeNames: Record<string, string> = {\n function: \"function\",\n memo: \"memo\",\n forward_ref: \"forwardRef\",\n class: \"class\",\n };\n\n const componentBreakdown = Object.entries(componentStats.byType)\n .sort(([, a], [, b]) => b - a)\n .map(([k, v]) => `${v} ${typeNames[k] ?? k}`)\n .join(\", \");\n\n const hookBreakdown = formatBreakdown(hookStats.byType, 6);\n\n // Console summary\n const consoleBreakdownParts = Object.entries(consoleLevels)\n .sort(([, a], [, b]) => b - a)\n .map(([k, v]) => `${v} ${k}`);\n const consoleBreakdown =\n consoleBreakdownParts.length > 0 ? ` (${consoleBreakdownParts.join(\", \")})` : \"\";\n\n // Suspense summary\n const suspenseSummary =\n report.suspenseBoundaries.length > 0\n ? ` (${suspendedCount} pending, ${resolvedCount} resolved)`\n : \"\";\n\n const lines = [\n title,\n rule(ruleWidth),\n row(\n \"Components:\",\n `${componentStats.total} total${componentBreakdown ? ` (${componentBreakdown})` : \"\"}`,\n ),\n row(\"Max depth:\", String(maxDepth)),\n row(\"Hooks:\", hookStats.total > 0 ? `${hookStats.total} total ${hookBreakdown}` : \"none\"),\n row(\"Error boundaries:\", String(errorBoundaries)),\n row(\"Suspense boundaries:\", `${report.suspenseBoundaries.length}${suspenseSummary}`),\n row(\"Console entries:\", `${report.consoleEntries.length}${consoleBreakdown}`),\n row(\n \"Errors captured:\",\n report.errors.length > 0 ? `${report.errors.length} (see JSON output for details)` : \"none\",\n ),\n row(\"Capture time:\", `${report.capturedIn}ms`),\n ];\n\n // Append route info if available\n if (report.route !== null) {\n lines.push(row(\"Route:\", report.route.pattern ?? report.url));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Structured JSON report — a summary object suitable for machine consumption.\n */\nexport interface StructuredReport {\n url: string;\n timestamp: number;\n capturedIn: number;\n components: {\n total: number;\n byType: Record<string, number>;\n maxDepth: number;\n };\n hooks: {\n total: number;\n byType: Record<string, number>;\n };\n errorBoundaries: number;\n suspenseBoundaries: {\n total: number;\n suspended: number;\n resolved: number;\n };\n consoleEntries: {\n total: number;\n byLevel: Record<string, number>;\n };\n errors: number;\n route: string | null;\n}\n\n/**\n * Produce a structured summary object from a PageReport.\n */\nexport function buildStructuredReport(report: PageReport): StructuredReport {\n const componentStats = collectComponentStats(report.tree);\n const hookStats = collectHookStats(report.tree);\n const maxDepth = treeDepth(report.tree);\n const errorBoundaries = countErrorBoundaries(report.tree);\n\n const suspendedCount = report.suspenseBoundaries.filter((b) => b.isSuspended).length;\n\n const consoleLevels: Record<string, number> = {};\n for (const entry of report.consoleEntries) {\n consoleLevels[entry.level] = (consoleLevels[entry.level] ?? 0) + 1;\n }\n\n return {\n url: report.url,\n timestamp: report.timestamp,\n capturedIn: report.capturedIn,\n components: {\n total: componentStats.total,\n byType: componentStats.byType,\n maxDepth,\n },\n hooks: {\n total: hookStats.total,\n byType: hookStats.byType,\n },\n errorBoundaries,\n suspenseBoundaries: {\n total: report.suspenseBoundaries.length,\n suspended: suspendedCount,\n resolved: report.suspenseBoundaries.length - suspendedCount,\n },\n consoleEntries: {\n total: report.consoleEntries.length,\n byLevel: consoleLevels,\n },\n errors: report.errors.length,\n route: report.route?.pattern ?? null,\n };\n}\n","/**\n * @agent-scope/cli — binary entry point\n *\n * Parses argv and executes the Scope CLI.\n */\n\nimport { createProgram } from \"./program.js\";\n\nconst program = createProgram();\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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","names":["readFileSync","Command","writeFileSync","row","writeFileSync","mkdirSync","writeFileSync","resolve","Command","MANIFEST_PATH","resolve","writeFileSync","mkdirSync","Command","visibleChildren","nextPrefix","pad","program","Command","readFileSync"]}
1
+ {"version":3,"sources":["../src/program.ts","../src/browser.ts","../src/manifest-commands.ts","../src/manifest-formatter.ts","../src/render-commands.ts","../src/component-bundler.ts","../src/render-formatter.ts","../src/tailwind-css.ts","../src/tree-formatter.ts","../src/report-formatter.ts","../src/cli.ts"],"sourcesContent":["/**\n * @agent-scope/cli — program factory\n *\n * Builds the Commander.js program tree without executing it.\n * This separation allows the library to be tested without side effects.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { generateTest, loadTrace } from \"@agent-scope/playwright\";\nimport { Command } from \"commander\";\nimport { browserCapture, writeReportToFile } from \"./browser.js\";\nimport { createManifestCommand } from \"./manifest-commands.js\";\nimport { createRenderCommand } from \"./render-commands.js\";\nimport { buildStructuredReport, formatReport } from \"./report-formatter.js\";\nimport { formatTree } from \"./tree-formatter.js\";\n\nexport interface ScopeCLIOptions {\n version?: string;\n}\n\n/** Build and return the Scope CLI program */\nexport function createProgram(options: ScopeCLIOptions = {}): Command {\n const program = new Command(\"scope\")\n .version(options.version ?? \"0.1.0\")\n .description(\"Scope — React instrumentation toolkit\");\n\n // ── capture ─────────────────────────────────────────────────────────────\n program\n .command(\"capture <url>\")\n .description(\"Capture a React component tree from a live URL and output as JSON\")\n .option(\"-o, --output <path>\", \"Write JSON to file instead of stdout\")\n .option(\"--pretty\", \"Pretty-print JSON output (default: minified)\", false)\n .option(\"--timeout <ms>\", \"Max wait time for React to mount (ms)\", \"10000\")\n .option(\"--wait <ms>\", \"Additional wait after page load before capture (ms)\", \"0\")\n .action(\n async (\n url: string,\n opts: {\n output?: string;\n pretty: boolean;\n timeout: string;\n wait: string;\n },\n ) => {\n try {\n const { report } = await browserCapture({\n url,\n timeout: Number.parseInt(opts.timeout, 10),\n wait: Number.parseInt(opts.wait, 10),\n });\n\n if (opts.output !== undefined) {\n writeReportToFile(report, opts.output, opts.pretty);\n process.stderr.write(`Captured to ${opts.output}\\n`);\n } else {\n const json = opts.pretty ? JSON.stringify(report, null, 2) : JSON.stringify(report);\n process.stdout.write(`${json}\\n`);\n }\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n\n // ── tree ─────────────────────────────────────────────────────────────────\n program\n .command(\"tree <url>\")\n .description(\"Display the React component tree from a live URL\")\n .option(\"--depth <n>\", \"Max depth to display (default: unlimited)\")\n .option(\"--show-props\", \"Include prop names next to components\", false)\n .option(\"--show-hooks\", \"Show hook counts per component\", false)\n .option(\"--timeout <ms>\", \"Max wait time for React to mount (ms)\", \"10000\")\n .option(\"--wait <ms>\", \"Additional wait after page load before capture (ms)\", \"0\")\n .action(\n async (\n url: string,\n opts: {\n depth?: string;\n showProps: boolean;\n showHooks: boolean;\n timeout: string;\n wait: string;\n },\n ) => {\n try {\n const { report } = await browserCapture({\n url,\n timeout: Number.parseInt(opts.timeout, 10),\n wait: Number.parseInt(opts.wait, 10),\n });\n\n const maxDepth = opts.depth !== undefined ? Number.parseInt(opts.depth, 10) : undefined;\n\n const tree = formatTree(report.tree, {\n maxDepth,\n showProps: opts.showProps,\n showHooks: opts.showHooks,\n });\n\n process.stdout.write(`${tree}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n\n // ── report ───────────────────────────────────────────────────────────────\n program\n .command(\"report <url>\")\n .description(\"Capture and display a human-readable summary of a React app\")\n .option(\"--json\", \"Output as structured JSON instead of human-readable text\", false)\n .option(\"--timeout <ms>\", \"Max wait time for React to mount (ms)\", \"10000\")\n .option(\"--wait <ms>\", \"Additional wait after page load before capture (ms)\", \"0\")\n .action(\n async (\n url: string,\n opts: {\n json: boolean;\n timeout: string;\n wait: string;\n },\n ) => {\n try {\n const { report } = await browserCapture({\n url,\n timeout: Number.parseInt(opts.timeout, 10),\n wait: Number.parseInt(opts.wait, 10),\n });\n\n if (opts.json) {\n const structured = buildStructuredReport(report);\n process.stdout.write(`${JSON.stringify(structured, null, 2)}\\n`);\n } else {\n const summary = formatReport(report);\n process.stdout.write(`${summary}\\n`);\n }\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n\n // ── generate (existing command — preserved) ──────────────────────────────\n program\n .command(\"generate\")\n .description(\"Generate a Playwright test from a Scope trace file\")\n .argument(\"<trace>\", \"Path to a serialized Scope trace (.json)\")\n .option(\"-o, --output <path>\", \"Output file path\", \"scope.spec.ts\")\n .option(\"-d, --description <text>\", \"Test description\")\n .action((tracePath: string, opts: { output: string; description?: string }) => {\n const raw = readFileSync(tracePath, \"utf-8\");\n const trace = loadTrace(raw);\n const source = generateTest(trace, {\n description: opts.description,\n outputPath: opts.output,\n });\n process.stdout.write(`${source}\\n`);\n });\n\n // ── manifest ─────────────────────────────────────────────────────────────\n program.addCommand(createManifestCommand());\n\n // ── render ───────────────────────────────────────────────────────────────\n program.addCommand(createRenderCommand());\n\n return program;\n}\n","/**\n * browser.ts\n *\n * Shared browser launch + capture logic used by capture/tree/report commands.\n * Uses Playwright directly to launch headless Chromium, inject the Scope\n * runtime IIFE bundle, wait for React to mount, and call capture().\n *\n * The browser-entry bundle is provided by @agent-scope/playwright, which handles:\n * - Vite react-refresh compatibility (renderers proxy Map)\n * - Async first-commit awaiting (React 18 scheduler)\n */\n\nimport { writeFileSync } from \"node:fs\";\nimport type { PageReport } from \"@agent-scope/core\";\nimport { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport { chromium } from \"playwright\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface BrowserCaptureOptions {\n /** URL to navigate to */\n url: string;\n /** Max time (ms) to wait for React to mount. Default: 10000 */\n timeout?: number;\n /** Additional wait (ms) after page load before capturing. Default: 0 */\n wait?: number;\n}\n\nexport interface BrowserCaptureResult {\n report: PageReport;\n}\n\n// ---------------------------------------------------------------------------\n// Main capture function\n// ---------------------------------------------------------------------------\n\n/**\n * Launch a headless browser, navigate to the given URL, inject the Scope\n * runtime, wait for React to mount, call capture(), and return the PageReport.\n */\nexport async function browserCapture(\n options: BrowserCaptureOptions,\n): Promise<BrowserCaptureResult> {\n const { url, timeout = 10_000, wait = 0 } = options;\n\n const browser = await chromium.launch({ headless: true });\n\n try {\n const context = await browser.newContext();\n const page = await context.newPage();\n\n // Inject the @agent-scope/playwright browser-entry bundle before any page scripts run.\n // This bundle correctly handles:\n // 1. Vite react-refresh preamble (renderers proxy Map)\n // 2. React 18 async first-commit awaiting\n await page.addInitScript({ content: getBrowserEntryScript() });\n\n // Navigate and wait for network idle\n await page.goto(url, {\n waitUntil: \"networkidle\",\n timeout: timeout + 5_000,\n });\n\n // Wait for the capture function to be available (bundle injects it synchronously)\n await page.waitForFunction(\n () => {\n return (\n typeof (window as Window & { __SCOPE_CAPTURE__?: unknown }).__SCOPE_CAPTURE__ ===\n \"function\" &&\n (document.readyState === \"complete\" || document.readyState === \"interactive\")\n );\n },\n { timeout },\n );\n\n // Additional wait if requested\n if (wait > 0) {\n await page.waitForTimeout(wait);\n }\n\n // Call the injected capture function — awaits first React commit internally\n const raw = await page.evaluate(async () => {\n const win = window as Window & { __SCOPE_CAPTURE__?: () => Promise<unknown> };\n if (typeof win.__SCOPE_CAPTURE__ !== \"function\") {\n throw new Error(\"Scope runtime not injected\");\n }\n return win.__SCOPE_CAPTURE__();\n });\n\n if (\n raw !== null &&\n typeof raw === \"object\" &&\n \"error\" in raw &&\n typeof (raw as Record<string, unknown>).error === \"string\"\n ) {\n throw new Error(`Scope capture failed: ${(raw as Record<string, unknown>).error as string}`);\n }\n\n const report = { ...(raw as Omit<PageReport, \"route\">), route: null } as PageReport;\n return { report };\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Write a PageReport to a file as JSON.\n */\nexport function writeReportToFile(report: PageReport, outputPath: string, pretty: boolean): void {\n const json = pretty ? JSON.stringify(report, null, 2) : JSON.stringify(report);\n writeFileSync(outputPath, json, \"utf-8\");\n}\n","/**\n * @agent-scope/cli — manifest sub-commands\n *\n * Registers the `scope manifest` command group with four sub-commands:\n * - `scope manifest list`\n * - `scope manifest get <name>`\n * - `scope manifest query`\n * - `scope manifest generate`\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { generateManifest, type Manifest } from \"@agent-scope/manifest\";\nimport { Command } from \"commander\";\nimport {\n formatGetJson,\n formatGetTable,\n formatListJson,\n formatListTable,\n formatQueryJson,\n formatQueryTable,\n isTTY,\n type ListRow,\n matchGlob,\n type QueryRow,\n} from \"./manifest-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\n\n/**\n * Load a manifest from the given path (default: `.reactscope/manifest.json`).\n * Throws with a helpful message if the file is missing.\n */\nexport function loadManifest(manifestPath: string = MANIFEST_PATH): Manifest {\n const absPath = resolve(process.cwd(), manifestPath);\n if (!existsSync(absPath)) {\n throw new Error(`Manifest not found at ${absPath}.\\nRun \\`scope manifest generate\\` first.`);\n }\n const raw = readFileSync(absPath, \"utf-8\");\n return JSON.parse(raw) as Manifest;\n}\n\n/**\n * Decide whether to output as JSON or table based on `--format` flag and TTY.\n */\nfunction resolveFormat(formatFlag: string | undefined): \"json\" | \"table\" {\n if (formatFlag === \"json\") return \"json\";\n if (formatFlag === \"table\") return \"table\";\n return isTTY() ? \"table\" : \"json\";\n}\n\n// ---------------------------------------------------------------------------\n// manifest list\n// ---------------------------------------------------------------------------\n\nfunction registerList(manifestCmd: Command): void {\n manifestCmd\n .command(\"list\")\n .description(\"List all components in the manifest\")\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .option(\"--filter <glob>\", \"Filter components by name glob pattern\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action((opts: { format?: string; filter?: string; manifest: string }) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const format = resolveFormat(opts.format);\n\n let entries = Object.entries(manifest.components);\n\n // Apply --filter glob\n if (opts.filter !== undefined) {\n const filterPattern = opts.filter ?? \"\";\n entries = entries.filter(([name]) => matchGlob(filterPattern, name));\n }\n\n const rows: ListRow[] = entries.map(([name, descriptor]) => ({\n name,\n file: descriptor.filePath,\n complexityClass: descriptor.complexityClass,\n hookCount: descriptor.detectedHooks.length,\n contextCount: descriptor.requiredContexts.length,\n }));\n\n const output = format === \"json\" ? formatListJson(rows) : formatListTable(rows);\n\n process.stdout.write(`${output}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// manifest get\n// ---------------------------------------------------------------------------\n\nfunction registerGet(manifestCmd: Command): void {\n manifestCmd\n .command(\"get <name>\")\n .description(\"Get full details of a single component by name\")\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action((name: string, opts: { format?: string; manifest: string }) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const format = resolveFormat(opts.format);\n\n const descriptor = manifest.components[name];\n if (descriptor === undefined) {\n const available = Object.keys(manifest.components).slice(0, 5).join(\", \");\n const hint = Object.keys(manifest.components).length > 5 ? \", …\" : \"\";\n throw new Error(\n `Component \"${name}\" not found in manifest.\\nAvailable: ${available}${hint}`,\n );\n }\n\n const output =\n format === \"json\" ? formatGetJson(name, descriptor) : formatGetTable(name, descriptor);\n\n process.stdout.write(`${output}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// manifest query\n// ---------------------------------------------------------------------------\n\nfunction registerQuery(manifestCmd: Command): void {\n manifestCmd\n .command(\"query\")\n .description(\"Query components by attributes\")\n .option(\"--context <name>\", \"Find components consuming a context\")\n .option(\"--hook <name>\", \"Find components using a specific hook\")\n .option(\"--complexity <class>\", \"Filter by complexity class: simple or complex\")\n .option(\"--side-effects\", \"Find components with any side effects\", false)\n .option(\"--has-fetch\", \"Find components with fetch calls\", false)\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n (opts: {\n context?: string;\n hook?: string;\n complexity?: string;\n sideEffects: boolean;\n hasFetch: boolean;\n format?: string;\n manifest: string;\n }) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const format = resolveFormat(opts.format);\n\n // Build query description for display\n const queryParts: string[] = [];\n if (opts.context !== undefined) queryParts.push(`context=${opts.context}`);\n if (opts.hook !== undefined) queryParts.push(`hook=${opts.hook}`);\n if (opts.complexity !== undefined) queryParts.push(`complexity=${opts.complexity}`);\n if (opts.sideEffects) queryParts.push(\"side-effects\");\n if (opts.hasFetch) queryParts.push(\"has-fetch\");\n\n if (queryParts.length === 0) {\n process.stderr.write(\n \"No query flags specified. Use --context, --hook, --complexity, --side-effects, or --has-fetch.\\n\",\n );\n process.exit(1);\n }\n\n const queryDesc = queryParts.join(\", \");\n\n let entries = Object.entries(manifest.components);\n\n // Apply filters\n if (opts.context !== undefined) {\n const ctx = opts.context;\n entries = entries.filter(([, d]) => d.requiredContexts.includes(ctx));\n }\n\n if (opts.hook !== undefined) {\n const hook = opts.hook;\n entries = entries.filter(([, d]) => d.detectedHooks.includes(hook));\n }\n\n if (opts.complexity !== undefined) {\n const cls = opts.complexity;\n entries = entries.filter(([, d]) => d.complexityClass === cls);\n }\n\n if (opts.sideEffects) {\n entries = entries.filter(([, d]) => {\n const se = d.sideEffects;\n return (\n se.fetches.length > 0 ||\n se.timers ||\n se.subscriptions.length > 0 ||\n se.globalListeners\n );\n });\n }\n\n if (opts.hasFetch) {\n entries = entries.filter(([, d]) => d.sideEffects.fetches.length > 0);\n }\n\n const rows: QueryRow[] = entries.map(([name, d]) => ({\n name,\n file: d.filePath,\n complexityClass: d.complexityClass,\n hooks: d.detectedHooks.join(\", \") || \"—\",\n contexts: d.requiredContexts.join(\", \") || \"—\",\n }));\n\n const output =\n format === \"json\" ? formatQueryJson(rows) : formatQueryTable(rows, queryDesc);\n\n process.stdout.write(`${output}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// manifest generate\n// ---------------------------------------------------------------------------\n\nfunction registerGenerate(manifestCmd: Command): void {\n manifestCmd\n .command(\"generate\")\n .description(\n \"Generate the component manifest from source and write to .reactscope/manifest.json\",\n )\n .option(\"--root <path>\", \"Project root directory (default: cwd)\")\n .option(\"--output <path>\", \"Output path for manifest.json\", MANIFEST_PATH)\n .option(\"--include <globs>\", \"Comma-separated glob patterns to include\")\n .option(\"--exclude <globs>\", \"Comma-separated glob patterns to exclude\")\n .action(async (opts: { root?: string; output: string; include?: string; exclude?: string }) => {\n try {\n const rootDir = resolve(process.cwd(), opts.root ?? \".\");\n const outputPath = resolve(process.cwd(), opts.output);\n\n const include = opts.include?.split(\",\").map((s) => s.trim());\n const exclude = opts.exclude?.split(\",\").map((s) => s.trim());\n\n process.stderr.write(`Scanning ${rootDir} for React components...\\n`);\n\n const manifest = await generateManifest({\n rootDir,\n ...(include !== undefined && { include }),\n ...(exclude !== undefined && { exclude }),\n });\n\n const componentCount = Object.keys(manifest.components).length;\n process.stderr.write(`Found ${componentCount} components.\\n`);\n\n // Ensure output directory exists\n const outputDir = outputPath.replace(/\\/[^/]+$/, \"\");\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n writeFileSync(outputPath, JSON.stringify(manifest, null, 2), \"utf-8\");\n process.stderr.write(`Manifest written to ${outputPath}\\n`);\n process.stdout.write(`${outputPath}\\n`);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n });\n}\n\n// ---------------------------------------------------------------------------\n// Public factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create and return the `manifest` command group (does not attach to any\n * parent — caller is responsible for mounting it).\n */\nexport function createManifestCommand(): Command {\n const manifestCmd = new Command(\"manifest\").description(\n \"Query and explore the component manifest\",\n );\n\n registerList(manifestCmd);\n registerGet(manifestCmd);\n registerQuery(manifestCmd);\n registerGenerate(manifestCmd);\n\n return manifestCmd;\n}\n","/**\n * @agent-scope/cli — manifest formatters\n *\n * Utilities for rendering ComponentDescriptor data as human-readable tables\n * or structured JSON, depending on whether stdout is a TTY.\n */\n\nimport type { ComplexityClass, ComponentDescriptor, SideEffects } from \"@agent-scope/manifest\";\n\n// ---------------------------------------------------------------------------\n// TTY detection\n// ---------------------------------------------------------------------------\n\n/**\n * Returns `true` when stdout is connected to an interactive terminal.\n * When piped (e.g. `scope manifest list | jq`), returns `false`.\n */\nexport function isTTY(): boolean {\n return process.stdout.isTTY === true;\n}\n\n// ---------------------------------------------------------------------------\n// Table rendering helpers\n// ---------------------------------------------------------------------------\n\nfunction pad(value: string, width: number): string {\n return value.length >= width ? value.slice(0, width) : value + \" \".repeat(width - value.length);\n}\n\nfunction buildTable(headers: string[], rows: string[][]): string {\n const colWidths = headers.map((h, i) =>\n Math.max(h.length, ...rows.map((r) => (r[i] ?? \"\").length)),\n );\n\n const divider = colWidths.map((w) => \"-\".repeat(w)).join(\" \");\n const headerRow = headers.map((h, i) => pad(h, colWidths[i] ?? 0)).join(\" \");\n const dataRows = rows.map((row) =>\n row.map((cell, i) => pad(cell ?? \"\", colWidths[i] ?? 0)).join(\" \"),\n );\n\n return [headerRow, divider, ...dataRows].join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// manifest list\n// ---------------------------------------------------------------------------\n\nexport interface ListRow {\n name: string;\n file: string;\n complexityClass: ComplexityClass;\n hookCount: number;\n contextCount: number;\n}\n\nexport function formatListTable(rows: ListRow[]): string {\n if (rows.length === 0) return \"No components found.\";\n\n const headers = [\"NAME\", \"FILE\", \"COMPLEXITY\", \"HOOKS\", \"CONTEXTS\"];\n const tableRows = rows.map((r) => [\n r.name,\n r.file,\n r.complexityClass,\n String(r.hookCount),\n String(r.contextCount),\n ]);\n\n return buildTable(headers, tableRows);\n}\n\nexport function formatListJson(rows: ListRow[]): string {\n return JSON.stringify(rows, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// manifest get\n// ---------------------------------------------------------------------------\n\nfunction formatSideEffects(se: SideEffects): string {\n const parts: string[] = [];\n if (se.fetches.length > 0) parts.push(`fetches: ${se.fetches.join(\", \")}`);\n if (se.timers) parts.push(\"timers\");\n if (se.subscriptions.length > 0) parts.push(`subscriptions: ${se.subscriptions.join(\", \")}`);\n if (se.globalListeners) parts.push(\"globalListeners\");\n return parts.length > 0 ? parts.join(\" | \") : \"none\";\n}\n\nexport function formatGetTable(name: string, descriptor: ComponentDescriptor): string {\n const propNames = Object.keys(descriptor.props);\n\n const lines: string[] = [\n `Component: ${name}`,\n ` File: ${descriptor.filePath}`,\n ` Export: ${descriptor.exportType}`,\n ` Display Name: ${descriptor.displayName}`,\n ` Complexity: ${descriptor.complexityClass}`,\n ` Memoized: ${descriptor.memoized}`,\n ` Forwarded Ref: ${descriptor.forwardedRef}`,\n ` HOC Wrappers: ${descriptor.hocWrappers.join(\", \") || \"none\"}`,\n ` Hooks: ${descriptor.detectedHooks.join(\", \") || \"none\"}`,\n ` Contexts: ${descriptor.requiredContexts.join(\", \") || \"none\"}`,\n ` Composes: ${descriptor.composes.join(\", \") || \"none\"}`,\n ` Composed By: ${descriptor.composedBy.join(\", \") || \"none\"}`,\n ` Side Effects: ${formatSideEffects(descriptor.sideEffects)}`,\n \"\",\n ` Props (${propNames.length}):`,\n ];\n\n if (propNames.length === 0) {\n lines.push(\" (none)\");\n } else {\n for (const propName of propNames) {\n const p = descriptor.props[propName];\n if (p === undefined) continue;\n const req = p.required ? \"required\" : \"optional\";\n const def = p.default !== undefined ? ` [default: ${p.default}]` : \"\";\n const vals = p.values !== undefined ? ` (${p.values.join(\" | \")})` : \"\";\n lines.push(` ${propName}: ${p.rawType}${vals} — ${req}${def}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function formatGetJson(name: string, descriptor: ComponentDescriptor): string {\n return JSON.stringify({ name, ...descriptor }, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// manifest query\n// ---------------------------------------------------------------------------\n\nexport interface QueryRow {\n name: string;\n file: string;\n complexityClass: ComplexityClass;\n hooks: string;\n contexts: string;\n}\n\nexport function formatQueryTable(rows: QueryRow[], queryDesc: string): string {\n if (rows.length === 0) return `No components match: ${queryDesc}`;\n\n const headers = [\"NAME\", \"FILE\", \"COMPLEXITY\", \"HOOKS\", \"CONTEXTS\"];\n const tableRows = rows.map((r) => [r.name, r.file, r.complexityClass, r.hooks, r.contexts]);\n\n return `Query: ${queryDesc}\\n\\n${buildTable(headers, tableRows)}`;\n}\n\nexport function formatQueryJson(rows: QueryRow[]): string {\n return JSON.stringify(rows, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// Glob matching\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal glob matcher supporting `*` (any chars except `/`) and `**` (any chars).\n * Only used for `--filter` on component names.\n */\nexport function matchGlob(pattern: string, value: string): boolean {\n // Escape regex special chars except *\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"§GLOBSTAR§\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/§GLOBSTAR§/g, \".*\");\n const regex = new RegExp(`^${regexStr}$`, \"i\");\n return regex.test(value);\n}\n","/**\n * @agent-scope/cli — render commands\n *\n * Provides three sub-commands under `scope render`:\n *\n * scope render <component> — single component render\n * scope render matrix <component> — matrix (Cartesian product) render\n * scope render all — full-project batch render\n *\n * Routing:\n * - All components → BrowserPool (Playwright, real DOM rendering)\n * - Props passed via --props JSON are forwarded to the component\n * - esbuild bundles the component + its deps into a self-contained IIFE\n *\n * All three commands load the manifest to discover components and their\n * file paths. The manifest must be generated first with\n * `scope manifest generate`.\n *\n * ## TTY vs Pipe output\n *\n * When stdout is a TTY (interactive terminal), commands write PNG files and\n * print a one-line human-readable summary. When stdout is piped, commands\n * emit structured JSON for programmatic consumers. The --format flag always\n * overrides auto-detection.\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { MatrixAxis, MatrixRenderer, MatrixResult, RenderResult } from \"@agent-scope/render\";\nimport {\n ALL_CONTEXT_IDS,\n ALL_STRESS_IDS,\n BrowserPool,\n contextAxis,\n RenderMatrix,\n SatoriRenderer,\n safeRender,\n stressAxis,\n} from \"@agent-scope/render\";\nimport { Command } from \"commander\";\nimport { buildComponentHarness } from \"./component-bundler.js\";\nimport { loadManifest } from \"./manifest-commands.js\";\nimport {\n formatMatrixCsv,\n formatMatrixHtml,\n formatMatrixJson,\n formatRenderJson,\n formatSummaryText,\n isTTY,\n parseViewport,\n renderProgressBar,\n} from \"./render-formatter.js\";\nimport { getCompiledCssForClasses } from \"./tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\nconst DEFAULT_OUTPUT_DIR = \".reactscope/renders\";\n\n// ---------------------------------------------------------------------------\n// BrowserPool singleton (lazy-initialised, shared across renders in one run)\n// ---------------------------------------------------------------------------\n\nlet _pool: BrowserPool | null = null;\n\nasync function getPool(viewportWidth: number, viewportHeight: number): Promise<BrowserPool> {\n if (_pool === null) {\n _pool = new BrowserPool({\n size: { browsers: 1, pagesPerBrowser: 4 },\n viewportWidth,\n viewportHeight,\n });\n await _pool.init();\n }\n return _pool;\n}\n\nasync function shutdownPool(): Promise<void> {\n if (_pool !== null) {\n await _pool.close();\n _pool = null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Renderer factory — replaces the stub\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a MatrixRenderer-compatible adapter that uses BrowserPool + esbuild\n * to produce real screenshots of the component.\n *\n * @param filePath - Absolute path to the component source file\n * @param componentName - Component name (used to resolve named exports)\n * @param viewportWidth - Viewport width in pixels\n * @param viewportHeight - Viewport height in pixels\n */\nfunction buildRenderer(\n filePath: string,\n componentName: string,\n viewportWidth: number,\n viewportHeight: number,\n): MatrixRenderer & { _satori: SatoriRenderer } {\n // Keep a SatoriRenderer reference to satisfy the existing type contract.\n // It is not used for actual rendering but satisfies TS structural checks.\n const satori = new SatoriRenderer({\n defaultViewport: { width: viewportWidth, height: viewportHeight },\n });\n\n return {\n _satori: satori,\n async renderCell(\n props: Record<string, unknown>,\n _complexityClass?: import(\"@agent-scope/manifest\").ComplexityClass,\n ): Promise<RenderResult> {\n const startMs = performance.now();\n\n const pool = await getPool(viewportWidth, viewportHeight);\n\n // Build HTML harness with bundled component + props\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n );\n\n // Acquire a Playwright page from the pool\n const slot = await pool.acquire();\n const { page } = slot;\n\n try {\n // Load the harness — this is a real navigation (setContent)\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\n // Wait for our render signal (set by the harness script)\n await page.waitForFunction(\n () => {\n const w = window as Window & {\n __SCOPE_RENDER_COMPLETE__?: boolean;\n __SCOPE_RENDER_ERROR__?: string;\n };\n return w.__SCOPE_RENDER_COMPLETE__ === true;\n },\n { timeout: 15_000 },\n );\n\n // Check for render errors\n const renderError = await page.evaluate(() => {\n return (\n (\n window as Window & {\n __SCOPE_RENDER_ERROR__?: string;\n }\n ).__SCOPE_RENDER_ERROR__ ?? null\n );\n });\n\n if (renderError !== null) {\n throw new Error(`Component render error: ${renderError}`);\n }\n\n // Tailwind v4: extract class names from the DOM and inject compiled CSS\n const rootDir = process.cwd();\n const classes = await page.evaluate(() => {\n const set = new Set<string>();\n document.querySelectorAll(\"[class]\").forEach((el) => {\n for (const c of el.className.split(/\\s+/)) {\n if (c) set.add(c);\n }\n });\n return [...set];\n });\n const projectCss = await getCompiledCssForClasses(rootDir, classes);\n if (projectCss != null && projectCss.length > 0) {\n await page.addStyleTag({ content: projectCss });\n }\n\n const renderTimeMs = performance.now() - startMs;\n\n // Screenshot the component root element\n const rootLocator = page.locator(\"[data-reactscope-root]\");\n const boundingBox = await rootLocator.boundingBox();\n\n if (boundingBox === null || boundingBox.width === 0 || boundingBox.height === 0) {\n throw new Error(\n `Component \"${componentName}\" rendered with zero bounding box — it may be invisible or not mounted`,\n );\n }\n\n // Apply padding + enforce minimums so tiny components (e.g. icons) produce\n // a readable screenshot rather than a pixel-tight 16×18 crop.\n const PAD = 24;\n const MIN_W = 320;\n const MIN_H = 200;\n\n const clipX = Math.max(0, boundingBox.x - PAD);\n const clipY = Math.max(0, boundingBox.y - PAD);\n const rawW = boundingBox.width + PAD * 2;\n const rawH = boundingBox.height + PAD * 2;\n const clipW = Math.max(rawW, MIN_W);\n const clipH = Math.max(rawH, MIN_H);\n\n // Clamp to viewport dimensions to avoid Playwright out-of-bounds errors.\n // Use the known viewport dimensions rather than page.viewportSize() so this\n // works correctly in test environments where the page mock may not implement it.\n const safeW = Math.min(clipW, viewportWidth - clipX);\n const safeH = Math.min(clipH, viewportHeight - clipY);\n\n const screenshot = await page.screenshot({\n clip: { x: clipX, y: clipY, width: safeW, height: safeH },\n type: \"png\",\n });\n\n // Collect basic computed styles from the root child\n const computedStyles: Record<string, Record<string, string>> = {};\n const styles = await page.evaluate((sel: string) => {\n const el = document.querySelector(sel);\n if (el === null) return {} as Record<string, string>;\n const computed = window.getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of [\n \"display\",\n \"width\",\n \"height\",\n \"color\",\n \"backgroundColor\",\n \"fontSize\",\n \"fontFamily\",\n \"padding\",\n \"margin\",\n ]) {\n out[prop] = computed.getPropertyValue(prop);\n }\n return out;\n }, \"[data-reactscope-root] > *\");\n computedStyles[\"[data-reactscope-root] > *\"] = styles;\n\n return {\n screenshot,\n width: Math.round(safeW),\n height: Math.round(safeH),\n renderTimeMs,\n computedStyles,\n };\n } finally {\n pool.release(slot);\n }\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// scope render <component>\n// ---------------------------------------------------------------------------\n\nfunction registerRenderSingle(renderCmd: Command): void {\n renderCmd\n .command(\"component <component>\", { isDefault: true })\n .description(\"Render a single component to PNG or JSON\")\n .option(\"--props <json>\", 'Inline props JSON, e.g. \\'{\"variant\":\"primary\"}\\'')\n .option(\"--viewport <WxH>\", \"Viewport size e.g. 1280x720\", \"375x812\")\n .option(\"--theme <name>\", \"Theme name from the token system\")\n .option(\"-o, --output <path>\", \"Write PNG to file instead of stdout\")\n .option(\"--format <fmt>\", \"Output format: png or json (default: auto)\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n async (\n componentName: string,\n opts: {\n props?: string;\n viewport: string;\n theme?: string;\n output?: string;\n format?: string;\n manifest: string;\n },\n ) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const descriptor = manifest.components[componentName];\n if (descriptor === undefined) {\n const available = Object.keys(manifest.components).slice(0, 5).join(\", \");\n throw new Error(\n `Component \"${componentName}\" not found in manifest.\\nAvailable: ${available}`,\n );\n }\n\n // Parse props\n let props: Record<string, unknown> = {};\n if (opts.props !== undefined) {\n try {\n props = JSON.parse(opts.props) as Record<string, unknown>;\n } catch {\n throw new Error(`Invalid props JSON: ${opts.props}`);\n }\n }\n\n // Parse viewport\n const { width, height } = parseViewport(opts.viewport);\n\n // Resolve component file path\n const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n // Build renderer\n const renderer = buildRenderer(filePath, componentName, width, height);\n\n process.stderr.write(\n `Rendering ${componentName} [${descriptor.complexityClass}] at ${width}×${height}…\\n`,\n );\n\n const outcome = await safeRender(\n () => renderer.renderCell(props, descriptor.complexityClass),\n {\n props,\n sourceLocation: {\n file: descriptor.filePath,\n line: descriptor.loc.start,\n column: 0,\n },\n },\n );\n\n await shutdownPool();\n\n if (outcome.crashed) {\n process.stderr.write(`✗ Render failed: ${outcome.error.message}\\n`);\n const hintList = outcome.error.heuristicFlags.join(\", \");\n if (hintList.length > 0) {\n process.stderr.write(` Hints: ${hintList}\\n`);\n }\n process.exit(1);\n }\n\n const result = outcome.result;\n\n // Determine output format\n // --output always means \"write PNG to that path\"\n // --format explicit overrides auto-detection\n // TTY with no flags → write PNG to default dir, print summary\n // Pipe with no flags → emit JSON to stdout\n\n if (opts.output !== undefined) {\n // Explicit output path — always write PNG\n const outPath = resolve(process.cwd(), opts.output);\n writeFileSync(outPath, result.screenshot);\n process.stdout.write(\n `✓ ${componentName} → ${opts.output} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n return;\n }\n\n const fmt = resolveSingleFormat(opts.format);\n\n if (fmt === \"json\") {\n const json = formatRenderJson(componentName, props, result);\n process.stdout.write(`${JSON.stringify(json, null, 2)}\\n`);\n } else if (fmt === \"file\") {\n // TTY default: write PNG to .reactscope/renders/<component>.png\n const dir = resolve(process.cwd(), DEFAULT_OUTPUT_DIR);\n mkdirSync(dir, { recursive: true });\n const outPath = resolve(dir, `${componentName}.png`);\n writeFileSync(outPath, result.screenshot);\n const relPath = `${DEFAULT_OUTPUT_DIR}/${componentName}.png`;\n process.stdout.write(\n `✓ ${componentName} → ${relPath} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n } else {\n // fmt === \"png\" — explicit --format png, write to default file\n const dir = resolve(process.cwd(), DEFAULT_OUTPUT_DIR);\n mkdirSync(dir, { recursive: true });\n const outPath = resolve(dir, `${componentName}.png`);\n writeFileSync(outPath, result.screenshot);\n const relPath = `${DEFAULT_OUTPUT_DIR}/${componentName}.png`;\n process.stdout.write(\n `✓ ${componentName} → ${relPath} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n }\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// scope render matrix <component>\n// ---------------------------------------------------------------------------\n\nfunction registerRenderMatrix(renderCmd: Command): void {\n renderCmd\n .command(\"matrix <component>\")\n .description(\"Render a component across a matrix of prop axes\")\n .option(\"--axes <spec>\", \"Axis definitions e.g. 'variant:primary,secondary size:sm,md,lg'\")\n .option(\n \"--contexts <ids>\",\n \"Composition context IDs, comma-separated (e.g. centered,rtl,sidebar)\",\n )\n .option(\"--stress <ids>\", \"Stress preset IDs, comma-separated (e.g. text.long,text.unicode)\")\n .option(\"--sprite <path>\", \"Write sprite sheet PNG to file\")\n .option(\"--format <fmt>\", \"Output format: json|png|html|csv (default: auto)\")\n .option(\"--concurrency <n>\", \"Max parallel renders\", \"8\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n async (\n componentName: string,\n opts: {\n axes?: string;\n contexts?: string;\n stress?: string;\n sprite?: string;\n format?: string;\n concurrency: string;\n manifest: string;\n },\n ) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const descriptor = manifest.components[componentName];\n if (descriptor === undefined) {\n const available = Object.keys(manifest.components).slice(0, 5).join(\", \");\n throw new Error(\n `Component \"${componentName}\" not found in manifest.\\nAvailable: ${available}`,\n );\n }\n\n const concurrency = Math.max(1, parseInt(opts.concurrency, 10) || 8);\n const { width, height } = { width: 375, height: 812 };\n\n // Resolve component file path\n const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n const renderer = buildRenderer(filePath, componentName, width, height);\n\n // Build axes\n const axes: MatrixAxis[] = [];\n\n if (opts.axes !== undefined) {\n // Parse \"variant:primary,secondary size:sm,md,lg\"\n const axisSpecs = opts.axes.trim().split(/\\s+/);\n for (const spec of axisSpecs) {\n const colonIdx = spec.indexOf(\":\");\n if (colonIdx < 0) {\n throw new Error(`Invalid axis spec \"${spec}\". Expected format: name:val1,val2,...`);\n }\n const name = spec.slice(0, colonIdx);\n const values = spec\n .slice(colonIdx + 1)\n .split(\",\")\n .map((v) => v.trim());\n if (name.length === 0 || values.length === 0) {\n throw new Error(`Invalid axis spec \"${spec}\"`);\n }\n axes.push({ name, values });\n }\n }\n\n if (opts.contexts !== undefined) {\n const ids = opts.contexts.split(\",\").map((s) => s.trim());\n const validIds = new Set<string>(ALL_CONTEXT_IDS);\n for (const id of ids) {\n if (!validIds.has(id)) {\n throw new Error(\n `Unknown context ID \"${id}\". Available: ${ALL_CONTEXT_IDS.join(\", \")}`,\n );\n }\n }\n const cAxis = contextAxis(ids as Parameters<typeof contextAxis>[0]);\n axes.push({ name: cAxis.name, values: cAxis.values });\n }\n\n if (opts.stress !== undefined) {\n const ids = opts.stress.split(\",\").map((s) => s.trim());\n for (const id of ids) {\n try {\n const sAxis = stressAxis(id as Parameters<typeof stressAxis>[0]);\n axes.push({ name: sAxis.name, values: sAxis.values });\n } catch {\n throw new Error(\n `Unknown stress preset \"${id}\". Available: ${ALL_STRESS_IDS.join(\", \")}`,\n );\n }\n }\n }\n\n if (axes.length === 0) {\n throw new Error(\n \"No axes defined. Use --axes, --contexts, or --stress to specify matrix dimensions.\",\n );\n }\n\n process.stderr.write(\n `Rendering matrix for ${componentName}: ${axes.map((a) => `${a.name}(${a.values.length})`).join(\" × \")}…\\n`,\n );\n\n const matrix = new RenderMatrix(renderer, axes, {\n complexityClass: descriptor.complexityClass,\n concurrency,\n });\n const result: MatrixResult = await matrix.render();\n\n await shutdownPool();\n\n process.stderr.write(\n `Done. ${result.stats.totalCells} cells, avg ${result.stats.avgRenderTimeMs.toFixed(1)}ms\\n`,\n );\n\n // Sprite sheet — explicit --sprite flag always writes to that path\n if (opts.sprite !== undefined) {\n const { SpriteSheetGenerator } = await import(\"@agent-scope/render\");\n const gen = new SpriteSheetGenerator();\n const sheet = await gen.generate(result);\n const spritePath = resolve(process.cwd(), opts.sprite);\n writeFileSync(spritePath, sheet.png);\n process.stderr.write(`Sprite sheet saved to ${spritePath}\\n`);\n }\n\n // Output format resolution\n // TTY with no --format and no --sprite → write sprite sheet to default path, print summary\n // Pipe with no --format → JSON\n // Explicit --format → honour it\n const fmt = resolveMatrixFormat(opts.format, opts.sprite !== undefined);\n\n if (fmt === \"file\") {\n // TTY default: sprite sheet to .reactscope/renders/<component>-matrix.png\n const { SpriteSheetGenerator } = await import(\"@agent-scope/render\");\n const gen = new SpriteSheetGenerator();\n const sheet = await gen.generate(result);\n const dir = resolve(process.cwd(), DEFAULT_OUTPUT_DIR);\n mkdirSync(dir, { recursive: true });\n const outPath = resolve(dir, `${componentName}-matrix.png`);\n writeFileSync(outPath, sheet.png);\n const relPath = `${DEFAULT_OUTPUT_DIR}/${componentName}-matrix.png`;\n process.stdout.write(\n `✓ ${componentName} matrix (${result.stats.totalCells} cells) → ${relPath} (${result.stats.wallClockTimeMs.toFixed(0)}ms total)\\n`,\n );\n } else if (fmt === \"json\") {\n process.stdout.write(`${JSON.stringify(formatMatrixJson(result), null, 2)}\\n`);\n } else if (fmt === \"png\") {\n if (opts.sprite !== undefined) {\n // Already written above\n } else {\n const { SpriteSheetGenerator } = await import(\"@agent-scope/render\");\n const gen = new SpriteSheetGenerator();\n const sheet = await gen.generate(result);\n process.stdout.write(sheet.png);\n }\n } else if (fmt === \"html\") {\n process.stdout.write(formatMatrixHtml(componentName, result));\n } else if (fmt === \"csv\") {\n process.stdout.write(formatMatrixCsv(componentName, result));\n }\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// scope render all\n// ---------------------------------------------------------------------------\n\nfunction registerRenderAll(renderCmd: Command): void {\n renderCmd\n .command(\"all\")\n .description(\"Render all components from the manifest\")\n .option(\"--concurrency <n>\", \"Max parallel renders\", \"4\")\n .option(\"--output-dir <dir>\", \"Output directory for renders\", DEFAULT_OUTPUT_DIR)\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .option(\"--format <fmt>\", \"Output format: json|png (default: png)\", \"png\")\n .action(\n async (opts: {\n concurrency: string;\n outputDir: string;\n manifest: string;\n format: string;\n }) => {\n try {\n const manifest = loadManifest(opts.manifest);\n const componentNames = Object.keys(manifest.components);\n const total = componentNames.length;\n\n if (total === 0) {\n process.stderr.write(\"No components found in manifest.\\n\");\n return;\n }\n\n const concurrency = Math.max(1, parseInt(opts.concurrency, 10) || 4);\n const outputDir = resolve(process.cwd(), opts.outputDir);\n mkdirSync(outputDir, { recursive: true });\n const rootDir = process.cwd();\n\n process.stderr.write(`Rendering ${total} components (concurrency: ${concurrency})…\\n`);\n\n const results: Array<{\n name: string;\n renderTimeMs: number;\n success: boolean;\n errorMessage?: string;\n }> = [];\n\n let completed = 0;\n\n const renderOne = async (name: string): Promise<void> => {\n const descriptor = manifest.components[name];\n if (descriptor === undefined) return;\n\n const filePath = resolve(rootDir, descriptor.filePath);\n const renderer = buildRenderer(filePath, name, 375, 812);\n\n const outcome = await safeRender(\n () => renderer.renderCell({}, descriptor.complexityClass),\n {\n props: {},\n sourceLocation: {\n file: descriptor.filePath,\n line: descriptor.loc.start,\n column: 0,\n },\n },\n );\n\n completed++;\n const pct = Math.round((completed / total) * 100);\n process.stderr.write(`${renderProgressBar(completed, total, name, pct)}\\r`);\n\n if (outcome.crashed) {\n results.push({\n name,\n renderTimeMs: 0,\n success: false,\n errorMessage: outcome.error.message,\n });\n // Write an error JSON alongside\n const errPath = resolve(outputDir, `${name}.error.json`);\n writeFileSync(\n errPath,\n JSON.stringify(\n {\n component: name,\n errorMessage: outcome.error.message,\n heuristicFlags: outcome.error.heuristicFlags,\n propsAtCrash: outcome.error.propsAtCrash,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n const result = outcome.result;\n results.push({ name, renderTimeMs: result.renderTimeMs, success: true });\n\n // Write PNG\n const pngPath = resolve(outputDir, `${name}.png`);\n writeFileSync(pngPath, result.screenshot);\n\n // Write JSON\n const jsonPath = resolve(outputDir, `${name}.json`);\n writeFileSync(jsonPath, JSON.stringify(formatRenderJson(name, {}, result), null, 2));\n\n // On TTY, print a per-component one-liner to stdout\n if (isTTY()) {\n process.stdout.write(\n `✓ ${name} → ${opts.outputDir}/${name}.png (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n }\n };\n\n // Concurrency pool\n let nextIdx = 0;\n const worker = async (): Promise<void> => {\n while (nextIdx < componentNames.length) {\n const i = nextIdx++;\n const name = componentNames[i];\n if (name !== undefined) {\n await renderOne(name);\n }\n }\n };\n\n const workers: Promise<void>[] = [];\n for (let w = 0; w < Math.min(concurrency, total); w++) {\n workers.push(worker());\n }\n await Promise.all(workers);\n\n await shutdownPool();\n\n process.stderr.write(\"\\n\");\n\n // Summary always goes to stderr (it's metadata); stdout is for\n // per-component one-liners on TTY or JSON on pipe\n const summary = formatSummaryText(results, outputDir);\n process.stderr.write(`${summary}\\n`);\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Format resolution helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the output format for `scope render <component>`.\n *\n * Priority:\n * 1. Explicit --format flag\n * 2. TTY → \"file\" (write PNG to default path, print one-liner)\n * 3. Pipe → \"json\" (emit structured JSON for programmatic consumers)\n */\nfunction resolveSingleFormat(formatFlag: string | undefined): \"file\" | \"json\" | \"png\" {\n if (formatFlag !== undefined) {\n const lower = formatFlag.toLowerCase();\n if (lower !== \"png\" && lower !== \"json\") {\n throw new Error(`Unknown format \"${formatFlag}\". Allowed: png, json`);\n }\n return lower;\n }\n return isTTY() ? \"file\" : \"json\";\n}\n\n/**\n * Resolve the output format for `scope render matrix <component>`.\n *\n * Priority:\n * 1. Explicit --format flag\n * 2. TTY and --sprite not already handled → \"file\" (write sprite sheet to default path)\n * 3. Pipe → \"json\"\n */\nfunction resolveMatrixFormat(\n formatFlag: string | undefined,\n spriteAlreadyWritten: boolean,\n): \"file\" | \"json\" | \"png\" | \"html\" | \"csv\" {\n if (formatFlag !== undefined) {\n const lower = formatFlag.toLowerCase();\n const allowed = [\"json\", \"png\", \"html\", \"csv\"] as const;\n if (!(allowed as readonly string[]).includes(lower)) {\n throw new Error(`Unknown format \"${formatFlag}\". Allowed: ${allowed.join(\", \")}`);\n }\n return lower as \"json\" | \"png\" | \"html\" | \"csv\";\n }\n if (isTTY() && !spriteAlreadyWritten) {\n return \"file\";\n }\n return \"json\";\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates and returns the `render` command group with three sub-commands:\n * - `scope render <component>` (default)\n * - `scope render matrix <component>`\n * - `scope render all`\n */\nexport function createRenderCommand(): Command {\n const renderCmd = new Command(\"render\").description(\n \"Render components to PNG or JSON via esbuild + BrowserPool\",\n );\n\n registerRenderSingle(renderCmd);\n registerRenderMatrix(renderCmd);\n registerRenderAll(renderCmd);\n\n return renderCmd;\n}\n","/**\n * component-bundler.ts\n *\n * Bundles a React component source file into a self-contained IIFE using\n * esbuild, then wraps it in an HTML harness that Playwright can load via\n * page.setContent().\n *\n * Design\n * ------\n * 1. A thin wrapper entry (via esbuild stdin) imports the real component file,\n * resolves the default or named export, and renders it into #scope-root via\n * ReactDOM.createRoot(). All dependencies (react, react-dom, …) are bundled\n * inline — no CDN, no network.\n *\n * 2. esbuild format \"iife\" wraps everything in (function(){ … })() so the\n * script can be embedded as a plain <script> tag (no type=\"module\" needed,\n * no blob-URL import tricks required).\n *\n * 3. After React finishes rendering, the script sets\n * window.__SCOPE_RENDER_COMPLETE__ = true (or __SCOPE_RENDER_ERROR__).\n * The caller waits on this flag via page.waitForFunction().\n */\n\nimport { dirname } from \"node:path\";\nimport * as esbuild from \"esbuild\";\n\n// ---------------------------------------------------------------------------\n// HTML harness builder\n// ---------------------------------------------------------------------------\n\n/**\n * Bundle the component at `filePath` and return a complete HTML page that\n * renders it with `props`. Suitable for page.setContent().\n *\n * @param filePath - Absolute path to the component source file\n * @param componentName - The export name to try first (for named exports).\n * Falls back to `default` and first function found.\n * @param props - Props to pass to the component\n * @param viewportWidth - Used in the viewport meta tag\n * @param projectCss - Optional CSS string (e.g. compiled Tailwind v4) to inject in the page\n */\nexport async function buildComponentHarness(\n filePath: string,\n componentName: string,\n props: Record<string, unknown>,\n viewportWidth: number,\n projectCss?: string,\n): Promise<string> {\n const bundledScript = await bundleComponentToIIFE(filePath, componentName, props);\n return wrapInHtml(bundledScript, viewportWidth, projectCss);\n}\n\n// ---------------------------------------------------------------------------\n// esbuild bundling\n// ---------------------------------------------------------------------------\n\n/**\n * Build the wrapper + component into a single IIFE script string.\n * The IIFE handles rendering and signals completion via globals.\n */\nasync function bundleComponentToIIFE(\n filePath: string,\n componentName: string,\n props: Record<string, unknown>,\n): Promise<string> {\n // Safely encode props — avoid </script> injection\n const propsJson = JSON.stringify(props).replace(/<\\/script>/gi, \"<\\\\/script>\");\n\n // The wrapper entry: import component, pick export, render, signal done.\n // We use the filePath as an absolute import — esbuild handles this via absWorkingDir.\n const wrapperCode = /* ts */ `\nimport * as __scopeMod from ${JSON.stringify(filePath)};\nimport { createRoot } from \"react-dom/client\";\nimport { createElement } from \"react\";\n\n(function scopeRenderHarness() {\n var Component =\n __scopeMod[\"default\"] ||\n __scopeMod[${JSON.stringify(componentName)}] ||\n (Object.values(__scopeMod).find(\n function(v) { return typeof v === \"function\" && /^[A-Z]/.test(v.name || \"\"); }\n ));\n\n if (!Component) {\n window.__SCOPE_RENDER_ERROR__ =\n \"No renderable component found. Checked: default, \" +\n ${JSON.stringify(componentName)} + \", and PascalCase named exports. \" +\n \"Available exports: \" + Object.keys(__scopeMod).join(\", \");\n window.__SCOPE_RENDER_COMPLETE__ = true;\n return;\n }\n\n try {\n var props = ${propsJson};\n var rootEl = document.getElementById(\"scope-root\");\n if (!rootEl) {\n window.__SCOPE_RENDER_ERROR__ = \"#scope-root element not found\";\n window.__SCOPE_RENDER_COMPLETE__ = true;\n return;\n }\n createRoot(rootEl).render(createElement(Component, props));\n // Use requestAnimationFrame to let React flush the render\n requestAnimationFrame(function() {\n window.__SCOPE_RENDER_COMPLETE__ = true;\n });\n } catch (err) {\n window.__SCOPE_RENDER_ERROR__ = err instanceof Error ? err.message : String(err);\n window.__SCOPE_RENDER_COMPLETE__ = true;\n }\n})();\n`;\n\n const result = await esbuild.build({\n stdin: {\n contents: wrapperCode,\n // Resolve relative imports (within the component's dir)\n resolveDir: dirname(filePath),\n loader: \"tsx\",\n sourcefile: \"__scope_harness__.tsx\",\n },\n bundle: true,\n format: \"iife\",\n write: false,\n platform: \"browser\",\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n target: \"es2020\",\n // Bundle everything — no externals\n external: [],\n define: {\n \"process.env.NODE_ENV\": '\"development\"',\n global: \"globalThis\",\n },\n logLevel: \"silent\",\n // Suppress \"React must be in scope\" warnings from old JSX (we use automatic)\n banner: {\n js: \"/* @agent-scope/cli component harness */\",\n },\n });\n\n if (result.errors.length > 0) {\n const msg = result.errors\n .map((e) => `${e.text}${e.location ? ` (${e.location.file}:${e.location.line})` : \"\"}`)\n .join(\"\\n\");\n throw new Error(`esbuild failed to bundle component:\\n${msg}`);\n }\n\n const outputFile = result.outputFiles?.[0];\n if (outputFile === undefined || outputFile.text.length === 0) {\n throw new Error(\"esbuild produced no output\");\n }\n\n return outputFile.text;\n}\n\n// ---------------------------------------------------------------------------\n// HTML template\n// ---------------------------------------------------------------------------\n\nfunction wrapInHtml(bundledScript: string, viewportWidth: number, projectCss?: string): string {\n const projectStyleBlock =\n projectCss != null && projectCss.length > 0\n ? `<style id=\"scope-project-css\">\\n${projectCss.replace(/<\\/style>/gi, \"<\\\\/style>\")}\\n</style>`\n : \"\";\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=${viewportWidth}, initial-scale=1.0\" />\n <style>\n *, *::before, *::after { box-sizing: border-box; }\n html, body { margin: 0; padding: 0; background: #fff; font-family: system-ui, sans-serif; }\n #scope-root { display: inline-block; min-width: 1px; min-height: 1px; }\n </style>\n ${projectStyleBlock}\n</head>\n<body>\n <div id=\"scope-root\" data-reactscope-root></div>\n <script>${bundledScript}</script>\n</body>\n</html>`;\n}\n","/**\n * @agent-scope/cli — render output formatters\n *\n * Formats RenderResult, MatrixResult, and batch render summaries in:\n * - JSON (full structured data)\n * - PNG (raw Buffer or file write)\n * - HTML (visual grid with embedded base64 images)\n * - CSV (flat table: component, axis values, render time, compliance %)\n *\n * Also provides:\n * - progress bar rendering for `scope render all`\n * - viewport string parsing (e.g. \"1280x720\")\n */\n\nimport type { MatrixCell, MatrixResult, RenderResult } from \"@agent-scope/render\";\n\n// ---------------------------------------------------------------------------\n// Re-export TTY helper (reused from manifest-formatter)\n// ---------------------------------------------------------------------------\n\nexport { isTTY } from \"./manifest-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Viewport parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a viewport string such as \"1280x720\" into `{ width, height }`.\n * Throws if the format is invalid or values are non-positive.\n */\nexport function parseViewport(spec: string): { width: number; height: number } {\n const lower = spec.toLowerCase();\n const match = /^(\\d+)[x×](\\d+)$/.exec(lower);\n if (!match) {\n throw new Error(`Invalid viewport \"${spec}\". Expected format: WIDTHxHEIGHT (e.g. 1280x720)`);\n }\n const width = parseInt(match[1] ?? \"0\", 10);\n const height = parseInt(match[2] ?? \"0\", 10);\n if (width <= 0 || height <= 0) {\n throw new Error(`Viewport dimensions must be positive integers, got: ${spec}`);\n }\n return { width, height };\n}\n\n// ---------------------------------------------------------------------------\n// Single render JSON\n// ---------------------------------------------------------------------------\n\nexport interface RenderJsonOutput {\n component: string;\n props: Record<string, unknown>;\n width: number;\n height: number;\n renderTimeMs: number;\n computedStyles: Record<string, Record<string, string>>;\n screenshot?: string; // base64-encoded PNG\n dom?: RenderResult[\"dom\"];\n console?: RenderResult[\"console\"];\n accessibility?: RenderResult[\"accessibility\"];\n}\n\n/**\n * Format a single `RenderResult` as a structured JSON-serialisable object.\n * The screenshot is base64-encoded for portability.\n */\nexport function formatRenderJson(\n componentName: string,\n props: Record<string, unknown>,\n result: RenderResult,\n): RenderJsonOutput {\n return {\n component: componentName,\n props,\n width: result.width,\n height: result.height,\n renderTimeMs: result.renderTimeMs,\n computedStyles: result.computedStyles,\n screenshot: result.screenshot.toString(\"base64\"),\n dom: result.dom,\n console: result.console,\n accessibility: result.accessibility,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix JSON\n// ---------------------------------------------------------------------------\n\nexport interface MatrixJsonOutput {\n axes: Array<{ name: string; values: string[] }>;\n stats: {\n totalCells: number;\n totalRenderTimeMs: number;\n avgRenderTimeMs: number;\n minRenderTimeMs: number;\n maxRenderTimeMs: number;\n wallClockTimeMs: number;\n };\n cells: Array<{\n index: number;\n axisIndices: number[];\n props: Record<string, unknown>;\n renderTimeMs: number;\n width: number;\n height: number;\n screenshot: string; // base64\n }>;\n}\n\n/**\n * Format a `MatrixResult` as a structured JSON-serialisable object.\n */\nexport function formatMatrixJson(result: MatrixResult): MatrixJsonOutput {\n return {\n axes: result.axes.map((axis) => ({\n name: axis.name,\n values: axis.values.map((v) => String(v)),\n })),\n stats: { ...result.stats },\n cells: result.cells.map((cell: MatrixCell) => ({\n index: cell.index,\n axisIndices: cell.axisIndices,\n props: cell.props,\n renderTimeMs: cell.result.renderTimeMs,\n width: cell.result.width,\n height: cell.result.height,\n screenshot: cell.result.screenshot.toString(\"base64\"),\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix HTML\n// ---------------------------------------------------------------------------\n\n/**\n * Format a `MatrixResult` as an HTML visual grid with embedded images.\n *\n * Each cell is rendered as an `<img>` tag with the screenshot embedded\n * as a data URI, with prop labels displayed beneath each cell.\n */\nexport function formatMatrixHtml(componentName: string, result: MatrixResult): string {\n const cellsHtml = result.cells\n .map((cell: MatrixCell) => {\n const b64 = cell.result.screenshot.toString(\"base64\");\n const propLabel = escapeHtml(\n Object.entries(cell.props)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(\", \"),\n );\n return ` <div class=\"cell\">\n <img src=\"data:image/png;base64,${b64}\" alt=\"${propLabel}\" width=\"${cell.result.width}\" height=\"${cell.result.height}\" />\n <div class=\"label\">${propLabel}</div>\n <div class=\"meta\">${cell.result.renderTimeMs.toFixed(1)}ms</div>\n </div>`;\n })\n .join(\"\\n\");\n\n const axesDesc = result.axes\n .map((a) => `${a.name}: ${a.values.map((v) => String(v)).join(\", \")}`)\n .join(\" | \");\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${escapeHtml(componentName)} — Render Matrix</title>\n <style>\n body { font-family: system-ui, sans-serif; background: #f8fafc; margin: 0; padding: 24px; }\n h1 { font-size: 1.25rem; color: #1e293b; margin-bottom: 8px; }\n .axes { font-size: 0.8rem; color: #64748b; margin-bottom: 20px; }\n .grid { display: flex; flex-wrap: wrap; gap: 16px; }\n .cell { background: #fff; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; }\n .cell img { display: block; }\n .label { padding: 6px 8px; font-size: 0.75rem; color: #374151; border-top: 1px solid #f1f5f9; }\n .meta { padding: 2px 8px 6px; font-size: 0.7rem; color: #94a3b8; }\n .stats { margin-top: 24px; font-size: 0.8rem; color: #64748b; }\n </style>\n</head>\n<body>\n <h1>${escapeHtml(componentName)} — Render Matrix</h1>\n <div class=\"axes\">Axes: ${escapeHtml(axesDesc)}</div>\n <div class=\"grid\">\n${cellsHtml}\n </div>\n <div class=\"stats\">\n ${result.stats.totalCells} cells ·\n avg ${result.stats.avgRenderTimeMs.toFixed(1)}ms ·\n min ${result.stats.minRenderTimeMs.toFixed(1)}ms ·\n max ${result.stats.maxRenderTimeMs.toFixed(1)}ms ·\n wall ${result.stats.wallClockTimeMs.toFixed(0)}ms\n </div>\n</body>\n</html>\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Matrix CSV\n// ---------------------------------------------------------------------------\n\n/**\n * Format a `MatrixResult` as a flat CSV table.\n *\n * Columns: component, [axis name columns...], renderTimeMs\n */\nexport function formatMatrixCsv(componentName: string, result: MatrixResult): string {\n const axisNames = result.axes.map((a) => a.name);\n const headers = [\"component\", ...axisNames, \"renderTimeMs\", \"width\", \"height\"];\n\n const rows = result.cells.map((cell: MatrixCell) => {\n const axisVals = result.axes.map((_, i) => {\n const axisIdx = cell.axisIndices[i];\n const axis = result.axes[i];\n if (axisIdx === undefined || axis === undefined) return \"\";\n const val = axis.values[axisIdx];\n return val !== undefined ? csvEscape(String(val)) : \"\";\n });\n return [\n csvEscape(componentName),\n ...axisVals,\n cell.result.renderTimeMs.toFixed(3),\n String(cell.result.width),\n String(cell.result.height),\n ].join(\",\");\n });\n\n return `${[headers.join(\",\"), ...rows].join(\"\\n\")}\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Progress bar\n// ---------------------------------------------------------------------------\n\n/**\n * Render an ASCII progress bar suitable for terminal output.\n *\n * Output format:\n * Rendering 42/128 components... [=====> ] 33%\n */\nexport function renderProgressBar(\n completed: number,\n total: number,\n currentName: string,\n pct: number,\n barWidth = 20,\n): string {\n const filled = Math.round((pct / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = \"=\".repeat(Math.max(0, filled - 1)) + (filled > 0 ? \">\" : \"\") + \" \".repeat(empty);\n const nameSlice = currentName.slice(0, 25).padEnd(25);\n return `Rendering ${completed}/${total} ${nameSlice} [${bar}] ${pct}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Batch summary\n// ---------------------------------------------------------------------------\n\nexport interface BatchRenderSummaryItem {\n name: string;\n renderTimeMs: number;\n success: boolean;\n errorMessage?: string;\n}\n\n/**\n * Format a human-readable summary of a `scope render all` run.\n */\nexport function formatSummaryText(results: BatchRenderSummaryItem[], outputDir: string): string {\n const total = results.length;\n const passed = results.filter((r) => r.success).length;\n const failed = total - passed;\n const successTimes = results.filter((r) => r.success).map((r) => r.renderTimeMs);\n const avgMs =\n successTimes.length > 0 ? successTimes.reduce((a, b) => a + b, 0) / successTimes.length : 0;\n\n const lines: string[] = [\n \"─\".repeat(60),\n `Render Summary`,\n \"─\".repeat(60),\n ` Total components : ${total}`,\n ` Passed : ${passed}`,\n ` Failed : ${failed}`,\n ` Avg render time : ${avgMs.toFixed(1)}ms`,\n ` Output dir : ${outputDir}`,\n ];\n\n if (failed > 0) {\n lines.push(\"\", \" Failed components:\");\n for (const r of results) {\n if (!r.success) {\n lines.push(` ✗ ${r.name}: ${r.errorMessage ?? \"unknown error\"}`);\n }\n }\n }\n\n lines.push(\"─\".repeat(60));\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction csvEscape(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n","/**\n * tailwind-css.ts\n *\n * Resolves and compiles Tailwind v4 project CSS for use in the render harness.\n * Assumes the CLI is run from a Tailwind v4 project root (e.g. design system).\n *\n * Flow:\n * 1. Find the project's styles entry (config or conventional paths).\n * 2. Compile it with tailwindcss's compile() and loadStylesheet for @import \"tailwindcss\".\n * 3. Call compiler.build(classes) with the list of class names used in the rendered DOM\n * so only those utilities are included.\n *\n * Caching: compiler is created once per cwd and reused; build(classes) is called per render.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { resolve } from \"node:path\";\n\nconst CONFIG_FILENAMES = [\n \".reactscope/config.json\",\n \".reactscope/config.js\",\n \".reactscope/config.mjs\",\n];\nconst STYLE_ENTRY_CANDIDATES = [\n \"src/index.css\",\n \"src/globals.css\",\n \"app/globals.css\",\n \"app/index.css\",\n \"styles/index.css\",\n \"index.css\",\n];\n\nconst TAILWIND_IMPORT = /@import\\s+[\"']tailwindcss[\"']\\s*;?/;\n\n/** Scope config when using Tailwind v4 (e.g. .reactscope/config.json). */\nexport interface ScopeTailwindConfig {\n /** Path to the CSS file that contains @import \"tailwindcss\" (and optional @source). */\n stylesEntry?: string;\n}\n\nlet compilerCache: {\n cwd: string;\n build: (candidates: string[]) => string;\n} | null = null;\n\nfunction getCachedBuild(cwd: string): ((candidates: string[]) => string) | null {\n if (compilerCache !== null && resolve(compilerCache.cwd) === resolve(cwd)) {\n return compilerCache.build;\n }\n return null;\n}\n\n/**\n * Find the path to the project's main Tailwind CSS entry file.\n * Prefer .reactscope/config.json or package.json \"scope.stylesEntry\", then try conventional paths.\n */\nexport function findStylesEntry(cwd: string): string | null {\n // Explicit config\n for (const name of CONFIG_FILENAMES) {\n const p = resolve(cwd, name);\n if (!existsSync(p)) continue;\n try {\n if (name.endsWith(\".json\")) {\n const raw = readFileSync(p, \"utf-8\");\n const data = JSON.parse(raw) as Record<string, unknown>;\n const scope = data.scope as ScopeTailwindConfig | undefined;\n const entry = scope?.stylesEntry ?? (data.stylesEntry as string | undefined);\n if (typeof entry === \"string\") {\n const full = resolve(cwd, entry);\n if (existsSync(full)) return full;\n }\n }\n } catch {\n // ignore parse errors\n }\n }\n\n const pkgPath = resolve(cwd, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const raw = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(raw) as { scope?: ScopeTailwindConfig };\n const entry = pkg.scope?.stylesEntry;\n if (typeof entry === \"string\") {\n const full = resolve(cwd, entry);\n if (existsSync(full)) return full;\n }\n } catch {\n // ignore\n }\n }\n\n for (const candidate of STYLE_ENTRY_CANDIDATES) {\n const full = resolve(cwd, candidate);\n if (existsSync(full)) {\n try {\n const content = readFileSync(full, \"utf-8\");\n if (TAILWIND_IMPORT.test(content)) return full;\n } catch {\n // skip\n }\n }\n }\n return null;\n}\n\n/**\n * Compile the project's Tailwind CSS and return a function that builds CSS for given class names.\n * Uses tailwindcss package (v4); if not installed, returns null.\n */\nexport async function getTailwindCompiler(\n cwd: string,\n): Promise<((candidates: string[]) => string) | null> {\n const cached = getCachedBuild(cwd);\n if (cached !== null) return cached;\n\n const entryPath = findStylesEntry(cwd);\n if (entryPath === null) return null;\n\n // Resolve tailwindcss from the project's node_modules (cwd), not the CLI's\n let compile: (css: string, opts: unknown) => Promise<{ build: (candidates: string[]) => string }>;\n try {\n const require = createRequire(resolve(cwd, \"package.json\"));\n const tailwind = require(\"tailwindcss\") as {\n compile?: (\n css: string,\n opts: unknown,\n ) => Promise<{ build: (candidates: string[]) => string }>;\n };\n const fn = tailwind.compile;\n if (typeof fn !== \"function\") return null;\n compile = fn;\n } catch {\n return null;\n }\n\n const entryContent = readFileSync(entryPath, \"utf-8\");\n\n const loadStylesheet = async (\n id: string,\n base: string,\n ): Promise<{ path: string; base: string; content: string }> => {\n if (id === \"tailwindcss\") {\n const nodeModules = resolve(cwd, \"node_modules\");\n const tailwindCssPath = resolve(nodeModules, \"tailwindcss\", \"index.css\");\n if (!existsSync(tailwindCssPath)) {\n throw new Error(\n `Tailwind v4: tailwindcss package not found at ${tailwindCssPath}. Install with: npm install tailwindcss`,\n );\n }\n const content = readFileSync(tailwindCssPath, \"utf-8\");\n return { path: \"virtual:tailwindcss/index.css\", base, content };\n }\n const full = resolve(base, id);\n if (existsSync(full)) {\n const content = readFileSync(full, \"utf-8\");\n return { path: full, base: resolve(full, \"..\"), content };\n }\n throw new Error(`Tailwind v4: could not load stylesheet: ${id} (base: ${base})`);\n };\n\n const result = await compile(entryContent, {\n base: cwd,\n from: entryPath,\n loadStylesheet,\n });\n\n const build = result.build.bind(result);\n compilerCache = { cwd, build };\n return build;\n}\n\n/**\n * Get compiled Tailwind CSS for the given list of class names.\n * Caches the compiler per cwd; use getCompiledCssForClasses for a one-shot call.\n */\nexport async function getCompiledCssForClasses(\n cwd: string,\n classes: string[],\n): Promise<string | null> {\n const build = await getTailwindCompiler(cwd);\n if (build === null) return null;\n const deduped = [...new Set(classes)].filter(Boolean);\n if (deduped.length === 0) return null;\n return build(deduped);\n}\n\n/**\n * Clear the cached Tailwind compiler (e.g. for tests or when cwd changes).\n */\nexport function clearTailwindCache(): void {\n compilerCache = null;\n}\n","/**\n * tree-formatter.ts\n *\n * Formats a ComponentNode tree as an ASCII tree string similar to the `tree`\n * command — but for React components.\n *\n * Example output:\n * App\n * ├── Layout\n * │ ├── Header\n * │ │ └── Logo\n * │ └── Main\n * │ └── Content\n * └── Footer\n */\n\nimport type { ComponentNode } from \"@agent-scope/core\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TreeFormatOptions {\n /** Maximum depth to display. Undefined = unlimited. */\n maxDepth?: number;\n /** Include prop names next to each component. Default: false */\n showProps?: boolean;\n /** Show hook count per component. Default: false */\n showHooks?: boolean;\n /** Whether to include host (DOM) elements. Default: false */\n showHost?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Box-drawing constants\n// ---------------------------------------------------------------------------\n\nconst BRANCH = \"├── \";\nconst LAST_BRANCH = \"└── \";\nconst VERTICAL = \"│ \";\nconst EMPTY = \" \";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Build a human-readable label for a component node.\n */\nfunction buildLabel(node: ComponentNode, options: TreeFormatOptions): string {\n const parts: string[] = [node.name];\n\n // Append component type badges\n if (node.type === \"memo\") {\n parts.push(\"[memo]\");\n } else if (node.type === \"forward_ref\") {\n parts.push(\"[forwardRef]\");\n } else if (node.type === \"class\") {\n parts.push(\"[class]\");\n }\n\n // Prop names\n if (options.showProps === true) {\n const props = node.props;\n if (\n props.type === \"object\" &&\n \"entries\" in props &&\n Array.isArray((props as Record<string, unknown>).entries)\n ) {\n const entries = (props as Record<string, unknown[]>).entries as Array<{\n key: string;\n value: unknown;\n }>;\n const propNames = entries\n .map((e) => e.key)\n .filter((k) => k !== \"children\")\n .slice(0, 4);\n if (propNames.length > 0) {\n parts.push(`{${propNames.join(\", \")}}`);\n }\n } else if (props.type === \"undefined\" || props.type === \"null\") {\n // no props — nothing to show\n } else {\n // Simple preview from the serialized value\n const preview = props.preview;\n if (preview && preview !== \"[object Object]\") {\n parts.push(preview);\n }\n }\n }\n\n // Hook counts\n if (options.showHooks === true && node.state.length > 0) {\n const hookCounts = new Map<string, number>();\n for (const hook of node.state) {\n const label = hook.name ?? hook.type;\n hookCounts.set(label, (hookCounts.get(label) ?? 0) + 1);\n }\n const summary = Array.from(hookCounts.entries())\n .map(([k, v]) => (v > 1 ? `${k}×${v}` : k))\n .join(\", \");\n parts.push(`[${summary}]`);\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Recursively render a node and its children into an array of lines.\n */\nfunction renderNode(\n node: ComponentNode,\n prefix: string,\n isLast: boolean,\n depth: number,\n options: TreeFormatOptions,\n lines: string[],\n): void {\n // Skip host elements unless explicitly requested\n if (node.type === \"host\" && options.showHost !== true) {\n // Still recurse into children so we don't lose user components inside DOM nodes\n const visibleChildren = getVisibleChildren(node, options);\n for (let i = 0; i < visibleChildren.length; i++) {\n const child = visibleChildren[i];\n if (child !== undefined) {\n renderNode(child, prefix, i === visibleChildren.length - 1, depth, options, lines);\n }\n }\n return;\n }\n\n const connector = isLast ? LAST_BRANCH : BRANCH;\n const label = buildLabel(node, options);\n lines.push(`${prefix}${connector}${label}`);\n\n // Stop recursing if we've hit maxDepth\n if (options.maxDepth !== undefined && depth >= options.maxDepth) {\n const childCount = countVisibleDescendants(node, options);\n if (childCount > 0) {\n const nextPrefix = prefix + (isLast ? EMPTY : VERTICAL);\n lines.push(`${nextPrefix}${LAST_BRANCH}… (${childCount} more)`);\n }\n return;\n }\n\n const visibleChildren = getVisibleChildren(node, options);\n const nextPrefix = prefix + (isLast ? EMPTY : VERTICAL);\n\n for (let i = 0; i < visibleChildren.length; i++) {\n const child = visibleChildren[i];\n if (child !== undefined) {\n renderNode(child, nextPrefix, i === visibleChildren.length - 1, depth + 1, options, lines);\n }\n }\n}\n\n/**\n * Filter node children according to display options.\n */\nfunction getVisibleChildren(node: ComponentNode, options: TreeFormatOptions): ComponentNode[] {\n if (options.showHost === true) {\n return node.children;\n }\n // When not showing host, collect effective visible children:\n // host children are replaced by their own visible children (recursively).\n return flattenHostChildren(node.children, options);\n}\n\nfunction flattenHostChildren(\n children: ComponentNode[],\n options: TreeFormatOptions,\n): ComponentNode[] {\n const result: ComponentNode[] = [];\n for (const child of children) {\n if (child.type === \"host\") {\n result.push(...flattenHostChildren(child.children, options));\n } else {\n result.push(child);\n }\n }\n return result;\n}\n\n/**\n * Count how many visible (non-host) descendants a node has.\n */\nfunction countVisibleDescendants(node: ComponentNode, options: TreeFormatOptions): number {\n let count = 0;\n for (const child of node.children) {\n if (child.type !== \"host\" || options.showHost === true) {\n count += 1;\n }\n count += countVisibleDescendants(child, options);\n }\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Format a ComponentNode tree as an ASCII tree string.\n *\n * The root node is printed without any connector prefix; all children use\n * box-drawing characters.\n *\n * @example\n * ```ts\n * const output = formatTree(report.tree, { maxDepth: 3, showHooks: true });\n * process.stdout.write(output + \"\\n\");\n * ```\n */\nexport function formatTree(root: ComponentNode, options: TreeFormatOptions = {}): string {\n const lines: string[] = [];\n\n // Root node label (no prefix/connector)\n if (root.type !== \"host\" || options.showHost === true) {\n lines.push(buildLabel(root, options));\n\n if (options.maxDepth === 0) {\n const childCount = countVisibleDescendants(root, options);\n if (childCount > 0) {\n lines.push(`${LAST_BRANCH}… (${childCount} more)`);\n }\n } else {\n const visibleChildren = getVisibleChildren(root, options);\n for (let i = 0; i < visibleChildren.length; i++) {\n const child = visibleChildren[i];\n if (child !== undefined) {\n renderNode(child, \"\", i === visibleChildren.length - 1, 1, options, lines);\n }\n }\n }\n } else {\n // Root is a host element and showHost is false — just render children\n const visibleChildren = getVisibleChildren(root, options);\n for (let i = 0; i < visibleChildren.length; i++) {\n const child = visibleChildren[i];\n if (child !== undefined) {\n renderNode(child, \"\", i === visibleChildren.length - 1, 1, options, lines);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Count the total number of component nodes in a tree (excluding host elements\n * unless `countHost` is true).\n */\nexport function countNodes(node: ComponentNode, countHost = false): number {\n let count = countHost || node.type !== \"host\" ? 1 : 0;\n for (const child of node.children) {\n count += countNodes(child, countHost);\n }\n return count;\n}\n\n/**\n * Compute the maximum depth of a component tree.\n */\nexport function treeDepth(node: ComponentNode): number {\n if (node.children.length === 0) return 0;\n return 1 + Math.max(...node.children.map(treeDepth));\n}\n","/**\n * report-formatter.ts\n *\n * Produces human-readable summary reports from a PageReport.\n *\n * Example output:\n * Scope Report for http://localhost:5173\n * ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n * Components: 24 total (18 function, 4 memo, 2 forwardRef)\n * Max depth: 6\n * Hooks: 42 total (12 useState, 8 useEffect, ...)\n * Error boundaries: 2\n * Suspense boundaries: 1 (1 resolved)\n * Console entries: 3 (1 warn, 2 error)\n * Capture time: 45ms\n */\n\nimport type { ComponentNode, PageReport } from \"@agent-scope/core\";\nimport { treeDepth } from \"./tree-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Analysis helpers\n// ---------------------------------------------------------------------------\n\ninterface ComponentStats {\n total: number;\n byType: Record<string, number>;\n}\n\ninterface HookStats {\n total: number;\n byType: Record<string, number>;\n}\n\n/** Walk the component tree and collect type counts. */\nfunction collectComponentStats(root: ComponentNode): ComponentStats {\n const byType: Record<string, number> = {};\n\n function walk(node: ComponentNode): void {\n if (node.type !== \"host\") {\n byType[node.type] = (byType[node.type] ?? 0) + 1;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n\n walk(root);\n\n const total = Object.values(byType).reduce((s, n) => s + n, 0);\n return { total, byType };\n}\n\n/** Walk the component tree and collect hook type counts. */\nfunction collectHookStats(root: ComponentNode): HookStats {\n const byType: Record<string, number> = {};\n\n function walk(node: ComponentNode): void {\n for (const hook of node.state) {\n const label = hook.name ?? hook.type;\n byType[label] = (byType[label] ?? 0) + 1;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n\n walk(root);\n\n const total = Object.values(byType).reduce((s, n) => s + n, 0);\n return { total, byType };\n}\n\n/**\n * Count error-boundary components (components named \"ErrorBoundary\" or class\n * components that appear to handle errors — best-effort from static names).\n */\nfunction countErrorBoundaries(root: ComponentNode): number {\n let count = 0;\n\n function walk(node: ComponentNode): void {\n if (\n node.type === \"class\" &&\n (node.name.toLowerCase().includes(\"error\") || node.name.toLowerCase().includes(\"boundary\"))\n ) {\n count += 1;\n }\n for (const child of node.children) {\n walk(child);\n }\n }\n\n walk(root);\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\n/** Right-pad a string to `width` characters. */\nfunction pad(s: string, width: number): string {\n return s.padEnd(width, \" \");\n}\n\n/** Render a key–value row with consistent alignment. */\nfunction row(label: string, value: string, labelWidth = 22): string {\n return `${pad(label, labelWidth)}${value}`;\n}\n\n/** Render a horizontal rule using ━ characters. */\nfunction rule(width: number): string {\n return \"━\".repeat(width);\n}\n\n/** Format a number-keyed record as \"(n typeA, m typeB, ...)\" */\nfunction formatBreakdown(byType: Record<string, number>, limit = 5): string {\n const entries = Object.entries(byType)\n .sort(([, a], [, b]) => b - a) // descending\n .slice(0, limit);\n\n if (entries.length === 0) return \"\";\n return `(${entries.map(([k, v]) => `${v} ${k}`).join(\", \")})`;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface ReportFormatOptions {\n /** Output as JSON instead of human-readable text. Default: false */\n json?: boolean;\n}\n\n/**\n * Format a PageReport as a human-readable summary string.\n */\nexport function formatReport(report: PageReport, options: ReportFormatOptions = {}): string {\n if (options.json === true) {\n return JSON.stringify(report, null, 2);\n }\n\n const url = report.url;\n const title = `Scope Report for ${url}`;\n const ruleWidth = Math.min(Math.max(title.length, 40), 72);\n\n const componentStats = collectComponentStats(report.tree);\n const hookStats = collectHookStats(report.tree);\n const maxDepth = treeDepth(report.tree);\n\n // Error boundaries — combine from tree walk + captured errors\n const errorBoundaries = countErrorBoundaries(report.tree);\n\n // Suspense breakdown\n const suspendedCount = report.suspenseBoundaries.filter((b) => b.isSuspended).length;\n const resolvedCount = report.suspenseBoundaries.length - suspendedCount;\n\n // Console breakdown\n const consoleLevels: Record<string, number> = {};\n for (const entry of report.consoleEntries) {\n consoleLevels[entry.level] = (consoleLevels[entry.level] ?? 0) + 1;\n }\n\n // Component type display names\n const typeNames: Record<string, string> = {\n function: \"function\",\n memo: \"memo\",\n forward_ref: \"forwardRef\",\n class: \"class\",\n };\n\n const componentBreakdown = Object.entries(componentStats.byType)\n .sort(([, a], [, b]) => b - a)\n .map(([k, v]) => `${v} ${typeNames[k] ?? k}`)\n .join(\", \");\n\n const hookBreakdown = formatBreakdown(hookStats.byType, 6);\n\n // Console summary\n const consoleBreakdownParts = Object.entries(consoleLevels)\n .sort(([, a], [, b]) => b - a)\n .map(([k, v]) => `${v} ${k}`);\n const consoleBreakdown =\n consoleBreakdownParts.length > 0 ? ` (${consoleBreakdownParts.join(\", \")})` : \"\";\n\n // Suspense summary\n const suspenseSummary =\n report.suspenseBoundaries.length > 0\n ? ` (${suspendedCount} pending, ${resolvedCount} resolved)`\n : \"\";\n\n const lines = [\n title,\n rule(ruleWidth),\n row(\n \"Components:\",\n `${componentStats.total} total${componentBreakdown ? ` (${componentBreakdown})` : \"\"}`,\n ),\n row(\"Max depth:\", String(maxDepth)),\n row(\"Hooks:\", hookStats.total > 0 ? `${hookStats.total} total ${hookBreakdown}` : \"none\"),\n row(\"Error boundaries:\", String(errorBoundaries)),\n row(\"Suspense boundaries:\", `${report.suspenseBoundaries.length}${suspenseSummary}`),\n row(\"Console entries:\", `${report.consoleEntries.length}${consoleBreakdown}`),\n row(\n \"Errors captured:\",\n report.errors.length > 0 ? `${report.errors.length} (see JSON output for details)` : \"none\",\n ),\n row(\"Capture time:\", `${report.capturedIn}ms`),\n ];\n\n // Append route info if available\n if (report.route !== null) {\n lines.push(row(\"Route:\", report.route.pattern ?? report.url));\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Structured JSON report — a summary object suitable for machine consumption.\n */\nexport interface StructuredReport {\n url: string;\n timestamp: number;\n capturedIn: number;\n components: {\n total: number;\n byType: Record<string, number>;\n maxDepth: number;\n };\n hooks: {\n total: number;\n byType: Record<string, number>;\n };\n errorBoundaries: number;\n suspenseBoundaries: {\n total: number;\n suspended: number;\n resolved: number;\n };\n consoleEntries: {\n total: number;\n byLevel: Record<string, number>;\n };\n errors: number;\n route: string | null;\n}\n\n/**\n * Produce a structured summary object from a PageReport.\n */\nexport function buildStructuredReport(report: PageReport): StructuredReport {\n const componentStats = collectComponentStats(report.tree);\n const hookStats = collectHookStats(report.tree);\n const maxDepth = treeDepth(report.tree);\n const errorBoundaries = countErrorBoundaries(report.tree);\n\n const suspendedCount = report.suspenseBoundaries.filter((b) => b.isSuspended).length;\n\n const consoleLevels: Record<string, number> = {};\n for (const entry of report.consoleEntries) {\n consoleLevels[entry.level] = (consoleLevels[entry.level] ?? 0) + 1;\n }\n\n return {\n url: report.url,\n timestamp: report.timestamp,\n capturedIn: report.capturedIn,\n components: {\n total: componentStats.total,\n byType: componentStats.byType,\n maxDepth,\n },\n hooks: {\n total: hookStats.total,\n byType: hookStats.byType,\n },\n errorBoundaries,\n suspenseBoundaries: {\n total: report.suspenseBoundaries.length,\n suspended: suspendedCount,\n resolved: report.suspenseBoundaries.length - suspendedCount,\n },\n consoleEntries: {\n total: report.consoleEntries.length,\n byLevel: consoleLevels,\n },\n errors: report.errors.length,\n route: report.route?.pattern ?? null,\n };\n}\n","/**\n * @agent-scope/cli — binary entry point\n *\n * Parses argv and executes the Scope CLI.\n */\n\nimport { createProgram } from \"./program.js\";\n\nconst program = createProgram();\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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","names":["readFileSync","Command","writeFileSync","row","writeFileSync","mkdirSync","writeFileSync","resolve","Command","existsSync","readFileSync","resolve","require","build","MANIFEST_PATH","resolve","writeFileSync","mkdirSync","Command","visibleChildren","nextPrefix","pad","program","Command","readFileSync"]}