@agent-scope/cli 1.10.0 → 1.12.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 +1305 -179
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +1341 -241
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +264 -1
- package/dist/index.d.ts +264 -1
- package/dist/index.js +1340 -243
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/init/detect.ts","../src/init/index.ts","../src/manifest-formatter.ts","../src/manifest-commands.ts","../src/browser.ts","../src/component-bundler.ts","../src/render-formatter.ts","../src/instrument/renders.ts","../src/tailwind-css.ts","../src/render-commands.ts","../src/report/baseline.ts","../src/tree-formatter.ts","../src/report-formatter.ts","../src/tokens/commands.ts","../src/program.ts"],"names":["resolve","join","existsSync","readFileSync","row","mkdirSync","writeFileSync","Command","MANIFEST_PATH","require","build","_pool","getPool","BrowserPool","shutdownPool","generateManifest","safeRender","visibleChildren","nextPrefix","pad","isTTY","buildTable","registerGet","TokenResolver","registerList"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @agent-scope/cli — project auto-detection engine\n *\n * Analyses a project root directory (read-only) and returns a\n * `DetectedProject` describing the framework, TypeScript setup,\n * component patterns, design-token sources, and package manager.\n *\n * Detection is best-effort and non-destructive: it reads files but\n * never writes or modifies anything.\n */\n\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** A file-based source of design tokens found in the project. */\nexport interface TokenSource {\n /** Human-readable kind. */\n kind: \"tailwind-config\" | \"css-custom-properties\" | \"theme-file\";\n /** Absolute path to the file. */\n path: string;\n}\n\n/** The result returned by {@link detectProject}. */\nexport interface DetectedProject {\n /** Detected JS/TS framework. */\n framework: \"next\" | \"vite\" | \"cra\" | \"remix\" | \"unknown\";\n /** Whether a tsconfig.json was found. */\n typescript: boolean;\n /** Absolute path to the tsconfig, or null. */\n tsconfigPath: string | null;\n /** Glob patterns covering component source files (relative, e.g. `src/**\\/*.tsx`). */\n componentPatterns: string[];\n /** Design-token sources discovered in the project. */\n tokenSources: TokenSource[];\n /** Package manager inferred from lockfile presence. */\n packageManager: \"bun\" | \"npm\" | \"yarn\" | \"pnpm\";\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Return true if any file whose name starts with `stem` exists in `dir`. */\nfunction hasConfigFile(dir: string, stem: string): boolean {\n if (!existsSync(dir)) return false;\n try {\n const entries = readdirSync(dir);\n return entries.some((f) => f === stem || f.startsWith(`${stem}.`));\n } catch {\n return false;\n }\n}\n\n/** Safely read a file as UTF-8; return null on any error. */\nfunction readSafe(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Framework detection\n// ---------------------------------------------------------------------------\n\nfunction detectFramework(\n rootDir: string,\n packageDeps: Record<string, string>,\n): DetectedProject[\"framework\"] {\n // Next.js — next.config.{js,ts,mjs,cjs,…}\n if (hasConfigFile(rootDir, \"next.config\")) return \"next\";\n\n // Vite — vite.config.{js,ts,mjs,cjs,…}\n if (hasConfigFile(rootDir, \"vite.config\")) return \"vite\";\n\n // Remix — remix.config.{js,ts,…}\n if (hasConfigFile(rootDir, \"remix.config\")) return \"remix\";\n\n // CRA — react-scripts present in (dev)dependencies\n if (\"react-scripts\" in packageDeps) return \"cra\";\n\n return \"unknown\";\n}\n\n// ---------------------------------------------------------------------------\n// Package manager detection\n// ---------------------------------------------------------------------------\n\nfunction detectPackageManager(rootDir: string): DetectedProject[\"packageManager\"] {\n if (existsSync(join(rootDir, \"bun.lock\"))) return \"bun\";\n if (existsSync(join(rootDir, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(rootDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(rootDir, \"package-lock.json\"))) return \"npm\";\n return \"npm\"; // default fallback\n}\n\n// ---------------------------------------------------------------------------\n// TypeScript detection\n// ---------------------------------------------------------------------------\n\nfunction detectTypeScript(rootDir: string): { typescript: boolean; tsconfigPath: string | null } {\n const candidate = join(rootDir, \"tsconfig.json\");\n if (existsSync(candidate)) {\n return { typescript: true, tsconfigPath: candidate };\n }\n return { typescript: false, tsconfigPath: null };\n}\n\n// ---------------------------------------------------------------------------\n// Component pattern detection\n// ---------------------------------------------------------------------------\n\n/** Common directories that typically contain React components. */\nconst COMPONENT_DIRS = [\"src/components\", \"src/app\", \"src/pages\", \"src/ui\", \"src/features\", \"src\"];\n\n/** Extensions that indicate React component files. */\nconst COMPONENT_EXTS = [\".tsx\", \".jsx\"] as const;\n\nfunction detectComponentPatterns(rootDir: string, typescript: boolean): string[] {\n const patterns: string[] = [];\n const ext = typescript ? \"tsx\" : \"jsx\";\n const altExt = typescript ? \"jsx\" : \"jsx\";\n\n for (const dir of COMPONENT_DIRS) {\n const absDir = join(rootDir, dir);\n if (!existsSync(absDir)) continue;\n\n // Scan one level deep to confirm there are component files\n let hasComponents = false;\n try {\n const entries = readdirSync(absDir, { withFileTypes: true });\n hasComponents = entries.some(\n (e) => e.isFile() && COMPONENT_EXTS.some((x) => e.name.endsWith(x)),\n );\n // Also check one level of subdirectories\n if (!hasComponents) {\n hasComponents = entries.some(\n (e) =>\n e.isDirectory() &&\n (() => {\n try {\n return readdirSync(join(absDir, e.name)).some((f) =>\n COMPONENT_EXTS.some((x) => f.endsWith(x)),\n );\n } catch {\n return false;\n }\n })(),\n );\n }\n } catch {\n continue;\n }\n\n if (hasComponents) {\n patterns.push(`${dir}/**/*.${ext}`);\n if (altExt !== ext) {\n patterns.push(`${dir}/**/*.${altExt}`);\n }\n }\n }\n\n // Deduplicate and return; if nothing found, emit a broad fallback\n const unique = [...new Set(patterns)];\n if (unique.length === 0) {\n return [`**/*.${ext}`];\n }\n return unique;\n}\n\n// ---------------------------------------------------------------------------\n// Token source detection\n// ---------------------------------------------------------------------------\n\n/** Tailwind config file stems to check. */\nconst TAILWIND_STEMS = [\"tailwind.config\"];\n\n/** CSS file extensions. */\nconst CSS_EXTS = [\".css\", \".scss\", \".sass\", \".less\"];\n\n/** Theme file suffixes. */\nconst THEME_SUFFIXES = [\".theme.ts\", \".theme.js\", \".theme.tsx\"];\n\n/** Regex that matches a CSS :root block containing custom properties. */\nconst CSS_CUSTOM_PROPS_RE = /:root\\s*\\{[^}]*--[a-zA-Z]/;\n\nfunction detectTokenSources(rootDir: string): TokenSource[] {\n const sources: TokenSource[] = [];\n\n // 1. Tailwind config files (project root)\n for (const stem of TAILWIND_STEMS) {\n if (hasConfigFile(rootDir, stem)) {\n try {\n const entries = readdirSync(rootDir);\n const match = entries.find((f) => f === stem || f.startsWith(`${stem}.`));\n if (match) {\n sources.push({ kind: \"tailwind-config\", path: join(rootDir, match) });\n }\n } catch {\n // ignore\n }\n }\n }\n\n // 2. CSS files with :root { --* custom properties (search src/)\n const srcDir = join(rootDir, \"src\");\n const dirsToScan: string[] = existsSync(srcDir) ? [srcDir] : [];\n\n for (const scanDir of dirsToScan) {\n try {\n const entries = readdirSync(scanDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && CSS_EXTS.some((x) => entry.name.endsWith(x))) {\n const filePath = join(scanDir, entry.name);\n const content = readSafe(filePath);\n if (content !== null && CSS_CUSTOM_PROPS_RE.test(content)) {\n sources.push({ kind: \"css-custom-properties\", path: filePath });\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n // 3. Theme files (*.theme.ts / .theme.js / .theme.tsx) in src/ root\n if (existsSync(srcDir)) {\n try {\n const entries = readdirSync(srcDir);\n for (const entry of entries) {\n if (THEME_SUFFIXES.some((s) => entry.endsWith(s))) {\n sources.push({ kind: \"theme-file\", path: join(srcDir, entry) });\n }\n }\n } catch {\n // ignore\n }\n }\n\n return sources;\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\n/**\n * Analyse `rootDir` and return a best-effort description of the project.\n *\n * @param rootDir Absolute (or CWD-relative) path to the project root.\n */\nexport function detectProject(rootDir: string): DetectedProject {\n // Parse package.json for dependency info (framework & CRA detection)\n const pkgPath = join(rootDir, \"package.json\");\n let packageDeps: Record<string, string> = {};\n const pkgContent = readSafe(pkgPath);\n if (pkgContent !== null) {\n try {\n const pkg = JSON.parse(pkgContent) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n packageDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n } catch {\n // malformed package.json — proceed with empty deps\n }\n }\n\n const framework = detectFramework(rootDir, packageDeps);\n const { typescript, tsconfigPath } = detectTypeScript(rootDir);\n const packageManager = detectPackageManager(rootDir);\n const componentPatterns = detectComponentPatterns(rootDir, typescript);\n const tokenSources = detectTokenSources(rootDir);\n\n return {\n framework,\n typescript,\n tsconfigPath,\n componentPatterns,\n tokenSources,\n packageManager,\n };\n}\n","/**\n * @agent-scope/cli — `scope init` command implementation\n *\n * Scaffolds a `reactscope.config.json` (and friends) in the current working\n * directory. Supports two modes:\n *\n * - Interactive (default): prompts the user to confirm / override every\n * auto-detected value via Node's built-in `readline`.\n * - Non-interactive (`--yes`): accepts all auto-detected defaults without\n * prompting and prints a summary of created files.\n *\n * Safety rules (locked decisions):\n * - Config file format is JSON (`reactscope.config.json`).\n * - Output directory is `.reactscope/` — always added to `.gitignore`.\n * - Auto-detection is non-destructive; never overwrite existing config\n * without `--force`.\n */\n\nimport { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport * as readline from \"node:readline\";\nimport type { DetectedProject } from \"./detect.js\";\nimport { detectProject } from \"./detect.js\";\n\n// ---------------------------------------------------------------------------\n// Config schema types\n// ---------------------------------------------------------------------------\n\nexport interface ReactScopeConfig {\n components: {\n include: string[];\n exclude: string[];\n wrappers: { providers: string[]; globalCSS: string[] };\n };\n render: {\n viewport: { default: { width: number; height: number } };\n theme: \"light\" | \"dark\";\n warmBrowser: boolean;\n };\n tokens: {\n file: string;\n compliance: { threshold: number };\n };\n output: {\n dir: string;\n sprites: { format: \"png\" | \"webp\"; cellPadding: number; labelAxes: boolean };\n json: { pretty: boolean };\n };\n ci: {\n complianceThreshold: number;\n failOnA11yViolations: boolean;\n failOnConsoleErrors: boolean;\n baselinePath: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Defaults builder\n// ---------------------------------------------------------------------------\n\nfunction buildDefaultConfig(\n detected: DetectedProject,\n tokenFile: string,\n outputDir: string,\n): ReactScopeConfig {\n const include =\n detected.componentPatterns.length > 0 ? detected.componentPatterns : [\"src/**/*.tsx\"];\n\n return {\n components: {\n include,\n exclude: [\"**/*.test.tsx\", \"**/*.stories.tsx\"],\n wrappers: { providers: [], globalCSS: [] },\n },\n render: {\n viewport: { default: { width: 1280, height: 800 } },\n theme: \"light\",\n warmBrowser: true,\n },\n tokens: {\n file: tokenFile,\n compliance: { threshold: 90 },\n },\n output: {\n dir: outputDir,\n sprites: { format: \"png\", cellPadding: 8, labelAxes: true },\n json: { pretty: true },\n },\n ci: {\n complianceThreshold: 90,\n failOnA11yViolations: true,\n failOnConsoleErrors: false,\n baselinePath: `${outputDir}baseline/`,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// readline helper\n// ---------------------------------------------------------------------------\n\nfunction createRL(): readline.Interface {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\nasync function ask(rl: readline.Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n}\n\nasync function askWithDefault(\n rl: readline.Interface,\n label: string,\n defaultValue: string,\n): Promise<string> {\n const answer = await ask(rl, ` ${label} [${defaultValue}]: `);\n return answer.length > 0 ? answer : defaultValue;\n}\n\n// ---------------------------------------------------------------------------\n// .gitignore helper\n// ---------------------------------------------------------------------------\n\nfunction ensureGitignoreEntry(rootDir: string, entry: string): void {\n const gitignorePath = join(rootDir, \".gitignore\");\n\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, \"utf-8\");\n // Check both with and without trailing slash\n const normalised = entry.replace(/\\/$/, \"\");\n const lines = content.split(\"\\n\").map((l) => l.trim());\n if (lines.includes(entry) || lines.includes(normalised)) {\n // Already present — idempotent, nothing to do\n return;\n }\n // Append with a leading newline to avoid joining with the last existing line\n const suffix = content.endsWith(\"\\n\") ? \"\" : \"\\n\";\n appendFileSync(gitignorePath, `${suffix}${entry}\\n`);\n } else {\n // Create a minimal .gitignore\n writeFileSync(gitignorePath, `${entry}\\n`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Scaffold helpers\n// ---------------------------------------------------------------------------\n\nfunction scaffoldConfig(rootDir: string, config: ReactScopeConfig): string {\n const path = join(rootDir, \"reactscope.config.json\");\n writeFileSync(path, `${JSON.stringify(config, null, 2)}\\n`);\n return path;\n}\n\nfunction scaffoldTokenFile(rootDir: string, tokenFile: string): string {\n const path = join(rootDir, tokenFile);\n if (!existsSync(path)) {\n const stub = {\n $schema:\n \"https://raw.githubusercontent.com/FlatFilers/Scope/main/packages/tokens/schema.json\",\n tokens: {},\n };\n writeFileSync(path, `${JSON.stringify(stub, null, 2)}\\n`);\n }\n return path;\n}\n\nfunction scaffoldOutputDir(rootDir: string, outputDir: string): string {\n const dirPath = join(rootDir, outputDir);\n mkdirSync(dirPath, { recursive: true });\n // Place a .gitkeep so the directory is tracked when tokens dir is NOT gitignored\n const keepPath = join(dirPath, \".gitkeep\");\n if (!existsSync(keepPath)) {\n writeFileSync(keepPath, \"\");\n }\n return dirPath;\n}\n\n// ---------------------------------------------------------------------------\n// Public init options / result types\n// ---------------------------------------------------------------------------\n\nexport interface InitOptions {\n /** Accept all defaults without prompting. */\n yes: boolean;\n /** Overwrite existing config without warning. */\n force: boolean;\n /** Root directory (defaults to `process.cwd()`). */\n cwd?: string;\n}\n\nexport interface InitResult {\n /** Whether the command succeeded. */\n success: boolean;\n /** Human-readable message summarising the outcome. */\n message: string;\n /** Paths of files that were created. */\n created: string[];\n /** Whether init was skipped (config already existed and --force was not set). */\n skipped: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Main exported function\n// ---------------------------------------------------------------------------\n\n/**\n * Execute `scope init` logic.\n *\n * Separated from the Commander action so it can be unit-tested without\n * spawning a real subprocess.\n */\nexport async function runInit(options: InitOptions): Promise<InitResult> {\n const rootDir = options.cwd ?? process.cwd();\n const configPath = join(rootDir, \"reactscope.config.json\");\n const created: string[] = [];\n\n // ── Safety: existing config check ────────────────────────────────────────\n if (existsSync(configPath) && !options.force) {\n const msg = \"reactscope.config.json already exists. Run with --force to overwrite.\";\n process.stderr.write(`⚠️ ${msg}\\n`);\n return { success: false, message: msg, created: [], skipped: true };\n }\n\n // ── Auto-detect project ───────────────────────────────────────────────────\n const detected = detectProject(rootDir);\n\n // ── Build initial defaults ────────────────────────────────────────────────\n const defaultTokenFile = \"reactscope.tokens.json\";\n const defaultOutputDir = \".reactscope/\";\n let config = buildDefaultConfig(detected, defaultTokenFile, defaultOutputDir);\n\n if (options.yes) {\n // Non-interactive: use all defaults, just print what we detected\n process.stdout.write(\"\\n🔍 Detected project settings:\\n\");\n process.stdout.write(` Framework : ${detected.framework}\\n`);\n process.stdout.write(` TypeScript : ${detected.typescript}\\n`);\n process.stdout.write(` Include globs : ${config.components.include.join(\", \")}\\n`);\n process.stdout.write(` Token file : ${config.tokens.file}\\n`);\n process.stdout.write(` Output dir : ${config.output.dir}\\n\\n`);\n } else {\n // Interactive: prompt for each setting\n const rl = createRL();\n\n process.stdout.write(\"\\n🚀 scope init — project configuration\\n\");\n process.stdout.write(\" Press Enter to accept the detected value shown in brackets.\\n\\n\");\n\n try {\n // Framework (informational, no schema field directly — but affects include)\n process.stdout.write(` Detected framework: ${detected.framework}\\n`);\n\n // Include patterns\n const includeRaw = await askWithDefault(\n rl,\n \"Component include patterns (comma-separated)\",\n config.components.include.join(\", \"),\n );\n config.components.include = includeRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n // Exclude patterns\n const excludeRaw = await askWithDefault(\n rl,\n \"Component exclude patterns (comma-separated)\",\n config.components.exclude.join(\", \"),\n );\n config.components.exclude = excludeRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n // Token file\n const tokenFile = await askWithDefault(rl, \"Token file location\", config.tokens.file);\n config.tokens.file = tokenFile;\n config.ci.baselinePath = `${config.output.dir}baseline/`;\n\n // Output dir\n const outputDir = await askWithDefault(rl, \"Output directory\", config.output.dir);\n config.output.dir = outputDir.endsWith(\"/\") ? outputDir : `${outputDir}/`;\n config.ci.baselinePath = `${config.output.dir}baseline/`;\n\n // Rebuild config with potentially updated token + output dir\n config = buildDefaultConfig(detected, config.tokens.file, config.output.dir);\n // Re-apply user overrides\n config.components.include = includeRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n config.components.exclude = excludeRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n } finally {\n rl.close();\n }\n\n process.stdout.write(\"\\n\");\n }\n\n // ── Scaffold files ────────────────────────────────────────────────────────\n\n // 1. reactscope.config.json\n const cfgPath = scaffoldConfig(rootDir, config);\n created.push(cfgPath);\n\n // 2. reactscope.tokens.json (stub)\n const tokPath = scaffoldTokenFile(rootDir, config.tokens.file);\n created.push(tokPath);\n\n // 3. Output directory\n const outDirPath = scaffoldOutputDir(rootDir, config.output.dir);\n created.push(outDirPath);\n\n // 4. .gitignore entry (idempotent)\n ensureGitignoreEntry(rootDir, config.output.dir);\n\n // ── Summary ───────────────────────────────────────────────────────────────\n process.stdout.write(\"✅ Scope project initialised!\\n\\n\");\n process.stdout.write(\" Created files:\\n\");\n for (const p of created) {\n process.stdout.write(` ${p}\\n`);\n }\n process.stdout.write(\"\\n Next steps: run `scope manifest` to scan your components.\\n\\n\");\n\n return {\n success: true,\n message: \"Project initialised successfully.\",\n created,\n skipped: false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Commander command factory\n// ---------------------------------------------------------------------------\n\nimport { Command } from \"commander\";\n\nexport function createInitCommand(): Command {\n return new Command(\"init\")\n .description(\"Initialise a Scope project — scaffold reactscope.config.json and friends\")\n .option(\"-y, --yes\", \"Accept all detected defaults without prompting\", false)\n .option(\"--force\", \"Overwrite existing reactscope.config.json if present\", false)\n .action(async (opts: { yes: boolean; force: boolean }) => {\n try {\n const result = await runInit({ yes: opts.yes, force: opts.force });\n if (!result.success && !result.skipped) {\n process.exit(1);\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 * @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 — 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 * 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 * 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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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 * @agent-scope/cli — scope instrument renders\n *\n * Re-render causality analysis command.\n *\n * Renders a component via BrowserPool, injects interaction-scoped instrumentation,\n * replays an interaction sequence, and traces every re-render back to its root cause.\n *\n * ## Architecture\n *\n * 1. Build an HTML harness via buildComponentHarness (esbuild IIFE)\n * 2. Inject a render-instrumentation script that hooks into React's DevTools\n * fiber hook to track re-renders with cause attribution\n * 3. Load into Playwright, execute interactions, collect render events\n * 4. Post-process events into causality chains (per Instrumentation Spec §2)\n * 5. Detect wasted renders (propsChanged=false AND stateChanged=false AND\n * contextChanged=false AND memoized=false)\n * 6. Emit JSON when piped, formatted table when TTY\n *\n * ## Usage\n *\n * ```bash\n * scope instrument renders SearchPage --interaction '[{\"action\":\"type\",\"target\":\"input\",\"text\":\"hello\"}]'\n * scope instrument renders Button --interaction '[{\"action\":\"click\",\"target\":\"button\"}]' --json\n * ```\n */\n\nimport { resolve } from \"node:path\";\nimport { BrowserPool } from \"@agent-scope/render\";\nimport { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { loadManifest } from \"../manifest-commands.js\";\nimport { isTTY } from \"../render-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\n\n// ---------------------------------------------------------------------------\n// Types — Instrumentation Spec §2\n// ---------------------------------------------------------------------------\n\n/** Root cause categories per Instrumentation Spec §2.1 */\nexport type RenderTrigger =\n | \"state_change\"\n | \"props_change\"\n | \"context_change\"\n | \"parent_rerender\"\n | \"force_update\"\n | \"hook_dependency\";\n\n/** A single link in the causality chain from root cause to this render */\nexport interface CausalityLink {\n component: string;\n trigger: RenderTrigger;\n propsChanged?: boolean;\n stateChanged?: boolean;\n contextChanged?: boolean;\n origin?: string;\n stateKey?: string;\n}\n\n/** Per-component render event with causality chain */\nexport interface RenderEvent {\n component: string;\n renderIndex: number;\n trigger: RenderTrigger;\n propsChanged: boolean;\n stateChanged: boolean;\n contextChanged: boolean;\n memoized: boolean;\n /** Wasted render: re-rendered with no changed inputs and not memoized */\n wasted: boolean;\n chain: CausalityLink[];\n cascade: {\n totalRendersTriggered: number;\n uniqueComponents: number;\n unchangedPropRenders: number;\n };\n}\n\n/** Heuristic flag from Instrumentation Spec §6.1 */\nexport interface InstrumentFlag {\n id: string;\n severity: \"error\" | \"warning\" | \"info\";\n component: string;\n detail: string;\n data: Record<string, unknown>;\n}\n\n/** Raw render event captured in-browser before post-processing */\nexport interface RawRenderEvent {\n component: string;\n renderIndex: number;\n propsChanged: boolean;\n stateChanged: boolean;\n contextChanged: boolean;\n memoized: boolean;\n parentComponent: string | null;\n hookDepsChanged: boolean;\n forceUpdate: boolean;\n}\n\n/** Full output of the renders analysis */\nexport interface RendersAnalysisResult {\n component: string;\n interaction: InteractionStep[];\n summary: {\n totalRenders: number;\n uniqueComponents: number;\n wastedRenders: number;\n interactionDurationMs: number;\n };\n renders: RenderEvent[];\n flags: InstrumentFlag[];\n}\n\n/** Interaction step definition per Instrumentation Spec §5.1 */\nexport interface InteractionStep {\n action: \"click\" | \"type\" | \"wait\" | \"hover\" | \"blur\" | \"focus\" | \"scroll\";\n target?: string;\n text?: string;\n condition?: string;\n timeout?: number;\n x?: number;\n y?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Causality chain builder\n// ---------------------------------------------------------------------------\n\n/**\n * Determine the trigger type for a render event based on its attributes.\n * Priority order mirrors the spec's taxonomy (most-specific first).\n */\nexport function determineTrigger(event: RawRenderEvent): RenderTrigger {\n if (event.forceUpdate) return \"force_update\";\n if (event.stateChanged) return \"state_change\";\n if (event.propsChanged) return \"props_change\";\n if (event.contextChanged) return \"context_change\";\n if (event.hookDepsChanged) return \"hook_dependency\";\n return \"parent_rerender\";\n}\n\n/**\n * Determine if a render is \"wasted\" per Instrumentation Spec §2.3.\n * All of: propsChanged=false AND stateChanged=false AND contextChanged=false AND memoized=false.\n */\nexport function isWastedRender(event: RawRenderEvent): boolean {\n return !event.propsChanged && !event.stateChanged && !event.contextChanged && !event.memoized;\n}\n\n/**\n * Build causality chains for all render events.\n *\n * For each render, we trace backward through the render sequence to find\n * the root cause. If a component's trigger is parent_rerender, we look for\n * the parent's render event and continue up the chain.\n */\nexport function buildCausalityChains(rawEvents: RawRenderEvent[]): RenderEvent[] {\n const result: RenderEvent[] = [];\n\n // Build lookup: component name → most recent render event\n const componentLastRender = new Map<string, RawRenderEvent>();\n\n for (const raw of rawEvents) {\n const trigger = determineTrigger(raw);\n const wasted = isWastedRender(raw);\n\n // Build the causality chain (root cause → this render)\n const chain: CausalityLink[] = [];\n\n // Trace up through parent_rerender triggers to find root cause\n let current: RawRenderEvent = raw;\n const visited = new Set<string>();\n\n while (true) {\n if (visited.has(current.component)) break;\n visited.add(current.component);\n\n const currentTrigger = determineTrigger(current);\n chain.unshift({\n component: current.component,\n trigger: currentTrigger,\n propsChanged: current.propsChanged,\n stateChanged: current.stateChanged,\n contextChanged: current.contextChanged,\n });\n\n // If this is a root cause trigger, stop\n if (currentTrigger !== \"parent_rerender\" || current.parentComponent === null) {\n break;\n }\n\n // Walk up to parent\n const parentEvent = componentLastRender.get(current.parentComponent);\n if (parentEvent === undefined) break;\n current = parentEvent;\n }\n\n // Cascade stats: how many renders were triggered by the same root cause\n const rootCause = chain[0];\n const cascadeRenders = rawEvents.filter((e) => {\n if (rootCause === undefined) return false;\n // Simple heuristic: same root cause component in the chain\n return e.component !== rootCause.component && !e.stateChanged && !e.propsChanged;\n });\n\n result.push({\n component: raw.component,\n renderIndex: raw.renderIndex,\n trigger,\n propsChanged: raw.propsChanged,\n stateChanged: raw.stateChanged,\n contextChanged: raw.contextChanged,\n memoized: raw.memoized,\n wasted,\n chain,\n cascade: {\n totalRendersTriggered: cascadeRenders.length,\n uniqueComponents: new Set(cascadeRenders.map((e) => e.component)).size,\n unchangedPropRenders: cascadeRenders.filter((e) => !e.propsChanged).length,\n },\n });\n\n componentLastRender.set(raw.component, raw);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic flags — Instrumentation Spec §6.1 (fixed catalog, no inference)\n// ---------------------------------------------------------------------------\n\n/**\n * Apply heuristic flags to the render event list.\n * Uses only the fixed catalog from §6.1 — no inference, only pattern matching.\n */\nexport function applyHeuristicFlags(renders: RenderEvent[]): InstrumentFlag[] {\n const flags: InstrumentFlag[] = [];\n\n // Group by component\n const byComponent = new Map<string, RenderEvent[]>();\n for (const r of renders) {\n if (!byComponent.has(r.component)) byComponent.set(r.component, []);\n // biome-ignore lint/style/noNonNullAssertion: just set above\n byComponent.get(r.component)!.push(r);\n }\n\n for (const [component, events] of byComponent) {\n const wastedCount = events.filter((e) => e.wasted).length;\n const totalCount = events.length;\n\n // WASTED_RENDER — Component re-rendered with unchanged props/state/context, not memoized\n if (wastedCount > 0) {\n flags.push({\n id: \"WASTED_RENDER\",\n severity: \"warning\",\n component,\n detail: `${wastedCount}/${totalCount} renders were wasted — unchanged props/state/context, not memoized`,\n data: { wastedCount, totalCount, wastedRatio: wastedCount / totalCount },\n });\n }\n\n // RENDER_CASCADE — Single state change triggers >50 component re-renders\n for (const event of events) {\n if (event.cascade.totalRendersTriggered > 50) {\n flags.push({\n id: \"RENDER_CASCADE\",\n severity: \"warning\",\n component,\n detail: `State change in ${component} triggered ${event.cascade.totalRendersTriggered} downstream re-renders`,\n data: {\n totalRendersTriggered: event.cascade.totalRendersTriggered,\n uniqueComponents: event.cascade.uniqueComponents,\n unchangedPropRenders: event.cascade.unchangedPropRenders,\n },\n });\n break; // one flag per component\n }\n }\n }\n\n return flags;\n}\n\n// ---------------------------------------------------------------------------\n// In-browser instrumentation script\n// ---------------------------------------------------------------------------\n\n/**\n * Generates the JavaScript snippet that hooks into React's DevTools fiber\n * hook to capture render events during an interaction window.\n *\n * This runs in-browser (injected into the Playwright page) and stores\n * captured events in `window.__SCOPE_RENDER_EVENTS__`.\n */\nexport function buildInstrumentationScript(): string {\n return /* js */ `\n(function installScopeRenderInstrumentation() {\n window.__SCOPE_RENDER_EVENTS__ = [];\n window.__SCOPE_RENDER_INDEX__ = 0;\n\n var hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!hook) return;\n\n var originalOnCommit = hook.onCommitFiberRoot;\n var renderedComponents = new Map(); // componentName -> { lastProps, lastState }\n\n function extractName(fiber) {\n if (!fiber) return 'Unknown';\n var type = fiber.type;\n if (!type) return 'Unknown';\n if (typeof type === 'string') return type; // host element\n if (typeof type === 'function') return type.displayName || type.name || 'Anonymous';\n if (type.displayName) return type.displayName;\n if (type.render && typeof type.render === 'function') {\n return type.render.displayName || type.render.name || 'Anonymous';\n }\n return 'Anonymous';\n }\n\n function isMemoized(fiber) {\n // MemoComponent = 14, SimpleMemoComponent = 15\n return fiber.tag === 14 || fiber.tag === 15;\n }\n\n function isComponent(fiber) {\n // FunctionComponent=0, ClassComponent=1, MemoComponent=14, SimpleMemoComponent=15\n return fiber.tag === 0 || fiber.tag === 1 || fiber.tag === 14 || fiber.tag === 15;\n }\n\n function shallowEqual(a, b) {\n if (a === b) return true;\n if (!a || !b) return a === b;\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (var i = 0; i < keysA.length; i++) {\n var k = keysA[i];\n if (k === 'children') continue; // ignore children prop\n if (a[k] !== b[k]) return false;\n }\n return true;\n }\n\n function getParentComponentName(fiber) {\n var parent = fiber.return;\n while (parent) {\n if (isComponent(parent)) {\n var name = extractName(parent);\n if (name && name !== 'Unknown' && !/^[a-z]/.test(name)) return name;\n }\n parent = parent.return;\n }\n return null;\n }\n\n function walkCommit(fiber) {\n if (!fiber) return;\n\n if (isComponent(fiber)) {\n var name = extractName(fiber);\n if (name && name !== 'Unknown' && !/^[a-z]/.test(name)) {\n var memoized = isMemoized(fiber);\n var currentProps = fiber.memoizedProps || {};\n var prev = renderedComponents.get(name);\n\n var propsChanged = true;\n var stateChanged = false;\n var contextChanged = false;\n var hookDepsChanged = false;\n var forceUpdate = false;\n\n if (prev) {\n propsChanged = !shallowEqual(prev.lastProps, currentProps);\n }\n\n // State: check memoizedState chain\n var memoizedState = fiber.memoizedState;\n if (prev && prev.lastStateSerialized !== undefined) {\n try {\n var stateSig = JSON.stringify(memoizedState ? memoizedState.memoizedState : null);\n stateChanged = stateSig !== prev.lastStateSerialized;\n } catch (_) {\n stateChanged = false;\n }\n }\n\n // Context: use _debugHookTypes or check dependencies\n var deps = fiber.dependencies;\n if (deps && deps.firstContext) {\n contextChanged = true; // conservative: context dep present = may have changed\n }\n\n var stateSig;\n try {\n stateSig = JSON.stringify(memoizedState ? memoizedState.memoizedState : null);\n } catch (_) {\n stateSig = null;\n }\n\n renderedComponents.set(name, {\n lastProps: currentProps,\n lastStateSerialized: stateSig,\n });\n\n var parentName = getParentComponentName(fiber);\n\n window.__SCOPE_RENDER_EVENTS__.push({\n component: name,\n renderIndex: window.__SCOPE_RENDER_INDEX__++,\n propsChanged: prev ? propsChanged : false,\n stateChanged: stateChanged,\n contextChanged: contextChanged,\n memoized: memoized,\n parentComponent: parentName,\n hookDepsChanged: hookDepsChanged,\n forceUpdate: forceUpdate,\n });\n }\n }\n\n walkCommit(fiber.child);\n walkCommit(fiber.sibling);\n }\n\n hook.onCommitFiberRoot = function(rendererID, root, priorityLevel) {\n if (typeof originalOnCommit === 'function') {\n originalOnCommit.call(hook, rendererID, root, priorityLevel);\n }\n var wipRoot = root && root.current && root.current.alternate;\n if (wipRoot) walkCommit(wipRoot);\n };\n})();\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Interaction replayer\n// ---------------------------------------------------------------------------\n\n/**\n * Execute an interaction sequence on a Playwright page.\n * Supports: click, type, wait, hover, blur, focus, scroll.\n */\nexport async function replayInteraction(\n page: import(\"playwright\").Page,\n steps: InteractionStep[],\n): Promise<void> {\n for (const step of steps) {\n switch (step.action) {\n case \"click\":\n if (step.target !== undefined) {\n await page.click(step.target, { timeout: 5000 }).catch(() => {\n // Best-effort — don't fail the whole analysis on a missing target\n });\n }\n break;\n case \"type\":\n if (step.target !== undefined && step.text !== undefined) {\n await page.fill(step.target, step.text, { timeout: 5000 }).catch(async () => {\n // Fallback to type if fill fails\n // biome-ignore lint/style/noNonNullAssertion: guarded by target/text check above\n await page.type(step.target!, step.text!, { timeout: 5000 }).catch(() => {});\n });\n }\n break;\n case \"hover\":\n if (step.target !== undefined) {\n await page.hover(step.target, { timeout: 5000 }).catch(() => {});\n }\n break;\n case \"blur\":\n if (step.target !== undefined) {\n await page\n .locator(step.target)\n .blur({ timeout: 5000 })\n .catch(() => {});\n }\n break;\n case \"focus\":\n if (step.target !== undefined) {\n await page.focus(step.target, { timeout: 5000 }).catch(() => {});\n }\n break;\n case \"scroll\":\n if (step.target !== undefined) {\n await page\n .locator(step.target)\n .scrollIntoViewIfNeeded({ timeout: 5000 })\n .catch(() => {});\n }\n break;\n case \"wait\": {\n const timeout = step.timeout ?? 1000;\n if (step.condition === \"idle\") {\n // Wait for network idle and React settle\n await page.waitForLoadState(\"networkidle\", { timeout }).catch(() => {});\n } else {\n await page.waitForTimeout(timeout);\n }\n break;\n }\n default:\n // Unknown action — skip silently\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// BrowserPool singleton (shared within one run)\n// ---------------------------------------------------------------------------\n\nlet _pool: InstanceType<typeof BrowserPool> | null = null;\n\nasync function getPool(): Promise<InstanceType<typeof BrowserPool>> {\n if (_pool === null) {\n _pool = new BrowserPool({\n size: { browsers: 1, pagesPerBrowser: 2 },\n viewportWidth: 1280,\n viewportHeight: 800,\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// Core analysis function\n// ---------------------------------------------------------------------------\n\nexport interface RendersOptions {\n componentName: string;\n interaction: InteractionStep[];\n manifestPath?: string;\n}\n\n/**\n * Run the renders analysis for a component + interaction sequence.\n *\n * 1. Loads the manifest to find the component file path\n * 2. Builds an HTML harness via esbuild\n * 3. Injects instrumentation and replays the interaction in Playwright\n * 4. Collects raw render events and builds causality chains\n * 5. Returns a structured RendersAnalysisResult\n */\nexport async function analyzeRenders(options: RendersOptions): Promise<RendersAnalysisResult> {\n const manifestPath = options.manifestPath ?? MANIFEST_PATH;\n const manifest = loadManifest(manifestPath);\n const descriptor = manifest.components[options.componentName];\n\n if (descriptor === undefined) {\n const available = Object.keys(manifest.components).slice(0, 5).join(\", \");\n throw new Error(\n `Component \"${options.componentName}\" not found in manifest.\\nAvailable: ${available}`,\n );\n }\n\n const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n // Build HTML harness\n const htmlHarness = await buildComponentHarness(filePath, options.componentName, {}, 1280);\n\n const pool = await getPool();\n const slot = await pool.acquire();\n const { page } = slot;\n\n const startMs = performance.now();\n\n try {\n // 1. Inject instrumentation BEFORE React loads\n // We add the script as an init script so it runs before page scripts\n await page.addInitScript(buildInstrumentationScript());\n\n // 2. Load the harness\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\n // 3. Wait for React render signal\n await page.waitForFunction(\n () =>\n (window as Window & { __SCOPE_RENDER_COMPLETE__?: boolean }).__SCOPE_RENDER_COMPLETE__ ===\n true,\n { timeout: 15_000 },\n );\n\n // Brief settle after initial render\n await page.waitForTimeout(100);\n\n // Reset render events counter (only track interaction-scoped renders)\n await page.evaluate(() => {\n // biome-ignore lint/suspicious/noExplicitAny: accessing internal scope globals\n (window as any).__SCOPE_RENDER_EVENTS__ = [];\n // biome-ignore lint/suspicious/noExplicitAny: accessing internal scope globals\n (window as any).__SCOPE_RENDER_INDEX__ = 0;\n });\n\n // 4. Replay interaction\n await replayInteraction(page, options.interaction);\n\n // Brief settle to capture async re-renders\n await page.waitForTimeout(200);\n\n const interactionDurationMs = performance.now() - startMs;\n\n // 5. Collect raw render events from the page\n const rawEvents = (await page.evaluate(() => {\n return (\n (window as Window & { __SCOPE_RENDER_EVENTS__?: RawRenderEvent[] })\n .__SCOPE_RENDER_EVENTS__ ?? []\n );\n })) as RawRenderEvent[];\n\n // 6. Build causality chains + detect wasted renders\n const renders = buildCausalityChains(rawEvents);\n\n // 7. Apply heuristic flags\n const flags = applyHeuristicFlags(renders);\n\n const uniqueComponents = new Set(renders.map((r) => r.component)).size;\n const wastedRenders = renders.filter((r) => r.wasted).length;\n\n return {\n component: options.componentName,\n interaction: options.interaction,\n summary: {\n totalRenders: renders.length,\n uniqueComponents,\n wastedRenders,\n interactionDurationMs: Math.round(interactionDurationMs),\n },\n renders,\n flags,\n };\n } finally {\n pool.release(slot);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Output formatters\n// ---------------------------------------------------------------------------\n\n/**\n * Format analysis result as a human-readable TTY table.\n */\nexport function formatRendersTable(result: RendersAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`\\n🔍 Re-render Analysis: ${result.component}`);\n lines.push(`${\"─\".repeat(60)}`);\n lines.push(`Total renders: ${result.summary.totalRenders}`);\n lines.push(`Unique components: ${result.summary.uniqueComponents}`);\n lines.push(`Wasted renders: ${result.summary.wastedRenders}`);\n lines.push(`Duration: ${result.summary.interactionDurationMs}ms`);\n lines.push(\"\");\n\n if (result.renders.length === 0) {\n lines.push(\"No re-renders captured during interaction.\");\n } else {\n lines.push(\"Re-renders:\");\n lines.push(\n `${\"#\".padEnd(4)} ${\"Component\".padEnd(30)} ${\"Trigger\".padEnd(18)} ${\"Wasted\".padEnd(7)} ${\"Chain Depth\"}`,\n );\n lines.push(\"─\".repeat(80));\n\n for (const r of result.renders) {\n const wasted = r.wasted ? \"⚠ yes\" : \"no\";\n const idx = String(r.renderIndex).padEnd(4);\n const comp = r.component.slice(0, 29).padEnd(30);\n const trig = r.trigger.padEnd(18);\n const w = wasted.padEnd(7);\n const depth = r.chain.length;\n lines.push(`${idx} ${comp} ${trig} ${w} ${depth}`);\n }\n }\n\n if (result.flags.length > 0) {\n lines.push(\"\");\n lines.push(\"Flags:\");\n for (const flag of result.flags) {\n const icon = flag.severity === \"error\" ? \"✗\" : flag.severity === \"warning\" ? \"⚠\" : \"ℹ\";\n lines.push(` ${icon} [${flag.id}] ${flag.component}: ${flag.detail}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `scope instrument renders` sub-command.\n */\nexport function createInstrumentRendersCommand(): Command {\n return new Command(\"renders\")\n .description(\"Trace re-render causality chains for a component during an interaction sequence\")\n .argument(\"<component>\", \"Component name to instrument (must be in manifest)\")\n .option(\n \"--interaction <json>\",\n 'Interaction sequence JSON, e.g. \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'',\n \"[]\",\n )\n .option(\"--json\", \"Output as JSON regardless of TTY\", false)\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n async (\n componentName: string,\n opts: {\n interaction: string;\n json: boolean;\n manifest: string;\n },\n ) => {\n let interaction: InteractionStep[] = [];\n try {\n interaction = JSON.parse(opts.interaction) as InteractionStep[];\n if (!Array.isArray(interaction)) {\n throw new Error(\"Interaction must be a JSON array\");\n }\n } catch {\n process.stderr.write(`Error: Invalid --interaction JSON: ${opts.interaction}\\n`);\n process.exit(1);\n }\n\n try {\n process.stderr.write(\n `Instrumenting ${componentName} (${interaction.length} interaction steps)…\\n`,\n );\n\n const result = await analyzeRenders({\n componentName,\n interaction,\n manifestPath: opts.manifest,\n });\n\n await shutdownPool();\n\n if (opts.json || !isTTY()) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n process.stdout.write(`${formatRendersTable(result)}\\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 * Creates the `scope instrument` command group.\n * Currently contains: `scope instrument renders`\n */\nexport function createInstrumentCommand(): Command {\n const instrumentCmd = new Command(\"instrument\").description(\n \"Structured instrumentation commands for React component analysis\",\n );\n\n instrumentCmd.addCommand(createInstrumentRendersCommand());\n\n return instrumentCmd;\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 * @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 * @agent-scope/cli — report baseline command\n *\n * Implements `scope report baseline`, which captures a complete snapshot of\n * the current component library state and saves it to `.reactscope/baseline/`\n * (or a custom `--output <dir>`).\n *\n * Snapshot structure:\n * ```\n * .reactscope/baseline/\n * ├── manifest.json # Full component manifest\n * ├── renders/\n * │ ├── Button.json # Structured render output per component\n * │ ├── Button.png # Screenshot per component\n * │ └── ...\n * └── compliance.json # Aggregate token compliance results\n * ```\n *\n * Running `scope report baseline` twice overwrites the previous baseline\n * in-place — versioning is left to git.\n */\n\nimport { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { generateManifest, type Manifest } from \"@agent-scope/manifest\";\nimport { BrowserPool, type RenderResult, safeRender } from \"@agent-scope/render\";\nimport type { BatchReport, ComputedStyles } from \"@agent-scope/tokens\";\nimport { ComplianceEngine, TokenResolver } from \"@agent-scope/tokens\";\nimport type { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { isTTY, matchGlob } from \"../manifest-formatter.js\";\nimport { formatRenderJson, renderProgressBar } from \"../render-formatter.js\";\nimport { getCompiledCssForClasses } from \"../tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_BASELINE_DIR = \".reactscope/baseline\";\n\n// ---------------------------------------------------------------------------\n// BrowserPool — lazy singleton for the lifetime of the baseline 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\n// ---------------------------------------------------------------------------\n\n/**\n * Renders a single component with the given props using BrowserPool + esbuild.\n * Returns the raw RenderResult on success or throws on failure.\n */\nasync function renderComponent(\n filePath: string,\n componentName: string,\n props: Record<string, unknown>,\n viewportWidth: number,\n viewportHeight: number,\n): Promise<RenderResult> {\n const pool = await getPool(viewportWidth, viewportHeight);\n const htmlHarness = await buildComponentHarness(filePath, componentName, props, viewportWidth);\n const slot = await pool.acquire();\n const { page } = slot;\n\n try {\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\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 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 // Inject compiled Tailwind CSS if present\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 startMs = performance.now();\n\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 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 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 const computedStylesRaw: 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 computedStylesRaw[\"[data-reactscope-root] > *\"] = styles;\n\n const renderTimeMs = performance.now() - startMs;\n\n return {\n screenshot,\n width: Math.round(safeW),\n height: Math.round(safeH),\n renderTimeMs,\n computedStyles: computedStylesRaw,\n };\n } finally {\n pool.release(slot);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Compliance helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract ComputedStyles from a render result's computedStyles map.\n * Maps the flat property bag into the categorised ComputedStyles shape\n * expected by ComplianceEngine.\n */\nfunction extractComputedStyles(\n computedStylesRaw: Record<string, Record<string, string>>,\n): ComputedStyles {\n const flat: Record<string, string> = {};\n for (const styles of Object.values(computedStylesRaw)) {\n Object.assign(flat, styles);\n }\n\n const colors: Record<string, string> = {};\n const spacing: Record<string, string> = {};\n const typography: Record<string, string> = {};\n const borders: Record<string, string> = {};\n const shadows: Record<string, string> = {};\n\n for (const [prop, value] of Object.entries(flat)) {\n if (prop === \"color\" || prop === \"backgroundColor\") {\n colors[prop] = value;\n } else if (prop === \"padding\" || prop === \"margin\") {\n spacing[prop] = value;\n } else if (\n prop === \"fontSize\" ||\n prop === \"fontFamily\" ||\n prop === \"fontWeight\" ||\n prop === \"lineHeight\"\n ) {\n typography[prop] = value;\n } else if (prop === \"borderRadius\" || prop === \"borderWidth\") {\n borders[prop] = value;\n } else if (prop === \"boxShadow\") {\n shadows[prop] = value;\n }\n }\n\n return { colors, spacing, typography, borders, shadows };\n}\n\n// ---------------------------------------------------------------------------\n// Baseline runner\n// ---------------------------------------------------------------------------\n\nexport interface BaselineOptions {\n /** Output directory for the baseline snapshot. Default: .reactscope/baseline */\n outputDir?: string;\n /** Glob to filter which components to baseline. Default: all */\n componentsGlob?: string;\n /** Path to manifest.json to read from instead of regenerating */\n manifestPath?: string;\n /** Viewport width. Default: 375 */\n viewportWidth?: number;\n /** Viewport height. Default: 812 */\n viewportHeight?: number;\n}\n\nexport interface BaselineResult {\n /** Absolute path to the baseline directory */\n baselineDir: string;\n /** Number of components processed */\n componentCount: number;\n /** Number of components that failed to render */\n failureCount: number;\n /** Total wall-clock time in ms */\n wallClockMs: number;\n}\n\n/**\n * Run the full baseline capture pipeline:\n * 1. Generate (or load) manifest\n * 2. Render all components (or filtered subset)\n * 3. Run token compliance audit\n * 4. Save snapshot to baseline directory\n *\n * If the baseline directory already exists it is wiped before writing,\n * ensuring the snapshot is always a clean, complete replacement.\n */\nexport async function runBaseline(options: BaselineOptions = {}): Promise<BaselineResult> {\n const {\n outputDir = DEFAULT_BASELINE_DIR,\n componentsGlob,\n manifestPath,\n viewportWidth = 375,\n viewportHeight = 812,\n } = options;\n\n const startTime = performance.now();\n const rootDir = process.cwd();\n const baselineDir = resolve(rootDir, outputDir);\n const rendersDir = resolve(baselineDir, \"renders\");\n\n // ── 1. Wipe and recreate baseline directory ──────────────────────────────\n if (existsSync(baselineDir)) {\n rmSync(baselineDir, { recursive: true, force: true });\n }\n mkdirSync(rendersDir, { recursive: true });\n\n // ── 2. Generate (or load) manifest ──────────────────────────────────────\n let manifest: Manifest;\n\n if (manifestPath !== undefined) {\n const { readFileSync } = await import(\"node:fs\");\n const absPath = resolve(rootDir, manifestPath);\n if (!existsSync(absPath)) {\n throw new Error(`Manifest not found at ${absPath}.`);\n }\n manifest = JSON.parse(readFileSync(absPath, \"utf-8\")) as Manifest;\n process.stderr.write(`Loaded manifest from ${manifestPath}\\n`);\n } else {\n process.stderr.write(\"Scanning for React components…\\n\");\n manifest = await generateManifest({ rootDir });\n const count = Object.keys(manifest.components).length;\n process.stderr.write(`Found ${count} components.\\n`);\n }\n\n // Save manifest\n writeFileSync(resolve(baselineDir, \"manifest.json\"), JSON.stringify(manifest, null, 2), \"utf-8\");\n\n // ── 3. Filter components ─────────────────────────────────────────────────\n let componentNames = Object.keys(manifest.components);\n\n if (componentsGlob !== undefined) {\n componentNames = componentNames.filter((name) => matchGlob(componentsGlob, name));\n process.stderr.write(\n `Filtered to ${componentNames.length} components matching \"${componentsGlob}\".\\n`,\n );\n }\n\n const total = componentNames.length;\n\n if (total === 0) {\n process.stderr.write(\"No components to baseline.\\n\");\n const emptyReport: BatchReport = {\n components: {},\n totalProperties: 0,\n totalOnSystem: 0,\n totalOffSystem: 0,\n aggregateCompliance: 1,\n auditedAt: new Date().toISOString(),\n };\n writeFileSync(\n resolve(baselineDir, \"compliance.json\"),\n JSON.stringify(emptyReport, null, 2),\n \"utf-8\",\n );\n return {\n baselineDir,\n componentCount: 0,\n failureCount: 0,\n wallClockMs: performance.now() - startTime,\n };\n }\n\n // ── 4. Render all components ─────────────────────────────────────────────\n process.stderr.write(`Rendering ${total} components…\\n`);\n\n const computedStylesMap = new Map<string, ComputedStyles>();\n let completed = 0;\n let failureCount = 0;\n const CONCURRENCY = 4;\n let nextIdx = 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\n const outcome = await safeRender(\n () => renderComponent(filePath, name, {}, viewportWidth, viewportHeight),\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\n if (isTTY()) {\n process.stderr.write(`${renderProgressBar(completed, total, name, pct)}\\r`);\n }\n\n if (outcome.crashed) {\n failureCount++;\n const errPath = resolve(rendersDir, `${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 \"utf-8\",\n );\n return;\n }\n\n const result = outcome.result;\n\n // Write screenshot PNG\n writeFileSync(resolve(rendersDir, `${name}.png`), result.screenshot);\n\n // Write structured render JSON\n const jsonOutput = formatRenderJson(name, {}, result);\n writeFileSync(\n resolve(rendersDir, `${name}.json`),\n JSON.stringify(jsonOutput, null, 2),\n \"utf-8\",\n );\n\n // Collect computed styles for compliance audit\n computedStylesMap.set(name, extractComputedStyles(result.computedStyles));\n };\n\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 await shutdownPool();\n\n if (isTTY()) {\n process.stderr.write(\"\\n\");\n }\n\n // ── 5. Compliance audit ──────────────────────────────────────────────────\n // Build an empty resolver — without a token file all rendered styles are\n // \"off-system\". Users integrate tokens by providing a token file via the\n // separate `scope tokens` commands; baseline stores the raw audit result.\n const resolver = new TokenResolver([]);\n const engine = new ComplianceEngine(resolver);\n const batchReport = engine.auditBatch(computedStylesMap);\n\n writeFileSync(\n resolve(baselineDir, \"compliance.json\"),\n JSON.stringify(batchReport, null, 2),\n \"utf-8\",\n );\n\n const wallClockMs = performance.now() - startTime;\n\n // ── 6. Summary ───────────────────────────────────────────────────────────\n const successCount = total - failureCount;\n process.stderr.write(\n `\\nBaseline complete: ${successCount}/${total} components rendered` +\n (failureCount > 0 ? ` (${failureCount} failed)` : \"\") +\n ` in ${(wallClockMs / 1000).toFixed(1)}s\\n`,\n );\n process.stderr.write(`Snapshot saved to ${baselineDir}\\n`);\n\n return { baselineDir, componentCount: total, failureCount, wallClockMs };\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Registers the `baseline` sub-command onto an existing Commander command\n * (typically the `report` command in program.ts).\n *\n * This avoids name collisions when the parent `report` command already\n * exists as a live-capture command.\n */\nexport function registerBaselineSubCommand(reportCmd: Command): void {\n reportCmd\n .command(\"baseline\")\n .description(\"Capture a baseline snapshot (manifest + renders + compliance) for later diffing\")\n .option(\n \"-o, --output <dir>\",\n \"Output directory for the baseline snapshot\",\n DEFAULT_BASELINE_DIR,\n )\n .option(\"--components <glob>\", \"Glob pattern to baseline a subset of components\")\n .option(\"--manifest <path>\", \"Path to an existing manifest.json to use instead of regenerating\")\n .option(\"--viewport <WxH>\", \"Viewport size, e.g. 1280x720\", \"375x812\")\n .action(\n async (opts: {\n output: string;\n components?: string;\n manifest?: string;\n viewport: string;\n }) => {\n try {\n const [wStr, hStr] = opts.viewport.split(\"x\");\n const viewportWidth = Number.parseInt(wStr ?? \"375\", 10);\n const viewportHeight = Number.parseInt(hStr ?? \"812\", 10);\n\n await runBaseline({\n outputDir: opts.output,\n componentsGlob: opts.components,\n manifestPath: opts.manifest,\n viewportWidth,\n viewportHeight,\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 * 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 — tokens sub-commands\n *\n * Registers the `scope tokens` command group with five sub-commands:\n * - `scope tokens get <path>`\n * - `scope tokens list [category]`\n * - `scope tokens search <value>`\n * - `scope tokens resolve <path>`\n * - `scope tokens validate`\n *\n * Token file location is resolved in priority order:\n * 1. `--file` flag\n * 2. `tokens.file` field in `reactscope.config.json`\n * 3. `reactscope.tokens.json` at project root (default)\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n parseTokenFileSync,\n TokenParseError,\n TokenResolver,\n type TokenType,\n TokenValidationError,\n validateTokenFile,\n} from \"@agent-scope/tokens\";\nimport { Command } from \"commander\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TOKEN_FILE = \"reactscope.tokens.json\";\nconst CONFIG_FILE = \"reactscope.config.json\";\n\n// ---------------------------------------------------------------------------\n// TTY detection (re-used from manifest-formatter pattern)\n// ---------------------------------------------------------------------------\n\nfunction isTTY(): boolean {\n return process.stdout.isTTY === true;\n}\n\n// ---------------------------------------------------------------------------\n// Table 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// Config / token file resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the path to the token file.\n *\n * Priority:\n * 1. Explicit `--file` flag value\n * 2. `tokens.file` in `reactscope.config.json`\n * 3. `reactscope.tokens.json` in cwd\n */\nexport function resolveTokenFilePath(fileFlag?: string): string {\n if (fileFlag !== undefined) {\n return resolve(process.cwd(), fileFlag);\n }\n\n const configPath = resolve(process.cwd(), CONFIG_FILE);\n if (existsSync(configPath)) {\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(raw) as unknown;\n if (\n typeof config === \"object\" &&\n config !== null &&\n \"tokens\" in config &&\n typeof (config as { tokens?: unknown }).tokens === \"object\" &&\n (config as { tokens?: { file?: unknown } }).tokens !== null &&\n typeof (config as { tokens?: { file?: unknown } }).tokens?.file === \"string\"\n ) {\n const file = (config as { tokens: { file: string } }).tokens.file;\n return resolve(process.cwd(), file);\n }\n } catch {\n // Ignore malformed config — fall through to default\n }\n }\n\n return resolve(process.cwd(), DEFAULT_TOKEN_FILE);\n}\n\n/**\n * Load and parse the token file at the given absolute path.\n * Throws with a helpful message if the file is missing.\n */\nexport function loadTokens(absPath: string) {\n if (!existsSync(absPath)) {\n throw new Error(\n `Token file not found at ${absPath}.\\nCreate a reactscope.tokens.json file or use --file to specify a path.`,\n );\n }\n const raw = readFileSync(absPath, \"utf-8\");\n return parseTokenFileSync(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Resolve-chain extraction\n// ---------------------------------------------------------------------------\n\n/**\n * Walk the raw token tree to extract the raw value for a given dot-notation path.\n * Returns null if the path doesn't exist.\n */\nfunction getRawValue(node: Record<string, unknown>, segments: string[]): string | number | null {\n const [head, ...rest] = segments;\n if (head === undefined) return null;\n\n const child = node[head];\n if (child === undefined || child === null) return null;\n\n if (rest.length === 0) {\n // Should be a leaf\n if (typeof child === \"object\" && !Array.isArray(child) && \"value\" in (child as object)) {\n const v = (child as { value: unknown }).value;\n return typeof v === \"string\" || typeof v === \"number\" ? v : null;\n }\n return null;\n }\n\n if (typeof child === \"object\" && !Array.isArray(child)) {\n return getRawValue(child as Record<string, unknown>, rest);\n }\n\n return null;\n}\n\n/**\n * Build the resolution chain for a token path.\n * e.g. `color.semantic.success` → [{path, rawValue: \"{color.green.500}\"}, {path: \"color.green.500\", rawValue: \"#22C55E\"}]\n */\nfunction buildResolutionChain(\n startPath: string,\n rawTokens: Record<string, unknown>,\n): Array<{ path: string; rawValue: string }> {\n const chain: Array<{ path: string; rawValue: string }> = [];\n const seen = new Set<string>();\n\n let current = startPath;\n while (!seen.has(current)) {\n seen.add(current);\n const rawValue = getRawValue(rawTokens, current.split(\".\"));\n if (rawValue === null) break;\n\n chain.push({ path: current, rawValue: String(rawValue) });\n\n // Check if rawValue is a reference like {path.to.token}\n const refMatch = /^\\{([^}]+)\\}$/.exec(String(rawValue));\n if (refMatch === null) break; // Reached a concrete value\n\n current = refMatch[1] ?? \"\";\n }\n\n return chain;\n}\n\n// ---------------------------------------------------------------------------\n// tokens get\n// ---------------------------------------------------------------------------\n\nfunction registerGet(tokensCmd: Command): void {\n tokensCmd\n .command(\"get <path>\")\n .description(\"Resolve a token path to its computed value\")\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action((tokenPath: string, opts: { file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(filePath);\n const resolver = new TokenResolver(tokens);\n\n const resolvedValue = resolver.resolve(tokenPath);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n const token = tokens.find((t) => t.path === tokenPath);\n process.stdout.write(\n `${JSON.stringify({ path: tokenPath, value: token?.value, resolvedValue, type: token?.type }, null, 2)}\\n`,\n );\n } else {\n process.stdout.write(`${resolvedValue}\\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// ---------------------------------------------------------------------------\n// tokens list\n// ---------------------------------------------------------------------------\n\nfunction registerList(tokensCmd: Command): void {\n tokensCmd\n .command(\"list [category]\")\n .description(\"List tokens, optionally filtered by category or type\")\n .option(\"--type <type>\", \"Filter by token type (color, dimension, fontFamily, etc.)\")\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .action(\n (category: string | undefined, opts: { type?: string; file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(filePath);\n const resolver = new TokenResolver(tokens);\n\n const filtered = resolver.list(opts.type as TokenType | undefined, category);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"table\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify(filtered, null, 2)}\\n`);\n } else {\n if (filtered.length === 0) {\n process.stdout.write(\"No tokens found.\\n\");\n return;\n }\n const headers = [\"PATH\", \"VALUE\", \"RESOLVED\", \"TYPE\"];\n const rows = filtered.map((t) => [t.path, String(t.value), t.resolvedValue, t.type]);\n process.stdout.write(`${buildTable(headers, rows)}\\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\n// ---------------------------------------------------------------------------\n// tokens search\n// ---------------------------------------------------------------------------\n\nfunction registerSearch(tokensCmd: Command): void {\n tokensCmd\n .command(\"search <value>\")\n .description(\"Find which token(s) match a computed value (supports fuzzy color matching)\")\n .option(\"--type <type>\", \"Restrict search to a specific token type\")\n .option(\"--fuzzy\", \"Return nearest match even if no exact match exists\", false)\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .action(\n (value: string, opts: { type?: string; fuzzy: boolean; file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(filePath);\n const resolver = new TokenResolver(tokens);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"table\" && !isTTY());\n\n // Determine which types to search\n const typesToSearch: TokenType[] = opts.type\n ? [opts.type as TokenType]\n : [\n \"color\",\n \"dimension\",\n \"fontFamily\",\n \"fontWeight\",\n \"number\",\n \"shadow\",\n \"duration\",\n \"cubicBezier\",\n ];\n\n const exactMatches: Array<{\n path: string;\n resolvedValue: string;\n type: TokenType;\n exact: boolean;\n distance: number;\n }> = [];\n const nearestMatches: Array<{\n path: string;\n resolvedValue: string;\n type: TokenType;\n exact: boolean;\n distance: number;\n }> = [];\n\n for (const type of typesToSearch) {\n const exact = resolver.match(value, type);\n if (exact !== null) {\n exactMatches.push({\n path: exact.token.path,\n resolvedValue: exact.token.resolvedValue,\n type: exact.token.type,\n exact: true,\n distance: 0,\n });\n }\n }\n\n // If no exact matches and fuzzy requested, get nearest per type\n if (exactMatches.length === 0 && opts.fuzzy) {\n for (const type of typesToSearch) {\n const typeTokens = tokens.filter((t) => t.type === type);\n if (typeTokens.length === 0) continue;\n try {\n const near = resolver.nearest(value, type);\n nearestMatches.push({\n path: near.token.path,\n resolvedValue: near.token.resolvedValue,\n type: near.token.type,\n exact: near.exact,\n distance: near.distance,\n });\n } catch {\n // Skip types with no tokens\n }\n }\n // Sort by distance, take top 3\n nearestMatches.sort((a, b) => a.distance - b.distance);\n nearestMatches.splice(3);\n }\n\n const results = exactMatches.length > 0 ? exactMatches : nearestMatches;\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify(results, null, 2)}\\n`);\n } else {\n if (results.length === 0) {\n process.stdout.write(\n `No tokens found matching \"${value}\".\\nTip: use --fuzzy for nearest-match search.\\n`,\n );\n return;\n }\n const headers = [\"PATH\", \"RESOLVED VALUE\", \"TYPE\", \"MATCH\", \"DISTANCE\"];\n const rows = results.map((r) => [\n r.path,\n r.resolvedValue,\n r.type,\n r.exact ? \"exact\" : \"nearest\",\n r.exact ? \"—\" : r.distance.toFixed(2),\n ]);\n process.stdout.write(`${buildTable(headers, rows)}\\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\n// ---------------------------------------------------------------------------\n// tokens resolve\n// ---------------------------------------------------------------------------\n\nfunction registerResolve(tokensCmd: Command): void {\n tokensCmd\n .command(\"resolve <path>\")\n .description(\"Show the full resolution chain for a token\")\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action((tokenPath: string, opts: { file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n const absFilePath = filePath;\n const { tokens, rawFile } = loadTokens(absFilePath);\n const resolver = new TokenResolver(tokens);\n\n // Verify the token exists\n resolver.resolve(tokenPath);\n\n const chain = buildResolutionChain(tokenPath, rawFile.tokens as Record<string, unknown>);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify({ path: tokenPath, chain }, null, 2)}\\n`);\n } else {\n if (chain.length === 0) {\n process.stdout.write(`Token \"${tokenPath}\" not found.\\n`);\n return;\n }\n // Format as: color.semantic.success → {color.green.500} → #22C55E\n const parts = chain.map((step, i) => {\n if (i < chain.length - 1) {\n return `${step.path} → ${step.rawValue}`;\n }\n return step.rawValue;\n });\n process.stdout.write(`${parts.join(\"\\n \")}\\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// ---------------------------------------------------------------------------\n// tokens validate\n// ---------------------------------------------------------------------------\n\nfunction registerValidate(tokensCmd: Command): void {\n tokensCmd\n .command(\"validate\")\n .description(\n \"Validate the token file for errors (circular refs, missing refs, type mismatches)\",\n )\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action((opts: { file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n\n if (!existsSync(filePath)) {\n throw new Error(\n `Token file not found at ${filePath}.\\nCreate a reactscope.tokens.json file or use --file to specify a path.`,\n );\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n const errors: Array<{ code: string; path?: string; message: string }> = [];\n\n // Phase 1: schema validation\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n errors.push({\n code: \"PARSE_ERROR\",\n message: `Failed to parse token file as JSON: ${String(err)}`,\n });\n outputValidationResult(filePath, errors, useJson);\n process.exit(1);\n }\n\n try {\n validateTokenFile(parsed);\n } catch (err) {\n if (err instanceof TokenValidationError) {\n for (const e of err.errors) {\n errors.push({ code: e.code, path: e.path, message: e.message });\n }\n outputValidationResult(filePath, errors, useJson);\n process.exit(1);\n }\n throw err;\n }\n\n // Phase 2: reference resolution (catches circular refs + missing refs)\n try {\n parseTokenFileSync(raw);\n } catch (err) {\n if (err instanceof TokenParseError) {\n errors.push({ code: err.code, path: err.path, message: err.message });\n } else {\n errors.push({ code: \"UNKNOWN\", message: String(err) });\n }\n outputValidationResult(filePath, errors, useJson);\n process.exit(1);\n }\n\n // All clear\n outputValidationResult(filePath, errors, useJson);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n });\n}\n\nfunction outputValidationResult(\n filePath: string,\n errors: Array<{ code: string; path?: string; message: string }>,\n useJson: boolean,\n): void {\n const valid = errors.length === 0;\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify({ valid, file: filePath, errors }, null, 2)}\\n`);\n } else {\n if (valid) {\n process.stdout.write(`✓ Token file is valid: ${filePath}\\n`);\n } else {\n process.stderr.write(`✗ Token file has ${errors.length} error(s): ${filePath}\\n\\n`);\n for (const e of errors) {\n const pathPrefix = e.path ? ` [${e.path}]` : \"\";\n process.stderr.write(` ${e.code}${pathPrefix}: ${e.message}\\n`);\n }\n process.exit(1);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create and return the `tokens` command group.\n */\nexport function createTokensCommand(): Command {\n const tokensCmd = new Command(\"tokens\").description(\n \"Query and validate design tokens from a reactscope.tokens.json file\",\n );\n\n registerGet(tokensCmd);\n registerList(tokensCmd);\n registerSearch(tokensCmd);\n registerResolve(tokensCmd);\n registerValidate(tokensCmd);\n\n return tokensCmd;\n}\n","/**\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 { createInitCommand } from \"./init/index.js\";\nimport { createInstrumentCommand } from \"./instrument/renders.js\";\nimport { createManifestCommand } from \"./manifest-commands.js\";\nimport { createRenderCommand } from \"./render-commands.js\";\nimport { registerBaselineSubCommand } from \"./report/baseline.js\";\nimport { buildStructuredReport, formatReport } from \"./report-formatter.js\";\nimport { createTokensCommand } from \"./tokens/commands.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 // ── tokens ───────────────────────────────────────────────────────────────\n program.addCommand(createTokensCommand());\n\n // ── instrument ───────────────────────────────────────────────────────────\n program.addCommand(createInstrumentCommand());\n\n // ── init ──────────────────────────────────────────────────────────────────\n program.addCommand(createInitCommand());\n\n // ── report baseline sub-command ─────────────────────────────────────────\n // Registers 'scope report baseline' on the existing report command.\n const existingReportCmd = program.commands.find((c) => c.name() === \"report\");\n if (existingReportCmd !== undefined) {\n registerBaselineSubCommand(existingReportCmd);\n }\n\n return program;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/init/detect.ts","../src/init/index.ts","../src/component-bundler.ts","../src/manifest-formatter.ts","../src/manifest-commands.ts","../src/render-formatter.ts","../src/instrument/hooks.ts","../src/instrument/profile.ts","../src/instrument/tree.ts","../src/instrument/renders.ts","../src/browser.ts","../src/tailwind-css.ts","../src/render-commands.ts","../src/report/baseline.ts","../src/tree-formatter.ts","../src/report-formatter.ts","../src/tokens/export.ts","../src/tokens/commands.ts","../src/program.ts"],"names":["resolve","join","existsSync","readFileSync","row","mkdirSync","writeFileSync","Command","MANIFEST_PATH","Cmd","chromium","resolveFormat","replayInteraction","_pool","getPool","BrowserPool","shutdownPool","getBrowserEntryScript","require","build","generateManifest","safeRender","BRANCH","LAST_BRANCH","VERTICAL","EMPTY","visibleChildren","nextPrefix","pad","TokenResolver","DEFAULT_TOKEN_FILE","CONFIG_FILE","isTTY","buildTable","resolveTokenFilePath","parseTokenFileSync","registerGet","registerList"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @agent-scope/cli — project auto-detection engine\n *\n * Analyses a project root directory (read-only) and returns a\n * `DetectedProject` describing the framework, TypeScript setup,\n * component patterns, design-token sources, and package manager.\n *\n * Detection is best-effort and non-destructive: it reads files but\n * never writes or modifies anything.\n */\n\nimport { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** A file-based source of design tokens found in the project. */\nexport interface TokenSource {\n /** Human-readable kind. */\n kind: \"tailwind-config\" | \"css-custom-properties\" | \"theme-file\";\n /** Absolute path to the file. */\n path: string;\n}\n\n/** The result returned by {@link detectProject}. */\nexport interface DetectedProject {\n /** Detected JS/TS framework. */\n framework: \"next\" | \"vite\" | \"cra\" | \"remix\" | \"unknown\";\n /** Whether a tsconfig.json was found. */\n typescript: boolean;\n /** Absolute path to the tsconfig, or null. */\n tsconfigPath: string | null;\n /** Glob patterns covering component source files (relative, e.g. `src/**\\/*.tsx`). */\n componentPatterns: string[];\n /** Design-token sources discovered in the project. */\n tokenSources: TokenSource[];\n /** Package manager inferred from lockfile presence. */\n packageManager: \"bun\" | \"npm\" | \"yarn\" | \"pnpm\";\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\n/** Return true if any file whose name starts with `stem` exists in `dir`. */\nfunction hasConfigFile(dir: string, stem: string): boolean {\n if (!existsSync(dir)) return false;\n try {\n const entries = readdirSync(dir);\n return entries.some((f) => f === stem || f.startsWith(`${stem}.`));\n } catch {\n return false;\n }\n}\n\n/** Safely read a file as UTF-8; return null on any error. */\nfunction readSafe(path: string): string | null {\n try {\n return readFileSync(path, \"utf-8\");\n } catch {\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Framework detection\n// ---------------------------------------------------------------------------\n\nfunction detectFramework(\n rootDir: string,\n packageDeps: Record<string, string>,\n): DetectedProject[\"framework\"] {\n // Next.js — next.config.{js,ts,mjs,cjs,…}\n if (hasConfigFile(rootDir, \"next.config\")) return \"next\";\n\n // Vite — vite.config.{js,ts,mjs,cjs,…}\n if (hasConfigFile(rootDir, \"vite.config\")) return \"vite\";\n\n // Remix — remix.config.{js,ts,…}\n if (hasConfigFile(rootDir, \"remix.config\")) return \"remix\";\n\n // CRA — react-scripts present in (dev)dependencies\n if (\"react-scripts\" in packageDeps) return \"cra\";\n\n return \"unknown\";\n}\n\n// ---------------------------------------------------------------------------\n// Package manager detection\n// ---------------------------------------------------------------------------\n\nfunction detectPackageManager(rootDir: string): DetectedProject[\"packageManager\"] {\n if (existsSync(join(rootDir, \"bun.lock\"))) return \"bun\";\n if (existsSync(join(rootDir, \"yarn.lock\"))) return \"yarn\";\n if (existsSync(join(rootDir, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(rootDir, \"package-lock.json\"))) return \"npm\";\n return \"npm\"; // default fallback\n}\n\n// ---------------------------------------------------------------------------\n// TypeScript detection\n// ---------------------------------------------------------------------------\n\nfunction detectTypeScript(rootDir: string): { typescript: boolean; tsconfigPath: string | null } {\n const candidate = join(rootDir, \"tsconfig.json\");\n if (existsSync(candidate)) {\n return { typescript: true, tsconfigPath: candidate };\n }\n return { typescript: false, tsconfigPath: null };\n}\n\n// ---------------------------------------------------------------------------\n// Component pattern detection\n// ---------------------------------------------------------------------------\n\n/** Common directories that typically contain React components. */\nconst COMPONENT_DIRS = [\"src/components\", \"src/app\", \"src/pages\", \"src/ui\", \"src/features\", \"src\"];\n\n/** Extensions that indicate React component files. */\nconst COMPONENT_EXTS = [\".tsx\", \".jsx\"] as const;\n\nfunction detectComponentPatterns(rootDir: string, typescript: boolean): string[] {\n const patterns: string[] = [];\n const ext = typescript ? \"tsx\" : \"jsx\";\n const altExt = typescript ? \"jsx\" : \"jsx\";\n\n for (const dir of COMPONENT_DIRS) {\n const absDir = join(rootDir, dir);\n if (!existsSync(absDir)) continue;\n\n // Scan one level deep to confirm there are component files\n let hasComponents = false;\n try {\n const entries = readdirSync(absDir, { withFileTypes: true });\n hasComponents = entries.some(\n (e) => e.isFile() && COMPONENT_EXTS.some((x) => e.name.endsWith(x)),\n );\n // Also check one level of subdirectories\n if (!hasComponents) {\n hasComponents = entries.some(\n (e) =>\n e.isDirectory() &&\n (() => {\n try {\n return readdirSync(join(absDir, e.name)).some((f) =>\n COMPONENT_EXTS.some((x) => f.endsWith(x)),\n );\n } catch {\n return false;\n }\n })(),\n );\n }\n } catch {\n continue;\n }\n\n if (hasComponents) {\n patterns.push(`${dir}/**/*.${ext}`);\n if (altExt !== ext) {\n patterns.push(`${dir}/**/*.${altExt}`);\n }\n }\n }\n\n // Deduplicate and return; if nothing found, emit a broad fallback\n const unique = [...new Set(patterns)];\n if (unique.length === 0) {\n return [`**/*.${ext}`];\n }\n return unique;\n}\n\n// ---------------------------------------------------------------------------\n// Token source detection\n// ---------------------------------------------------------------------------\n\n/** Tailwind config file stems to check. */\nconst TAILWIND_STEMS = [\"tailwind.config\"];\n\n/** CSS file extensions. */\nconst CSS_EXTS = [\".css\", \".scss\", \".sass\", \".less\"];\n\n/** Theme file suffixes. */\nconst THEME_SUFFIXES = [\".theme.ts\", \".theme.js\", \".theme.tsx\"];\n\n/** Regex that matches a CSS :root block containing custom properties. */\nconst CSS_CUSTOM_PROPS_RE = /:root\\s*\\{[^}]*--[a-zA-Z]/;\n\nfunction detectTokenSources(rootDir: string): TokenSource[] {\n const sources: TokenSource[] = [];\n\n // 1. Tailwind config files (project root)\n for (const stem of TAILWIND_STEMS) {\n if (hasConfigFile(rootDir, stem)) {\n try {\n const entries = readdirSync(rootDir);\n const match = entries.find((f) => f === stem || f.startsWith(`${stem}.`));\n if (match) {\n sources.push({ kind: \"tailwind-config\", path: join(rootDir, match) });\n }\n } catch {\n // ignore\n }\n }\n }\n\n // 2. CSS files with :root { --* custom properties (search src/)\n const srcDir = join(rootDir, \"src\");\n const dirsToScan: string[] = existsSync(srcDir) ? [srcDir] : [];\n\n for (const scanDir of dirsToScan) {\n try {\n const entries = readdirSync(scanDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile() && CSS_EXTS.some((x) => entry.name.endsWith(x))) {\n const filePath = join(scanDir, entry.name);\n const content = readSafe(filePath);\n if (content !== null && CSS_CUSTOM_PROPS_RE.test(content)) {\n sources.push({ kind: \"css-custom-properties\", path: filePath });\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n // 3. Theme files (*.theme.ts / .theme.js / .theme.tsx) in src/ root\n if (existsSync(srcDir)) {\n try {\n const entries = readdirSync(srcDir);\n for (const entry of entries) {\n if (THEME_SUFFIXES.some((s) => entry.endsWith(s))) {\n sources.push({ kind: \"theme-file\", path: join(srcDir, entry) });\n }\n }\n } catch {\n // ignore\n }\n }\n\n return sources;\n}\n\n// ---------------------------------------------------------------------------\n// Main export\n// ---------------------------------------------------------------------------\n\n/**\n * Analyse `rootDir` and return a best-effort description of the project.\n *\n * @param rootDir Absolute (or CWD-relative) path to the project root.\n */\nexport function detectProject(rootDir: string): DetectedProject {\n // Parse package.json for dependency info (framework & CRA detection)\n const pkgPath = join(rootDir, \"package.json\");\n let packageDeps: Record<string, string> = {};\n const pkgContent = readSafe(pkgPath);\n if (pkgContent !== null) {\n try {\n const pkg = JSON.parse(pkgContent) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n packageDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n } catch {\n // malformed package.json — proceed with empty deps\n }\n }\n\n const framework = detectFramework(rootDir, packageDeps);\n const { typescript, tsconfigPath } = detectTypeScript(rootDir);\n const packageManager = detectPackageManager(rootDir);\n const componentPatterns = detectComponentPatterns(rootDir, typescript);\n const tokenSources = detectTokenSources(rootDir);\n\n return {\n framework,\n typescript,\n tsconfigPath,\n componentPatterns,\n tokenSources,\n packageManager,\n };\n}\n","/**\n * @agent-scope/cli — `scope init` command implementation\n *\n * Scaffolds a `reactscope.config.json` (and friends) in the current working\n * directory. Supports two modes:\n *\n * - Interactive (default): prompts the user to confirm / override every\n * auto-detected value via Node's built-in `readline`.\n * - Non-interactive (`--yes`): accepts all auto-detected defaults without\n * prompting and prints a summary of created files.\n *\n * Safety rules (locked decisions):\n * - Config file format is JSON (`reactscope.config.json`).\n * - Output directory is `.reactscope/` — always added to `.gitignore`.\n * - Auto-detection is non-destructive; never overwrite existing config\n * without `--force`.\n */\n\nimport { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport * as readline from \"node:readline\";\nimport type { DetectedProject } from \"./detect.js\";\nimport { detectProject } from \"./detect.js\";\n\n// ---------------------------------------------------------------------------\n// Config schema types\n// ---------------------------------------------------------------------------\n\nexport interface ReactScopeConfig {\n components: {\n include: string[];\n exclude: string[];\n wrappers: { providers: string[]; globalCSS: string[] };\n };\n render: {\n viewport: { default: { width: number; height: number } };\n theme: \"light\" | \"dark\";\n warmBrowser: boolean;\n };\n tokens: {\n file: string;\n compliance: { threshold: number };\n };\n output: {\n dir: string;\n sprites: { format: \"png\" | \"webp\"; cellPadding: number; labelAxes: boolean };\n json: { pretty: boolean };\n };\n ci: {\n complianceThreshold: number;\n failOnA11yViolations: boolean;\n failOnConsoleErrors: boolean;\n baselinePath: string;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Defaults builder\n// ---------------------------------------------------------------------------\n\nfunction buildDefaultConfig(\n detected: DetectedProject,\n tokenFile: string,\n outputDir: string,\n): ReactScopeConfig {\n const include =\n detected.componentPatterns.length > 0 ? detected.componentPatterns : [\"src/**/*.tsx\"];\n\n return {\n components: {\n include,\n exclude: [\"**/*.test.tsx\", \"**/*.stories.tsx\"],\n wrappers: { providers: [], globalCSS: [] },\n },\n render: {\n viewport: { default: { width: 1280, height: 800 } },\n theme: \"light\",\n warmBrowser: true,\n },\n tokens: {\n file: tokenFile,\n compliance: { threshold: 90 },\n },\n output: {\n dir: outputDir,\n sprites: { format: \"png\", cellPadding: 8, labelAxes: true },\n json: { pretty: true },\n },\n ci: {\n complianceThreshold: 90,\n failOnA11yViolations: true,\n failOnConsoleErrors: false,\n baselinePath: `${outputDir}baseline/`,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// readline helper\n// ---------------------------------------------------------------------------\n\nfunction createRL(): readline.Interface {\n return readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n}\n\nasync function ask(rl: readline.Interface, question: string): Promise<string> {\n return new Promise((resolve) => {\n rl.question(question, (answer) => {\n resolve(answer.trim());\n });\n });\n}\n\nasync function askWithDefault(\n rl: readline.Interface,\n label: string,\n defaultValue: string,\n): Promise<string> {\n const answer = await ask(rl, ` ${label} [${defaultValue}]: `);\n return answer.length > 0 ? answer : defaultValue;\n}\n\n// ---------------------------------------------------------------------------\n// .gitignore helper\n// ---------------------------------------------------------------------------\n\nfunction ensureGitignoreEntry(rootDir: string, entry: string): void {\n const gitignorePath = join(rootDir, \".gitignore\");\n\n if (existsSync(gitignorePath)) {\n const content = readFileSync(gitignorePath, \"utf-8\");\n // Check both with and without trailing slash\n const normalised = entry.replace(/\\/$/, \"\");\n const lines = content.split(\"\\n\").map((l) => l.trim());\n if (lines.includes(entry) || lines.includes(normalised)) {\n // Already present — idempotent, nothing to do\n return;\n }\n // Append with a leading newline to avoid joining with the last existing line\n const suffix = content.endsWith(\"\\n\") ? \"\" : \"\\n\";\n appendFileSync(gitignorePath, `${suffix}${entry}\\n`);\n } else {\n // Create a minimal .gitignore\n writeFileSync(gitignorePath, `${entry}\\n`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Scaffold helpers\n// ---------------------------------------------------------------------------\n\nfunction scaffoldConfig(rootDir: string, config: ReactScopeConfig): string {\n const path = join(rootDir, \"reactscope.config.json\");\n writeFileSync(path, `${JSON.stringify(config, null, 2)}\\n`);\n return path;\n}\n\nfunction scaffoldTokenFile(rootDir: string, tokenFile: string): string {\n const path = join(rootDir, tokenFile);\n if (!existsSync(path)) {\n const stub = {\n $schema:\n \"https://raw.githubusercontent.com/FlatFilers/Scope/main/packages/tokens/schema.json\",\n tokens: {},\n };\n writeFileSync(path, `${JSON.stringify(stub, null, 2)}\\n`);\n }\n return path;\n}\n\nfunction scaffoldOutputDir(rootDir: string, outputDir: string): string {\n const dirPath = join(rootDir, outputDir);\n mkdirSync(dirPath, { recursive: true });\n // Place a .gitkeep so the directory is tracked when tokens dir is NOT gitignored\n const keepPath = join(dirPath, \".gitkeep\");\n if (!existsSync(keepPath)) {\n writeFileSync(keepPath, \"\");\n }\n return dirPath;\n}\n\n// ---------------------------------------------------------------------------\n// Public init options / result types\n// ---------------------------------------------------------------------------\n\nexport interface InitOptions {\n /** Accept all defaults without prompting. */\n yes: boolean;\n /** Overwrite existing config without warning. */\n force: boolean;\n /** Root directory (defaults to `process.cwd()`). */\n cwd?: string;\n}\n\nexport interface InitResult {\n /** Whether the command succeeded. */\n success: boolean;\n /** Human-readable message summarising the outcome. */\n message: string;\n /** Paths of files that were created. */\n created: string[];\n /** Whether init was skipped (config already existed and --force was not set). */\n skipped: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Main exported function\n// ---------------------------------------------------------------------------\n\n/**\n * Execute `scope init` logic.\n *\n * Separated from the Commander action so it can be unit-tested without\n * spawning a real subprocess.\n */\nexport async function runInit(options: InitOptions): Promise<InitResult> {\n const rootDir = options.cwd ?? process.cwd();\n const configPath = join(rootDir, \"reactscope.config.json\");\n const created: string[] = [];\n\n // ── Safety: existing config check ────────────────────────────────────────\n if (existsSync(configPath) && !options.force) {\n const msg = \"reactscope.config.json already exists. Run with --force to overwrite.\";\n process.stderr.write(`⚠️ ${msg}\\n`);\n return { success: false, message: msg, created: [], skipped: true };\n }\n\n // ── Auto-detect project ───────────────────────────────────────────────────\n const detected = detectProject(rootDir);\n\n // ── Build initial defaults ────────────────────────────────────────────────\n const defaultTokenFile = \"reactscope.tokens.json\";\n const defaultOutputDir = \".reactscope/\";\n let config = buildDefaultConfig(detected, defaultTokenFile, defaultOutputDir);\n\n if (options.yes) {\n // Non-interactive: use all defaults, just print what we detected\n process.stdout.write(\"\\n🔍 Detected project settings:\\n\");\n process.stdout.write(` Framework : ${detected.framework}\\n`);\n process.stdout.write(` TypeScript : ${detected.typescript}\\n`);\n process.stdout.write(` Include globs : ${config.components.include.join(\", \")}\\n`);\n process.stdout.write(` Token file : ${config.tokens.file}\\n`);\n process.stdout.write(` Output dir : ${config.output.dir}\\n\\n`);\n } else {\n // Interactive: prompt for each setting\n const rl = createRL();\n\n process.stdout.write(\"\\n🚀 scope init — project configuration\\n\");\n process.stdout.write(\" Press Enter to accept the detected value shown in brackets.\\n\\n\");\n\n try {\n // Framework (informational, no schema field directly — but affects include)\n process.stdout.write(` Detected framework: ${detected.framework}\\n`);\n\n // Include patterns\n const includeRaw = await askWithDefault(\n rl,\n \"Component include patterns (comma-separated)\",\n config.components.include.join(\", \"),\n );\n config.components.include = includeRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n // Exclude patterns\n const excludeRaw = await askWithDefault(\n rl,\n \"Component exclude patterns (comma-separated)\",\n config.components.exclude.join(\", \"),\n );\n config.components.exclude = excludeRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n // Token file\n const tokenFile = await askWithDefault(rl, \"Token file location\", config.tokens.file);\n config.tokens.file = tokenFile;\n config.ci.baselinePath = `${config.output.dir}baseline/`;\n\n // Output dir\n const outputDir = await askWithDefault(rl, \"Output directory\", config.output.dir);\n config.output.dir = outputDir.endsWith(\"/\") ? outputDir : `${outputDir}/`;\n config.ci.baselinePath = `${config.output.dir}baseline/`;\n\n // Rebuild config with potentially updated token + output dir\n config = buildDefaultConfig(detected, config.tokens.file, config.output.dir);\n // Re-apply user overrides\n config.components.include = includeRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n config.components.exclude = excludeRaw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n } finally {\n rl.close();\n }\n\n process.stdout.write(\"\\n\");\n }\n\n // ── Scaffold files ────────────────────────────────────────────────────────\n\n // 1. reactscope.config.json\n const cfgPath = scaffoldConfig(rootDir, config);\n created.push(cfgPath);\n\n // 2. reactscope.tokens.json (stub)\n const tokPath = scaffoldTokenFile(rootDir, config.tokens.file);\n created.push(tokPath);\n\n // 3. Output directory\n const outDirPath = scaffoldOutputDir(rootDir, config.output.dir);\n created.push(outDirPath);\n\n // 4. .gitignore entry (idempotent)\n ensureGitignoreEntry(rootDir, config.output.dir);\n\n // ── Summary ───────────────────────────────────────────────────────────────\n process.stdout.write(\"✅ Scope project initialised!\\n\\n\");\n process.stdout.write(\" Created files:\\n\");\n for (const p of created) {\n process.stdout.write(` ${p}\\n`);\n }\n process.stdout.write(\"\\n Next steps: run `scope manifest` to scan your components.\\n\\n\");\n\n return {\n success: true,\n message: \"Project initialised successfully.\",\n created,\n skipped: false,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Commander command factory\n// ---------------------------------------------------------------------------\n\nimport { Command } from \"commander\";\n\nexport function createInitCommand(): Command {\n return new Command(\"init\")\n .description(\"Initialise a Scope project — scaffold reactscope.config.json and friends\")\n .option(\"-y, --yes\", \"Accept all detected defaults without prompting\", false)\n .option(\"--force\", \"Overwrite existing reactscope.config.json if present\", false)\n .action(async (opts: { yes: boolean; force: boolean }) => {\n try {\n const result = await runInit({ yes: opts.yes, force: opts.force });\n if (!result.success && !result.skipped) {\n process.exit(1);\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 * 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 — 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 — 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 — 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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\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 * @agent-scope/cli — instrument hooks command\n *\n * Implements `scope instrument hooks <component>`.\n *\n * Renders the component via a Playwright page (same harness as render-commands),\n * then extracts per-hook-instance profiling data from the live React fiber tree.\n *\n * Per-hook tracking (React Instrumentation Spec §4):\n * useState: currentValue, updateCount, updateOrigins\n * useEffect: dependencyValues, fireCount, lastDuration, cleanupPresence\n * useMemo: dependencyValues, recomputeCount, cacheHitRate\n * useCallback: dependencyValues, recreationCount, cacheHitRate\n * useRef: currentValue, readCountDuringRender\n * useContext: contextType, valueAccessFrequency\n * useReducer: actionTypesDispatched, stateTransitions\n *\n * Output: per-component hook inventory JSON, plus heuristic flags from §6.1.\n */\n\nimport { resolve } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { Command as Cmd } from \"commander\";\nimport { chromium } from \"playwright\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { loadManifest } from \"../manifest-commands.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\n\n/**\n * Heuristic flags from §6.1 that apply to hook-level analysis.\n */\nexport type HookHeuristicFlag =\n | \"WASTED_RENDER\"\n | \"MEMO_INEFFECTIVE\"\n | \"EFFECT_EVERY_RENDER\"\n | \"MISSING_CLEANUP\"\n | \"STALE_CLOSURE\"\n | \"STATE_UPDATE_LOOP\";\n\n/** Per-hook-instance profiling record. */\nexport interface HookProfile {\n /** 0-based call-order index within the component. */\n index: number;\n /** Hook type inferred from fiber shape. */\n type: string;\n /** useState / useReducer: current state value (serialised). */\n currentValue?: unknown;\n /** useState / useReducer: number of state updates observed. */\n updateCount?: number;\n /** useEffect / useLayoutEffect: number of times the effect fired. */\n fireCount?: number;\n /** useEffect / useLayoutEffect: last measured run duration in ms (null when unavailable). */\n lastDuration?: number | null;\n /** useEffect / useLayoutEffect: whether a cleanup function was returned. */\n cleanupPresence?: boolean;\n /** useMemo / useCallback: number of times value was recomputed (deps changed). */\n recomputeCount?: number;\n /** useMemo / useCallback: ratio of cache hits to total checks (0-1). */\n cacheHitRate?: number;\n /** useRef: current value. */\n currentRefValue?: unknown;\n /** useRef: number of times .current was read during render (heuristic). */\n readCountDuringRender?: number;\n /** useContext: serialised context value. */\n contextValue?: unknown;\n /** useReducer: action type strings dispatched so far. */\n actionTypesDispatched?: string[];\n /** Dependency values serialised (for hooks that accept deps). */\n dependencyValues?: unknown[] | null;\n}\n\n/** Profiling result for a single component. */\nexport interface ComponentHookProfile {\n /** Component display name. */\n name: string;\n /** Source location (if available). */\n source?: { file: string; line: number } | null;\n /** Ordered list of hook profiles (one per hook call site). */\n hooks: HookProfile[];\n /** Heuristic flags detected for this component. */\n flags: HookHeuristicFlag[];\n}\n\n/** Top-level result returned by runHooksProfiling(). */\nexport interface HooksProfilingResult {\n /** Profiled component name passed on the CLI. */\n component: string;\n /** Per-component hook inventory. */\n components: ComponentHookProfile[];\n /** Global heuristic flags (union of all component flags). */\n flags: HookHeuristicFlag[];\n}\n\n// ---------------------------------------------------------------------------\n// In-browser instrumentation script\n// ---------------------------------------------------------------------------\n\n/**\n * Returns a JS string that, when evaluated in the browser after a component\n * has mounted, walks the React fiber tree and returns hook profiling data.\n *\n * This runs in the browser context where React's DevTools hook is available.\n */\nfunction buildHookInstrumentationScript(): string {\n // biome-ignore format: inline script kept readable\n return `\n(function __scopeHooksInstrument() {\n // Locate the React DevTools hook installed by the browser-entry bundle.\n // We use a lighter approach: walk __REACT_DEVTOOLS_GLOBAL_HOOK__ renderers.\n var hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!hook) return { error: \"No React DevTools hook found\" };\n\n var renderers = hook._renderers || hook.renderers;\n if (!renderers || renderers.size === 0) return { error: \"No React renderers registered\" };\n\n // Get the first renderer's fiber roots\n var renderer = null;\n if (renderers.forEach) {\n renderers.forEach(function(r) { if (!renderer) renderer = r; });\n } else {\n renderer = Object.values(renderers)[0];\n }\n\n // Handle both our wrapped format {id, renderer, fiberRoots} and raw renderer\n var fiberRoots;\n if (renderer && renderer.fiberRoots) {\n fiberRoots = renderer.fiberRoots;\n } else {\n return { error: \"No fiber roots found\" };\n }\n\n var rootFiber = null;\n fiberRoots.forEach(function(r) { if (!rootFiber) rootFiber = r; });\n if (!rootFiber) return { error: \"No fiber root\" };\n\n var current = rootFiber.current;\n if (!current) return { error: \"No current fiber\" };\n\n // Walk fiber tree and collect hook data per component\n var components = [];\n\n function serializeValue(v) {\n if (v === null) return null;\n if (v === undefined) return undefined;\n var t = typeof v;\n if (t === \"string\" || t === \"number\" || t === \"boolean\") return v;\n if (t === \"function\") return \"[function \" + (v.name || \"anonymous\") + \"]\";\n if (Array.isArray(v)) {\n try { return v.map(serializeValue); } catch(e) { return \"[Array]\"; }\n }\n if (t === \"object\") {\n try {\n var keys = Object.keys(v).slice(0, 5);\n var out = {};\n for (var k of keys) { out[k] = serializeValue(v[k]); }\n if (Object.keys(v).length > 5) out[\"...\"] = \"(truncated)\";\n return out;\n } catch(e) { return \"[Object]\"; }\n }\n return String(v);\n }\n\n // Hook node classifiers (mirrors hooks-extractor.ts logic)\n var HookLayout = 0b00100;\n\n function isEffectNode(node) {\n var ms = node.memoizedState;\n if (!ms || typeof ms !== \"object\") return false;\n return typeof ms.create === \"function\" && \"deps\" in ms && typeof ms.tag === \"number\";\n }\n\n function isRefNode(node) {\n if (node.queue != null) return false;\n var ms = node.memoizedState;\n if (!ms || typeof ms !== \"object\" || Array.isArray(ms)) return false;\n var keys = Object.keys(ms);\n return keys.length === 1 && keys[0] === \"current\";\n }\n\n function isMemoTuple(node) {\n if (node.queue != null) return false;\n var ms = node.memoizedState;\n if (!Array.isArray(ms) || ms.length !== 2) return false;\n return ms[1] === null || Array.isArray(ms[1]);\n }\n\n function isStateOrReducer(node) {\n return node.queue != null &&\n typeof node.queue === \"object\" &&\n typeof node.queue.dispatch === \"function\";\n }\n\n function isReducer(node) {\n if (!isStateOrReducer(node)) return false;\n var q = node.queue;\n if (typeof q.reducer === \"function\") return true;\n var lrr = q.lastRenderedReducer;\n if (typeof lrr !== \"function\") return false;\n var name = lrr.name || \"\";\n return name !== \"basicStateReducer\" && name !== \"\";\n }\n\n function classifyHookNode(node, index) {\n var profile = { index: index, type: \"custom\" };\n\n if (isEffectNode(node)) {\n var effect = node.memoizedState;\n profile.type = (effect.tag & HookLayout) ? \"useLayoutEffect\" : \"useEffect\";\n profile.dependencyValues = effect.deps ? effect.deps.map(serializeValue) : null;\n profile.cleanupPresence = typeof effect.destroy === \"function\";\n profile.fireCount = 1; // We can only observe the mount; runtime tracking would need injection\n profile.lastDuration = null;\n return profile;\n }\n\n if (isRefNode(node)) {\n var ref = node.memoizedState;\n profile.type = \"useRef\";\n profile.currentRefValue = serializeValue(ref.current);\n profile.readCountDuringRender = 0; // static snapshot; read count requires instrumented wrapper\n return profile;\n }\n\n if (isMemoTuple(node)) {\n var tuple = node.memoizedState;\n var val = tuple[0];\n var deps = tuple[1];\n profile.type = typeof val === \"function\" ? \"useCallback\" : \"useMemo\";\n profile.currentValue = serializeValue(val);\n profile.dependencyValues = deps ? deps.map(serializeValue) : null;\n // recomputeCount cannot be known from a single snapshot; set to 0 for mount\n profile.recomputeCount = 0;\n // On mount, first render always computes → cacheHitRate is 0 (no prior hits)\n profile.cacheHitRate = 0;\n return profile;\n }\n\n if (isStateOrReducer(node)) {\n if (isReducer(node)) {\n profile.type = \"useReducer\";\n profile.currentValue = serializeValue(node.memoizedState);\n profile.updateCount = 0;\n profile.actionTypesDispatched = [];\n // stateTransitions: we record current state as first entry\n profile.stateTransitions = [serializeValue(node.memoizedState)];\n } else {\n profile.type = \"useState\";\n profile.currentValue = serializeValue(node.memoizedState);\n profile.updateCount = 0;\n profile.updateOrigins = [];\n }\n return profile;\n }\n\n // useContext: detected via _currentValue / _currentValue2 property (React context internals)\n // Context consumers in React store the context VALUE in memoizedState directly, not\n // via a queue. Context objects themselves have _currentValue.\n // We check if memoizedState could be a context value by seeing if node has no queue\n // and memoizedState is not an array and not an effect.\n if (!node.queue && !isRefNode(node) && !isMemoTuple(node) && !isEffectNode(node)) {\n profile.type = \"custom\";\n profile.currentValue = serializeValue(node.memoizedState);\n return profile;\n }\n\n return profile;\n }\n\n // Walk the fiber tree\n var FunctionComponent = 0;\n var ClassComponent = 1;\n var ForwardRef = 11;\n var MemoComponent = 14;\n var SimpleMemoComponent = 15;\n var HostRoot = 3;\n\n function getFiberName(fiber) {\n if (!fiber.type) return null;\n if (typeof fiber.type === \"string\") return fiber.type;\n if (typeof fiber.type === \"function\") return fiber.type.displayName || fiber.type.name || \"Anonymous\";\n if (fiber.type.displayName) return fiber.type.displayName;\n if (fiber.type.render) {\n return fiber.type.render.displayName || fiber.type.render.name || \"ForwardRef\";\n }\n if (fiber.type.type) {\n return (fiber.type.type.displayName || fiber.type.type.name || \"Memo\");\n }\n return \"Unknown\";\n }\n\n function isComponentFiber(fiber) {\n var tag = fiber.tag;\n return tag === FunctionComponent || tag === ClassComponent ||\n tag === ForwardRef || tag === MemoComponent || tag === SimpleMemoComponent;\n }\n\n function walkFiber(fiber) {\n if (!fiber) return;\n\n if (isComponentFiber(fiber)) {\n var name = getFiberName(fiber);\n if (name) {\n var hooks = [];\n var hookNode = fiber.memoizedState;\n var idx = 0;\n while (hookNode !== null && hookNode !== undefined) {\n hooks.push(classifyHookNode(hookNode, idx));\n hookNode = hookNode.next;\n idx++;\n }\n\n var source = null;\n if (fiber._debugSource) {\n source = { file: fiber._debugSource.fileName, line: fiber._debugSource.lineNumber };\n }\n\n if (hooks.length > 0) {\n components.push({ name: name, source: source, hooks: hooks });\n }\n }\n }\n\n walkFiber(fiber.child);\n walkFiber(fiber.sibling);\n }\n\n walkFiber(current.child);\n\n return { components: components };\n})();\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic flag analysis (§6.1 catalog)\n// ---------------------------------------------------------------------------\n\nfunction analyzeHookFlags(hooks: HookProfile[]): HookHeuristicFlag[] {\n const flags = new Set<HookHeuristicFlag>();\n\n for (const hook of hooks) {\n // EFFECT_EVERY_RENDER: useEffect with empty or null deps (fires every render)\n if (\n (hook.type === \"useEffect\" || hook.type === \"useLayoutEffect\") &&\n hook.dependencyValues !== undefined &&\n hook.dependencyValues === null\n ) {\n // null deps means no dep array → fires every render\n flags.add(\"EFFECT_EVERY_RENDER\");\n }\n\n // MISSING_CLEANUP: useEffect with no cleanup in a potentially leaky scenario\n if (\n (hook.type === \"useEffect\" || hook.type === \"useLayoutEffect\") &&\n hook.cleanupPresence === false &&\n hook.dependencyValues === null\n ) {\n flags.add(\"MISSING_CLEANUP\");\n }\n\n // MEMO_INEFFECTIVE: useMemo/useCallback with null deps (no memoization benefit)\n if (\n (hook.type === \"useMemo\" || hook.type === \"useCallback\") &&\n hook.dependencyValues === null\n ) {\n flags.add(\"MEMO_INEFFECTIVE\");\n }\n\n // MEMO_INEFFECTIVE: recomputeCount == renderCount means memo never hit cache\n if (\n (hook.type === \"useMemo\" || hook.type === \"useCallback\") &&\n hook.cacheHitRate !== undefined &&\n hook.cacheHitRate === 0 &&\n hook.recomputeCount !== undefined &&\n hook.recomputeCount > 1\n ) {\n flags.add(\"MEMO_INEFFECTIVE\");\n }\n\n // STATE_UPDATE_LOOP: updateCount unusually high relative to expected renders\n if (\n (hook.type === \"useState\" || hook.type === \"useReducer\") &&\n hook.updateCount !== undefined &&\n hook.updateCount > 10\n ) {\n flags.add(\"STATE_UPDATE_LOOP\");\n }\n }\n\n return [...flags];\n}\n\n// ---------------------------------------------------------------------------\n// Core profiling logic\n// ---------------------------------------------------------------------------\n\n/**\n * Render the named component in a headless browser and extract hook profiling data.\n */\nexport async function runHooksProfiling(\n componentName: string,\n filePath: string,\n props: Record<string, unknown>,\n): Promise<HooksProfilingResult> {\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 // Load the component harness (same approach as render-commands)\n const htmlHarness = await buildComponentHarness(filePath, componentName, props, 1280);\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\n // Wait for the component to render\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 // Run the hook instrumentation script in the browser\n const instrumentScript = buildHookInstrumentationScript();\n const raw = await page.evaluate(instrumentScript);\n\n const result = raw as {\n error?: string;\n components?: Array<{\n name: string;\n source: { file: string; line: number } | null;\n hooks: HookProfile[];\n }>;\n };\n\n if (result.error) {\n throw new Error(`Hook instrumentation failed: ${result.error}`);\n }\n\n const rawComponents = result.components ?? [];\n\n // Analyze heuristic flags per component\n const components: ComponentHookProfile[] = rawComponents.map((c) => ({\n name: c.name,\n source: c.source,\n hooks: c.hooks,\n flags: analyzeHookFlags(c.hooks),\n }));\n\n // Union of all flags\n const allFlags = new Set<HookHeuristicFlag>();\n for (const comp of components) {\n for (const flag of comp.flags) {\n allFlags.add(flag);\n }\n }\n\n return {\n component: componentName,\n components,\n flags: [...allFlags],\n };\n } finally {\n await browser.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates and returns the `scope instrument hooks` sub-command.\n */\nexport function createInstrumentHooksCommand(): Command {\n const cmd = new Cmd(\"hooks\")\n .description(\n \"Profile per-hook-instance data for a component: update counts, cache hit rates, effect counts, and more\",\n )\n .argument(\"<component>\", \"Component name (must exist in the manifest)\")\n .option(\"--props <json>\", \"Inline props JSON passed to the component\", \"{}\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .option(\"--format <fmt>\", \"Output format: json|text (default: auto)\", \"json\")\n .option(\"--show-flags\", \"Show heuristic flags only (useful for CI checks)\", false)\n .action(\n async (\n componentName: string,\n opts: {\n props: string;\n manifest: string;\n format: string;\n showFlags: boolean;\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 let props: Record<string, unknown> = {};\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 const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n process.stderr.write(`Instrumenting hooks for ${componentName}…\\n`);\n\n const result = await runHooksProfiling(componentName, filePath, props);\n\n if (opts.showFlags) {\n if (result.flags.length === 0) {\n process.stdout.write(\"No heuristic flags detected.\\n\");\n } else {\n for (const flag of result.flags) {\n process.stdout.write(`${flag}\\n`);\n }\n }\n return;\n }\n\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } catch (err: unknown) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n\n return cmd;\n}\n","/**\n * @agent-scope/cli — instrument profile command\n *\n * Implements `scope instrument profile <component> --interaction '...'`.\n *\n * Renders the component via a Playwright page, replays a structured interaction\n * sequence, and captures a full interaction profile per React Instrumentation\n * Spec §5:\n *\n * - totalRenders — total commit count during the interaction window\n * - uniqueComponents — distinct component names that re-rendered\n * - wastedRenders — re-renders where output was identical (heuristic)\n * - timing.js — JS execution time (ms) measured via Performance API\n * - timing.layout — Layout/reflow time (ms) measured via PerformanceObserver\n * - timing.paint — Paint time (ms) measured via PerformanceObserver\n * - layoutShifts — { count, cumulativeScore } via Layout Instability API\n *\n * Heuristic flags from §6.1 catalog: WASTED_RENDER, MEMO_INEFFECTIVE,\n * EFFECT_EVERY_RENDER, etc.\n */\n\nimport { resolve } from \"node:path\";\nimport type { Command } from \"commander\";\nimport { Command as Cmd } from \"commander\";\nimport { chromium } from \"playwright\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { loadManifest } from \"../manifest-commands.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\n\n/** An interaction step definition (JSON format per spec). */\nexport interface InteractionStep {\n /** Playwright action: click, fill, hover, press, wait */\n action: \"click\" | \"fill\" | \"hover\" | \"press\" | \"wait\";\n /** CSS selector or descriptive target for the element */\n target?: string;\n /** Value to type (for fill) or key to press (for press) */\n value?: string;\n /** Delay in ms (for wait action) */\n delay?: number;\n}\n\n/** Performance timing captured during the interaction window. */\nexport interface InteractionTiming {\n /** JS execution time in ms (from performance.now() around interactions). */\n js: number;\n /** Layout time in ms (from PerformanceObserver layout entries). */\n layout: number;\n /** Paint time in ms (from PerformanceObserver paint entries). */\n paint: number;\n}\n\n/** Layout shift data (Cumulative Layout Shift). */\nexport interface LayoutShiftData {\n /** Number of layout shift events observed. */\n count: number;\n /** Cumulative layout shift score. */\n cumulativeScore: number;\n}\n\n/**\n * Heuristic flags from §6.1 catalog applicable to interaction profiling.\n */\nexport type ProfileHeuristicFlag =\n | \"WASTED_RENDER\"\n | \"MEMO_INEFFECTIVE\"\n | \"EFFECT_EVERY_RENDER\"\n | \"MISSING_CLEANUP\"\n | \"HIGH_RENDER_COUNT\"\n | \"LAYOUT_SHIFT_DETECTED\"\n | \"SLOW_INTERACTION\";\n\n/** Full interaction profile result per Spec §5. */\nexport interface InteractionProfile {\n /** Component name profiled. */\n component: string;\n /** Total number of React commits (renders) during the interaction window. */\n totalRenders: number;\n /** Number of distinct component names that re-rendered during the window. */\n uniqueComponents: number;\n /** Estimated number of \"wasted\" renders (components that re-rendered without output change). */\n wastedRenders: number;\n /** Timing breakdown in ms. */\n timing: InteractionTiming;\n /** Layout shift metrics. */\n layoutShifts: LayoutShiftData;\n /** Heuristic flags from §6.1 catalog. */\n flags: ProfileHeuristicFlag[];\n /** Interaction steps that were replayed. */\n interaction: InteractionStep[];\n}\n\n// ---------------------------------------------------------------------------\n// In-browser profiling instrumentation\n// ---------------------------------------------------------------------------\n\n/**\n * Returns a JS string that, when evaluated BEFORE interaction replay,\n * installs commit-counting listeners on the React DevTools hook.\n */\nfunction buildProfilingSetupScript(): string {\n return `\n(function __scopeProfileSetup() {\n window.__scopeProfileData = {\n commitCount: 0,\n componentNames: new Set(),\n fiberSnapshots: []\n };\n\n var hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!hook) return { error: \"No DevTools hook\" };\n\n // Wrap onCommitFiberRoot to count commits and collect component names\n var origCommit = hook.onCommitFiberRoot.bind(hook);\n hook.onCommitFiberRoot = function(rendererID, root, priorityLevel) {\n origCommit(rendererID, root, priorityLevel);\n\n window.__scopeProfileData.commitCount++;\n\n // Walk the committed tree to collect re-rendered component names\n var current = root && root.current;\n if (!current) return;\n\n function walkFiber(fiber) {\n if (!fiber) return;\n var tag = fiber.tag;\n // FunctionComponent=0, ClassComponent=1, ForwardRef=11, Memo=14, SimpleMemo=15\n if (tag === 0 || tag === 1 || tag === 11 || tag === 14 || tag === 15) {\n var name = null;\n if (fiber.type) {\n if (typeof fiber.type === \"function\") name = fiber.type.displayName || fiber.type.name;\n else if (fiber.type.displayName) name = fiber.type.displayName;\n else if (fiber.type.render) name = fiber.type.render.displayName || fiber.type.render.name;\n else if (fiber.type.type) name = fiber.type.type.displayName || fiber.type.type.name;\n }\n // Only count fibers with a positive actualDuration (actually re-rendered this commit)\n if (name && typeof fiber.actualDuration === \"number\" && fiber.actualDuration >= 0) {\n window.__scopeProfileData.componentNames.add(name);\n }\n }\n walkFiber(fiber.child);\n walkFiber(fiber.sibling);\n }\n\n var wip = root.current.alternate || root.current;\n walkFiber(wip.child);\n };\n\n // Install PerformanceObserver for layout and paint timing\n window.__scopeLayoutTime = 0;\n window.__scopePaintTime = 0;\n window.__scopeLayoutShifts = { count: 0, score: 0 };\n\n try {\n var observer = new PerformanceObserver(function(list) {\n for (var entry of list.getEntries()) {\n if (entry.entryType === \"layout-shift\") {\n window.__scopeLayoutShifts.count++;\n window.__scopeLayoutShifts.score += entry.value || 0;\n }\n if (entry.entryType === \"longtask\") {\n window.__scopeLayoutTime += entry.duration || 0;\n }\n if (entry.entryType === \"paint\") {\n window.__scopePaintTime += entry.startTime || 0;\n }\n }\n });\n observer.observe({ entryTypes: [\"layout-shift\", \"longtask\", \"paint\"] });\n } catch(e) {\n // PerformanceObserver may not be available in all Playwright contexts\n }\n\n return { ok: true };\n})();\n`;\n}\n\n/**\n * Returns a JS string that collects the profiling results accumulated since setup.\n */\nfunction buildProfilingCollectScript(): string {\n return `\n(function __scopeProfileCollect() {\n var data = window.__scopeProfileData;\n if (!data) return { error: \"Profiling not set up\" };\n\n // Estimate wasted renders: use paint entries count as a heuristic for\n // \"components that re-rendered but their subtree output was likely unchanged\".\n // A more accurate method would require React's own wasted-render detection,\n // which requires React Profiler API. We use a conservative estimate here.\n var totalCommits = data.commitCount;\n var uniqueNames = Array.from(data.componentNames);\n\n // Wasted renders heuristic: if a component is in a subsequent commit (not the initial\n // mount commit), it *may* have been wasted if it didn't actually need to re-render.\n // For the initial snapshot we approximate: wastedRenders = max(0, totalCommits - 1) * 0.3\n // This is a heuristic — real wasted render detection needs shouldComponentUpdate/React.memo tracing.\n var wastedRenders = Math.max(0, Math.round((totalCommits - 1) * uniqueNames.length * 0.3));\n\n return {\n commitCount: totalCommits,\n uniqueComponents: uniqueNames.length,\n componentNames: uniqueNames,\n wastedRenders: wastedRenders,\n layoutTime: window.__scopeLayoutTime || 0,\n paintTime: window.__scopePaintTime || 0,\n layoutShifts: window.__scopeLayoutShifts || { count: 0, score: 0 }\n };\n})();\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Interaction replay\n// ---------------------------------------------------------------------------\n\n/**\n * Replay a sequence of interaction steps on a Playwright page.\n */\nasync function replayInteraction(\n page: import(\"playwright\").Page,\n steps: InteractionStep[],\n): Promise<void> {\n for (const step of steps) {\n switch (step.action) {\n case \"click\":\n if (step.target) {\n await page.click(step.target, { timeout: 5_000 }).catch(() => {\n // Soft-fail for optional interactions\n process.stderr.write(` ⚠ click target \"${step.target}\" not found, skipping\\n`);\n });\n }\n break;\n case \"fill\":\n if (step.target && step.value !== undefined) {\n await page.fill(step.target, step.value, { timeout: 5_000 }).catch(() => {\n process.stderr.write(` ⚠ fill target \"${step.target}\" not found, skipping\\n`);\n });\n }\n break;\n case \"hover\":\n if (step.target) {\n await page.hover(step.target, { timeout: 5_000 }).catch(() => {\n process.stderr.write(` ⚠ hover target \"${step.target}\" not found, skipping\\n`);\n });\n }\n break;\n case \"press\":\n if (step.value) {\n await page.keyboard.press(step.value);\n }\n break;\n case \"wait\":\n await page.waitForTimeout(step.delay ?? 500);\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic flag analysis for interaction profiles (§6.1)\n// ---------------------------------------------------------------------------\n\nfunction analyzeProfileFlags(\n totalRenders: number,\n wastedRenders: number,\n timing: InteractionTiming,\n layoutShifts: LayoutShiftData,\n): ProfileHeuristicFlag[] {\n const flags = new Set<ProfileHeuristicFlag>();\n\n // WASTED_RENDER: significant portion of renders were likely wasted\n if (wastedRenders > 0 && wastedRenders / Math.max(1, totalRenders) > 0.3) {\n flags.add(\"WASTED_RENDER\");\n }\n\n // HIGH_RENDER_COUNT: more than 10 commits during a single interaction\n if (totalRenders > 10) {\n flags.add(\"HIGH_RENDER_COUNT\");\n }\n\n // LAYOUT_SHIFT_DETECTED: CLS score above 0.1 (Google's \"poor\" threshold)\n if (layoutShifts.cumulativeScore > 0.1) {\n flags.add(\"LAYOUT_SHIFT_DETECTED\");\n }\n\n // SLOW_INTERACTION: total JS time > 100ms (a perceptible delay)\n if (timing.js > 100) {\n flags.add(\"SLOW_INTERACTION\");\n }\n\n return [...flags];\n}\n\n// ---------------------------------------------------------------------------\n// Core profiling logic\n// ---------------------------------------------------------------------------\n\n/**\n * Render the component, replay interactions, and collect the interaction profile.\n */\nexport async function runInteractionProfile(\n componentName: string,\n filePath: string,\n props: Record<string, unknown>,\n interaction: InteractionStep[],\n): Promise<InteractionProfile> {\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 // Build and load the component harness\n const htmlHarness = await buildComponentHarness(filePath, componentName, props, 1280);\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\n // Wait for initial render\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 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 // Install profiling listeners (before interaction)\n const setupResult = await page.evaluate(buildProfilingSetupScript());\n const setupData = setupResult as { error?: string; ok?: boolean };\n if (setupData.error) {\n throw new Error(`Profiling setup failed: ${setupData.error}`);\n }\n\n // Measure JS time around interaction\n const jsStart = Date.now();\n\n // Replay interactions\n if (interaction.length > 0) {\n process.stderr.write(` Replaying ${interaction.length} interaction step(s)…\\n`);\n await replayInteraction(page, interaction);\n\n // Brief settle window to capture async state updates\n await page.waitForTimeout(300);\n }\n\n const jsDuration = Date.now() - jsStart;\n\n // Collect profiling data\n const collected = await page.evaluate(buildProfilingCollectScript());\n const profileData = collected as {\n error?: string;\n commitCount?: number;\n uniqueComponents?: number;\n wastedRenders?: number;\n layoutTime?: number;\n paintTime?: number;\n layoutShifts?: { count: number; score: number };\n };\n\n if (profileData.error) {\n throw new Error(`Profile collection failed: ${profileData.error}`);\n }\n\n const timing: InteractionTiming = {\n js: jsDuration,\n layout: profileData.layoutTime ?? 0,\n paint: profileData.paintTime ?? 0,\n };\n\n const layoutShifts: LayoutShiftData = {\n count: profileData.layoutShifts?.count ?? 0,\n cumulativeScore: profileData.layoutShifts?.score ?? 0,\n };\n\n const totalRenders = profileData.commitCount ?? 0;\n const uniqueComponents = profileData.uniqueComponents ?? 0;\n const wastedRenders = profileData.wastedRenders ?? 0;\n\n const flags = analyzeProfileFlags(totalRenders, wastedRenders, timing, layoutShifts);\n\n return {\n component: componentName,\n totalRenders,\n uniqueComponents,\n wastedRenders,\n timing,\n layoutShifts,\n flags,\n interaction,\n };\n } finally {\n await browser.close();\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates and returns the `scope instrument profile` sub-command.\n */\nexport function createInstrumentProfileCommand(): Command {\n const cmd = new Cmd(\"profile\")\n .description(\n \"Capture a full interaction-scoped performance profile: renders, timing, layout shifts\",\n )\n .argument(\"<component>\", \"Component name (must exist in the manifest)\")\n .option(\n \"--interaction <json>\",\n 'Interaction steps JSON, e.g. \\'[{\"action\":\"click\",\"target\":\"button.primary\"}]\\'',\n \"[]\",\n )\n .option(\"--props <json>\", \"Inline props JSON passed to the component\", \"{}\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .option(\"--format <fmt>\", \"Output format: json|text (default: json)\", \"json\")\n .option(\"--show-flags\", \"Show heuristic flags only (useful for CI checks)\", false)\n .action(\n async (\n componentName: string,\n opts: {\n interaction: string;\n props: string;\n manifest: string;\n format: string;\n showFlags: boolean;\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 let props: Record<string, unknown> = {};\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 let interaction: InteractionStep[] = [];\n try {\n interaction = JSON.parse(opts.interaction) as InteractionStep[];\n if (!Array.isArray(interaction)) {\n throw new Error(\"Interaction must be a JSON array\");\n }\n } catch {\n throw new Error(`Invalid interaction JSON: ${opts.interaction}`);\n }\n\n const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n process.stderr.write(`Profiling interaction for ${componentName}…\\n`);\n\n const result = await runInteractionProfile(componentName, filePath, props, interaction);\n\n if (opts.showFlags) {\n if (result.flags.length === 0) {\n process.stdout.write(\"No heuristic flags detected.\\n\");\n } else {\n for (const flag of result.flags) {\n process.stdout.write(`${flag}\\n`);\n }\n }\n return;\n }\n\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } catch (err: unknown) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n },\n );\n\n return cmd;\n}\n","/**\n * @agent-scope/cli — instrument tree command\n *\n * Implements `scope instrument tree <component>`.\n *\n * Renders the target component via BrowserPool (same pipeline as\n * `scope render`), waits for it to mount, then injects the Scope runtime\n * to walk the live React fiber tree. The result is a structured tree\n * conforming to the Instrumentation Spec §1.1 schema.\n *\n * ## Output modes\n *\n * - **Pipe** (not a TTY) → JSON of root node\n * - **TTY** → formatted ASCII tree with metadata\n *\n * ## Query flags\n *\n * | Flag | Effect |\n * |---|---|\n * | `--sort-by renderCount\\|depth` | Sort nodes at each level |\n * | `--limit N` | Keep only the first N nodes (depth-first, post-filter) |\n * | `--uses-context <Name>` | Keep only subtrees containing nodes that use a given context |\n * | `--provider-depth` | Annotate each node with its context-provider nesting depth |\n * | `--wasted-renders` | Keep only nodes with wasted renders (no prop/state/context change, not memoized) |\n */\n\nimport { resolve } from \"node:path\";\nimport type {\n ComponentNode,\n ContextConsumption,\n HookState,\n SerializedValue,\n} from \"@agent-scope/core\";\nimport { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport { BrowserPool } from \"@agent-scope/render\";\nimport { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { loadManifest } from \"../manifest-commands.js\";\nimport { isTTY } from \"../render-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\nconst DEFAULT_VIEWPORT_WIDTH = 375;\nconst DEFAULT_VIEWPORT_HEIGHT = 812;\n\n// ---------------------------------------------------------------------------\n// Types — Instrumentation Spec §1.1\n// ---------------------------------------------------------------------------\n\n/**\n * Component type discriminant for the instrumentation tree.\n * Maps from ComponentNode.type plus context provider/consumer heuristics.\n */\nexport type InstrumentNodeType =\n | \"function\"\n | \"class\"\n | \"forwardRef\"\n | \"memo\"\n | \"context.provider\"\n | \"context.consumer\"\n | \"host\";\n\n/**\n * A single node in the instrumented component tree.\n *\n * Extends ComponentNode with performance-profiling fields derived from\n * the Scope profiler and change-detection flags.\n */\nexport interface InstrumentTreeNode {\n /** Component display name */\n component: string;\n /** Implementation strategy */\n type: InstrumentNodeType;\n /** Number of renders recorded */\n renderCount: number;\n /** Duration of the most recent render in ms */\n lastRenderDuration: number;\n /** True when the component is wrapped with React.memo */\n memoized: boolean;\n /** Number of times memo bailed out (skipped re-render) */\n memoSkipped: number;\n /** Serialized props snapshot */\n props: Record<string, unknown>;\n /** True when props differed from the previous render */\n propsChanged: boolean;\n /** Serialized state snapshot (hook slot values) */\n state: Record<string, unknown>;\n /** True when any hook state changed since the last render */\n stateChanged: boolean;\n /** Names of React contexts consumed by this component */\n contexts: string[];\n /** True when any consumed context value changed */\n contextChanged: boolean;\n /** Depth in the component tree (root = 0) */\n depth: number;\n /** Child component nodes */\n children: InstrumentTreeNode[];\n}\n\n// ---------------------------------------------------------------------------\n// BrowserPool singleton (shared across a single CLI invocation)\n// ---------------------------------------------------------------------------\n\nlet _pool: BrowserPool | null = null;\n\nasync function getPool(): Promise<BrowserPool> {\n if (_pool === null) {\n _pool = new BrowserPool({\n size: { browsers: 1, pagesPerBrowser: 1 },\n viewportWidth: DEFAULT_VIEWPORT_WIDTH,\n viewportHeight: DEFAULT_VIEWPORT_HEIGHT,\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// ComponentNode → InstrumentTreeNode conversion\n// ---------------------------------------------------------------------------\n\n/**\n * Map a ComponentNode.type to InstrumentNodeType, distinguishing\n * context providers and consumers from the node's display name.\n */\nfunction mapNodeType(node: ComponentNode): InstrumentNodeType {\n if (node.type === \"forward_ref\") return \"forwardRef\";\n if (node.type === \"host\") return \"host\";\n // Heuristic: React wraps context providers/consumers with known display names\n const name = node.name;\n if (name.endsWith(\".Provider\") || name === \"Provider\") return \"context.provider\";\n if (name.endsWith(\".Consumer\") || name === \"Consumer\") return \"context.consumer\";\n return node.type as InstrumentNodeType;\n}\n\n/**\n * Flatten a SerializedValue into a plain JS object suitable for JSON output.\n * Complex/circular/truncated values are represented as string descriptions.\n */\nfunction flattenSerializedValue(sv: SerializedValue): unknown {\n if (sv === null || sv === undefined) return null;\n const v = sv as unknown as Record<string, unknown>;\n switch (v.type) {\n case \"null\":\n case \"undefined\":\n return null;\n case \"string\":\n case \"number\":\n case \"boolean\":\n return v.value;\n case \"object\": {\n if (!Array.isArray(v.entries)) return {};\n const result: Record<string, unknown> = {};\n for (const entry of v.entries as Array<{ key: string; value: SerializedValue }>) {\n result[entry.key] = flattenSerializedValue(entry.value);\n }\n return result;\n }\n case \"array\": {\n if (!Array.isArray(v.items)) return [];\n return (v.items as SerializedValue[]).map(flattenSerializedValue);\n }\n case \"function\":\n return \"[Function]\";\n case \"symbol\":\n return `[Symbol: ${v.description ?? \"\"}]`;\n case \"circular\":\n return \"[Circular]\";\n case \"truncated\":\n return `[Truncated: ${v.preview ?? \"\"}]`;\n default:\n return v.preview ?? null;\n }\n}\n\n/**\n * Convert a HookState array into a plain state snapshot object.\n * Keys are derived from hook names/types + slot index.\n */\nfunction flattenHookState(hooks: HookState[]): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (let i = 0; i < hooks.length; i++) {\n const hook = hooks[i];\n if (hook === undefined) continue;\n // hook.name is string | null (null for built-in hooks where type conveys the name)\n const key = hook.name !== null && hook.name !== undefined ? hook.name : `${hook.type}[${i}]`;\n result[key] = flattenSerializedValue(hook.value);\n }\n return result;\n}\n\n/**\n * Extract deduplicated context names from a ContextConsumption array.\n * Uses contextName field (may be null for anonymous contexts).\n */\nfunction extractContextNames(contexts: ContextConsumption[]): string[] {\n const names = contexts\n .map((c) => c.contextName ?? \"Unknown\")\n .filter((name, idx, arr) => arr.indexOf(name) === idx);\n return names;\n}\n\n/**\n * Determine if any consumed context triggered a re-render.\n */\nfunction anyContextChanged(contexts: ContextConsumption[]): boolean {\n return contexts.some((c) => c.didTriggerRender);\n}\n\n/**\n * Convert a ComponentNode tree into an InstrumentTreeNode tree.\n */\nexport function convertToInstrumentNode(node: ComponentNode, depth = 0): InstrumentTreeNode {\n const contexts = extractContextNames(node.context);\n const contextChanged = anyContextChanged(node.context);\n const state = flattenHookState(node.state);\n const propsFlat = flattenSerializedValue(node.props);\n const props =\n propsFlat !== null && typeof propsFlat === \"object\" && !Array.isArray(propsFlat)\n ? (propsFlat as Record<string, unknown>)\n : {};\n\n return {\n component: node.name,\n type: mapNodeType(node),\n renderCount: node.renderCount,\n lastRenderDuration: node.renderDuration,\n memoized: node.type === \"memo\",\n // memoSkipped requires tracking bail-outs across commits — not available from\n // a single-shot capture. Defaulted to 0.\n memoSkipped: 0,\n props,\n // propsChanged is not tracked in a single-shot capture — would need a diff\n // between two renders. Defaulted to false.\n propsChanged: false,\n state,\n stateChanged: false,\n contextChanged,\n contexts,\n depth,\n children: node.children.map((child) => convertToInstrumentNode(child, depth + 1)),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Filter / sort helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Flatten an InstrumentTreeNode tree into a flat list (depth-first).\n */\nexport function flattenTree(root: InstrumentTreeNode): InstrumentTreeNode[] {\n const result: InstrumentTreeNode[] = [];\n const visit = (node: InstrumentTreeNode): void => {\n result.push(node);\n for (const child of node.children) {\n visit(child);\n }\n };\n visit(root);\n return result;\n}\n\n/**\n * Filter the tree to only include nodes (and their subtrees) that use\n * a specific context name (case-insensitive).\n *\n * A node is kept if it or any of its descendants uses the context.\n * Returns `null` if the subtree has no matching nodes.\n */\nexport function filterByContext(\n node: InstrumentTreeNode,\n contextName: string,\n): InstrumentTreeNode | null {\n const filteredChildren = node.children\n .map((child) => filterByContext(child, contextName))\n .filter((c): c is InstrumentTreeNode => c !== null);\n\n const selfMatches = node.contexts.some((c) => c.toLowerCase() === contextName.toLowerCase());\n\n if (!selfMatches && filteredChildren.length === 0) return null;\n\n return { ...node, children: filteredChildren };\n}\n\n/**\n * Filter the tree to nodes with wasted renders:\n * - propsChanged = false\n * - stateChanged = false\n * - contextChanged = false\n * - memoized = false\n * - renderCount > 1\n */\nexport function filterWastedRenders(node: InstrumentTreeNode): InstrumentTreeNode | null {\n const filteredChildren = node.children\n .map((child) => filterWastedRenders(child))\n .filter((c): c is InstrumentTreeNode => c !== null);\n\n const isWasted =\n !node.propsChanged &&\n !node.stateChanged &&\n !node.contextChanged &&\n !node.memoized &&\n node.renderCount > 1;\n\n if (!isWasted && filteredChildren.length === 0) return null;\n\n return { ...node, children: filteredChildren };\n}\n\n/**\n * Sort children at every level of the tree by the given field.\n * Higher renderCount sorts first; lower depth sorts first.\n */\nexport function sortTree(\n node: InstrumentTreeNode,\n sortBy: \"renderCount\" | \"depth\",\n): InstrumentTreeNode {\n const sortedChildren = node.children\n .map((child) => sortTree(child, sortBy))\n .sort((a, b) => {\n if (sortBy === \"renderCount\") return b.renderCount - a.renderCount;\n return a.depth - b.depth;\n });\n return { ...node, children: sortedChildren };\n}\n\n/**\n * Annotate each node with the number of context providers above it in the tree.\n * The annotation is stored as a non-spec `_providerDepth` field for TTY display.\n */\nexport function annotateProviderDepth(\n node: InstrumentTreeNode,\n providerDepth = 0,\n): InstrumentTreeNode & { _providerDepth: number } {\n const isProvider = node.type === \"context.provider\";\n const childProviderDepth = isProvider ? providerDepth + 1 : providerDepth;\n return {\n ...node,\n _providerDepth: providerDepth,\n children: node.children.map((child) => annotateProviderDepth(child, childProviderDepth)),\n };\n}\n\n/**\n * Apply a depth-first node limit to a tree, keeping only the first `n` nodes.\n */\nexport function limitNodes(root: InstrumentTreeNode, limit: number): InstrumentTreeNode {\n let remaining = limit;\n\n const clip = (node: InstrumentTreeNode): InstrumentTreeNode | null => {\n if (remaining <= 0) return null;\n remaining--;\n const clippedChildren: InstrumentTreeNode[] = [];\n for (const child of node.children) {\n const clipped = clip(child);\n if (clipped !== null) clippedChildren.push(clipped);\n }\n return { ...node, children: clippedChildren };\n };\n\n return clip(root) ?? root;\n}\n\n// ---------------------------------------------------------------------------\n// TTY tree formatter\n// ---------------------------------------------------------------------------\n\nconst BRANCH = \"├── \";\nconst LAST_BRANCH = \"└── \";\nconst VERTICAL = \"│ \";\nconst EMPTY = \" \";\n\nfunction buildTTYLabel(node: InstrumentTreeNode, showProviderDepth: boolean): string {\n const parts: string[] = [node.component];\n\n // Type badge\n switch (node.type) {\n case \"memo\":\n parts.push(\"[memo]\");\n break;\n case \"forwardRef\":\n parts.push(\"[forwardRef]\");\n break;\n case \"class\":\n parts.push(\"[class]\");\n break;\n case \"context.provider\":\n parts.push(\"[provider]\");\n break;\n case \"context.consumer\":\n parts.push(\"[consumer]\");\n break;\n default:\n break;\n }\n\n // Render stats\n if (node.renderCount > 0) {\n const durationStr =\n node.lastRenderDuration > 0 ? ` ${node.lastRenderDuration.toFixed(2)}ms` : \"\";\n parts.push(`(renders:${node.renderCount}${durationStr})`);\n }\n\n // Context usage\n if (node.contexts.length > 0) {\n parts.push(`[ctx:${node.contexts.join(\",\")}]`);\n }\n\n // Provider depth annotation\n if (showProviderDepth) {\n const pd = (node as InstrumentTreeNode & { _providerDepth?: number })._providerDepth;\n if (pd !== undefined && pd > 0) {\n parts.push(`[pd:${pd}]`);\n }\n }\n\n return parts.join(\" \");\n}\n\nfunction renderTTYNode(\n node: InstrumentTreeNode,\n prefix: string,\n isLast: boolean,\n showProviderDepth: boolean,\n lines: string[],\n): void {\n // Skip host elements in TTY mode — pass through to children\n if (node.type === \"host\") {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (child !== undefined) {\n renderTTYNode(child, prefix, i === node.children.length - 1, showProviderDepth, lines);\n }\n }\n return;\n }\n\n const connector = isLast ? LAST_BRANCH : BRANCH;\n lines.push(`${prefix}${connector}${buildTTYLabel(node, showProviderDepth)}`);\n\n const nextPrefix = prefix + (isLast ? EMPTY : VERTICAL);\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n if (child !== undefined) {\n renderTTYNode(child, nextPrefix, i === node.children.length - 1, showProviderDepth, lines);\n }\n }\n}\n\n/**\n * Format an InstrumentTreeNode tree as an ASCII tree string for TTY output.\n */\nexport function formatInstrumentTree(root: InstrumentTreeNode, showProviderDepth = false): string {\n const lines: string[] = [];\n\n if (root.type !== \"host\") {\n lines.push(buildTTYLabel(root, showProviderDepth));\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n if (child !== undefined) {\n renderTTYNode(child, \"\", i === root.children.length - 1, showProviderDepth, lines);\n }\n }\n } else {\n // Root is a host element — render children directly\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n if (child !== undefined) {\n renderTTYNode(child, \"\", i === root.children.length - 1, showProviderDepth, lines);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Core instrumentation logic\n// ---------------------------------------------------------------------------\n\n/** Options for the instrument tree operation. */\nexport interface InstrumentTreeOptions {\n componentName: string;\n filePath: string;\n sortBy?: \"renderCount\" | \"depth\";\n limit?: number;\n usesContext?: string;\n providerDepth?: boolean;\n wastedRenders?: boolean;\n}\n\n/**\n * Render a component via BrowserPool and walk its fiber tree.\n * Returns an InstrumentTreeNode tree.\n */\nexport async function runInstrumentTree(\n options: InstrumentTreeOptions,\n): Promise<InstrumentTreeNode> {\n const { componentName, filePath } = options;\n\n const pool = await getPool();\n const slot = await pool.acquire();\n const { page } = slot;\n\n try {\n // 1. Inject Scope browser entry BEFORE page scripts — installs DevTools hook\n await page.addInitScript({ content: getBrowserEntryScript() });\n\n // 2. Build and load the component HTML harness\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n {},\n DEFAULT_VIEWPORT_WIDTH,\n );\n\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\n // 3. Wait for the component to render\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 const renderError = await page.evaluate(\n () =>\n (\n window as Window & {\n __SCOPE_RENDER_ERROR__?: string;\n }\n ).__SCOPE_RENDER_ERROR__ ?? null,\n );\n\n if (renderError !== null) {\n throw new Error(`Component render error: ${renderError}`);\n }\n\n // 4. Walk the fiber tree via __SCOPE_CAPTURE_JSON__\n const captureJson = await page.evaluate(async () => {\n const w = window as Window & {\n __SCOPE_CAPTURE_JSON__?: (opts?: { lightweight?: boolean }) => Promise<string>;\n };\n if (typeof w.__SCOPE_CAPTURE_JSON__ !== \"function\") {\n throw new Error(\"__SCOPE_CAPTURE_JSON__ not available — Scope runtime not injected\");\n }\n return w.__SCOPE_CAPTURE_JSON__({ lightweight: false });\n });\n\n // biome-ignore lint/suspicious/noExplicitAny: CaptureResult runtime shape\n const captureResult = JSON.parse(captureJson) as any;\n const componentTree = captureResult.tree as ComponentNode | null | undefined;\n\n if (componentTree === undefined || componentTree === null) {\n throw new Error(`No component tree found for \"${componentName}\"`);\n }\n\n // 5. Convert to InstrumentTreeNode schema\n let instrumentRoot = convertToInstrumentNode(componentTree, 0);\n\n // 6. Apply filters\n if (options.usesContext !== undefined) {\n const filtered = filterByContext(instrumentRoot, options.usesContext);\n instrumentRoot = filtered !== null ? filtered : { ...instrumentRoot, children: [] };\n }\n\n if (options.wastedRenders === true) {\n const filtered = filterWastedRenders(instrumentRoot);\n instrumentRoot = filtered !== null ? filtered : { ...instrumentRoot, children: [] };\n }\n\n if (options.sortBy !== undefined) {\n instrumentRoot = sortTree(instrumentRoot, options.sortBy);\n }\n\n if (options.providerDepth === true) {\n instrumentRoot = annotateProviderDepth(instrumentRoot, 0);\n }\n\n if (options.limit !== undefined && options.limit > 0) {\n instrumentRoot = limitNodes(instrumentRoot, options.limit);\n }\n\n return instrumentRoot;\n } finally {\n pool.release(slot);\n }\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factories\n// ---------------------------------------------------------------------------\n\ninterface TreeCommandOptions {\n sortBy?: string;\n limit?: string;\n usesContext?: string;\n providerDepth?: boolean;\n wastedRenders?: boolean;\n manifest: string;\n format?: string;\n}\n\n/**\n * Creates the `instrument tree` sub-command.\n */\nexport function createInstrumentTreeCommand(): Command {\n return new Command(\"tree\")\n .description(\"Render a component via BrowserPool and output a structured instrumentation tree\")\n .argument(\"<component>\", \"Component name to instrument (must exist in the manifest)\")\n .option(\"--sort-by <field>\", \"Sort nodes by field: renderCount | depth\")\n .option(\"--limit <n>\", \"Limit output to the first N nodes (depth-first)\")\n .option(\"--uses-context <name>\", \"Filter to components that use a specific context\")\n .option(\"--provider-depth\", \"Annotate each node with its context-provider nesting depth\", false)\n .option(\n \"--wasted-renders\",\n \"Filter to components with wasted renders (no prop/state/context changes, not memoized)\",\n false,\n )\n .option(\"--format <fmt>\", \"Output format: json | tree (default: auto)\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(async (componentName: string, opts: TreeCommandOptions) => {\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 if (opts.sortBy !== undefined) {\n const allowed = [\"renderCount\", \"depth\"] as const;\n if (!(allowed as readonly string[]).includes(opts.sortBy)) {\n throw new Error(\n `Unknown --sort-by value \"${opts.sortBy}\". Allowed: ${allowed.join(\", \")}`,\n );\n }\n }\n\n const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n process.stderr.write(`Instrumenting ${componentName}…\\n`);\n\n const instrumentRoot = await runInstrumentTree({\n componentName,\n filePath,\n sortBy: opts.sortBy as \"renderCount\" | \"depth\" | undefined,\n limit: opts.limit !== undefined ? Math.max(1, parseInt(opts.limit, 10)) : undefined,\n usesContext: opts.usesContext,\n providerDepth: opts.providerDepth,\n wastedRenders: opts.wastedRenders,\n });\n\n await shutdownPool();\n\n const fmt = resolveFormat(opts.format);\n\n if (fmt === \"json\") {\n process.stdout.write(`${JSON.stringify(instrumentRoot, null, 2)}\\n`);\n } else {\n const tree = formatInstrumentTree(instrumentRoot, opts.providerDepth ?? false);\n process.stdout.write(`${tree}\\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// Format resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveFormat(formatFlag: string | undefined): \"json\" | \"tree\" {\n if (formatFlag !== undefined) {\n const lower = formatFlag.toLowerCase();\n if (lower !== \"json\" && lower !== \"tree\") {\n throw new Error(`Unknown format \"${formatFlag}\". Allowed: json, tree`);\n }\n return lower as \"json\" | \"tree\";\n }\n return isTTY() ? \"tree\" : \"json\";\n}\n","/**\n * @agent-scope/cli — scope instrument renders\n *\n * Re-render causality analysis command.\n *\n * Renders a component via BrowserPool, injects interaction-scoped instrumentation,\n * replays an interaction sequence, and traces every re-render back to its root cause.\n *\n * ## Architecture\n *\n * 1. Build an HTML harness via buildComponentHarness (esbuild IIFE)\n * 2. Inject a render-instrumentation script that hooks into React's DevTools\n * fiber hook to track re-renders with cause attribution\n * 3. Load into Playwright, execute interactions, collect render events\n * 4. Post-process events into causality chains (per Instrumentation Spec §2)\n * 5. Detect wasted renders (propsChanged=false AND stateChanged=false AND\n * contextChanged=false AND memoized=false)\n * 6. Emit JSON when piped, formatted table when TTY\n *\n * ## Usage\n *\n * ```bash\n * scope instrument renders SearchPage --interaction '[{\"action\":\"type\",\"target\":\"input\",\"text\":\"hello\"}]'\n * scope instrument renders Button --interaction '[{\"action\":\"click\",\"target\":\"button\"}]' --json\n * ```\n */\n\nimport { resolve } from \"node:path\";\nimport { BrowserPool } from \"@agent-scope/render\";\nimport { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { loadManifest } from \"../manifest-commands.js\";\nimport { isTTY } from \"../render-formatter.js\";\nimport { createInstrumentHooksCommand } from \"./hooks.js\";\nimport { createInstrumentProfileCommand } from \"./profile.js\";\nimport { createInstrumentTreeCommand } from \"./tree.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\n\n// ---------------------------------------------------------------------------\n// Types — Instrumentation Spec §2\n// ---------------------------------------------------------------------------\n\n/** Root cause categories per Instrumentation Spec §2.1 */\nexport type RenderTrigger =\n | \"state_change\"\n | \"props_change\"\n | \"context_change\"\n | \"parent_rerender\"\n | \"force_update\"\n | \"hook_dependency\";\n\n/** A single link in the causality chain from root cause to this render */\nexport interface CausalityLink {\n component: string;\n trigger: RenderTrigger;\n propsChanged?: boolean;\n stateChanged?: boolean;\n contextChanged?: boolean;\n origin?: string;\n stateKey?: string;\n}\n\n/** Per-component render event with causality chain */\nexport interface RenderEvent {\n component: string;\n renderIndex: number;\n trigger: RenderTrigger;\n propsChanged: boolean;\n stateChanged: boolean;\n contextChanged: boolean;\n memoized: boolean;\n /** Wasted render: re-rendered with no changed inputs and not memoized */\n wasted: boolean;\n chain: CausalityLink[];\n cascade: {\n totalRendersTriggered: number;\n uniqueComponents: number;\n unchangedPropRenders: number;\n };\n}\n\n/** Heuristic flag from Instrumentation Spec §6.1 */\nexport interface InstrumentFlag {\n id: string;\n severity: \"error\" | \"warning\" | \"info\";\n component: string;\n detail: string;\n data: Record<string, unknown>;\n}\n\n/** Raw render event captured in-browser before post-processing */\nexport interface RawRenderEvent {\n component: string;\n renderIndex: number;\n propsChanged: boolean;\n stateChanged: boolean;\n contextChanged: boolean;\n memoized: boolean;\n parentComponent: string | null;\n hookDepsChanged: boolean;\n forceUpdate: boolean;\n}\n\n/** Full output of the renders analysis */\nexport interface RendersAnalysisResult {\n component: string;\n interaction: InteractionStep[];\n summary: {\n totalRenders: number;\n uniqueComponents: number;\n wastedRenders: number;\n interactionDurationMs: number;\n };\n renders: RenderEvent[];\n flags: InstrumentFlag[];\n}\n\n/** Interaction step definition per Instrumentation Spec §5.1 */\nexport interface InteractionStep {\n action: \"click\" | \"type\" | \"wait\" | \"hover\" | \"blur\" | \"focus\" | \"scroll\";\n target?: string;\n text?: string;\n condition?: string;\n timeout?: number;\n x?: number;\n y?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Causality chain builder\n// ---------------------------------------------------------------------------\n\n/**\n * Determine the trigger type for a render event based on its attributes.\n * Priority order mirrors the spec's taxonomy (most-specific first).\n */\nexport function determineTrigger(event: RawRenderEvent): RenderTrigger {\n if (event.forceUpdate) return \"force_update\";\n if (event.stateChanged) return \"state_change\";\n if (event.propsChanged) return \"props_change\";\n if (event.contextChanged) return \"context_change\";\n if (event.hookDepsChanged) return \"hook_dependency\";\n return \"parent_rerender\";\n}\n\n/**\n * Determine if a render is \"wasted\" per Instrumentation Spec §2.3.\n * All of: propsChanged=false AND stateChanged=false AND contextChanged=false AND memoized=false.\n */\nexport function isWastedRender(event: RawRenderEvent): boolean {\n return !event.propsChanged && !event.stateChanged && !event.contextChanged && !event.memoized;\n}\n\n/**\n * Build causality chains for all render events.\n *\n * For each render, we trace backward through the render sequence to find\n * the root cause. If a component's trigger is parent_rerender, we look for\n * the parent's render event and continue up the chain.\n */\nexport function buildCausalityChains(rawEvents: RawRenderEvent[]): RenderEvent[] {\n const result: RenderEvent[] = [];\n\n // Build lookup: component name → most recent render event\n const componentLastRender = new Map<string, RawRenderEvent>();\n\n for (const raw of rawEvents) {\n const trigger = determineTrigger(raw);\n const wasted = isWastedRender(raw);\n\n // Build the causality chain (root cause → this render)\n const chain: CausalityLink[] = [];\n\n // Trace up through parent_rerender triggers to find root cause\n let current: RawRenderEvent = raw;\n const visited = new Set<string>();\n\n while (true) {\n if (visited.has(current.component)) break;\n visited.add(current.component);\n\n const currentTrigger = determineTrigger(current);\n chain.unshift({\n component: current.component,\n trigger: currentTrigger,\n propsChanged: current.propsChanged,\n stateChanged: current.stateChanged,\n contextChanged: current.contextChanged,\n });\n\n // If this is a root cause trigger, stop\n if (currentTrigger !== \"parent_rerender\" || current.parentComponent === null) {\n break;\n }\n\n // Walk up to parent\n const parentEvent = componentLastRender.get(current.parentComponent);\n if (parentEvent === undefined) break;\n current = parentEvent;\n }\n\n // Cascade stats: how many renders were triggered by the same root cause\n const rootCause = chain[0];\n const cascadeRenders = rawEvents.filter((e) => {\n if (rootCause === undefined) return false;\n // Simple heuristic: same root cause component in the chain\n return e.component !== rootCause.component && !e.stateChanged && !e.propsChanged;\n });\n\n result.push({\n component: raw.component,\n renderIndex: raw.renderIndex,\n trigger,\n propsChanged: raw.propsChanged,\n stateChanged: raw.stateChanged,\n contextChanged: raw.contextChanged,\n memoized: raw.memoized,\n wasted,\n chain,\n cascade: {\n totalRendersTriggered: cascadeRenders.length,\n uniqueComponents: new Set(cascadeRenders.map((e) => e.component)).size,\n unchangedPropRenders: cascadeRenders.filter((e) => !e.propsChanged).length,\n },\n });\n\n componentLastRender.set(raw.component, raw);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic flags — Instrumentation Spec §6.1 (fixed catalog, no inference)\n// ---------------------------------------------------------------------------\n\n/**\n * Apply heuristic flags to the render event list.\n * Uses only the fixed catalog from §6.1 — no inference, only pattern matching.\n */\nexport function applyHeuristicFlags(renders: RenderEvent[]): InstrumentFlag[] {\n const flags: InstrumentFlag[] = [];\n\n // Group by component\n const byComponent = new Map<string, RenderEvent[]>();\n for (const r of renders) {\n if (!byComponent.has(r.component)) byComponent.set(r.component, []);\n // biome-ignore lint/style/noNonNullAssertion: just set above\n byComponent.get(r.component)!.push(r);\n }\n\n for (const [component, events] of byComponent) {\n const wastedCount = events.filter((e) => e.wasted).length;\n const totalCount = events.length;\n\n // WASTED_RENDER — Component re-rendered with unchanged props/state/context, not memoized\n if (wastedCount > 0) {\n flags.push({\n id: \"WASTED_RENDER\",\n severity: \"warning\",\n component,\n detail: `${wastedCount}/${totalCount} renders were wasted — unchanged props/state/context, not memoized`,\n data: { wastedCount, totalCount, wastedRatio: wastedCount / totalCount },\n });\n }\n\n // RENDER_CASCADE — Single state change triggers >50 component re-renders\n for (const event of events) {\n if (event.cascade.totalRendersTriggered > 50) {\n flags.push({\n id: \"RENDER_CASCADE\",\n severity: \"warning\",\n component,\n detail: `State change in ${component} triggered ${event.cascade.totalRendersTriggered} downstream re-renders`,\n data: {\n totalRendersTriggered: event.cascade.totalRendersTriggered,\n uniqueComponents: event.cascade.uniqueComponents,\n unchangedPropRenders: event.cascade.unchangedPropRenders,\n },\n });\n break; // one flag per component\n }\n }\n }\n\n return flags;\n}\n\n// ---------------------------------------------------------------------------\n// In-browser instrumentation script\n// ---------------------------------------------------------------------------\n\n/**\n * Generates the JavaScript snippet that hooks into React's DevTools fiber\n * hook to capture render events during an interaction window.\n *\n * This runs in-browser (injected into the Playwright page) and stores\n * captured events in `window.__SCOPE_RENDER_EVENTS__`.\n */\nexport function buildInstrumentationScript(): string {\n return /* js */ `\n(function installScopeRenderInstrumentation() {\n window.__SCOPE_RENDER_EVENTS__ = [];\n window.__SCOPE_RENDER_INDEX__ = 0;\n\n var hook = window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (!hook) return;\n\n var originalOnCommit = hook.onCommitFiberRoot;\n var renderedComponents = new Map(); // componentName -> { lastProps, lastState }\n\n function extractName(fiber) {\n if (!fiber) return 'Unknown';\n var type = fiber.type;\n if (!type) return 'Unknown';\n if (typeof type === 'string') return type; // host element\n if (typeof type === 'function') return type.displayName || type.name || 'Anonymous';\n if (type.displayName) return type.displayName;\n if (type.render && typeof type.render === 'function') {\n return type.render.displayName || type.render.name || 'Anonymous';\n }\n return 'Anonymous';\n }\n\n function isMemoized(fiber) {\n // MemoComponent = 14, SimpleMemoComponent = 15\n return fiber.tag === 14 || fiber.tag === 15;\n }\n\n function isComponent(fiber) {\n // FunctionComponent=0, ClassComponent=1, MemoComponent=14, SimpleMemoComponent=15\n return fiber.tag === 0 || fiber.tag === 1 || fiber.tag === 14 || fiber.tag === 15;\n }\n\n function shallowEqual(a, b) {\n if (a === b) return true;\n if (!a || !b) return a === b;\n var keysA = Object.keys(a);\n var keysB = Object.keys(b);\n if (keysA.length !== keysB.length) return false;\n for (var i = 0; i < keysA.length; i++) {\n var k = keysA[i];\n if (k === 'children') continue; // ignore children prop\n if (a[k] !== b[k]) return false;\n }\n return true;\n }\n\n function getParentComponentName(fiber) {\n var parent = fiber.return;\n while (parent) {\n if (isComponent(parent)) {\n var name = extractName(parent);\n if (name && name !== 'Unknown' && !/^[a-z]/.test(name)) return name;\n }\n parent = parent.return;\n }\n return null;\n }\n\n function walkCommit(fiber) {\n if (!fiber) return;\n\n if (isComponent(fiber)) {\n var name = extractName(fiber);\n if (name && name !== 'Unknown' && !/^[a-z]/.test(name)) {\n var memoized = isMemoized(fiber);\n var currentProps = fiber.memoizedProps || {};\n var prev = renderedComponents.get(name);\n\n var propsChanged = true;\n var stateChanged = false;\n var contextChanged = false;\n var hookDepsChanged = false;\n var forceUpdate = false;\n\n if (prev) {\n propsChanged = !shallowEqual(prev.lastProps, currentProps);\n }\n\n // State: check memoizedState chain\n var memoizedState = fiber.memoizedState;\n if (prev && prev.lastStateSerialized !== undefined) {\n try {\n var stateSig = JSON.stringify(memoizedState ? memoizedState.memoizedState : null);\n stateChanged = stateSig !== prev.lastStateSerialized;\n } catch (_) {\n stateChanged = false;\n }\n }\n\n // Context: use _debugHookTypes or check dependencies\n var deps = fiber.dependencies;\n if (deps && deps.firstContext) {\n contextChanged = true; // conservative: context dep present = may have changed\n }\n\n var stateSig;\n try {\n stateSig = JSON.stringify(memoizedState ? memoizedState.memoizedState : null);\n } catch (_) {\n stateSig = null;\n }\n\n renderedComponents.set(name, {\n lastProps: currentProps,\n lastStateSerialized: stateSig,\n });\n\n var parentName = getParentComponentName(fiber);\n\n window.__SCOPE_RENDER_EVENTS__.push({\n component: name,\n renderIndex: window.__SCOPE_RENDER_INDEX__++,\n propsChanged: prev ? propsChanged : false,\n stateChanged: stateChanged,\n contextChanged: contextChanged,\n memoized: memoized,\n parentComponent: parentName,\n hookDepsChanged: hookDepsChanged,\n forceUpdate: forceUpdate,\n });\n }\n }\n\n walkCommit(fiber.child);\n walkCommit(fiber.sibling);\n }\n\n hook.onCommitFiberRoot = function(rendererID, root, priorityLevel) {\n if (typeof originalOnCommit === 'function') {\n originalOnCommit.call(hook, rendererID, root, priorityLevel);\n }\n var wipRoot = root && root.current && root.current.alternate;\n if (wipRoot) walkCommit(wipRoot);\n };\n})();\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Interaction replayer\n// ---------------------------------------------------------------------------\n\n/**\n * Execute an interaction sequence on a Playwright page.\n * Supports: click, type, wait, hover, blur, focus, scroll.\n */\nexport async function replayInteraction(\n page: import(\"playwright\").Page,\n steps: InteractionStep[],\n): Promise<void> {\n for (const step of steps) {\n switch (step.action) {\n case \"click\":\n if (step.target !== undefined) {\n await page.click(step.target, { timeout: 5000 }).catch(() => {\n // Best-effort — don't fail the whole analysis on a missing target\n });\n }\n break;\n case \"type\":\n if (step.target !== undefined && step.text !== undefined) {\n await page.fill(step.target, step.text, { timeout: 5000 }).catch(async () => {\n // Fallback to type if fill fails\n // biome-ignore lint/style/noNonNullAssertion: guarded by target/text check above\n await page.type(step.target!, step.text!, { timeout: 5000 }).catch(() => {});\n });\n }\n break;\n case \"hover\":\n if (step.target !== undefined) {\n await page.hover(step.target, { timeout: 5000 }).catch(() => {});\n }\n break;\n case \"blur\":\n if (step.target !== undefined) {\n await page\n .locator(step.target)\n .blur({ timeout: 5000 })\n .catch(() => {});\n }\n break;\n case \"focus\":\n if (step.target !== undefined) {\n await page.focus(step.target, { timeout: 5000 }).catch(() => {});\n }\n break;\n case \"scroll\":\n if (step.target !== undefined) {\n await page\n .locator(step.target)\n .scrollIntoViewIfNeeded({ timeout: 5000 })\n .catch(() => {});\n }\n break;\n case \"wait\": {\n const timeout = step.timeout ?? 1000;\n if (step.condition === \"idle\") {\n // Wait for network idle and React settle\n await page.waitForLoadState(\"networkidle\", { timeout }).catch(() => {});\n } else {\n await page.waitForTimeout(timeout);\n }\n break;\n }\n default:\n // Unknown action — skip silently\n break;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// BrowserPool singleton (shared within one run)\n// ---------------------------------------------------------------------------\n\nlet _pool: InstanceType<typeof BrowserPool> | null = null;\n\nasync function getPool(): Promise<InstanceType<typeof BrowserPool>> {\n if (_pool === null) {\n _pool = new BrowserPool({\n size: { browsers: 1, pagesPerBrowser: 2 },\n viewportWidth: 1280,\n viewportHeight: 800,\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// Core analysis function\n// ---------------------------------------------------------------------------\n\nexport interface RendersOptions {\n componentName: string;\n interaction: InteractionStep[];\n manifestPath?: string;\n}\n\n/**\n * Run the renders analysis for a component + interaction sequence.\n *\n * 1. Loads the manifest to find the component file path\n * 2. Builds an HTML harness via esbuild\n * 3. Injects instrumentation and replays the interaction in Playwright\n * 4. Collects raw render events and builds causality chains\n * 5. Returns a structured RendersAnalysisResult\n */\nexport async function analyzeRenders(options: RendersOptions): Promise<RendersAnalysisResult> {\n const manifestPath = options.manifestPath ?? MANIFEST_PATH;\n const manifest = loadManifest(manifestPath);\n const descriptor = manifest.components[options.componentName];\n\n if (descriptor === undefined) {\n const available = Object.keys(manifest.components).slice(0, 5).join(\", \");\n throw new Error(\n `Component \"${options.componentName}\" not found in manifest.\\nAvailable: ${available}`,\n );\n }\n\n const rootDir = process.cwd();\n const filePath = resolve(rootDir, descriptor.filePath);\n\n // Build HTML harness\n const htmlHarness = await buildComponentHarness(filePath, options.componentName, {}, 1280);\n\n const pool = await getPool();\n const slot = await pool.acquire();\n const { page } = slot;\n\n const startMs = performance.now();\n\n try {\n // 1. Inject instrumentation BEFORE React loads\n // We add the script as an init script so it runs before page scripts\n await page.addInitScript(buildInstrumentationScript());\n\n // 2. Load the harness\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\n // 3. Wait for React render signal\n await page.waitForFunction(\n () =>\n (window as Window & { __SCOPE_RENDER_COMPLETE__?: boolean }).__SCOPE_RENDER_COMPLETE__ ===\n true,\n { timeout: 15_000 },\n );\n\n // Brief settle after initial render\n await page.waitForTimeout(100);\n\n // Reset render events counter (only track interaction-scoped renders)\n await page.evaluate(() => {\n // biome-ignore lint/suspicious/noExplicitAny: accessing internal scope globals\n (window as any).__SCOPE_RENDER_EVENTS__ = [];\n // biome-ignore lint/suspicious/noExplicitAny: accessing internal scope globals\n (window as any).__SCOPE_RENDER_INDEX__ = 0;\n });\n\n // 4. Replay interaction\n await replayInteraction(page, options.interaction);\n\n // Brief settle to capture async re-renders\n await page.waitForTimeout(200);\n\n const interactionDurationMs = performance.now() - startMs;\n\n // 5. Collect raw render events from the page\n const rawEvents = (await page.evaluate(() => {\n return (\n (window as Window & { __SCOPE_RENDER_EVENTS__?: RawRenderEvent[] })\n .__SCOPE_RENDER_EVENTS__ ?? []\n );\n })) as RawRenderEvent[];\n\n // 6. Build causality chains + detect wasted renders\n const renders = buildCausalityChains(rawEvents);\n\n // 7. Apply heuristic flags\n const flags = applyHeuristicFlags(renders);\n\n const uniqueComponents = new Set(renders.map((r) => r.component)).size;\n const wastedRenders = renders.filter((r) => r.wasted).length;\n\n return {\n component: options.componentName,\n interaction: options.interaction,\n summary: {\n totalRenders: renders.length,\n uniqueComponents,\n wastedRenders,\n interactionDurationMs: Math.round(interactionDurationMs),\n },\n renders,\n flags,\n };\n } finally {\n pool.release(slot);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Output formatters\n// ---------------------------------------------------------------------------\n\n/**\n * Format analysis result as a human-readable TTY table.\n */\nexport function formatRendersTable(result: RendersAnalysisResult): string {\n const lines: string[] = [];\n\n lines.push(`\\n🔍 Re-render Analysis: ${result.component}`);\n lines.push(`${\"─\".repeat(60)}`);\n lines.push(`Total renders: ${result.summary.totalRenders}`);\n lines.push(`Unique components: ${result.summary.uniqueComponents}`);\n lines.push(`Wasted renders: ${result.summary.wastedRenders}`);\n lines.push(`Duration: ${result.summary.interactionDurationMs}ms`);\n lines.push(\"\");\n\n if (result.renders.length === 0) {\n lines.push(\"No re-renders captured during interaction.\");\n } else {\n lines.push(\"Re-renders:\");\n lines.push(\n `${\"#\".padEnd(4)} ${\"Component\".padEnd(30)} ${\"Trigger\".padEnd(18)} ${\"Wasted\".padEnd(7)} ${\"Chain Depth\"}`,\n );\n lines.push(\"─\".repeat(80));\n\n for (const r of result.renders) {\n const wasted = r.wasted ? \"⚠ yes\" : \"no\";\n const idx = String(r.renderIndex).padEnd(4);\n const comp = r.component.slice(0, 29).padEnd(30);\n const trig = r.trigger.padEnd(18);\n const w = wasted.padEnd(7);\n const depth = r.chain.length;\n lines.push(`${idx} ${comp} ${trig} ${w} ${depth}`);\n }\n }\n\n if (result.flags.length > 0) {\n lines.push(\"\");\n lines.push(\"Flags:\");\n for (const flag of result.flags) {\n const icon = flag.severity === \"error\" ? \"✗\" : flag.severity === \"warning\" ? \"⚠\" : \"ℹ\";\n lines.push(` ${icon} [${flag.id}] ${flag.component}: ${flag.detail}`);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Creates the `scope instrument renders` sub-command.\n */\nexport function createInstrumentRendersCommand(): Command {\n return new Command(\"renders\")\n .description(\"Trace re-render causality chains for a component during an interaction sequence\")\n .argument(\"<component>\", \"Component name to instrument (must be in manifest)\")\n .option(\n \"--interaction <json>\",\n 'Interaction sequence JSON, e.g. \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'',\n \"[]\",\n )\n .option(\"--json\", \"Output as JSON regardless of TTY\", false)\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n async (\n componentName: string,\n opts: {\n interaction: string;\n json: boolean;\n manifest: string;\n },\n ) => {\n let interaction: InteractionStep[] = [];\n try {\n interaction = JSON.parse(opts.interaction) as InteractionStep[];\n if (!Array.isArray(interaction)) {\n throw new Error(\"Interaction must be a JSON array\");\n }\n } catch {\n process.stderr.write(`Error: Invalid --interaction JSON: ${opts.interaction}\\n`);\n process.exit(1);\n }\n\n try {\n process.stderr.write(\n `Instrumenting ${componentName} (${interaction.length} interaction steps)…\\n`,\n );\n\n const result = await analyzeRenders({\n componentName,\n interaction,\n manifestPath: opts.manifest,\n });\n\n await shutdownPool();\n\n if (opts.json || !isTTY()) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n process.stdout.write(`${formatRendersTable(result)}\\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 * Creates the `scope instrument` command group.\n * Contains: `scope instrument renders`, `scope instrument hooks`, `scope instrument profile`\n */\nexport function createInstrumentCommand(): Command {\n const instrumentCmd = new Command(\"instrument\").description(\n \"Structured instrumentation commands for React component analysis\",\n );\n\n instrumentCmd.addCommand(createInstrumentRendersCommand());\n instrumentCmd.addCommand(createInstrumentHooksCommand());\n instrumentCmd.addCommand(createInstrumentProfileCommand());\n instrumentCmd.addCommand(createInstrumentTreeCommand());\n\n return instrumentCmd;\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 * 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 * @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 * @agent-scope/cli — report baseline command\n *\n * Implements `scope report baseline`, which captures a complete snapshot of\n * the current component library state and saves it to `.reactscope/baseline/`\n * (or a custom `--output <dir>`).\n *\n * Snapshot structure:\n * ```\n * .reactscope/baseline/\n * ├── manifest.json # Full component manifest\n * ├── renders/\n * │ ├── Button.json # Structured render output per component\n * │ ├── Button.png # Screenshot per component\n * │ └── ...\n * └── compliance.json # Aggregate token compliance results\n * ```\n *\n * Running `scope report baseline` twice overwrites the previous baseline\n * in-place — versioning is left to git.\n */\n\nimport { existsSync, mkdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { generateManifest, type Manifest } from \"@agent-scope/manifest\";\nimport { BrowserPool, type RenderResult, safeRender } from \"@agent-scope/render\";\nimport type { BatchReport, ComputedStyles } from \"@agent-scope/tokens\";\nimport { ComplianceEngine, TokenResolver } from \"@agent-scope/tokens\";\nimport type { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { isTTY, matchGlob } from \"../manifest-formatter.js\";\nimport { formatRenderJson, renderProgressBar } from \"../render-formatter.js\";\nimport { getCompiledCssForClasses } from \"../tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_BASELINE_DIR = \".reactscope/baseline\";\n\n// ---------------------------------------------------------------------------\n// BrowserPool — lazy singleton for the lifetime of the baseline 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\n// ---------------------------------------------------------------------------\n\n/**\n * Renders a single component with the given props using BrowserPool + esbuild.\n * Returns the raw RenderResult on success or throws on failure.\n */\nasync function renderComponent(\n filePath: string,\n componentName: string,\n props: Record<string, unknown>,\n viewportWidth: number,\n viewportHeight: number,\n): Promise<RenderResult> {\n const pool = await getPool(viewportWidth, viewportHeight);\n const htmlHarness = await buildComponentHarness(filePath, componentName, props, viewportWidth);\n const slot = await pool.acquire();\n const { page } = slot;\n\n try {\n await page.setContent(htmlHarness, { waitUntil: \"load\" });\n\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 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 // Inject compiled Tailwind CSS if present\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 startMs = performance.now();\n\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 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 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 const computedStylesRaw: 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 computedStylesRaw[\"[data-reactscope-root] > *\"] = styles;\n\n const renderTimeMs = performance.now() - startMs;\n\n return {\n screenshot,\n width: Math.round(safeW),\n height: Math.round(safeH),\n renderTimeMs,\n computedStyles: computedStylesRaw,\n };\n } finally {\n pool.release(slot);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Compliance helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Extract ComputedStyles from a render result's computedStyles map.\n * Maps the flat property bag into the categorised ComputedStyles shape\n * expected by ComplianceEngine.\n */\nfunction extractComputedStyles(\n computedStylesRaw: Record<string, Record<string, string>>,\n): ComputedStyles {\n const flat: Record<string, string> = {};\n for (const styles of Object.values(computedStylesRaw)) {\n Object.assign(flat, styles);\n }\n\n const colors: Record<string, string> = {};\n const spacing: Record<string, string> = {};\n const typography: Record<string, string> = {};\n const borders: Record<string, string> = {};\n const shadows: Record<string, string> = {};\n\n for (const [prop, value] of Object.entries(flat)) {\n if (prop === \"color\" || prop === \"backgroundColor\") {\n colors[prop] = value;\n } else if (prop === \"padding\" || prop === \"margin\") {\n spacing[prop] = value;\n } else if (\n prop === \"fontSize\" ||\n prop === \"fontFamily\" ||\n prop === \"fontWeight\" ||\n prop === \"lineHeight\"\n ) {\n typography[prop] = value;\n } else if (prop === \"borderRadius\" || prop === \"borderWidth\") {\n borders[prop] = value;\n } else if (prop === \"boxShadow\") {\n shadows[prop] = value;\n }\n }\n\n return { colors, spacing, typography, borders, shadows };\n}\n\n// ---------------------------------------------------------------------------\n// Baseline runner\n// ---------------------------------------------------------------------------\n\nexport interface BaselineOptions {\n /** Output directory for the baseline snapshot. Default: .reactscope/baseline */\n outputDir?: string;\n /** Glob to filter which components to baseline. Default: all */\n componentsGlob?: string;\n /** Path to manifest.json to read from instead of regenerating */\n manifestPath?: string;\n /** Viewport width. Default: 375 */\n viewportWidth?: number;\n /** Viewport height. Default: 812 */\n viewportHeight?: number;\n}\n\nexport interface BaselineResult {\n /** Absolute path to the baseline directory */\n baselineDir: string;\n /** Number of components processed */\n componentCount: number;\n /** Number of components that failed to render */\n failureCount: number;\n /** Total wall-clock time in ms */\n wallClockMs: number;\n}\n\n/**\n * Run the full baseline capture pipeline:\n * 1. Generate (or load) manifest\n * 2. Render all components (or filtered subset)\n * 3. Run token compliance audit\n * 4. Save snapshot to baseline directory\n *\n * If the baseline directory already exists it is wiped before writing,\n * ensuring the snapshot is always a clean, complete replacement.\n */\nexport async function runBaseline(options: BaselineOptions = {}): Promise<BaselineResult> {\n const {\n outputDir = DEFAULT_BASELINE_DIR,\n componentsGlob,\n manifestPath,\n viewportWidth = 375,\n viewportHeight = 812,\n } = options;\n\n const startTime = performance.now();\n const rootDir = process.cwd();\n const baselineDir = resolve(rootDir, outputDir);\n const rendersDir = resolve(baselineDir, \"renders\");\n\n // ── 1. Wipe and recreate baseline directory ──────────────────────────────\n if (existsSync(baselineDir)) {\n rmSync(baselineDir, { recursive: true, force: true });\n }\n mkdirSync(rendersDir, { recursive: true });\n\n // ── 2. Generate (or load) manifest ──────────────────────────────────────\n let manifest: Manifest;\n\n if (manifestPath !== undefined) {\n const { readFileSync } = await import(\"node:fs\");\n const absPath = resolve(rootDir, manifestPath);\n if (!existsSync(absPath)) {\n throw new Error(`Manifest not found at ${absPath}.`);\n }\n manifest = JSON.parse(readFileSync(absPath, \"utf-8\")) as Manifest;\n process.stderr.write(`Loaded manifest from ${manifestPath}\\n`);\n } else {\n process.stderr.write(\"Scanning for React components…\\n\");\n manifest = await generateManifest({ rootDir });\n const count = Object.keys(manifest.components).length;\n process.stderr.write(`Found ${count} components.\\n`);\n }\n\n // Save manifest\n writeFileSync(resolve(baselineDir, \"manifest.json\"), JSON.stringify(manifest, null, 2), \"utf-8\");\n\n // ── 3. Filter components ─────────────────────────────────────────────────\n let componentNames = Object.keys(manifest.components);\n\n if (componentsGlob !== undefined) {\n componentNames = componentNames.filter((name) => matchGlob(componentsGlob, name));\n process.stderr.write(\n `Filtered to ${componentNames.length} components matching \"${componentsGlob}\".\\n`,\n );\n }\n\n const total = componentNames.length;\n\n if (total === 0) {\n process.stderr.write(\"No components to baseline.\\n\");\n const emptyReport: BatchReport = {\n components: {},\n totalProperties: 0,\n totalOnSystem: 0,\n totalOffSystem: 0,\n aggregateCompliance: 1,\n auditedAt: new Date().toISOString(),\n };\n writeFileSync(\n resolve(baselineDir, \"compliance.json\"),\n JSON.stringify(emptyReport, null, 2),\n \"utf-8\",\n );\n return {\n baselineDir,\n componentCount: 0,\n failureCount: 0,\n wallClockMs: performance.now() - startTime,\n };\n }\n\n // ── 4. Render all components ─────────────────────────────────────────────\n process.stderr.write(`Rendering ${total} components…\\n`);\n\n const computedStylesMap = new Map<string, ComputedStyles>();\n let completed = 0;\n let failureCount = 0;\n const CONCURRENCY = 4;\n let nextIdx = 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\n const outcome = await safeRender(\n () => renderComponent(filePath, name, {}, viewportWidth, viewportHeight),\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\n if (isTTY()) {\n process.stderr.write(`${renderProgressBar(completed, total, name, pct)}\\r`);\n }\n\n if (outcome.crashed) {\n failureCount++;\n const errPath = resolve(rendersDir, `${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 \"utf-8\",\n );\n return;\n }\n\n const result = outcome.result;\n\n // Write screenshot PNG\n writeFileSync(resolve(rendersDir, `${name}.png`), result.screenshot);\n\n // Write structured render JSON\n const jsonOutput = formatRenderJson(name, {}, result);\n writeFileSync(\n resolve(rendersDir, `${name}.json`),\n JSON.stringify(jsonOutput, null, 2),\n \"utf-8\",\n );\n\n // Collect computed styles for compliance audit\n computedStylesMap.set(name, extractComputedStyles(result.computedStyles));\n };\n\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 await shutdownPool();\n\n if (isTTY()) {\n process.stderr.write(\"\\n\");\n }\n\n // ── 5. Compliance audit ──────────────────────────────────────────────────\n // Build an empty resolver — without a token file all rendered styles are\n // \"off-system\". Users integrate tokens by providing a token file via the\n // separate `scope tokens` commands; baseline stores the raw audit result.\n const resolver = new TokenResolver([]);\n const engine = new ComplianceEngine(resolver);\n const batchReport = engine.auditBatch(computedStylesMap);\n\n writeFileSync(\n resolve(baselineDir, \"compliance.json\"),\n JSON.stringify(batchReport, null, 2),\n \"utf-8\",\n );\n\n const wallClockMs = performance.now() - startTime;\n\n // ── 6. Summary ───────────────────────────────────────────────────────────\n const successCount = total - failureCount;\n process.stderr.write(\n `\\nBaseline complete: ${successCount}/${total} components rendered` +\n (failureCount > 0 ? ` (${failureCount} failed)` : \"\") +\n ` in ${(wallClockMs / 1000).toFixed(1)}s\\n`,\n );\n process.stderr.write(`Snapshot saved to ${baselineDir}\\n`);\n\n return { baselineDir, componentCount: total, failureCount, wallClockMs };\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Registers the `baseline` sub-command onto an existing Commander command\n * (typically the `report` command in program.ts).\n *\n * This avoids name collisions when the parent `report` command already\n * exists as a live-capture command.\n */\nexport function registerBaselineSubCommand(reportCmd: Command): void {\n reportCmd\n .command(\"baseline\")\n .description(\"Capture a baseline snapshot (manifest + renders + compliance) for later diffing\")\n .option(\n \"-o, --output <dir>\",\n \"Output directory for the baseline snapshot\",\n DEFAULT_BASELINE_DIR,\n )\n .option(\"--components <glob>\", \"Glob pattern to baseline a subset of components\")\n .option(\"--manifest <path>\", \"Path to an existing manifest.json to use instead of regenerating\")\n .option(\"--viewport <WxH>\", \"Viewport size, e.g. 1280x720\", \"375x812\")\n .action(\n async (opts: {\n output: string;\n components?: string;\n manifest?: string;\n viewport: string;\n }) => {\n try {\n const [wStr, hStr] = opts.viewport.split(\"x\");\n const viewportWidth = Number.parseInt(wStr ?? \"375\", 10);\n const viewportHeight = Number.parseInt(hStr ?? \"812\", 10);\n\n await runBaseline({\n outputDir: opts.output,\n componentsGlob: opts.components,\n manifestPath: opts.manifest,\n viewportWidth,\n viewportHeight,\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 * 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 — tokens export sub-command\n *\n * Implements `scope tokens export --format <fmt>` which converts a resolved\n * token set into one of six downstream formats:\n *\n * css — CSS custom properties (:root { --color-primary-500: … })\n * ts — TypeScript const exports (export const colorPrimary500 = …)\n * scss — SCSS variable declarations ($color-primary-500: …)\n * tailwind — Tailwind CSS theme.extend object (module.exports = { … })\n * flat-json — Flat key→value JSON { \"color.primary.500\": \"#3B82F6\" }\n * figma — Figma Tokens JSON (nested value+type objects)\n *\n * Token file resolution priority:\n * 1. `--file` flag\n * 2. `tokens.file` field in `reactscope.config.json`\n * 3. `reactscope.tokens.json` in cwd (default)\n *\n * Output defaults to stdout (pipe-friendly). Use `--out <path>` to write to\n * a file instead.\n *\n * Theme-aware export: if the token file contains a `themes` block and\n * `--theme <name>` is passed, theme overrides are included in formats that\n * support them (css, ts, scss, tailwind, figma).\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n type ExportFormat,\n exportTokens,\n parseTokenFileSync,\n ThemeResolver,\n TokenResolver,\n} from \"@agent-scope/tokens\";\nimport { Command } from \"commander\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TOKEN_FILE = \"reactscope.tokens.json\";\nconst CONFIG_FILE = \"reactscope.config.json\";\n\nconst SUPPORTED_FORMATS: ExportFormat[] = [\"css\", \"ts\", \"scss\", \"tailwind\", \"flat-json\", \"figma\"];\n\n// ---------------------------------------------------------------------------\n// Config / token file resolution (mirrors tokens/commands.ts pattern)\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the path to the token file.\n *\n * Priority:\n * 1. Explicit `--file` flag value\n * 2. `tokens.file` in `reactscope.config.json`\n * 3. `reactscope.tokens.json` in cwd\n */\nexport function resolveTokenFilePath(fileFlag?: string): string {\n if (fileFlag !== undefined) {\n return resolve(process.cwd(), fileFlag);\n }\n\n const configPath = resolve(process.cwd(), CONFIG_FILE);\n if (existsSync(configPath)) {\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(raw) as unknown;\n if (\n typeof config === \"object\" &&\n config !== null &&\n \"tokens\" in config &&\n typeof (config as { tokens?: unknown }).tokens === \"object\" &&\n (config as { tokens?: { file?: unknown } }).tokens !== null &&\n typeof (config as { tokens?: { file?: unknown } }).tokens?.file === \"string\"\n ) {\n const file = (config as { tokens: { file: string } }).tokens.file;\n return resolve(process.cwd(), file);\n }\n } catch {\n // Ignore malformed config — fall through to default\n }\n }\n\n return resolve(process.cwd(), DEFAULT_TOKEN_FILE);\n}\n\n// ---------------------------------------------------------------------------\n// Export command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create and return the `tokens export` sub-command.\n *\n * Intended to be registered on the parent `tokens` Command:\n * ```ts\n * tokensCmd.addCommand(createTokensExportCommand());\n * ```\n */\nexport function createTokensExportCommand(): Command {\n return new Command(\"export\")\n .description(\"Export design tokens to a downstream format\")\n .requiredOption(\"--format <fmt>\", `Output format: ${SUPPORTED_FORMATS.join(\", \")}`)\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--out <path>\", \"Write output to file instead of stdout\")\n .option(\"--prefix <prefix>\", \"CSS/SCSS: prefix for variable names (e.g. 'scope')\")\n .option(\"--selector <selector>\", \"CSS: custom root selector (default: ':root')\")\n .option(\n \"--theme <name>\",\n \"Include theme overrides for the named theme (applies to css, ts, scss, tailwind, figma)\",\n )\n .action(\n (opts: {\n format: string;\n file?: string;\n out?: string;\n prefix?: string;\n selector?: string;\n theme?: string;\n }) => {\n // Validate format early so we get a clean error message\n if (!SUPPORTED_FORMATS.includes(opts.format as ExportFormat)) {\n process.stderr.write(\n `Error: unsupported format \"${opts.format}\".\\n` +\n `Supported formats: ${SUPPORTED_FORMATS.join(\", \")}\\n`,\n );\n process.exit(1);\n }\n\n const format = opts.format as ExportFormat;\n\n try {\n const filePath = resolveTokenFilePath(opts.file);\n\n if (!existsSync(filePath)) {\n throw new Error(\n `Token file not found at ${filePath}.\\n` +\n `Create a reactscope.tokens.json file or use --file to specify a path.`,\n );\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const { tokens, rawFile } = parseTokenFileSync(raw);\n\n // Build theme overrides map when a theme name is provided\n let themesMap: Map<string, Map<string, string>> | undefined;\n\n if (opts.theme !== undefined) {\n // Verify the theme exists\n if (!rawFile.themes || !(opts.theme in rawFile.themes)) {\n const available = rawFile.themes ? Object.keys(rawFile.themes).join(\", \") : \"none\";\n throw new Error(\n `Theme \"${opts.theme}\" not found in token file.\\n` +\n `Available themes: ${available}`,\n );\n }\n\n // Use ThemeResolver to build the override map\n const baseResolver = new TokenResolver(tokens);\n const themeResolver = ThemeResolver.fromTokenFile(\n baseResolver,\n rawFile as import(\"@agent-scope/tokens\").ThemedTokenFile,\n );\n const themeNames = themeResolver.listThemes();\n\n if (!themeNames.includes(opts.theme)) {\n throw new Error(\n `Theme \"${opts.theme}\" could not be resolved.\\n` +\n `Available themes: ${themeNames.join(\", \")}`,\n );\n }\n\n // Extract the override Map for this theme by building a\n // full themed token set and diffing against base values\n const themedTokens = themeResolver.buildThemedTokens(opts.theme);\n const overrideMap = new Map<string, string>();\n for (const themedToken of themedTokens) {\n const baseToken = tokens.find((t) => t.path === themedToken.path);\n if (\n baseToken !== undefined &&\n themedToken.resolvedValue !== baseToken.resolvedValue\n ) {\n overrideMap.set(themedToken.path, themedToken.resolvedValue);\n }\n }\n\n themesMap = new Map([[opts.theme, overrideMap]]);\n }\n\n const output = exportTokens(tokens, format, {\n prefix: opts.prefix,\n rootSelector: opts.selector,\n themes: themesMap,\n });\n\n if (opts.out !== undefined) {\n const outPath = resolve(process.cwd(), opts.out);\n writeFileSync(outPath, output, \"utf-8\");\n process.stderr.write(`Exported ${tokens.length} tokens to ${outPath}\\n`);\n } else {\n process.stdout.write(output);\n // Ensure output ends with newline for pipe-friendliness\n if (!output.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\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","/**\n * @agent-scope/cli — tokens sub-commands\n *\n * Registers the `scope tokens` command group with five sub-commands:\n * - `scope tokens get <path>`\n * - `scope tokens list [category]`\n * - `scope tokens search <value>`\n * - `scope tokens resolve <path>`\n * - `scope tokens validate`\n *\n * Token file location is resolved in priority order:\n * 1. `--file` flag\n * 2. `tokens.file` field in `reactscope.config.json`\n * 3. `reactscope.tokens.json` at project root (default)\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n parseTokenFileSync,\n TokenParseError,\n TokenResolver,\n type TokenType,\n TokenValidationError,\n validateTokenFile,\n} from \"@agent-scope/tokens\";\nimport { Command } from \"commander\";\nimport { createTokensExportCommand } from \"./export.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TOKEN_FILE = \"reactscope.tokens.json\";\nconst CONFIG_FILE = \"reactscope.config.json\";\n\n// ---------------------------------------------------------------------------\n// TTY detection (re-used from manifest-formatter pattern)\n// ---------------------------------------------------------------------------\n\nfunction isTTY(): boolean {\n return process.stdout.isTTY === true;\n}\n\n// ---------------------------------------------------------------------------\n// Table 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// Config / token file resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the path to the token file.\n *\n * Priority:\n * 1. Explicit `--file` flag value\n * 2. `tokens.file` in `reactscope.config.json`\n * 3. `reactscope.tokens.json` in cwd\n */\nexport function resolveTokenFilePath(fileFlag?: string): string {\n if (fileFlag !== undefined) {\n return resolve(process.cwd(), fileFlag);\n }\n\n const configPath = resolve(process.cwd(), CONFIG_FILE);\n if (existsSync(configPath)) {\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const config = JSON.parse(raw) as unknown;\n if (\n typeof config === \"object\" &&\n config !== null &&\n \"tokens\" in config &&\n typeof (config as { tokens?: unknown }).tokens === \"object\" &&\n (config as { tokens?: { file?: unknown } }).tokens !== null &&\n typeof (config as { tokens?: { file?: unknown } }).tokens?.file === \"string\"\n ) {\n const file = (config as { tokens: { file: string } }).tokens.file;\n return resolve(process.cwd(), file);\n }\n } catch {\n // Ignore malformed config — fall through to default\n }\n }\n\n return resolve(process.cwd(), DEFAULT_TOKEN_FILE);\n}\n\n/**\n * Load and parse the token file at the given absolute path.\n * Throws with a helpful message if the file is missing.\n */\nexport function loadTokens(absPath: string) {\n if (!existsSync(absPath)) {\n throw new Error(\n `Token file not found at ${absPath}.\\nCreate a reactscope.tokens.json file or use --file to specify a path.`,\n );\n }\n const raw = readFileSync(absPath, \"utf-8\");\n return parseTokenFileSync(raw);\n}\n\n// ---------------------------------------------------------------------------\n// Resolve-chain extraction\n// ---------------------------------------------------------------------------\n\n/**\n * Walk the raw token tree to extract the raw value for a given dot-notation path.\n * Returns null if the path doesn't exist.\n */\nfunction getRawValue(node: Record<string, unknown>, segments: string[]): string | number | null {\n const [head, ...rest] = segments;\n if (head === undefined) return null;\n\n const child = node[head];\n if (child === undefined || child === null) return null;\n\n if (rest.length === 0) {\n // Should be a leaf\n if (typeof child === \"object\" && !Array.isArray(child) && \"value\" in (child as object)) {\n const v = (child as { value: unknown }).value;\n return typeof v === \"string\" || typeof v === \"number\" ? v : null;\n }\n return null;\n }\n\n if (typeof child === \"object\" && !Array.isArray(child)) {\n return getRawValue(child as Record<string, unknown>, rest);\n }\n\n return null;\n}\n\n/**\n * Build the resolution chain for a token path.\n * e.g. `color.semantic.success` → [{path, rawValue: \"{color.green.500}\"}, {path: \"color.green.500\", rawValue: \"#22C55E\"}]\n */\nfunction buildResolutionChain(\n startPath: string,\n rawTokens: Record<string, unknown>,\n): Array<{ path: string; rawValue: string }> {\n const chain: Array<{ path: string; rawValue: string }> = [];\n const seen = new Set<string>();\n\n let current = startPath;\n while (!seen.has(current)) {\n seen.add(current);\n const rawValue = getRawValue(rawTokens, current.split(\".\"));\n if (rawValue === null) break;\n\n chain.push({ path: current, rawValue: String(rawValue) });\n\n // Check if rawValue is a reference like {path.to.token}\n const refMatch = /^\\{([^}]+)\\}$/.exec(String(rawValue));\n if (refMatch === null) break; // Reached a concrete value\n\n current = refMatch[1] ?? \"\";\n }\n\n return chain;\n}\n\n// ---------------------------------------------------------------------------\n// tokens get\n// ---------------------------------------------------------------------------\n\nfunction registerGet(tokensCmd: Command): void {\n tokensCmd\n .command(\"get <path>\")\n .description(\"Resolve a token path to its computed value\")\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action((tokenPath: string, opts: { file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(filePath);\n const resolver = new TokenResolver(tokens);\n\n const resolvedValue = resolver.resolve(tokenPath);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n const token = tokens.find((t) => t.path === tokenPath);\n process.stdout.write(\n `${JSON.stringify({ path: tokenPath, value: token?.value, resolvedValue, type: token?.type }, null, 2)}\\n`,\n );\n } else {\n process.stdout.write(`${resolvedValue}\\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// ---------------------------------------------------------------------------\n// tokens list\n// ---------------------------------------------------------------------------\n\nfunction registerList(tokensCmd: Command): void {\n tokensCmd\n .command(\"list [category]\")\n .description(\"List tokens, optionally filtered by category or type\")\n .option(\"--type <type>\", \"Filter by token type (color, dimension, fontFamily, etc.)\")\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .action(\n (category: string | undefined, opts: { type?: string; file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(filePath);\n const resolver = new TokenResolver(tokens);\n\n const filtered = resolver.list(opts.type as TokenType | undefined, category);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"table\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify(filtered, null, 2)}\\n`);\n } else {\n if (filtered.length === 0) {\n process.stdout.write(\"No tokens found.\\n\");\n return;\n }\n const headers = [\"PATH\", \"VALUE\", \"RESOLVED\", \"TYPE\"];\n const rows = filtered.map((t) => [t.path, String(t.value), t.resolvedValue, t.type]);\n process.stdout.write(`${buildTable(headers, rows)}\\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\n// ---------------------------------------------------------------------------\n// tokens search\n// ---------------------------------------------------------------------------\n\nfunction registerSearch(tokensCmd: Command): void {\n tokensCmd\n .command(\"search <value>\")\n .description(\"Find which token(s) match a computed value (supports fuzzy color matching)\")\n .option(\"--type <type>\", \"Restrict search to a specific token type\")\n .option(\"--fuzzy\", \"Return nearest match even if no exact match exists\", false)\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .action(\n (value: string, opts: { type?: string; fuzzy: boolean; file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(filePath);\n const resolver = new TokenResolver(tokens);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"table\" && !isTTY());\n\n // Determine which types to search\n const typesToSearch: TokenType[] = opts.type\n ? [opts.type as TokenType]\n : [\n \"color\",\n \"dimension\",\n \"fontFamily\",\n \"fontWeight\",\n \"number\",\n \"shadow\",\n \"duration\",\n \"cubicBezier\",\n ];\n\n const exactMatches: Array<{\n path: string;\n resolvedValue: string;\n type: TokenType;\n exact: boolean;\n distance: number;\n }> = [];\n const nearestMatches: Array<{\n path: string;\n resolvedValue: string;\n type: TokenType;\n exact: boolean;\n distance: number;\n }> = [];\n\n for (const type of typesToSearch) {\n const exact = resolver.match(value, type);\n if (exact !== null) {\n exactMatches.push({\n path: exact.token.path,\n resolvedValue: exact.token.resolvedValue,\n type: exact.token.type,\n exact: true,\n distance: 0,\n });\n }\n }\n\n // If no exact matches and fuzzy requested, get nearest per type\n if (exactMatches.length === 0 && opts.fuzzy) {\n for (const type of typesToSearch) {\n const typeTokens = tokens.filter((t) => t.type === type);\n if (typeTokens.length === 0) continue;\n try {\n const near = resolver.nearest(value, type);\n nearestMatches.push({\n path: near.token.path,\n resolvedValue: near.token.resolvedValue,\n type: near.token.type,\n exact: near.exact,\n distance: near.distance,\n });\n } catch {\n // Skip types with no tokens\n }\n }\n // Sort by distance, take top 3\n nearestMatches.sort((a, b) => a.distance - b.distance);\n nearestMatches.splice(3);\n }\n\n const results = exactMatches.length > 0 ? exactMatches : nearestMatches;\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify(results, null, 2)}\\n`);\n } else {\n if (results.length === 0) {\n process.stdout.write(\n `No tokens found matching \"${value}\".\\nTip: use --fuzzy for nearest-match search.\\n`,\n );\n return;\n }\n const headers = [\"PATH\", \"RESOLVED VALUE\", \"TYPE\", \"MATCH\", \"DISTANCE\"];\n const rows = results.map((r) => [\n r.path,\n r.resolvedValue,\n r.type,\n r.exact ? \"exact\" : \"nearest\",\n r.exact ? \"—\" : r.distance.toFixed(2),\n ]);\n process.stdout.write(`${buildTable(headers, rows)}\\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\n// ---------------------------------------------------------------------------\n// tokens resolve\n// ---------------------------------------------------------------------------\n\nfunction registerResolve(tokensCmd: Command): void {\n tokensCmd\n .command(\"resolve <path>\")\n .description(\"Show the full resolution chain for a token\")\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action((tokenPath: string, opts: { file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n const absFilePath = filePath;\n const { tokens, rawFile } = loadTokens(absFilePath);\n const resolver = new TokenResolver(tokens);\n\n // Verify the token exists\n resolver.resolve(tokenPath);\n\n const chain = buildResolutionChain(tokenPath, rawFile.tokens as Record<string, unknown>);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify({ path: tokenPath, chain }, null, 2)}\\n`);\n } else {\n if (chain.length === 0) {\n process.stdout.write(`Token \"${tokenPath}\" not found.\\n`);\n return;\n }\n // Format as: color.semantic.success → {color.green.500} → #22C55E\n const parts = chain.map((step, i) => {\n if (i < chain.length - 1) {\n return `${step.path} → ${step.rawValue}`;\n }\n return step.rawValue;\n });\n process.stdout.write(`${parts.join(\"\\n \")}\\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// ---------------------------------------------------------------------------\n// tokens validate\n// ---------------------------------------------------------------------------\n\nfunction registerValidate(tokensCmd: Command): void {\n tokensCmd\n .command(\"validate\")\n .description(\n \"Validate the token file for errors (circular refs, missing refs, type mismatches)\",\n )\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action((opts: { file?: string; format?: string }) => {\n try {\n const filePath = resolveTokenFilePath(opts.file);\n\n if (!existsSync(filePath)) {\n throw new Error(\n `Token file not found at ${filePath}.\\nCreate a reactscope.tokens.json file or use --file to specify a path.`,\n );\n }\n\n const raw = readFileSync(filePath, \"utf-8\");\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n const errors: Array<{ code: string; path?: string; message: string }> = [];\n\n // Phase 1: schema validation\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n errors.push({\n code: \"PARSE_ERROR\",\n message: `Failed to parse token file as JSON: ${String(err)}`,\n });\n outputValidationResult(filePath, errors, useJson);\n process.exit(1);\n }\n\n try {\n validateTokenFile(parsed);\n } catch (err) {\n if (err instanceof TokenValidationError) {\n for (const e of err.errors) {\n errors.push({ code: e.code, path: e.path, message: e.message });\n }\n outputValidationResult(filePath, errors, useJson);\n process.exit(1);\n }\n throw err;\n }\n\n // Phase 2: reference resolution (catches circular refs + missing refs)\n try {\n parseTokenFileSync(raw);\n } catch (err) {\n if (err instanceof TokenParseError) {\n errors.push({ code: err.code, path: err.path, message: err.message });\n } else {\n errors.push({ code: \"UNKNOWN\", message: String(err) });\n }\n outputValidationResult(filePath, errors, useJson);\n process.exit(1);\n }\n\n // All clear\n outputValidationResult(filePath, errors, useJson);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(1);\n }\n });\n}\n\nfunction outputValidationResult(\n filePath: string,\n errors: Array<{ code: string; path?: string; message: string }>,\n useJson: boolean,\n): void {\n const valid = errors.length === 0;\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify({ valid, file: filePath, errors }, null, 2)}\\n`);\n } else {\n if (valid) {\n process.stdout.write(`✓ Token file is valid: ${filePath}\\n`);\n } else {\n process.stderr.write(`✗ Token file has ${errors.length} error(s): ${filePath}\\n\\n`);\n for (const e of errors) {\n const pathPrefix = e.path ? ` [${e.path}]` : \"\";\n process.stderr.write(` ${e.code}${pathPrefix}: ${e.message}\\n`);\n }\n process.exit(1);\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create and return the `tokens` command group.\n */\nexport function createTokensCommand(): Command {\n const tokensCmd = new Command(\"tokens\").description(\n \"Query and validate design tokens from a reactscope.tokens.json file\",\n );\n\n registerGet(tokensCmd);\n registerList(tokensCmd);\n registerSearch(tokensCmd);\n registerResolve(tokensCmd);\n registerValidate(tokensCmd);\n tokensCmd.addCommand(createTokensExportCommand());\n\n return tokensCmd;\n}\n","/**\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 { createInitCommand } from \"./init/index.js\";\nimport { createInstrumentCommand } from \"./instrument/renders.js\";\nimport { createManifestCommand } from \"./manifest-commands.js\";\nimport { createRenderCommand } from \"./render-commands.js\";\nimport { registerBaselineSubCommand } from \"./report/baseline.js\";\nimport { buildStructuredReport, formatReport } from \"./report-formatter.js\";\nimport { createTokensCommand } from \"./tokens/commands.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 // ── tokens ───────────────────────────────────────────────────────────────\n program.addCommand(createTokensCommand());\n\n // ── instrument ───────────────────────────────────────────────────────────\n program.addCommand(createInstrumentCommand());\n\n // ── init ──────────────────────────────────────────────────────────────────\n program.addCommand(createInitCommand());\n\n // ── report baseline sub-command ─────────────────────────────────────────\n // Registers 'scope report baseline' on the existing report command.\n const existingReportCmd = program.commands.find((c) => c.name() === \"report\");\n if (existingReportCmd !== undefined) {\n registerBaselineSubCommand(existingReportCmd);\n }\n\n return program;\n}\n"]}
|