@agent-scope/cli 1.20.3 → 1.20.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/program.ts","../src/browser.ts","../src/ci/commands.ts","../src/component-bundler.ts","../src/manifest-formatter.ts","../src/render-formatter.ts","../src/tailwind-css.ts","../src/doctor-commands.ts","../src/diagnostics.ts","../src/get-skill-command.ts","../src/skill-content.ts","../src/init/index.ts","../src/init/detect.ts","../src/instrument/renders.ts","../src/manifest-commands.ts","../src/instrument/hooks.ts","../src/instrument/profile.ts","../src/instrument/tree.ts","../src/render-commands.ts","../src/run-summary.ts","../src/scope-file.ts","../src/report/baseline.ts","../src/report/diff.ts","../src/report/pr-comment.ts","../src/tree-formatter.ts","../src/report-formatter.ts","../src/site-commands.ts","../src/playground-bundler.ts","../src/tokens/commands.ts","../src/tokens/compliance.ts","../src/tokens/export.ts","../src/tokens/impact.ts","../src/tokens/init.ts","../src/tokens/preview.ts","../src/cli.ts"],"sourcesContent":["/**\n * @agent-scope/cli — program factory\n *\n * Builds the Commander.js program tree without executing it.\n * This separation allows the library to be tested without side effects.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { generateTest, loadTrace } from \"@agent-scope/playwright\";\nimport { Command } from \"commander\";\nimport { browserCapture, writeReportToFile } from \"./browser.js\";\nimport { createCiCommand } from \"./ci/commands.js\";\nimport { createDoctorCommand } from \"./doctor-commands.js\";\nimport { createGetSkillCommand } from \"./get-skill-command.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 { registerDiffSubCommand } from \"./report/diff.js\";\nimport { registerPrCommentSubCommand } from \"./report/pr-comment.js\";\nimport { buildStructuredReport, formatReport } from \"./report-formatter.js\";\nimport { createSiteCommand } from \"./site-commands.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(\n \"Scope — static analysis + visual rendering toolkit for React component libraries.\\n\\n\" +\n \"Scope answers questions about React codebases — structure, props, visual output,\\n\" +\n \"design token compliance — without running the full application.\\n\\n\" +\n \"AGENT QUICKSTART:\\n\" +\n \" scope get-skill > /tmp/scope-skill.md\\n\" +\n \" scope init --yes\\n\" +\n \" scope doctor --json\\n\" +\n \" scope manifest list --format json\\n\" +\n \" scope render all --format json --output-dir .reactscope/renders\\n\" +\n \" scope site build --output .reactscope/site\\n\" +\n \" scope instrument profile http://localhost:5173\\n\\n\" +\n \"CI QUICKSTART:\\n\" +\n \" scope ci --json --output .reactscope/ci-result.json\\n\\n\" +\n \"CONFIG FILE: reactscope.config.json (created by `scope init`)\\n\" +\n ' components.include glob patterns for component files (e.g. \"src/**/*.tsx\")\\n' +\n \" components.wrappers providers and globalCSS to wrap every render\\n\" +\n \" render.viewport default viewport width×height in px\\n\" +\n \" tokens.file path to reactscope.tokens.json (default)\\n\" +\n \" output.dir output root (default: .reactscope/)\\n\" +\n \" ci.complianceThreshold fail threshold for `scope ci` (default: 0.90)\\n\\n\" +\n \"OUTPUT DIRECTORY: .reactscope/\\n\" +\n \" manifest.json component registry — updated by `scope manifest generate`\\n\" +\n \" renders/<Name>/ PNGs + render.json per component\\n\" +\n \" compliance-styles.json computed-style map for token matching\\n\" +\n \" site/ static HTML gallery (built by `scope site build`)\\n\\n\" +\n \"Run `scope <command> --help` for detailed flags and examples.\",\n );\n\n // ── capture ─────────────────────────────────────────────────────────────\n program\n .command(\"capture <url>\")\n .description(\n \"Capture the live React component tree from a running app and emit it as JSON.\\n\" +\n \"Requires a running dev server at the given URL (e.g. http://localhost:5173).\\n\\n\" +\n \"Examples:\\n\" +\n \" scope capture http://localhost:5173\\n\" +\n \" scope capture http://localhost:5173 -o report.json --pretty\\n\" +\n \" scope capture http://localhost:5173 --timeout 15000 --wait 500\",\n )\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(\n \"Print a formatted React component tree from a running app.\\n\" +\n \"Useful for quickly understanding component hierarchy without full capture.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tree http://localhost:5173\\n\" +\n \" scope tree http://localhost:5173 --show-props --show-hooks\\n\" +\n \" scope tree http://localhost:5173 --depth 4\",\n )\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(\n \"Capture a React app and print a human-readable analysis summary.\\n\" +\n \"Includes component count, hook usage, side-effect summary, and more.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope report http://localhost:5173\\n\" +\n \" scope report http://localhost:5173 --json\\n\" +\n \" scope report http://localhost:5173 --json -o report.json\",\n )\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(\n \"Generate a Playwright test file from a Scope trace (.json).\\n\" +\n \"Traces are produced by scope instrument renders or scope capture.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope generate trace.json\\n\" +\n ' scope generate trace.json -o tests/scope.spec.ts -d \"User login flow\"',\n )\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 // ── ci ───────────────────────────────────────────────────────────────────\n program.addCommand(createCiCommand());\n\n // Health check\n program.addCommand(createDoctorCommand());\n program.addCommand(createGetSkillCommand());\n\n // ── report baseline + diff sub-commands ────────────────────────────────\n // Registers 'scope report baseline' and 'scope report diff' on the existing\n // report command.\n const existingReportCmd = program.commands.find((c) => c.name() === \"report\");\n if (existingReportCmd !== undefined) {\n registerBaselineSubCommand(existingReportCmd);\n registerDiffSubCommand(existingReportCmd);\n registerPrCommentSubCommand(existingReportCmd);\n }\n\n // ── site ─────────────────────────────────────────────────────────────────\n program.addCommand(createSiteCommand());\n\n return program;\n}\n","/**\n * browser.ts\n *\n * Shared browser launch + capture logic used by capture/tree/report commands.\n * Uses Playwright directly to launch headless Chromium, inject the Scope\n * runtime IIFE bundle, wait for React to mount, and call capture().\n *\n * The browser-entry bundle is provided by @agent-scope/playwright, which handles:\n * - Vite react-refresh compatibility (renderers proxy Map)\n * - Async first-commit awaiting (React 18 scheduler)\n */\n\nimport { writeFileSync } from \"node:fs\";\nimport type { PageReport } from \"@agent-scope/core\";\nimport { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport { chromium } from \"playwright\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface BrowserCaptureOptions {\n /** URL to navigate to */\n url: string;\n /** Max time (ms) to wait for React to mount. Default: 10000 */\n timeout?: number;\n /** Additional wait (ms) after page load before capturing. Default: 0 */\n wait?: number;\n}\n\nexport interface BrowserCaptureResult {\n report: PageReport;\n}\n\n// ---------------------------------------------------------------------------\n// Main capture function\n// ---------------------------------------------------------------------------\n\n/**\n * Launch a headless browser, navigate to the given URL, inject the Scope\n * runtime, wait for React to mount, call capture(), and return the PageReport.\n */\nexport async function browserCapture(\n options: BrowserCaptureOptions,\n): Promise<BrowserCaptureResult> {\n const { url, timeout = 10_000, wait = 0 } = options;\n\n const browser = await chromium.launch({ headless: true });\n\n try {\n const context = await browser.newContext();\n const page = await context.newPage();\n\n // Inject the @agent-scope/playwright browser-entry bundle before any page scripts run.\n // This bundle correctly handles:\n // 1. Vite react-refresh preamble (renderers proxy Map)\n // 2. React 18 async first-commit awaiting\n await page.addInitScript({ content: getBrowserEntryScript() });\n\n // Navigate and wait for network idle\n await page.goto(url, {\n waitUntil: \"networkidle\",\n timeout: timeout + 5_000,\n });\n\n // Wait for the capture function to be available (bundle injects it synchronously)\n await page.waitForFunction(\n () => {\n return (\n typeof (window as Window & { __SCOPE_CAPTURE__?: unknown }).__SCOPE_CAPTURE__ ===\n \"function\" &&\n (document.readyState === \"complete\" || document.readyState === \"interactive\")\n );\n },\n { timeout },\n );\n\n // Additional wait if requested\n if (wait > 0) {\n await page.waitForTimeout(wait);\n }\n\n // Call the injected capture function — awaits first React commit internally\n const raw = await page.evaluate(async () => {\n const win = window as Window & { __SCOPE_CAPTURE__?: () => Promise<unknown> };\n if (typeof win.__SCOPE_CAPTURE__ !== \"function\") {\n throw new Error(\"Scope runtime not injected\");\n }\n return win.__SCOPE_CAPTURE__();\n });\n\n if (\n raw !== null &&\n typeof raw === \"object\" &&\n \"error\" in raw &&\n typeof (raw as Record<string, unknown>).error === \"string\"\n ) {\n throw new Error(`Scope capture failed: ${(raw as Record<string, unknown>).error as string}`);\n }\n\n const report = { ...(raw as Omit<PageReport, \"route\">), route: null } as PageReport;\n return { report };\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Write a PageReport to a file as JSON.\n */\nexport function writeReportToFile(report: PageReport, outputPath: string, pretty: boolean): void {\n const json = pretty ? JSON.stringify(report, null, 2) : JSON.stringify(report);\n writeFileSync(outputPath, json, \"utf-8\");\n}\n","/**\n * @agent-scope/cli — `scope ci` command\n *\n * Runs a non-interactive CI pipeline over the component library and exits\n * with a structured exit code so the result can be consumed by CI systems.\n *\n * ## Pipeline steps (in order)\n *\n * 1. Generate the component manifest (discover all components)\n * 2. Render all discovered components\n * 3. Run token-compliance checks\n * 4. Compare against baseline snapshot (if `--baseline` provided)\n *\n * ## Exit codes\n *\n * 0 — All checks passed\n * 1 — Compliance below threshold\n * 2 — Accessibility violations found (reserved; currently surfaced as info)\n * 3 — Console errors during render\n * 4 — Visual regression detected (pixel diff above threshold)\n * 5 — Component render failures\n *\n * ## Usage\n *\n * ```bash\n * scope ci\n * scope ci --baseline .reactscope/baseline\n * scope ci --checks compliance,console-errors\n * scope ci --threshold 0.90 --json\n * ```\n */\n\nimport { existsSync, readFileSync, 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 { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { isTTY } from \"../manifest-formatter.js\";\nimport { renderProgressBar } from \"../render-formatter.js\";\nimport { getCompiledCssForClasses, getElementClassNames } from \"../tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Exit codes — must match the spec in Human Interface & CLI Spec §1.9\n// ---------------------------------------------------------------------------\n\nexport const CI_EXIT = {\n /** All checks passed */\n OK: 0,\n /** Compliance score below threshold */\n COMPLIANCE_BELOW_THRESHOLD: 1,\n /** Accessibility violations found */\n A11Y_VIOLATIONS: 2,\n /** Console errors detected during render */\n CONSOLE_ERRORS: 3,\n /** Visual regression detected against baseline */\n VISUAL_REGRESSION: 4,\n /** One or more components failed to render */\n RENDER_FAILURES: 5,\n} as const;\n\nexport type CiExitCode = (typeof CI_EXIT)[keyof typeof CI_EXIT];\n\n// ---------------------------------------------------------------------------\n// Check names\n// ---------------------------------------------------------------------------\n\nexport type CiCheckName = \"compliance\" | \"a11y\" | \"console-errors\" | \"visual-regression\";\n\nconst ALL_CHECKS: CiCheckName[] = [\"compliance\", \"a11y\", \"console-errors\", \"visual-regression\"];\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\nexport interface CiCheckResult {\n /** Which check this is */\n check: CiCheckName;\n /** Whether the check passed */\n passed: boolean;\n /** Human-readable summary */\n message: string;\n /** Numeric value for threshold-based checks */\n value?: number;\n /** Threshold that was applied */\n threshold?: number;\n}\n\nexport interface CiResult {\n /** ISO timestamp */\n ranAt: string;\n /** Whether the overall CI run passed (exit code 0) */\n passed: boolean;\n /** The resolved exit code */\n exitCode: CiExitCode;\n /** Per-check results */\n checks: CiCheckResult[];\n /** Component counts */\n components: {\n total: number;\n rendered: number;\n failed: number;\n };\n /** Aggregate compliance score (0–1) */\n complianceScore: number;\n /** Compliance threshold that was applied */\n complianceThreshold: number;\n /** Whether baseline comparison was performed */\n baselineCompared: boolean;\n /** Wall-clock duration in ms */\n wallClockMs: number;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface CiOptions {\n /** Baseline directory to compare against. Omit to skip visual regression check. */\n baselineDir?: string;\n /** Which checks to run. Default: all */\n checks?: CiCheckName[];\n /** Compliance pass threshold (0–1). Default: 0.90 */\n complianceThreshold?: number;\n /** Viewport width. Default: 375 */\n viewportWidth?: number;\n /** Viewport height. Default: 812 */\n viewportHeight?: number;\n}\n\n// ---------------------------------------------------------------------------\n// BrowserPool — lazy singleton\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 (shared pattern — identical to baseline/diff)\n// ---------------------------------------------------------------------------\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 PAD = 24;\n const pool = await getPool(viewportWidth, viewportHeight);\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n undefined,\n undefined,\n PAD,\n );\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 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 getElementClassNames(el)) {\n 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 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// Computed-style extractor (shared pattern)\n// ---------------------------------------------------------------------------\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 comparison helpers\n// ---------------------------------------------------------------------------\n\ninterface BaselineRenderJson {\n component: string;\n width: number;\n height: number;\n}\n\nfunction loadBaselineRenderJson(\n baselineDir: string,\n componentName: string,\n): BaselineRenderJson | null {\n const jsonPath = resolve(baselineDir, \"renders\", `${componentName}.json`);\n if (!existsSync(jsonPath)) return null;\n return JSON.parse(readFileSync(jsonPath, \"utf-8\")) as BaselineRenderJson;\n}\n\n// ---------------------------------------------------------------------------\n// CI runner\n// ---------------------------------------------------------------------------\n\n/**\n * Run the full CI pipeline and return a structured CiResult.\n *\n * Does not call `process.exit` — callers are responsible for that so the\n * function remains testable without side effects.\n */\nexport async function runCi(options: CiOptions = {}): Promise<CiResult> {\n const {\n baselineDir: baselineDirRaw,\n checks = ALL_CHECKS,\n complianceThreshold = 0.9,\n viewportWidth = 375,\n viewportHeight = 812,\n } = options;\n\n const startTime = performance.now();\n const rootDir = process.cwd();\n const checksSet = new Set<CiCheckName>(checks);\n const baselineDir = baselineDirRaw !== undefined ? resolve(rootDir, baselineDirRaw) : undefined;\n\n // ── 1. Generate manifest ─────────────────────────────────────────────────\n process.stderr.write(\"Scanning for React components…\\n\");\n const manifest: Manifest = await generateManifest({ rootDir });\n const componentNames = Object.keys(manifest.components);\n const total = componentNames.length;\n process.stderr.write(`Found ${total} components.\\n`);\n\n // ── 2. Render all components ─────────────────────────────────────────────\n process.stderr.write(`Rendering ${total} components…\\n`);\n\n const computedStylesMap = new Map<string, ComputedStyles>();\n const currentRenderMeta = new Map<string, { width: number; height: number }>();\n const renderFailures = new Set<string>();\n\n let completed = 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 renderFailures.add(name);\n return;\n }\n\n const result = outcome.result;\n currentRenderMeta.set(name, { width: result.width, height: result.height });\n computedStylesMap.set(name, extractComputedStyles(result.computedStyles));\n };\n\n if (total > 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\n await shutdownPool();\n\n if (isTTY() && total > 0) {\n process.stderr.write(\"\\n\");\n }\n\n // ── 3. Compliance audit ──────────────────────────────────────────────────\n const resolver = new TokenResolver([]);\n const engine = new ComplianceEngine(resolver);\n const batchReport: BatchReport = engine.auditBatch(computedStylesMap);\n const complianceScore = batchReport.aggregateCompliance;\n\n // ── 4. Evaluate checks ───────────────────────────────────────────────────\n const checkResults: CiCheckResult[] = [];\n\n // ── 4a. Render failures (always evaluated) ───────────────────────────────\n const renderFailureCount = renderFailures.size;\n const rendersPassed = renderFailureCount === 0;\n\n // ── 4b. Compliance check ─────────────────────────────────────────────────\n if (checksSet.has(\"compliance\")) {\n const compliancePassed = complianceScore >= complianceThreshold;\n checkResults.push({\n check: \"compliance\",\n passed: compliancePassed,\n message: compliancePassed\n ? `Compliance ${(complianceScore * 100).toFixed(1)}% >= threshold ${(complianceThreshold * 100).toFixed(1)}%`\n : `Compliance ${(complianceScore * 100).toFixed(1)}% < threshold ${(complianceThreshold * 100).toFixed(1)}%`,\n value: complianceScore,\n threshold: complianceThreshold,\n });\n }\n\n // ── 4c. A11y check (reserved — informational in v1) ─────────────────────\n if (checksSet.has(\"a11y\")) {\n // A11y violations require axe-core integration (future work).\n // Exit-code slot 2 is reserved; currently passes unconditionally.\n checkResults.push({\n check: \"a11y\",\n passed: true,\n message: \"Accessibility audit not yet implemented — skipped\",\n });\n }\n\n // ── 4d. Console errors check ─────────────────────────────────────────────\n if (checksSet.has(\"console-errors\")) {\n // Console error capture requires page-level hooks (future work).\n // Exit-code slot 3 is reserved; currently passes when all components render.\n const consoleErrorsPassed = rendersPassed;\n checkResults.push({\n check: \"console-errors\",\n passed: consoleErrorsPassed,\n message: consoleErrorsPassed\n ? \"No console errors detected\"\n : `Console errors likely — ${renderFailureCount} component(s) failed to render`,\n });\n }\n\n // ── 4e. Visual regression check ─────────────────────────────────────────\n let hasVisualRegression = false;\n\n if (checksSet.has(\"visual-regression\") && baselineDir !== undefined) {\n if (!existsSync(baselineDir)) {\n process.stderr.write(\n `Warning: baseline directory not found at \"${baselineDir}\" — skipping visual regression check.\\n`,\n );\n checkResults.push({\n check: \"visual-regression\",\n passed: true,\n message: `Baseline not found at ${baselineDir} — skipped`,\n });\n } else {\n // Dimension-based regression detection (pixel diff reserved for v2).\n // Flag components whose rendered dimensions changed by > 10px on either axis.\n const regressions: string[] = [];\n\n for (const name of componentNames) {\n const baselineMeta = loadBaselineRenderJson(baselineDir, name);\n const currentMeta = currentRenderMeta.get(name);\n\n if (baselineMeta !== null && currentMeta !== undefined) {\n const dw = Math.abs(currentMeta.width - baselineMeta.width);\n const dh = Math.abs(currentMeta.height - baselineMeta.height);\n if (dw > 10 || dh > 10) {\n regressions.push(name);\n }\n }\n }\n\n hasVisualRegression = regressions.length > 0;\n checkResults.push({\n check: \"visual-regression\",\n passed: !hasVisualRegression,\n message: hasVisualRegression\n ? `Visual regression detected in ${regressions.length} component(s): ${regressions.slice(0, 5).join(\", \")}${regressions.length > 5 ? \"...\" : \"\"}`\n : \"No visual regressions detected\",\n });\n }\n }\n\n // ── 5. Resolve exit code ─────────────────────────────────────────────────\n // First failing check wins. Render failures are checked last so that\n // compliance/a11y/console/visual codes take precedence when checks are enabled.\n let exitCode: CiExitCode = CI_EXIT.OK;\n\n const complianceResult = checkResults.find((r) => r.check === \"compliance\");\n const a11yResult = checkResults.find((r) => r.check === \"a11y\");\n const consoleResult = checkResults.find((r) => r.check === \"console-errors\");\n const visualResult = checkResults.find((r) => r.check === \"visual-regression\");\n\n if (complianceResult !== undefined && !complianceResult.passed) {\n exitCode = CI_EXIT.COMPLIANCE_BELOW_THRESHOLD;\n } else if (a11yResult !== undefined && !a11yResult.passed) {\n exitCode = CI_EXIT.A11Y_VIOLATIONS;\n } else if (consoleResult !== undefined && !consoleResult.passed) {\n exitCode = CI_EXIT.CONSOLE_ERRORS;\n } else if (visualResult !== undefined && !visualResult.passed) {\n exitCode = CI_EXIT.VISUAL_REGRESSION;\n } else if (!rendersPassed) {\n exitCode = CI_EXIT.RENDER_FAILURES;\n }\n\n const passed = exitCode === CI_EXIT.OK;\n const wallClockMs = performance.now() - startTime;\n\n return {\n ranAt: new Date().toISOString(),\n passed,\n exitCode,\n checks: checkResults,\n components: {\n total,\n rendered: total - renderFailureCount,\n failed: renderFailureCount,\n },\n complianceScore,\n complianceThreshold,\n baselineCompared: baselineDir !== undefined && existsSync(baselineDir),\n wallClockMs,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Human-readable formatter\n// ---------------------------------------------------------------------------\n\n/**\n * Format a CiResult as the CI stdout summary (spec §4.2).\n */\nexport function formatCiReport(result: CiResult): string {\n const lines: string[] = [];\n\n const title = \"Scope CI Report\";\n const rule = \"=\".repeat(Math.max(title.length, 40));\n lines.push(title, rule);\n\n // Component stats\n const { total, rendered, failed } = result.components;\n lines.push(\n `Components: ${total} total ${rendered} rendered${failed > 0 ? ` ${failed} failed` : \"\"}`,\n );\n\n // Per-check summary\n lines.push(\"\");\n for (const check of result.checks) {\n const icon = check.passed ? \"pass\" : \"FAIL\";\n lines.push(` [${icon}] ${check.message}`);\n }\n\n // Render failures (always shown when present)\n if (result.components.failed > 0) {\n lines.push(` [FAIL] ${result.components.failed} component(s) failed to render`);\n }\n\n lines.push(\"\");\n lines.push(rule);\n\n if (result.passed) {\n lines.push(\n `CI passed in ${(result.wallClockMs / 1000).toFixed(1)}s (exit code ${result.exitCode})`,\n );\n } else {\n lines.push(\n `CI failed in ${(result.wallClockMs / 1000).toFixed(1)}s (exit code ${result.exitCode})`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a comma-separated list of check names, validating each entry.\n * Returns undefined when the list is empty or invalid, falling back to all checks.\n */\nfunction parseChecks(raw: string | undefined): CiCheckName[] | undefined {\n if (raw === undefined) return undefined;\n\n const parts = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n if (parts.length === 0) return undefined;\n\n const valid = new Set<string>(ALL_CHECKS);\n const parsed: CiCheckName[] = [];\n\n for (const part of parts) {\n if (!valid.has(part)) {\n process.stderr.write(\n `Warning: unknown check \"${part}\" — valid checks are: ${ALL_CHECKS.join(\", \")}\\n`,\n );\n continue;\n }\n parsed.push(part as CiCheckName);\n }\n\n return parsed.length > 0 ? parsed : undefined;\n}\n\n/**\n * Build and return the `scope ci` command.\n *\n * The command runs the full pipeline, writes output,\n * and calls `process.exit` with the appropriate exit code.\n */\nexport function createCiCommand(): Command {\n return new Command(\"ci\")\n .description(\n \"Run the full Scope pipeline non-interactively and exit with a structured code.\\n\\n\" +\n \"PIPELINE STEPS (in order):\\n\" +\n \" 1. manifest generate scan source, build .reactscope/manifest.json\\n\" +\n \" 2. render all screenshot every component\\n\" +\n \" 3. tokens compliance score on-token CSS coverage\\n\" +\n \" 4. visual regression pixel diff against --baseline (if provided)\\n\\n\" +\n \"CHECKS (--checks flag, comma-separated):\\n\" +\n \" compliance token coverage below --threshold → exit 1\\n\" +\n \" a11y accessibility violations → exit 2\\n\" +\n \" console-errors console.error during render → exit 3\\n\" +\n \" visual-regression pixel diff against baseline → exit 4\\n\" +\n \" (render failures always → exit 5 regardless of --checks)\\n\\n\" +\n \"EXIT CODES:\\n\" +\n \" 0 all checks passed\\n\" +\n \" 1 compliance below threshold\\n\" +\n \" 2 accessibility violations\\n\" +\n \" 3 console errors during render\\n\" +\n \" 4 visual regression detected\\n\" +\n \" 5 component render failures\\n\\n\" +\n \"Examples:\\n\" +\n \" scope ci\\n\" +\n \" scope ci --baseline .reactscope/baseline --threshold 0.95\\n\" +\n \" scope ci --checks compliance,a11y --json -o ci-result.json\\n\" +\n \" scope ci --viewport 1280x720\",\n )\n .option(\n \"-b, --baseline <dir>\",\n \"Baseline directory for visual regression comparison (omit to skip)\",\n )\n .option(\n \"--checks <list>\",\n `Comma-separated checks to run (default: all). Valid: ${ALL_CHECKS.join(\", \")}`,\n )\n .option(\"--threshold <n>\", \"Compliance pass threshold (0-1, default: 0.90)\", \"0.90\")\n .option(\"--viewport <WxH>\", \"Viewport size, e.g. 1280x720\", \"375x812\")\n .option(\"--json\", \"Emit structured JSON to stdout in addition to the summary\", false)\n .option(\"-o, --output <path>\", \"Write the CI result JSON to a file\")\n .action(\n async (opts: {\n baseline?: string;\n checks?: string;\n threshold: string;\n viewport: string;\n json: boolean;\n output?: 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 const complianceThreshold = Number.parseFloat(opts.threshold);\n const checks = parseChecks(opts.checks);\n\n const result = await runCi({\n baselineDir: opts.baseline,\n checks,\n complianceThreshold,\n viewportWidth,\n viewportHeight,\n });\n\n // Write JSON output file if requested\n if (opts.output !== undefined) {\n const outPath = resolve(process.cwd(), opts.output);\n writeFileSync(outPath, JSON.stringify(result, null, 2), \"utf-8\");\n process.stderr.write(`CI result written to ${opts.output}\\n`);\n }\n\n // Emit human-readable summary\n process.stdout.write(`${formatCiReport(result)}\\n`);\n\n // Emit JSON to stdout when requested\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n }\n\n process.exit(result.exitCode);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(CI_EXIT.RENDER_FAILURES);\n }\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 * @param preScript - Optional JS to inject before the component bundle\n * (e.g. Scope browser-entry for DevTools hook installation).\n * Runs in a separate <script> tag so it executes before React.\n */\nexport async function buildComponentHarness(\n filePath: string,\n componentName: string,\n props: Record<string, unknown>,\n viewportWidth: number,\n projectCss?: string,\n /** Optional pre-built wrapper IIFE script from a .scope.ts(x) file. */\n wrapperScript?: string,\n /** Padding (px) around the component for screenshot clipping. Applied as margin on #scope-root. */\n screenshotPadding = 0,\n): Promise<string> {\n const bundledScript = await bundleComponentToIIFE(filePath, componentName, props);\n return wrapInHtml(bundledScript, viewportWidth, projectCss, wrapperScript, screenshotPadding);\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 // If a scope file wrapper was injected, use it to wrap the component\n var Wrapper = (window).__SCOPE_WRAPPER__;\n var element = Wrapper\n ? createElement(Wrapper, null, createElement(Component, props))\n : createElement(Component, props);\n createRoot(rootEl).render(element);\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 // CSS imports (e.g. `import './styles.css'`) are handled at the page level via\n // globalCSS injection. Tell esbuild to treat CSS files as empty modules so\n // components that import CSS directly (e.g. App.tsx) don't error during bundling.\n loader: {\n \".css\": \"empty\",\n \".svg\": \"dataurl\",\n \".png\": \"dataurl\",\n \".jpg\": \"dataurl\",\n \".jpeg\": \"dataurl\",\n \".gif\": \"dataurl\",\n \".webp\": \"dataurl\",\n \".ttf\": \"dataurl\",\n \".woff\": \"dataurl\",\n \".woff2\": \"dataurl\",\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(\n bundledScript: string,\n viewportWidth: number,\n projectCss?: string,\n wrapperScript?: string,\n screenshotPadding = 0,\n): 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 const wrapperScriptBlock =\n wrapperScript != null && wrapperScript.length > 0\n ? `<script id=\"scope-wrapper-script\">${wrapperScript}</script>`\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 <script>\n // Reset globals that persist on window across page.setContent() calls\n // (document.open/write/close clears the DOM but NOT the JS global scope)\n window.__SCOPE_WRAPPER__ = null;\n window.__SCOPE_RENDER_COMPLETE__ = false;\n window.__SCOPE_RENDER_ERROR__ = null;\n </script>\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; margin: ${screenshotPadding}px; }\n </style>\n ${projectStyleBlock}\n</head>\n<body>\n <div id=\"scope-root\" data-reactscope-root></div>\n ${wrapperScriptBlock}\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 collection?: string;\n internal: boolean;\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\", \"COLLECTION\", \"INTERNAL\"];\n const tableRows = rows.map((r) => [\n r.name,\n r.file,\n r.complexityClass,\n String(r.hookCount),\n String(r.contextCount),\n r.collection ?? \"—\",\n r.internal ? \"yes\" : \"no\",\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 ` Collection: ${descriptor.collection ?? \"—\"}`,\n ` Internal: ${descriptor.internal}`,\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 collection?: string;\n internal: boolean;\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\", \"COLLECTION\", \"INTERNAL\"];\n const tableRows = rows.map((r) => [\n r.name,\n r.file,\n r.complexityClass,\n r.hooks,\n r.contexts,\n r.collection ?? \"—\",\n r.internal ? \"yes\" : \"no\",\n ]);\n\n return `Query: ${queryDesc}\\n\\n${buildTable(headers, tableRows)}`;\n}\n\nexport function formatQueryJson(rows: QueryRow[]): string {\n return JSON.stringify(rows, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// Glob matching\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal glob matcher supporting `*` (any chars except `/`) and `**` (any chars).\n * Only used for `--filter` on component names.\n */\nexport function matchGlob(pattern: string, value: string): boolean {\n // Escape regex special chars except *\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"§GLOBSTAR§\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/§GLOBSTAR§/g, \".*\");\n const regex = new RegExp(`^${regexStr}$`, \"i\");\n return regex.test(value);\n}\n","/**\n * @agent-scope/cli — render output formatters\n *\n * Formats RenderResult, MatrixResult, and batch render summaries in:\n * - JSON (full structured data)\n * - PNG (raw Buffer or file write)\n * - HTML (visual grid with embedded base64 images)\n * - CSV (flat table: component, axis values, render time, compliance %)\n *\n * Also provides:\n * - progress bar rendering for `scope render all`\n * - viewport string parsing (e.g. \"1280x720\")\n */\n\nimport type { MatrixCell, MatrixResult, RenderResult } from \"@agent-scope/render\";\n\n// ---------------------------------------------------------------------------\n// Re-export TTY helper (reused from manifest-formatter)\n// ---------------------------------------------------------------------------\n\nexport { isTTY } from \"./manifest-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Viewport parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a viewport string such as \"1280x720\" into `{ width, height }`.\n * Throws if the format is invalid or values are non-positive.\n */\nexport function parseViewport(spec: string): { width: number; height: number } {\n const lower = spec.toLowerCase();\n const match = /^(\\d+)[x×](\\d+)$/.exec(lower);\n if (!match) {\n throw new Error(`Invalid viewport \"${spec}\". Expected format: WIDTHxHEIGHT (e.g. 1280x720)`);\n }\n const width = parseInt(match[1] ?? \"0\", 10);\n const height = parseInt(match[2] ?? \"0\", 10);\n if (width <= 0 || height <= 0) {\n throw new Error(`Viewport dimensions must be positive integers, got: ${spec}`);\n }\n return { width, height };\n}\n\n// ---------------------------------------------------------------------------\n// Single render JSON\n// ---------------------------------------------------------------------------\n\nexport interface RenderJsonOutput {\n component: string;\n props: Record<string, unknown>;\n width: number;\n height: number;\n renderTimeMs: number;\n computedStyles: Record<string, Record<string, string>>;\n screenshot?: string; // base64-encoded PNG\n dom?: RenderResult[\"dom\"];\n console?: RenderResult[\"console\"];\n accessibility?: RenderResult[\"accessibility\"];\n}\n\n/**\n * Format a single `RenderResult` as a structured JSON-serialisable object.\n * The screenshot is base64-encoded for portability.\n */\nexport function formatRenderJson(\n componentName: string,\n props: Record<string, unknown>,\n result: RenderResult,\n): RenderJsonOutput {\n return {\n component: componentName,\n props,\n width: result.width,\n height: result.height,\n renderTimeMs: result.renderTimeMs,\n computedStyles: result.computedStyles,\n screenshot: result.screenshot.toString(\"base64\"),\n dom: result.dom,\n console: result.console,\n accessibility: result.accessibility,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix JSON\n// ---------------------------------------------------------------------------\n\nexport interface MatrixJsonOutput {\n axes: Array<{ name: string; values: string[] }>;\n stats: {\n totalCells: number;\n totalRenderTimeMs: number;\n avgRenderTimeMs: number;\n minRenderTimeMs: number;\n maxRenderTimeMs: number;\n wallClockTimeMs: number;\n };\n cells: Array<{\n index: number;\n axisIndices: number[];\n props: Record<string, unknown>;\n renderTimeMs: number;\n width: number;\n height: number;\n screenshot: string; // base64\n }>;\n}\n\n/**\n * Format a `MatrixResult` as a structured JSON-serialisable object.\n */\nexport function formatMatrixJson(result: MatrixResult): MatrixJsonOutput {\n return {\n axes: result.axes.map((axis) => ({\n name: axis.name,\n values: axis.values.map((v) => String(v)),\n })),\n stats: { ...result.stats },\n cells: result.cells.map((cell: MatrixCell) => ({\n index: cell.index,\n axisIndices: cell.axisIndices,\n props: cell.props,\n renderTimeMs: cell.result.renderTimeMs,\n width: cell.result.width,\n height: cell.result.height,\n screenshot: cell.result.screenshot.toString(\"base64\"),\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix HTML\n// ---------------------------------------------------------------------------\n\n/**\n * Format a `MatrixResult` as an HTML visual grid with embedded images.\n *\n * Each cell is rendered as an `<img>` tag with the screenshot embedded\n * as a data URI, with prop labels displayed beneath each cell.\n */\nexport function formatMatrixHtml(componentName: string, result: MatrixResult): string {\n const cellsHtml = result.cells\n .map((cell: MatrixCell) => {\n const b64 = cell.result.screenshot.toString(\"base64\");\n const propLabel = escapeHtml(\n Object.entries(cell.props)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(\", \"),\n );\n return ` <div class=\"cell\">\n <img src=\"data:image/png;base64,${b64}\" alt=\"${propLabel}\" width=\"${cell.result.width}\" height=\"${cell.result.height}\" />\n <div class=\"label\">${propLabel}</div>\n <div class=\"meta\">${cell.result.renderTimeMs.toFixed(1)}ms</div>\n </div>`;\n })\n .join(\"\\n\");\n\n const axesDesc = result.axes\n .map((a) => `${a.name}: ${a.values.map((v) => String(v)).join(\", \")}`)\n .join(\" | \");\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${escapeHtml(componentName)} — Render Matrix</title>\n <style>\n body { font-family: system-ui, sans-serif; background: #f8fafc; margin: 0; padding: 24px; }\n h1 { font-size: 1.25rem; color: #1e293b; margin-bottom: 8px; }\n .axes { font-size: 0.8rem; color: #64748b; margin-bottom: 20px; }\n .grid { display: flex; flex-wrap: wrap; gap: 16px; }\n .cell { background: #fff; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; }\n .cell img { display: block; }\n .label { padding: 6px 8px; font-size: 0.75rem; color: #374151; border-top: 1px solid #f1f5f9; }\n .meta { padding: 2px 8px 6px; font-size: 0.7rem; color: #94a3b8; }\n .stats { margin-top: 24px; font-size: 0.8rem; color: #64748b; }\n </style>\n</head>\n<body>\n <h1>${escapeHtml(componentName)} — Render Matrix</h1>\n <div class=\"axes\">Axes: ${escapeHtml(axesDesc)}</div>\n <div class=\"grid\">\n${cellsHtml}\n </div>\n <div class=\"stats\">\n ${result.stats.totalCells} cells ·\n avg ${result.stats.avgRenderTimeMs.toFixed(1)}ms ·\n min ${result.stats.minRenderTimeMs.toFixed(1)}ms ·\n max ${result.stats.maxRenderTimeMs.toFixed(1)}ms ·\n wall ${result.stats.wallClockTimeMs.toFixed(0)}ms\n </div>\n</body>\n</html>\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Matrix CSV\n// ---------------------------------------------------------------------------\n\n/**\n * Format a `MatrixResult` as a flat CSV table.\n *\n * Columns: component, [axis name columns...], renderTimeMs\n */\nexport function formatMatrixCsv(componentName: string, result: MatrixResult): string {\n const axisNames = result.axes.map((a) => a.name);\n const headers = [\"component\", ...axisNames, \"renderTimeMs\", \"width\", \"height\"];\n\n const rows = result.cells.map((cell: MatrixCell) => {\n const axisVals = result.axes.map((_, i) => {\n const axisIdx = cell.axisIndices[i];\n const axis = result.axes[i];\n if (axisIdx === undefined || axis === undefined) return \"\";\n const val = axis.values[axisIdx];\n return val !== undefined ? csvEscape(String(val)) : \"\";\n });\n return [\n csvEscape(componentName),\n ...axisVals,\n cell.result.renderTimeMs.toFixed(3),\n String(cell.result.width),\n String(cell.result.height),\n ].join(\",\");\n });\n\n return `${[headers.join(\",\"), ...rows].join(\"\\n\")}\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Progress bar\n// ---------------------------------------------------------------------------\n\n/**\n * Render an ASCII progress bar suitable for terminal output.\n *\n * Output format:\n * Rendering 42/128 components... [=====> ] 33%\n */\nexport function renderProgressBar(\n completed: number,\n total: number,\n currentName: string,\n pct: number,\n barWidth = 20,\n): string {\n const filled = Math.round((pct / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = \"=\".repeat(Math.max(0, filled - 1)) + (filled > 0 ? \">\" : \"\") + \" \".repeat(empty);\n const nameSlice = currentName.slice(0, 25).padEnd(25);\n return `Rendering ${completed}/${total} ${nameSlice} [${bar}] ${pct}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Batch summary\n// ---------------------------------------------------------------------------\n\nexport interface BatchRenderSummaryItem {\n name: string;\n renderTimeMs: number;\n success: boolean;\n errorMessage?: string;\n}\n\n/**\n * Format a human-readable summary of a `scope render all` run.\n */\nexport function formatSummaryText(results: BatchRenderSummaryItem[], outputDir: string): string {\n const total = results.length;\n const passed = results.filter((r) => r.success).length;\n const failed = total - passed;\n const successTimes = results.filter((r) => r.success).map((r) => r.renderTimeMs);\n const avgMs =\n successTimes.length > 0 ? successTimes.reduce((a, b) => a + b, 0) / successTimes.length : 0;\n\n const lines: string[] = [\n \"─\".repeat(60),\n `Render Summary`,\n \"─\".repeat(60),\n ` Total components : ${total}`,\n ` Passed : ${passed}`,\n ` Failed : ${failed}`,\n ` Avg render time : ${avgMs.toFixed(1)}ms`,\n ` Output dir : ${outputDir}`,\n ];\n\n if (failed > 0) {\n lines.push(\"\", \" Failed components:\");\n for (const r of results) {\n if (!r.success) {\n lines.push(` ✗ ${r.name}: ${r.errorMessage ?? \"unknown error\"}`);\n }\n }\n }\n\n lines.push(\"─\".repeat(60));\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction csvEscape(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n","/**\n * tailwind-css.ts\n *\n * Resolves and compiles Tailwind v4 project CSS for use in the render harness.\n * Assumes the CLI is run from a Tailwind v4 project root (e.g. design system).\n *\n * Flow:\n * 1. Find the project's styles entry (config or conventional paths).\n * 2. Compile it with tailwindcss's compile() and loadStylesheet for @import \"tailwindcss\".\n * 3. Call compiler.build(classes) with the list of class names used in the rendered DOM\n * so only those utilities are included.\n *\n * Caching: compiler is created once per cwd and reused; build(classes) is called per render.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { resolve } from \"node:path\";\n\nconst CONFIG_FILENAMES = [\n \".reactscope/config.json\",\n \".reactscope/config.js\",\n \".reactscope/config.mjs\",\n];\nconst STYLE_ENTRY_CANDIDATES = [\n \"src/index.css\",\n \"src/globals.css\",\n \"app/globals.css\",\n \"app/index.css\",\n \"styles/index.css\",\n \"index.css\",\n];\n\nconst TAILWIND_IMPORT = /@import\\s+[\"']tailwindcss[\"']\\s*;?/;\n\nexport function getElementClassNames(el: Element): string[] {\n const className = el.className;\n const raw =\n typeof className === \"string\"\n ? className\n : typeof (className as SVGAnimatedString | undefined)?.baseVal === \"string\"\n ? (className as SVGAnimatedString).baseVal\n : (el.getAttribute(\"class\") ?? \"\");\n return raw.split(/\\s+/).filter(Boolean);\n}\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// Tailwind v3 / PostCSS compilation (globalCSS files)\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a CSS file using the project's local PostCSS + Tailwind v3 setup.\n * Falls back to reading the file as raw CSS if PostCSS/Tailwind are unavailable.\n *\n * This handles `components.wrappers.globalCSS` entries from reactscope.config.json.\n */\nexport async function compileGlobalCssFile(\n cssFilePath: string,\n cwd: string,\n): Promise<string | null> {\n const { existsSync, readFileSync } = await import(\"node:fs\");\n const { createRequire } = await import(\"node:module\");\n\n if (!existsSync(cssFilePath)) return null;\n\n const raw = readFileSync(cssFilePath, \"utf-8\");\n\n // If the file has @tailwind directives it needs PostCSS compilation\n const needsCompile = /@tailwind|@import\\s+['\"]tailwindcss/.test(raw);\n if (!needsCompile) {\n // Plain CSS — return as-is\n return raw;\n }\n\n try {\n const require = createRequire(resolve(cwd, \"package.json\"));\n\n // Try Tailwind v3 PostCSS path first\n let postcss: (plugins: unknown[]) => {\n process: (css: string, opts: unknown) => Promise<{ css: string }>;\n };\n let twPlugin: unknown;\n\n try {\n postcss = require(\"postcss\") as typeof postcss;\n twPlugin = require(\"tailwindcss\") as unknown;\n } catch {\n // PostCSS or tailwindcss not available — return raw\n return raw;\n }\n\n let autoprefixerPlugin: unknown;\n try {\n autoprefixerPlugin = require(\"autoprefixer\") as unknown;\n } catch {\n autoprefixerPlugin = null;\n }\n\n const plugins = autoprefixerPlugin ? [twPlugin, autoprefixerPlugin] : [twPlugin];\n const result = await postcss(plugins).process(raw, {\n from: cssFilePath,\n to: cssFilePath,\n });\n return result.css;\n } catch (err) {\n // Compilation failed — log and return raw so render still proceeds\n process.stderr.write(\n `[scope/render] Warning: CSS compilation failed for ${cssFilePath}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return raw;\n }\n}\n\n/**\n * Load and compile all globalCSS files listed in the reactscope config,\n * returning a single concatenated CSS string (or null if none).\n */\nexport async function loadGlobalCss(globalCssFiles: string[], cwd: string): Promise<string | null> {\n if (globalCssFiles.length === 0) return null;\n const parts: string[] = [];\n for (const relPath of globalCssFiles) {\n const absPath = resolve(cwd, relPath);\n const css = await compileGlobalCssFile(absPath, cwd);\n if (css !== null && css.trim().length > 0) {\n parts.push(css);\n }\n }\n return parts.length > 0 ? parts.join(\"\\n\") : null;\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 * doctor-commands.ts\n *\n * `scope doctor` — health check that validates the current project's Scope\n * setup and reports issues with config, tokens, globalCSS, and manifest staleness.\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n detectPackageManager,\n getMissingHarnessDependencies,\n getPlaywrightBrowserStatus,\n hasLikelyInstalledDependencies,\n} from \"./diagnostics.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface DoctorCheck {\n name: string;\n status: \"ok\" | \"warn\" | \"error\";\n message: string;\n remediationCode?: string;\n fixCommand?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n/** Recursively collect .ts/.tsx/.js/.jsx files under a directory. */\nfunction collectSourceFiles(dir: string): string[] {\n if (!existsSync(dir)) return [];\n const results: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name);\n if (entry.isDirectory() && entry.name !== \"node_modules\" && entry.name !== \".reactscope\") {\n results.push(...collectSourceFiles(full));\n } else if (entry.isFile() && /\\.(tsx?|jsx?)$/.test(entry.name)) {\n results.push(full);\n }\n }\n return results;\n}\n\nconst TAILWIND_CONFIG_FILES = [\n \"tailwind.config.js\",\n \"tailwind.config.cjs\",\n \"tailwind.config.mjs\",\n \"tailwind.config.ts\",\n \"postcss.config.js\",\n \"postcss.config.cjs\",\n \"postcss.config.mjs\",\n \"postcss.config.ts\",\n];\n\nfunction hasTailwindSetup(cwd: string): boolean {\n if (TAILWIND_CONFIG_FILES.some((file) => existsSync(resolve(cwd, file)))) {\n return true;\n }\n\n const packageJsonPath = resolve(cwd, \"package.json\");\n if (!existsSync(packageJsonPath)) return false;\n\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n };\n return [pkg.dependencies, pkg.devDependencies].some(\n (deps) =>\n deps &&\n Object.keys(deps).some(\n (name) => name === \"tailwindcss\" || name.startsWith(\"@tailwindcss/\"),\n ),\n );\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Individual checks\n// ---------------------------------------------------------------------------\nfunction getPlaywrightInstallCommand(effectiveBrowserPath: string | null): string {\n return effectiveBrowserPath === null\n ? \"bunx playwright install chromium\"\n : `PLAYWRIGHT_BROWSERS_PATH=${effectiveBrowserPath} bunx playwright install chromium`;\n}\n\nfunction checkConfig(cwd: string): DoctorCheck {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) {\n return {\n name: \"config\",\n status: \"error\",\n message: \"reactscope.config.json not found — run `scope init` in the target project root\",\n };\n }\n try {\n JSON.parse(readFileSync(configPath, \"utf-8\"));\n return { name: \"config\", status: \"ok\", message: \"reactscope.config.json valid\" };\n } catch {\n return { name: \"config\", status: \"error\", message: \"reactscope.config.json is not valid JSON\" };\n }\n}\n\nfunction checkTokens(cwd: string): DoctorCheck {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n let tokensPath = resolve(cwd, \"reactscope.tokens.json\");\n if (existsSync(configPath)) {\n try {\n const cfg = JSON.parse(readFileSync(configPath, \"utf-8\")) as { tokens?: { file?: string } };\n if (cfg.tokens?.file) tokensPath = resolve(cwd, cfg.tokens.file);\n } catch {\n /* use default */\n }\n }\n if (!existsSync(tokensPath)) {\n return {\n name: \"tokens\",\n status: \"warn\",\n message: `Token file not found at ${tokensPath} — run \\`scope init\\``,\n };\n }\n try {\n const raw = JSON.parse(readFileSync(tokensPath, \"utf-8\")) as { version?: unknown };\n if (!raw.version) {\n return { name: \"tokens\", status: \"warn\", message: \"Token file is missing a `version` field\" };\n }\n return { name: \"tokens\", status: \"ok\", message: \"Token file valid\" };\n } catch {\n return { name: \"tokens\", status: \"error\", message: \"Token file is not valid JSON\" };\n }\n}\n\nfunction checkGlobalCss(cwd: string): DoctorCheck {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n let globalCss: string[] = [];\n if (existsSync(configPath)) {\n try {\n const cfg = JSON.parse(readFileSync(configPath, \"utf-8\")) as {\n components?: { wrappers?: { globalCSS?: string[] } };\n };\n globalCss = cfg.components?.wrappers?.globalCSS ?? [];\n } catch {\n /* empty */\n }\n }\n if (globalCss.length === 0) {\n if (!hasTailwindSetup(cwd)) {\n return {\n name: \"globalCSS\",\n status: \"ok\",\n message: \"No globalCSS configured — skipping CSS injection for this non-Tailwind project\",\n };\n }\n\n return {\n name: \"globalCSS\",\n status: \"warn\",\n message:\n \"No globalCSS configured — Tailwind styles won't apply to renders. \" +\n \"Add `components.wrappers.globalCSS` to reactscope.config.json\",\n };\n }\n const missing = globalCss.filter((f) => !existsSync(resolve(cwd, f)));\n if (missing.length > 0) {\n return {\n name: \"globalCSS\",\n status: \"error\",\n message: `globalCSS file(s) not found: ${missing.join(\", \")}`,\n };\n }\n return {\n name: \"globalCSS\",\n status: \"ok\",\n message: `${globalCss.length} globalCSS file(s) present`,\n };\n}\n\nfunction checkManifest(cwd: string): DoctorCheck {\n const manifestPath = resolve(cwd, \".reactscope\", \"manifest.json\");\n if (!existsSync(manifestPath)) {\n return {\n name: \"manifest\",\n status: \"warn\",\n message: \"Manifest not found — run `scope manifest generate` in the target project root\",\n };\n }\n\n const manifestMtime = statSync(manifestPath).mtimeMs;\n const sourceDir = resolve(cwd, \"src\");\n const sourceFiles = collectSourceFiles(sourceDir);\n const stale = sourceFiles.filter((f) => statSync(f).mtimeMs > manifestMtime);\n\n if (stale.length > 0) {\n return {\n name: \"manifest\",\n status: \"warn\",\n message: `Manifest may be stale — ${stale.length} source file(s) modified since last generate. Run \\`scope manifest generate\\``,\n };\n }\n return { name: \"manifest\", status: \"ok\", message: \"Manifest present and up to date\" };\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nconst ICONS = { ok: \"✓\", warn: \"!\", error: \"✗\" } as const;\n\nfunction checkDependencies(cwd: string): DoctorCheck {\n const packageManager = detectPackageManager(cwd);\n\n if (!hasLikelyInstalledDependencies(cwd)) {\n return {\n name: \"dependencies\",\n status: \"error\",\n remediationCode: \"TARGET_PROJECT_DEPENDENCIES_MISSING\",\n fixCommand: `${packageManager} install`,\n message: `node_modules not found — run \\`${packageManager} install\\` in ${cwd} before render/site/instrument`,\n };\n }\n\n const missingHarnessDependencies = getMissingHarnessDependencies(cwd);\n if (missingHarnessDependencies.length > 0) {\n return {\n name: \"dependencies\",\n status: \"error\",\n remediationCode: \"TARGET_PROJECT_HARNESS_DEPENDENCIES_MISSING\",\n fixCommand: `${packageManager} install`,\n message:\n `Missing React harness dependencies: ${missingHarnessDependencies.join(\", \")}. ` +\n `Run \\`${packageManager} install\\` in ${cwd}, then retry render/site/instrument.`,\n };\n }\n\n return {\n name: \"dependencies\",\n status: \"ok\",\n message: \"node_modules and React harness dependencies present\",\n };\n}\n\nasync function checkPlaywright(cwd: string): Promise<DoctorCheck> {\n const status = await getPlaywrightBrowserStatus(cwd);\n const pathDetails =\n status.effectiveBrowserPath === null\n ? \"PLAYWRIGHT_BROWSERS_PATH is unset\"\n : `PLAYWRIGHT_BROWSERS_PATH=${status.effectiveBrowserPath}; exists=${status.browserPathExists}; writable=${status.browserPathWritable}`;\n\n if (status.available) {\n return {\n name: \"playwright\",\n status: \"ok\",\n message: `Playwright package available (${pathDetails})`,\n };\n }\n\n return {\n name: \"playwright\",\n status: \"error\",\n remediationCode: \"PLAYWRIGHT_BROWSERS_MISSING\",\n fixCommand: getPlaywrightInstallCommand(status.effectiveBrowserPath),\n message: `Playwright Chromium unavailable (${pathDetails}) — ${status.remediation}`,\n };\n}\n\nfunction collectFixCommands(checks: DoctorCheck[]): string[] {\n return checks\n .filter((check) => check.status === \"error\" && check.fixCommand !== undefined)\n .map((check) => check.fixCommand as string)\n .filter((command, index, commands) => commands.indexOf(command) === index);\n}\n\nfunction formatCheck(check: DoctorCheck): string {\n return ` [${ICONS[check.status]}] ${check.name.padEnd(12)} ${check.message}`;\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport function createDoctorCommand(): Command {\n return new Command(\"doctor\")\n .description(\n \"Verify your Scope project setup before running other commands.\\n\\n\" +\n \"CHECKS PERFORMED:\\n\" +\n \" config reactscope.config.json exists and is valid JSON\\n\" +\n \" tokens reactscope.tokens.json exists and passes validation\\n\" +\n \" css globalCSS files referenced in config actually exist\\n\" +\n \" manifest .reactscope/manifest.json exists and is not stale\\n\" +\n \" dependencies node_modules exists in the target project root\\n\" +\n \" playwright Playwright browser runtime is available\\n\" +\n \" (stale = source files modified after last generate)\\n\\n\" +\n \"STATUS LEVELS: ok | warn | error\\n\\n\" +\n \"Run this first whenever renders fail or produce unexpected output.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope doctor\\n\" +\n \" scope doctor --json\\n\" +\n \" scope doctor --print-fix-commands\\n\" +\n \" scope doctor --json | jq '.checks[] | select(.status == \\\"error\\\")'\",\n )\n .option(\"--json\", \"Emit structured JSON output\", false)\n .option(\n \"--print-fix-commands\",\n \"Print deduplicated shell remediation commands for failing checks\",\n false,\n )\n .action(async (opts: { json: boolean; printFixCommands: boolean }) => {\n const cwd = process.cwd();\n const checks: DoctorCheck[] = [\n checkConfig(cwd),\n checkTokens(cwd),\n checkGlobalCss(cwd),\n checkManifest(cwd),\n checkDependencies(cwd),\n await checkPlaywright(cwd),\n ];\n\n const errors = checks.filter((c) => c.status === \"error\").length;\n const warnings = checks.filter((c) => c.status === \"warn\").length;\n\n const fixCommands = collectFixCommands(checks);\n\n if (opts.printFixCommands) {\n process.stdout.write(`${JSON.stringify({ cwd, fixCommands }, null, 2)}\\n`);\n if (errors > 0) process.exit(1);\n return;\n }\n\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ passed: checks.length - errors - warnings, warnings, errors, fixCommands, checks }, null, 2)}\\n`,\n );\n if (errors > 0) process.exit(1);\n return;\n }\n\n process.stdout.write(\"\\nScope Doctor\\n\");\n process.stdout.write(\"────────────────────────────────────────\\n\");\n for (const check of checks) process.stdout.write(`${formatCheck(check)}\\n`);\n process.stdout.write(\"────────────────────────────────────────\\n\");\n\n if (errors > 0) {\n process.stdout.write(` ${errors} error(s), ${warnings} warning(s)\\n\\n`);\n process.exit(1);\n } else if (warnings > 0) {\n process.stdout.write(` ${warnings} warning(s) — everything works but could be better\\n\\n`);\n } else {\n process.stdout.write(\" All checks passed!\\n\\n\");\n }\n });\n}\n","import { constants, existsSync, readFileSync } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface ScopeDiagnostic {\n code: string;\n message: string;\n recovery: string;\n}\n\nexport interface PlaywrightBrowserStatus {\n effectiveBrowserPath: string | null;\n executablePath: string | null;\n available: boolean;\n browserPathWritable: boolean | null;\n browserPathExists: boolean | null;\n remediation: string;\n}\n\nconst PLAYWRIGHT_BROWSER_HINTS = [\n \"executable doesn't exist\",\n \"browserType.launch\",\n \"looks like playwright was just installed or updated\",\n \"please run the following command to download new browsers\",\n \"could not find chromium\",\n];\n\nconst MISSING_DEPENDENCY_HINTS = [\"could not resolve\", \"cannot find module\", \"module not found\"];\n\nconst REQUIRED_HARNESS_DEPENDENCIES = [\"react\", \"react-dom\", \"react/jsx-runtime\"] as const;\n\nexport function getEffectivePlaywrightBrowsersPath(): string | null {\n const value = process.env.PLAYWRIGHT_BROWSERS_PATH;\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function getPlaywrightBrowserRemediation(\n status?: Pick<\n PlaywrightBrowserStatus,\n \"effectiveBrowserPath\" | \"browserPathWritable\" | \"browserPathExists\"\n >,\n): string {\n const effectivePath = status?.effectiveBrowserPath ?? getEffectivePlaywrightBrowsersPath();\n if (effectivePath !== null) {\n const pathProblem =\n status?.browserPathExists === false\n ? \"missing\"\n : status?.browserPathWritable === false\n ? \"unwritable\"\n : \"unavailable\";\n return `PLAYWRIGHT_BROWSERS_PATH is set to ${effectivePath}, but that browser cache is ${pathProblem}. Unset PLAYWRIGHT_BROWSERS_PATH and run \\`bunx playwright install chromium\\`, or install and run with the same writable path: \\`PLAYWRIGHT_BROWSERS_PATH=${effectivePath} bunx playwright install chromium\\`.`;\n }\n return \"Run `bunx playwright install chromium` in this sandbox, then retry the Scope command.\";\n}\n\nexport function diagnoseScopeError(error: unknown, cwd = process.cwd()): ScopeDiagnostic | null {\n const message = error instanceof Error ? error.message : String(error);\n const normalized = message.toLowerCase();\n\n if (PLAYWRIGHT_BROWSER_HINTS.some((hint) => normalized.includes(hint))) {\n const browserPath = extractPlaywrightBrowserPath(message);\n const browserPathHint =\n browserPath === null ? \"\" : ` Scope tried to launch Chromium from ${browserPath}.`;\n\n return {\n code: \"PLAYWRIGHT_BROWSERS_MISSING\",\n message: \"Playwright Chromium is unavailable for Scope browser rendering.\",\n recovery:\n getPlaywrightBrowserRemediation() +\n browserPathHint +\n \" Use `scope doctor --json` to verify the browser check passes before rerunning render/site/instrument.\",\n };\n }\n\n if (MISSING_DEPENDENCY_HINTS.some((hint) => normalized.includes(hint))) {\n const packageManager = detectPackageManager(cwd);\n return {\n code: \"TARGET_PROJECT_DEPENDENCIES_MISSING\",\n message: \"The target project's dependencies appear to be missing or incomplete.\",\n recovery: `Run \\`${packageManager} install\\` in ${cwd}, then rerun \\`scope doctor\\` and retry the Scope command.`,\n };\n }\n\n return null;\n}\n\nexport function formatScopeDiagnostic(error: unknown, cwd = process.cwd()): string {\n const message = error instanceof Error ? error.message : String(error);\n const diagnostic = diagnoseScopeError(error, cwd);\n if (diagnostic === null) return `Error: ${message}`;\n return `Error [${diagnostic.code}]: ${diagnostic.message}\\nRecovery: ${diagnostic.recovery}\\nCause: ${message}`;\n}\n\nexport async function getPlaywrightBrowserStatus(\n cwd = process.cwd(),\n): Promise<PlaywrightBrowserStatus> {\n const effectiveBrowserPath = getEffectivePlaywrightBrowsersPath();\n const executablePath = getPlaywrightChromiumExecutablePath(cwd);\n const available = executablePath !== null && existsSync(executablePath);\n const browserPathExists = effectiveBrowserPath === null ? null : existsSync(effectiveBrowserPath);\n const browserPathWritable =\n effectiveBrowserPath === null ? null : await isWritableBrowserPath(effectiveBrowserPath);\n\n return {\n effectiveBrowserPath,\n executablePath,\n available,\n browserPathExists,\n browserPathWritable,\n remediation: getPlaywrightBrowserRemediation({\n effectiveBrowserPath,\n browserPathExists,\n browserPathWritable,\n }),\n };\n}\n\nexport function hasPlaywrightChromium(cwd = process.cwd()): boolean {\n const executablePath = getPlaywrightChromiumExecutablePath(cwd);\n return executablePath !== null && existsSync(executablePath);\n}\n\nfunction getPlaywrightChromiumExecutablePath(cwd = process.cwd()): string | null {\n try {\n const packageJsonPath = require.resolve(\"playwright/package.json\", { paths: [cwd] });\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as { version?: string };\n if (!packageJson.version) return null;\n\n const playwrightPath = require.resolve(\"playwright\", { paths: [cwd] });\n const { chromium } = require(playwrightPath) as {\n chromium?: { executablePath?: () => string };\n };\n const executablePath = chromium?.executablePath?.();\n if (typeof executablePath !== \"string\" || executablePath.length === 0) return null;\n\n return executablePath;\n } catch {\n return null;\n }\n}\n\nasync function isWritableBrowserPath(browserPath: string): Promise<boolean> {\n const candidate = existsSync(browserPath) ? browserPath : dirname(browserPath);\n try {\n await access(candidate, constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\nexport function detectPackageManager(cwd = process.cwd()): \"bun\" | \"pnpm\" | \"yarn\" | \"npm\" {\n if (existsSync(join(cwd, \"bun.lock\")) || existsSync(join(cwd, \"bun.lockb\"))) return \"bun\";\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\nexport function hasLikelyInstalledDependencies(cwd = process.cwd()): boolean {\n return existsSync(join(cwd, \"node_modules\"));\n}\n\nexport function getMissingHarnessDependencies(cwd = process.cwd()): string[] {\n return REQUIRED_HARNESS_DEPENDENCIES.filter((dependencyName) => {\n try {\n require.resolve(dependencyName, { paths: [cwd] });\n return false;\n } catch {\n return true;\n }\n });\n}\n\nfunction extractPlaywrightBrowserPath(message: string): string | null {\n const match = message.match(/Executable doesn't exist at\\s+([^\\n]+)/i);\n return match?.[1]?.trim() ?? null;\n}\n","/**\n * get-skill-command.ts\n *\n * `scope get-skill` — print the Scope SKILL.md to stdout so an agent can\n * load it directly into its context without knowing the file path.\n *\n * The skill content is embedded at build time by scripts/generate-skill-content.mjs\n * so this works correctly in any install context (global npm, local node_modules, etc.)\n *\n * Usage:\n * scope get-skill # print raw markdown to stdout\n * scope get-skill --json # wrap in JSON { \"skill\": \"<content>\" }\n */\n\nimport { Command } from \"commander\";\nimport { SKILL_CONTENT } from \"./skill-content.js\";\n\nexport function createGetSkillCommand(): Command {\n return new Command(\"get-skill\")\n .description(\n \"Print the embedded Scope SKILL.md to stdout.\\n\\n\" +\n \"Agents: load this first, then follow the canonical workflow in the skill:\\n\" +\n \" init --yes → doctor --json → manifest --format json → render all --format json → site build\\n\" +\n \"The skill documents .scope.tsx discovery/exports, config paths, profiler usage,\\n\" +\n \"and failure recovery.\\n\\n\" +\n \"EMBEDDED AT BUILD TIME — works in any install context (global npm, npx, local).\\n\\n\" +\n \"Examples:\\n\" +\n \" scope get-skill # raw markdown to stdout\\n\" +\n ' scope get-skill --json # { \"skill\": \"...\" } for structured ingestion\\n' +\n \" scope get-skill | head -50 # preview the skill\\n\" +\n \" scope get-skill > /tmp/SKILL.md # save locally\",\n )\n .option(\"--json\", \"Wrap output in JSON { skill: string } instead of raw markdown\")\n .action((opts: { json?: boolean }) => {\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ skill: SKILL_CONTENT }, null, 2)}\n`);\n } else {\n process.stdout.write(SKILL_CONTENT);\n }\n });\n}\n","// AUTO-GENERATED by scripts/generate-skill-content.mjs — do not edit manually\n// Re-run `bun run prebuild` or `bun run build` to regenerate.\nexport const SKILL_CONTENT =\n '# Scope — Agent Skill\\n\\n## TLDR\\nScope is a React codebase introspection toolkit. Use it to answer questions about component structure, props, context dependencies, side effects, and visual output — without running the app.\\n\\n**When to reach for it:** Any task requiring \"which components use X\", \"what props does Y accept\", \"render Z for visual verification\", \"does this component depend on a provider\", or \"what design tokens are in use\".\\n\\n**Canonical agent workflow:**\\n```\\nscope get-skill > /tmp/scope-skill.md # bootstrap command semantics into agent context\\nscope init --yes # scaffold config + auto-generate manifest\\nscope doctor --json # validate config, tokens, globalCSS, manifest freshness, deps, Playwright\\nscope manifest query --context ThemeContext --format json\\nscope render all --format json --output-dir .reactscope/renders\\nscope site build --output .reactscope/site\\n```\\n\\n---\\n\\n---\\n\\n## Mental Model\\n\\nUnderstanding how Scope\\'s data flows is the key to using it effectively as an agent.\\n\\n```\\nSource TypeScript files\\n ↓ (ts-morph AST parse)\\n manifest.json ← structural facts: props, hooks, contexts, complexity\\n ↓ (esbuild + Playwright)\\n renders/*.json ← visual facts: screenshot, computedStyles, dom, a11y\\n ↓ (token engine)\\n compliance-styles.json ← audit facts: which CSS values match tokens, which don\\'t\\n ↓ (site generator)\\n site/ ← human-readable docs combining all of the above\\n```\\n\\nEach layer depends on the previous. If you\\'re getting unexpected results, check whether the earlier layers are stale (run `scope doctor` to diagnose).\\n\\n---\\n\\n## The Four Subsystems\\n\\n### 1. Manifest (`scope manifest *`)\\nThe manifest is a static analysis snapshot of your TypeScript source. It tells you:\\n- What components exist, where they live, and how they\\'re exported\\n- What props each component accepts (types, defaults, required/optional)\\n- What React hooks they call (`detectedHooks`)\\n- What contexts they consume (`requiredContexts`) — must be provided for a render to succeed\\n- Whether they compose other components (`composes` / `composedBy`)\\n- Their **complexity class** — `\"simple\"` or `\"complex\"` — which determines the render engine\\n\\nThe manifest never runs your code. It only reads TypeScript. This means it\\'s fast and safe, but it can\\'t know about runtime values.\\n\\n### 2. Render Engine (`scope render *`)\\nThe render engine compiles components with esbuild and renders them in Chromium (Playwright). Two paths exist:\\n\\n| Path | When | Speed | Capability |\\n|------|------|-------|------------|\\n| **Satori** | `complexityClass: \"simple\"` | ~8ms | Flexbox only, no JS, no CSS-in-JS |\\n| **BrowserPool** | `complexityClass: \"complex\"` | ~200–800ms | Full DOM, CSS, Tailwind, animations |\\n\\nMost real-world components route through BrowserPool. Scope defaults to `\"complex\"` when uncertain (safe fallback).\\n\\nEach render produces:\\n- `screenshot` — retina-quality PNG (2× `deviceScaleFactor`; display at CSS px dimensions)\\n- `width` / `height` — CSS pixel dimensions of the component root\\n- `computedStyles` — per-node computed CSS keyed by `#node-0`, `#node-1`, etc.\\n- `dom` — full DOM tree with bounding boxes (BrowserPool only)\\n- `accessibility` — role, aria-name, violation list (BrowserPool only)\\n- `renderTimeMs` — wall-clock render duration\\n\\n### 3. Scope Files (`.scope.tsx` / `.scope.ts`)\\nScope files define **named rendering scenarios** and optional provider wrappers next to a component. They are the primary way to ensure `render all` produces meaningful screenshots.\\n\\nDiscovery is deterministic: for `Button.tsx`, Scope checks `Button.scope.tsx`, then `.scope.ts`, `.scope.jsx`, `.scope.js` in the same directory and uses the first file that exists.\\n\\n```tsx\\n// Button.scope.tsx\\nexport const scenarios = {\\n default: { variant: \\'primary\\', children: \\'Click me\\' },\\n ghost: { variant: \\'ghost\\', children: \\'Cancel\\' },\\n danger: { variant: \\'danger\\', children: \\'Delete\\' },\\n disabled: { variant: \\'primary\\', children: \\'Disabled\\', disabled: true },\\n} satisfies Record<string, Record<string, unknown>>;\\n```\\n\\nOptional wrapper:\\n\\n```tsx\\nimport type { ReactNode } from \\'react\\';\\nimport { ThemeProvider } from \\'../providers/ThemeProvider\\';\\n\\nexport function wrapper({ children }: { children: ReactNode }) {\\n return <ThemeProvider theme=\"dark\">{children}</ThemeProvider>;\\n}\\n```\\n\\nContract:\\n- Export `scenarios` as a plain object of scenario-name → props-object, either as a named export or under `default.scenarios`\\n- Export `wrapper` as a function, either as a named export or under `default.wrapper`\\n- Non-object scenario values are skipped with a warning\\n- If no scope file or no valid scenarios exist, Scope falls back to one bare render and inferred required-prop defaults\\n- If 2+ scenarios exist, `render all` automatically runs a matrix and merges cells into each component JSON\\n\\nWhen a component renders blank with `{}` props, **the fix is usually to create a `.scope.tsx` file** with real props.\\n\\n### 4. Token Compliance\\nThe compliance pipeline:\\n1. `scope render all` captures `computedStyles` for every element in every component\\n2. These are written to `.reactscope/compliance-styles.json`\\n3. The token engine compares each computed CSS value against your `reactscope.tokens.json`\\n4. `scope tokens compliance` reports the aggregate on-system percentage\\n5. `scope ci` fails if the percentage is below `complianceThreshold` (default 90%)\\n\\n**On-system** means the value exactly matches a resolved token value. Off-system means it\\'s a hardcoded value with no token backing it.\\n\\n---\\n\\n## Complexity Classes — Practical Guide\\n\\nThe `complexityClass` field determines which render engine runs. Scope auto-detects it, but agents should understand it:\\n\\n**`\"simple\"` components:**\\n- Pure presentational, flexbox layout only\\n- No CSS grid, no absolute/fixed/sticky positioning\\n- No CSS animations, transitions, or transforms\\n- No `className` values Scope can\\'t statically trace (e.g. dynamic Tailwind classes)\\n- Renders in ~8ms via Satori (SVG-based, no browser needed)\\n\\n**`\"complex\"` components:**\\n- Anything using Tailwind (CSS injection required)\\n- CSS grid, positioned elements, overflow, z-index\\n- Components that read from context at render time\\n- Any component Scope isn\\'t sure about (conservative default)\\n- Renders in ~200–800ms via Playwright BrowserPool\\n\\nWhen in doubt: complex is always safe. Simple is an optimization.\\n\\n---\\n\\n## Required Contexts — Why Renders Fail\\n\\nIf `requiredContexts` is non-empty, the component calls `useContext` on one or more contexts. Without a provider, it will either render broken or throw entirely.\\n\\nTwo ways to fix:\\n1. **Provider presets in config** (recommended): add provider names to `reactscope.config.json → components.wrappers.providers`\\n2. **Scope file with wrapper**: wrap the component in a provider in the scenario itself\\n\\nBuilt-in mocks (always provided): `ThemeContext → { theme: \\'light\\' }`, `LocaleContext → { locale: \\'en-US\\' }`.\\n\\n---\\n\\n## `scope doctor` — Always Run This First\\n\\nBefore debugging any render issue, run:\\n```bash\\nscope doctor --json\\n```\\n\\nIt checks:\\n- `reactscope.config.json` is valid JSON\\n- Token file exists and has a `version` field\\n- Every path in `globalCSS` resolves on disk\\n- Manifest is present and up to date (not stale relative to source)\\n- Target-project dependencies are installed (`node_modules` exists)\\n- Playwright Chromium is available for render/site/instrument commands\\n\\n**If `globalCSS` is empty or missing**: Tailwind styles won\\'t apply to renders. Every component will look unstyled. This is the most common footgun. Fix: add your CSS entry file (the one with `@tailwind base; @tailwind components; @tailwind utilities;`) to `globalCSS` in config.\\n\\n---\\n\\n## Agent Decision Tree\\n\\n**\"I want to know what props Component X accepts\"**\\n→ `scope manifest get X --format json | jq \\'.props\\'`\\n\\n**\"I want to know which components will break if I change a context\"**\\n→ `scope manifest query --context MyContext --format json`\\n\\n**\"I want to render a component to verify visual output\"**\\n→ Create a `.scope.tsx` file with real props first, then `scope render component X --format json`\\n\\n**\"I want to render all variants of a component\"**\\n→ Define all variants in `.scope.tsx`, then `scope render all --format json --output-dir .reactscope/renders` (auto-matrix)\\n→ Or: `scope render matrix X --axes \\'variant:primary,secondary,danger\\' --format json`\\n\\n**\"I want to audit token compliance\"**\\n→ `scope render all` first (populates computedStyles), then `scope tokens compliance`\\n\\n**\"Renders look unstyled / blank\"**\\n→ Run `scope doctor` — likely missing `globalCSS`\\n→ If props are the issue: create/update the `.scope.tsx` file\\n\\n**\"I want to understand blast radius of a token change\"**\\n→ `scope tokens impact color.primary.500 --new-value \\'#0077dd\\'`\\n→ `scope tokens preview color.primary.500 --new-value \\'#0077dd\\'` for visual diff\\n\\n**\"I need to set up Scope in a new project\"**\\n→ `scope init --yes` (auto-detects Tailwind + CSS, generates manifest automatically)\\n→ `scope doctor` to validate\\n→ Create `.scope.tsx` files for key components\\n→ `scope render all`\\n\\n**\"I want to profile a live SPA\"**\\n→ Generate a manifest, then `scope instrument profile SearchPage --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'`\\n→ For auth/timing-heavy apps, follow `docs/profiling-production-spas.md`\\n\\n**\"I want to run Scope in CI\"**\\n→ `scope ci --json --output ci-result.json`\\n→ Exit code 0 = pass, non-zero = specific failure type\\n\\n---\\n\\n\\n## Installation\\n\\nPublished package:\\n\\n```bash\\nnpm install -g @agent-scope/cli # global\\nnpm install --save-dev @agent-scope/cli # per-project\\n```\\n\\nLocal-from-source quickstart for this repo:\\n\\n```bash\\nbun install\\nbun run build\\nbunx playwright install chromium\\ncd fixtures/tailwind-showcase\\nbun install\\n../../packages/cli/dist/cli.js init --yes\\n../../packages/cli/dist/cli.js doctor --json\\n../../packages/cli/dist/cli.js render all --format json --output-dir .reactscope/renders\\n../../packages/cli/dist/cli.js site build --output .reactscope/site\\n```\\n\\nBinary: `scope` (published install) or `packages/cli/dist/cli.js` (local build)\\n\\n---\\n\\n## Core Workflow\\n\\n```\\nget-skill → init --yes → doctor --json → manifest query/get/list --format json → render all --format json → site build → instrument profile → ci\\n```\\n\\n- **init**: Scaffold `reactscope.config.json` + token stub, auto-detect framework/globalCSS, **immediately runs `manifest generate`** so you see results right away.\\n- **doctor**: Health-check command — validates config, token file, globalCSS presence, manifest staleness, target-project dependencies, and Playwright Chromium availability.\\n- **generate**: Parse TypeScript AST and emit `.reactscope/manifest.json`. Run once per codebase change (or automatically via `scope init`).\\n- **query / get / list**: Ask structural questions. No network required. Works from manifest alone. Supports filtering by `--collection` and `--internal`.\\n- **render**: Produce PNGs of components via esbuild + Playwright (BrowserPool). Requires manifest for file paths. Auto-injects required prop defaults and globalCSS.\\n- **token audit**: Validate design tokens via `@scope/tokens` CLI commands (`tokens list`, `tokens compliance`, `tokens impact`, `tokens preview`, `tokens export`).\\n- **ci**: Run compliance checks and exit with code 0/1 for CI pipelines. `report pr-comment` posts results to GitHub PRs.\\n\\n---\\n\\n## Full CLI Reference\\n\\n### `scope init`\\nScaffold config, detect framework, extract Tailwind tokens, detect globalCSS files, and **automatically run `scope manifest generate`**.\\n\\n```bash\\nscope init\\nscope init --force # overwrite existing config\\n```\\n\\nAfter init completes, the manifest is already written — no manual `scope manifest generate` step needed.\\n\\n**Tailwind token extraction**: reads `tailwind.config.js`, extracts colors (with nested scale support), spacing, fontFamily, borderRadius. Stored in `reactscope.tokens.json`.\\n\\n**globalCSS detection**: checks 9 common patterns (`src/styles.css`, `src/index.css`, `app/globals.css`, etc.). Stored in `components.wrappers.globalCSS` in config.\\n\\n---\\n\\n### `scope doctor`\\nValidate the Scope setup. Exits non-zero on errors, zero on warnings-only.\\n\\n```bash\\nscope doctor --json\\nscope doctor --json\\n```\\n\\nChecks:\\n- `config` — `reactscope.config.json` is valid JSON with required fields\\n- `tokens` — token file is present and has a valid `version` field\\n- `globalCSS` — globalCSS files listed in config exist on disk\\n- `manifest` — manifest exists and is not stale (compares source file mtimes)\\n- `dependencies` — `node_modules` exists in the target project root\\n- `playwright` — Playwright Chromium is available before render/site/instrument\\n\\nIf `dependencies` fails, run `bun install` (or the package manager detected by your lockfile) in the target project root, then rerun `scope doctor --json`.\\n\\nIf `playwright` fails, run `bunx playwright install chromium`, then rerun `scope doctor --json` before retrying `scope render component`, `scope render all`, `scope site build`, or `scope instrument ...`.\\n\\n```\\n$ scope doctor --json\\nScope Doctor\\n────────────────────────────────────────\\n [✓] config reactscope.config.json valid\\n [✓] tokens Token file valid\\n [✓] globalCSS 1 globalCSS file(s) present\\n [!] manifest Manifest may be stale — 5 source file(s) modified since last generate\\n────────────────────────────────────────\\n 1 warning(s) — everything works but could be better\\n```\\n\\n---\\n\\n### `scope capture <url>`\\nCapture a live React component tree from a running app URL.\\n\\n```bash\\nscope capture http://localhost:3000\\nscope capture http://localhost:3000 --output report.json --pretty\\nscope capture http://localhost:3000 --timeout 15000 --wait 2000\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `-o, --output <path>` | string | stdout | Write JSON to file |\\n| `--pretty` | bool | false | Pretty-print JSON |\\n| `--timeout <ms>` | number | 10000 | Max wait for React to mount |\\n| `--wait <ms>` | number | 0 | Additional wait after page load |\\n\\nOutput (stdout): serialized PageReport JSON (or path when `--output` is set)\\n\\n---\\n\\n### `scope tree <url>`\\nPrint the React component tree from a live URL.\\n\\n```bash\\nscope tree http://localhost:3000\\nscope tree http://localhost:3000 --depth 3 --show-props --show-hooks\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--depth <n>` | number | unlimited | Max depth to display |\\n| `--show-props` | bool | false | Include prop names next to components |\\n| `--show-hooks` | bool | false | Show hook counts per component |\\n| `--timeout <ms>` | number | 10000 | Max wait for React to mount |\\n| `--wait <ms>` | number | 0 | Additional wait after page load |\\n\\n---\\n\\n### `scope report <url>`\\nCapture and print a human-readable summary of a React app.\\n\\n```bash\\nscope report http://localhost:3000\\nscope report http://localhost:3000 --json\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--json` | bool | false | Emit structured JSON instead of text |\\n| `--timeout <ms>` | number | 10000 | Max wait for React to mount |\\n| `--wait <ms>` | number | 0 | Additional wait after page load |\\n\\n---\\n\\n### `scope report baseline`\\nSave a baseline snapshot for future diff comparisons.\\n\\n```bash\\nscope report baseline\\nscope report baseline --output baselines/my-baseline.json\\n```\\n\\n---\\n\\n### `scope report diff`\\nDiff the current app state against a saved baseline.\\n\\n```bash\\nscope report diff\\nscope report diff --baseline baselines/my-baseline.json\\nscope report diff --json\\n```\\n\\n---\\n\\n### `scope report pr-comment`\\nPost a Scope CI report as a GitHub PR comment. Used in CI pipelines via the reusable `scope-ci` workflow.\\n\\n```bash\\nscope report pr-comment --report-path scope-ci-report.json\\n```\\n\\nRequires `GITHUB_TOKEN`, `GITHUB_REPOSITORY`, and `GITHUB_PR_NUMBER` in environment.\\n\\n---\\n\\n### `scope manifest generate`\\nScan source files and write `.reactscope/manifest.json`.\\n\\n```bash\\nscope manifest generate\\nscope manifest generate --root ./packages/ui\\nscope manifest generate --include \"src/**/*.tsx\" --exclude \"**/*.test.tsx\"\\nscope manifest generate --output custom/manifest.json\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--root <path>` | string | cwd | Project root directory |\\n| `--output <path>` | string | `.reactscope/manifest.json` | Output path |\\n| `--include <globs>` | string | `src/**/*.tsx,src/**/*.ts` | Comma-separated include globs |\\n| `--exclude <globs>` | string | `**/node_modules/**,...` | Comma-separated exclude globs |\\n\\n---\\n\\n### `scope manifest list`\\nList all components in the manifest.\\n\\n```bash\\nscope manifest list\\nscope manifest list --filter \"Button*\"\\nscope manifest list --format json\\nscope manifest list --collection Forms # filter to named collection\\nscope manifest list --internal # only internal components\\nscope manifest list --no-internal # hide internal components\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--format <fmt>` | `json\\\\|table` | auto (TTY→table, pipe→json) | Output format |\\n| `--filter <glob>` | string | — | Filter component names by glob |\\n| `--collection <name>` | string | — | Filter to named collection |\\n| `--internal` | bool | false | Show only internal components |\\n| `--no-internal` | bool | false | Hide internal components |\\n| `--manifest <path>` | string | `.reactscope/manifest.json` | Manifest path |\\n\\nTTY table output (includes COLLECTION and INTERNAL columns):\\n```\\nNAME FILE COMPLEXITY HOOKS CONTEXTS COLLECTION INTERNAL\\n------------ --------------------------- ---------- ----- -------- ---------- --------\\nButton src/components/Button.tsx simple 1 0 — no\\nThemeToggle src/components/Toggle.tsx complex 3 1 Forms no\\n```\\n\\n---\\n\\n### `scope manifest get <name>`\\nGet full details of a single component.\\n\\n```bash\\nscope manifest get Button\\nscope manifest get Button --format json\\n```\\n\\nJSON output includes `collection` and `internal` fields:\\n```json\\n{\\n \"name\": \"Button\",\\n \"filePath\": \"src/components/Button.tsx\",\\n \"collection\": \"Primitives\",\\n \"internal\": false,\\n ...\\n}\\n```\\n\\n---\\n\\n### `scope manifest query`\\nQuery components by attributes.\\n\\n```bash\\nscope manifest query --context ThemeContext\\nscope manifest query --hook useEffect\\nscope manifest query --complexity complex\\nscope manifest query --side-effects\\nscope manifest query --has-fetch\\nscope manifest query --has-prop <propName>\\nscope manifest query --composed-by <ComponentName>\\nscope manifest query --internal\\nscope manifest query --collection Forms\\nscope manifest query --context ThemeContext --format json\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--context <name>` | string | — | Find components consuming a context by name |\\n| `--hook <name>` | string | — | Find components using a specific hook |\\n| `--complexity <class>` | `simple\\\\|complex` | — | Filter by complexity class |\\n| `--side-effects` | bool | false | Any side effects detected |\\n| `--has-fetch` | bool | false | Components with fetch calls specifically |\\n| `--has-prop <name>` | string | — | Components that accept a specific prop |\\n| `--composed-by <name>` | string | — | Components rendered inside a specific parent |\\n| `--internal` | bool | false | Only internal components |\\n| `--collection <name>` | string | — | Filter to named collection |\\n| `--format <fmt>` | `json\\\\|table` | auto | Output format |\\n| `--manifest <path>` | string | `.reactscope/manifest.json` | Manifest path |\\n\\n---\\n\\n### `scope render <component>`\\nRender a single component to PNG (TTY) or JSON (pipe).\\n\\n**Auto prop defaults**: if `--props` is omitted, Scope injects sensible defaults so required props don\\'t produce blank renders: strings/nodes → component name, unions → first value, booleans → `false`, numbers → `0`.\\n\\n**globalCSS auto-injection**: reads `components.wrappers.globalCSS` from config and compiles/injects CSS (supports Tailwind v3 via PostCSS) into the render harness. A warning is printed to stderr if no globalCSS is configured (common cause of unstyled renders).\\n\\n```bash\\nscope render component Button\\nscope render component Button --props \\'{\"variant\":\"primary\",\"children\":\"Click me\"}\\'\\nscope render component Button --viewport 375x812\\nscope render component Button --output button.png\\nscope render component Button --format json\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--props <json>` | string | `{}` | Inline props as JSON string |\\n| `--viewport <WxH>` | string | `375x812` | Viewport size |\\n| `--theme <name>` | string | — | Theme name from token system |\\n| `-o, --output <path>` | string | — | Write PNG to specific path |\\n| `--format <fmt>` | `png\\\\|json` | auto (TTY→file, pipe→json) | Output format |\\n| `--manifest <path>` | string | `.reactscope/manifest.json` | Manifest path |\\n\\n---\\n\\n### `scope render matrix <component>`\\nRender across a Cartesian product of prop axes. Accepts both `key:v1,v2` and `{\"key\":[\"v1\",\"v2\"]}` JSON format for `--axes`.\\n\\n```bash\\nscope render matrix Button --axes \\'variant:primary,secondary,danger\\'\\nscope render matrix Button --axes \\'{\"variant\":[\"primary\",\"secondary\"]}\\'\\nscope render matrix Button --axes \\'variant:primary,secondary size:sm,md,lg\\'\\nscope render matrix Button --sprite button-matrix.png --format json\\n```\\n\\n---\\n\\n### `scope render all`\\nRender every component in the manifest.\\n\\n```bash\\nscope render all\\nscope render all --concurrency 4 --output-dir renders/\\n```\\n\\nHandles imports of CSS files in components (maps to empty loader so styles are injected at page level). SVG and font imports are handled via dataurl loaders.\\n\\n---\\n\\n### `scope instrument tree`\\nCapture the live React component tree with instrumentation metadata.\\n\\n```bash\\nscope instrument tree http://localhost:3000\\nscope instrument tree http://localhost:3000 --depth 5 --show-props\\n```\\n\\n**Implementation note**: uses a fresh `chromium.launch()` + `newContext()` + `newPage()` per call (not BrowserPool), with `addInitScript` called before `setContent` to ensure the Scope runtime is injected at document-start before React loads.\\n\\n---\\n\\n### `scope instrument hooks`\\nProfile hook execution in live components.\\n\\n```bash\\nscope instrument hooks http://localhost:3000\\nscope instrument hooks http://localhost:3000 --component Button\\n```\\n\\n**Implementation note**: requires `addInitScript({ content: getBrowserEntryScript() })` before `setContent` so `__REACT_DEVTOOLS_GLOBAL_HOOK__` is present when React loads its renderer.\\n\\n---\\n\\n### `scope instrument profile`\\nProfile render performance of live components.\\n\\n```bash\\nscope instrument profile SearchPage --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'\\n```\\n\\n---\\n\\n### `scope instrument renders`\\nRe-render causality analysis — what triggered each render.\\n\\n```bash\\nscope instrument renders http://localhost:3000\\n```\\n\\n---\\n\\n### `scope tokens get <name>`\\nGet details of a single design token.\\n\\n### `scope tokens list`\\nList all tokens. Token file must have a `version` field (written by `scope init`).\\n\\n```bash\\nscope tokens list\\nscope tokens list --type color\\nscope tokens list --format json\\n```\\n\\n### `scope tokens search <query>`\\nFull-text search across token names/values.\\n\\n### `scope tokens resolve <value>`\\nResolve a CSS value or alias back to its token name.\\n\\n### `scope tokens validate`\\nValidate token file schema.\\n\\n### `scope tokens compliance`\\nCheck rendered components for design token compliance.\\n\\n```bash\\nscope tokens compliance\\nscope tokens compliance --threshold 95\\n```\\n\\n### `scope tokens impact <token>`\\nAnalyze impact of changing a token — which components use it.\\n\\n```bash\\nscope tokens impact --token color.primary.500\\n```\\n\\n### `scope tokens preview <token>`\\nPreview a token value change visually before committing.\\n\\n### `scope tokens export`\\nExport tokens in multiple formats.\\n\\n```bash\\nscope tokens export --format flat-json\\nscope tokens export --format css\\nscope tokens export --format scss\\nscope tokens export --format ts\\nscope tokens export --format tailwind\\nscope tokens export --format style-dictionary\\n```\\n\\n**Format aliases** (auto-corrected with \"Did you mean?\" hint):\\n- `json` → `flat-json`\\n- `js` → `ts`\\n- `sass` → `scss`\\n- `tw` → `tailwind`\\n\\n---\\n\\n### `scope ci`\\nRun all CI checks (compliance, accessibility, console errors) and exit 0/1.\\n\\n```bash\\nscope ci\\nscope ci --json\\nscope ci --threshold 90 # compliance threshold (default: 90)\\n```\\n\\n```\\n$ scope ci --json\\n→ CI passed in 3.2s\\n→ Compliance 100.0% >= threshold 90.0% ✅\\n→ Accessibility audit not yet implemented — skipped ✅\\n→ No console errors detected ✅\\n→ Exit code 0\\n```\\n\\nThe `scope-ci` **reusable GitHub Actions workflow** is available at `.github/workflows/scope-ci.yml` and can be included in any repo\\'s CI to run `scope ci` and post results as a PR comment via `scope report pr-comment`.\\n\\n---\\n\\n### `scope site build`\\nGenerate a static HTML component gallery site from the manifest.\\n\\n```bash\\nscope site build\\nscope site build --output ./dist/site\\n```\\n\\n**Collections support**: components are grouped under named collection sections in the sidebar and index grid. Internal components are hidden from the sidebar and card grid but appear in composition detail sections with an `internal` badge.\\n\\n**Collection display rules**:\\n- Sidebar: one section divider per collection + an \"Ungrouped\" section; internal components excluded\\n- Index page: named sections with heading + optional description; internal components excluded\\n- Component detail page: Composes/Composed By lists ALL components including internal ones (with subtle badge)\\n- Falls back to flat list when no collections configured (backwards-compatible)\\n\\n### `scope site serve`\\nServe the generated site locally.\\n\\n```bash\\nscope site serve\\nscope site serve --port 4000\\n```\\n\\n---\\n\\n## Collections & Internal Components\\n\\nComponents can be organized into named **collections** and flagged as **internal** (library implementation details not shown in the public gallery).\\n\\n### Defining collections\\n\\n**1. TSDoc tag** (highest precedence):\\n```tsx\\n/**\\n * @collection Forms\\n */\\nexport function Input() { ... }\\n```\\n\\n**2. `.scope.ts` co-located file**:\\n```ts\\n// Input.scope.ts\\nexport const collection = \"Forms\"\\n```\\n\\n**3. Config-level glob patterns**:\\n```json\\n// reactscope.config.json\\n{\\n \"collections\": [\\n { \"name\": \"Forms\", \"description\": \"Form inputs and controls\", \"patterns\": [\"src/forms/**\"] },\\n { \"name\": \"Primitives\", \"patterns\": [\"src/primitives/**\"] }\\n ]\\n}\\n```\\n\\nResolution precedence: TSDoc `@collection` > `.scope.ts` export > config pattern.\\n\\n### Flagging internal components\\n\\n**TSDoc tag**:\\n```tsx\\n/**\\n * @internal\\n */\\nexport function InternalHelperButton() { ... }\\n```\\n\\n**Config glob patterns**:\\n```json\\n{\\n \"internalPatterns\": [\"src/internal/**\", \"src/**/*Internal*\"]\\n}\\n```\\n\\n---\\n\\n## Manifest Output Schema\\n\\nFile: `.reactscope/manifest.json`\\n\\n```typescript\\n{\\n version: \"0.1\",\\n generatedAt: string, // ISO 8601\\n collections: CollectionConfig[], // echoes config.collections, [] when not set\\n components: Record<string, ComponentDescriptor>,\\n tree: Record<string, { children: string[], parents: string[] }>\\n}\\n```\\n\\n### `ComponentDescriptor` fields\\n\\n| Field | Type | Description |\\n|-------|------|-------------|\\n| `filePath` | `string` | Relative path from project root to source file |\\n| `exportType` | `\"named\" \\\\| \"default\" \\\\| \"none\"` | How the component is exported |\\n| `displayName` | `string` | `displayName` if set, else function/class name |\\n| `collection` | `string?` | Resolved collection name (`undefined` = ungrouped) |\\n| `internal` | `boolean` | `true` if flagged as internal (default: `false`) |\\n| `props` | `Record<string, PropDescriptor>` | Extracted prop types keyed by prop name |\\n| `composes` | `string[]` | Components this one renders in its JSX |\\n| `composedBy` | `string[]` | Components that render this one in their JSX |\\n| `complexityClass` | `\"simple\" \\\\| \"complex\"` | Render path: simple = Satori-safe, complex = requires BrowserPool |\\n| `requiredContexts` | `string[]` | React context names consumed |\\n| `detectedHooks` | `string[]` | All hooks called, sorted alphabetically |\\n| `sideEffects` | `SideEffects` | Side effect categories detected |\\n| `memoized` | `boolean` | Wrapped with `React.memo` |\\n| `forwardedRef` | `boolean` | Wrapped with `React.forwardRef` |\\n| `hocWrappers` | `string[]` | HOC wrapper names (excluding memo/forwardRef) |\\n| `loc` | `{ start: number, end: number }` | Line numbers in source file |\\n\\n---\\n\\n## Common Agent Workflows\\n\\n### Structural queries\\n\\n```bash\\n# Which components use ThemeContext?\\nscope manifest query --context ThemeContext\\n\\n# What props does Button accept?\\nscope manifest get Button --format json | jq \\'.props\\'\\n\\n# Which components are safe to render without a provider?\\nscope manifest query --complexity simple # + check requiredContexts === []\\n\\n# Show all components with side effects\\nscope manifest query --side-effects\\n\\n# Which components make fetch calls?\\nscope manifest query --has-fetch\\n\\n# Which components use useEffect?\\nscope manifest query --hook useEffect\\n\\n# Which components accept a disabled prop?\\nscope manifest query --has-prop disabled\\n\\n# Which components are composed inside Modal?\\nscope manifest query --composed-by Modal\\n\\n# All components in the Forms collection\\nscope manifest list --collection Forms\\n\\n# All internal components (library implementation details)\\nscope manifest list --internal\\n\\n# Public components only (hide internals)\\nscope manifest list --no-internal\\n```\\n\\n### Render workflows\\n\\n```bash\\n# Render Button in all variants (auto-defaults props if not provided)\\nscope render matrix Button --axes \\'variant:primary,secondary,danger\\'\\n\\n# Render with JSON axes format\\nscope render matrix Button --axes \\'{\"variant\":[\"primary\",\"secondary\"]}\\'\\n\\n# Render with explicit props\\nscope render component Button --props \\'{\"variant\":\"primary\",\"disabled\":true}\\'\\n\\n# Render all components (handles CSS/SVG/font imports automatically)\\nscope render all --concurrency 8\\n\\n# Get render as JSON\\nscope render component Button --format json | jq \\'.screenshot\\' | base64 -d > button.png\\n```\\n\\n### Token workflows\\n\\n```bash\\n# List all tokens\\nscope tokens list\\n\\n# Check compliance\\nscope tokens compliance --threshold 95\\n\\n# See what a token change impacts\\nscope tokens impact --token color.primary.500\\n\\n# Export for Tailwind\\nscope tokens export --format tailwind\\n```\\n\\n### CI workflow\\n\\n```bash\\n# Full compliance check\\nscope ci --json\\n\\n# In GitHub Actions — use the reusable workflow\\n# .github/workflows/ci.yml:\\n# uses: FlatFilers/Scope/.github/workflows/scope-ci.yml@main\\n```\\n\\n---\\n\\n## Error Patterns\\n\\n| Error | Cause | Fix |\\n|-------|-------|-----|\\n| `\"React root not found\"` | App not running, wrong URL, or Vite HMR interfering | Use `scope capture --wait 2000` |\\n| `\"Component not in manifest\"` | Manifest is stale | Run `scope manifest generate` first |\\n| `\"Manifest not found\"` | Missing manifest | Run `scope init` or `scope manifest generate` |\\n| `\"requiredContexts missing\"` | Component needs a provider | Add provider presets to `reactscope.config.json` |\\n| Blank PNG / 16×6px renders | No globalCSS injected (common with Tailwind) | Set `components.wrappers.globalCSS` in config; run `scope doctor` to verify |\\n| `PLAYWRIGHT_BROWSERS_MISSING` / `browserType.launch: Executable doesn\\'t exist` | Playwright Chromium is not installed in this sandbox | Run `bunx playwright install chromium`, then `scope doctor --json`, then retry render/site/instrument |\\n| `TARGET_PROJECT_DEPENDENCIES_MISSING` / `Could not resolve \"react\"` | Target project dependencies are missing | Run `bun install` (or the detected package manager) in the target project root, then `scope doctor --json` |\\n| `\"Invalid props JSON\"` | Malformed JSON in `--props` | Use single outer quotes: `--props \\'{\"key\":\"val\"}\\'` |\\n| `\"SCOPE_CAPTURE_JSON not available\"` | Scope runtime not injected before React loaded | Fixed in PR #83 — update CLI |\\n| `\"No React DevTools hook found\"` | Hook instrumentation init order bug | Fixed in PR #83 — update CLI |\\n| `\"ERR_MODULE_NOT_FOUND\"` after tokens commands | Old Node shebang in CLI binary | Fixed in PR #90 — CLI now uses `#!/usr/bin/env bun` |\\n| `\"version\" field missing in tokens` | Token stub written by old `scope init` | Re-run `scope init --force` or add `\"version\": \"1\"` to token file |\\n| `\"unknown option --has-prop\"` | Old CLI version | Fixed in PR #90 — update CLI |\\n| Format alias error (`json`, `js`, `sass`, `tw`) | Wrong format name for `tokens export` | Use `flat-json`, `ts`, `scss`, `tailwind`; CLI shows \"Did you mean?\" hint |\\n\\n---\\n\\n## `reactscope.config.json`\\n\\n```json\\n{\\n \"components\": {\\n \"wrappers\": {\\n \"globalCSS\": [\"src/styles.css\"]\\n }\\n },\\n \"tokens\": {\\n \"file\": \"reactscope.tokens.json\"\\n },\\n \"collections\": [\\n { \"name\": \"Forms\", \"description\": \"Form inputs and controls\", \"patterns\": [\"src/forms/**\"] },\\n { \"name\": \"Primitives\", \"patterns\": [\"src/primitives/**\"] }\\n ],\\n \"internalPatterns\": [\"src/internal/**\"],\\n \"providers\": {\\n \"theme\": { \"component\": \"ThemeProvider\", \"props\": { \"theme\": \"light\" } },\\n \"router\": { \"component\": \"MemoryRouter\", \"props\": { \"initialEntries\": [\"/\"] } }\\n }\\n}\\n```\\n\\n**Built-in mock providers** (always available, no config needed):\\n- `ThemeContext` → `{ theme: \\'light\\' }` (or `--theme <name>`)\\n- `LocaleContext` → `{ locale: \\'en-US\\' }`\\n\\n---\\n\\n## What Scope Cannot Do\\n\\n- **Runtime state**: `useState` values after user interaction\\n- **Network requests**: `fetch`, `XHR`, `WebSocket`\\n- **User interactions**: click, type, hover, drag\\n- **Auth/session-gated components**: components that redirect or throw without a session\\n- **Server components (RSC)**: React Server Components\\n- **Dynamic CSS**: CSS-in-JS styles computed at runtime from props Scope can\\'t infer\\n\\n---\\n\\n## Version History\\n\\n| Version | Date | Summary |\\n|---------|------|---------|\\n| v1.0 | 2026-03-11 | Initial SKILL.md (PR #36) — manifest, render, capture, tree, report, tokens, ci commands |\\n| v1.1 | 2026-03-11 | Updated through PR #82 — Phase 2 CLI commands complete |\\n| v1.2 | 2026-03-13 | PRs #83–#95: runtime injection fix, dogfooding fixes (12 bugs), `scope doctor`, `scope init` auto-manifest, globalCSS render warning, collections & internal components feature |\\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 icons?: {\n patterns: 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: detected.globalCSSFiles ?? [] },\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// Tailwind token extractor\n// ---------------------------------------------------------------------------\n\n/**\n * Attempt to extract design tokens from a tailwind.config.js/ts file.\n * Returns a nested token object compatible with the TokenFile schema, or null.\n */\nexport function extractTailwindTokens(\n tokenSources: import(\"./detect.js\").TokenSource[],\n): Record<string, unknown> | null {\n const tailwindSource = tokenSources.find((s) => s.kind === \"tailwind-config\");\n if (!tailwindSource) return null;\n\n try {\n const raw = readFileSync(tailwindSource.path, \"utf-8\");\n\n const tokens: Record<string, unknown> = {};\n\n // Helper: parse a JS/TS object literal block into key-value pairs\n // Helper: parse a JS object literal block into key-value pairs.\n // Handles both quoted keys ('key': 'value') and unquoted numeric keys (500: '#fff').\n function parseBlock(block: string): Record<string, string> {\n const result: Record<string, string> = {};\n // Match optional-quote KEY optional-quote : optional-quote VALUE optional-quote\n // KEY can be: word identifier OR bare number (e.g. 50, 100, 500 for color scales)\n const lineRe =\n /['\"]?(\\w[\\w.-]*|\\d+)['\"]?\\s*:\\s*['\"]?(#[0-9a-fA-F]{3,8}|\\d+(?:px|rem|em|%)|[\\w-]+(?:\\/[\\w]+)?)['\"]?/g;\n for (const m of block.matchAll(lineRe)) {\n if (m[1] !== undefined && m[2] !== undefined) {\n result[m[1]] = m[2];\n }\n }\n return result;\n }\n\n // Colors — use bracket counting to handle multi-level nesting correctly\n // The greedy regex approach fails when there are multiple nested color scale objects\n const colorsKeyIdx = raw.indexOf(\"colors:\");\n if (colorsKeyIdx !== -1) {\n const colorsBraceStart = raw.indexOf(\"{\", colorsKeyIdx);\n if (colorsBraceStart !== -1) {\n let colorDepth = 0;\n let colorsBraceEnd = -1;\n for (let ci = colorsBraceStart; ci < raw.length; ci++) {\n if (raw[ci] === \"{\") colorDepth++;\n else if (raw[ci] === \"}\") {\n colorDepth--;\n if (colorDepth === 0) {\n colorsBraceEnd = ci;\n break;\n }\n }\n }\n if (colorsBraceEnd > colorsBraceStart) {\n const colorSection = raw.slice(colorsBraceStart + 1, colorsBraceEnd);\n const scaleRe = /(\\w+)\\s*:\\s*\\{([^}]+)\\}/g;\n const colorTokens: Record<string, unknown> = {};\n for (const sm of colorSection.matchAll(scaleRe)) {\n if (sm[1] === undefined || sm[2] === undefined) continue;\n const scaleName = sm[1];\n const scaleValues = parseBlock(sm[2]);\n if (Object.keys(scaleValues).length > 0) {\n const scaleTokens: Record<string, unknown> = {};\n for (const [step, hex] of Object.entries(scaleValues)) {\n scaleTokens[step] = { value: hex, type: \"color\" };\n }\n colorTokens[scaleName] = scaleTokens;\n }\n }\n if (Object.keys(colorTokens).length > 0) {\n tokens.color = colorTokens;\n }\n }\n }\n }\n\n // Spacing\n const spacingMatch = raw.match(/spacing\\s*:\\s*\\{([\\s\\S]*?)\\n\\s*\\}/);\n if (spacingMatch?.[1] !== undefined) {\n const spacingValues = parseBlock(spacingMatch[1]);\n if (Object.keys(spacingValues).length > 0) {\n const spacingTokens: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(spacingValues)) {\n spacingTokens[key] = { value: val, type: \"dimension\" };\n }\n tokens.spacing = spacingTokens;\n }\n }\n\n // Font families\n const fontFamilyMatch = raw.match(/fontFamily\\s*:\\s*\\{([\\s\\S]*?)\\n\\s*\\}/);\n if (fontFamilyMatch?.[1] !== undefined) {\n const fontFamilyRe = /(\\w+)\\s*:\\s*\\[\\s*['\"]([^'\"]+)['\"]/g;\n const fontTokens: Record<string, unknown> = {};\n for (const fm of fontFamilyMatch[1].matchAll(fontFamilyRe)) {\n if (fm[1] !== undefined && fm[2] !== undefined) {\n fontTokens[fm[1]] = { value: fm[2], type: \"fontFamily\" };\n }\n }\n if (Object.keys(fontTokens).length > 0) {\n tokens.font = fontTokens;\n }\n }\n\n // Border radii\n const borderRadiusMatch = raw.match(/borderRadius\\s*:\\s*\\{([\\s\\S]*?)\\n\\s*\\}/);\n if (borderRadiusMatch?.[1] !== undefined) {\n const radiusValues = parseBlock(borderRadiusMatch[1]);\n if (Object.keys(radiusValues).length > 0) {\n const radiusTokens: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(radiusValues)) {\n radiusTokens[key] = { value: val, type: \"dimension\" };\n }\n tokens.radius = radiusTokens;\n }\n }\n\n return Object.keys(tokens).length > 0 ? tokens : null;\n } catch {\n return null;\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(\n rootDir: string,\n tokenFile: string,\n extractedTokens?: Record<string, unknown>,\n): 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 version: \"1.0.0\",\n meta: {\n name: \"Design Tokens\",\n lastUpdated: new Date().toISOString().split(\"T\")[0],\n },\n tokens: extractedTokens ?? {},\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 — extract tokens from Tailwind config if found\n const extractedTokens = extractTailwindTokens(detected.tokenSources);\n if (extractedTokens !== null) {\n const tokenGroupCount = Object.keys(extractedTokens).length;\n process.stdout.write(` Extracted ${tokenGroupCount} token group(s) from Tailwind config\\n`);\n }\n const tokPath = scaffoldTokenFile(rootDir, config.tokens.file, extractedTokens ?? undefined);\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 // Auto-run manifest generate so users get immediate feedback\n process.stdout.write(\"\\n Scanning components...\\n\");\n try {\n const manifestConfig = {\n include: config.components.include,\n rootDir,\n };\n const manifest = await generateManifest(manifestConfig);\n const manifestCount = Object.keys(manifest.components).length;\n const manifestOutPath = join(rootDir, config.output.dir, \"manifest.json\");\n mkdirSync(join(rootDir, config.output.dir), { recursive: true });\n writeFileSync(manifestOutPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n process.stdout.write(\n ` Found ${manifestCount} component(s) — manifest written to ${manifestOutPath}\\n`,\n );\n } catch {\n process.stdout.write(\n \" (manifest generate skipped — run `scope manifest generate` manually)\\n\",\n );\n }\n process.stdout.write(\"\\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 { generateManifest } from \"@agent-scope/manifest\";\nimport { Command } from \"commander\";\n\nexport function createInitCommand(): Command {\n return new Command(\"init\")\n .description(\n \"Auto-detect your project layout and scaffold reactscope.config.json.\\n\\n\" +\n \"WHAT IT DOES:\\n\" +\n \" - Detects component glob patterns from tsconfig / package.json / directory scan\\n\" +\n \" - Detects globalCSS files (Tailwind, PostCSS)\\n\" +\n \" - Writes reactscope.config.json with all detected values\\n\" +\n \" - Adds .reactscope/ to .gitignore\\n\" +\n \" - Creates .reactscope/ output directory\\n\\n\" +\n \"CONFIG FIELDS GENERATED:\\n\" +\n \" components.include glob patterns for component discovery\\n\" +\n \" components.wrappers providers + globalCSS to inject on every render\\n\" +\n \" render.viewport default viewport (1280×800)\\n\" +\n \" tokens.file path to reactscope.tokens.json\\n\" +\n \" output.dir .reactscope/ (all outputs go here)\\n\" +\n \" ci.complianceThreshold 0.90 (90% on-token required to pass CI)\\n\\n\" +\n \"Safe to re-run — will not overwrite existing config unless --force.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope init\\n\" +\n \" scope init --yes # accept all detected defaults, no prompts\\n\" +\n \" scope init --force # overwrite existing config\",\n )\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 — 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\" | \"tailwind-v4-theme\" | \"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 /** Detected global CSS entry files (relative paths, e.g. [\"src/styles.css\"]). */\n globalCSSFiles: string[];\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// Global CSS file detection\n// ---------------------------------------------------------------------------\n\n/** Common CSS entry file patterns to look for. */\nconst GLOBAL_CSS_CANDIDATES = [\n \"src/styles.css\",\n \"src/index.css\",\n \"src/global.css\",\n \"src/globals.css\",\n \"src/app.css\",\n \"src/main.css\",\n \"styles/globals.css\",\n \"styles/global.css\",\n \"styles/index.css\",\n];\n\n/** Returns relative paths to global CSS entry files found in rootDir. */\nfunction detectGlobalCSSFiles(rootDir: string): string[] {\n return GLOBAL_CSS_CANDIDATES.filter((rel) => existsSync(join(rootDir, rel)));\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\n/** Regex that matches a Tailwind v4 @theme block containing custom properties. */\nconst TAILWIND_V4_THEME_RE = /@theme\\s*(?:inline\\s*)?\\{[^}]*--[a-zA-Z]/;\n\n/** Max recursion depth when scanning for CSS/theme files under src/. */\nconst MAX_SCAN_DEPTH = 4;\n\n/** Filenames to skip during CSS scanning (generated/compiled output). */\nconst SKIP_CSS_NAMES = [\"compiled\", \".min.\"];\n\n/**\n * Recursively collect CSS files from a directory up to `maxDepth` levels.\n * Skips generated/compiled output files.\n */\nfunction collectCSSFiles(dir: string, depth: number): string[] {\n if (depth > MAX_SCAN_DEPTH) return [];\n const results: string[] = [];\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === \"node_modules\" || entry.name === \"dist\" || entry.name === \".next\") {\n continue;\n }\n const full = join(dir, entry.name);\n if (entry.isFile() && CSS_EXTS.some((x) => entry.name.endsWith(x))) {\n if (!SKIP_CSS_NAMES.some((skip) => entry.name.includes(skip))) {\n results.push(full);\n }\n } else if (entry.isDirectory()) {\n results.push(...collectCSSFiles(full, depth + 1));\n }\n }\n } catch {\n // ignore unreadable dirs\n }\n return results;\n}\n\nfunction detectTokenSources(rootDir: string): TokenSource[] {\n const sources: TokenSource[] = [];\n\n // 1. Tailwind config files (project root) — Tailwind v3 and earlier\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 — scan src/ recursively for :root custom properties and\n // Tailwind v4 @theme blocks\n const srcDir = join(rootDir, \"src\");\n if (existsSync(srcDir)) {\n const cssFiles = collectCSSFiles(srcDir, 0);\n const seen = new Set<string>();\n\n for (const filePath of cssFiles) {\n const content = readSafe(filePath);\n if (content === null) continue;\n\n if (TAILWIND_V4_THEME_RE.test(content) && !seen.has(filePath)) {\n sources.push({ kind: \"tailwind-v4-theme\", path: filePath });\n seen.add(filePath);\n }\n if (CSS_CUSTOM_PROPS_RE.test(content) && !seen.has(filePath)) {\n sources.push({ kind: \"css-custom-properties\", path: filePath });\n seen.add(filePath);\n }\n }\n }\n\n // Also check common token directories at project root (tokens/, styles/, theme/)\n for (const tokenDir of [\"tokens\", \"styles\", \"theme\"]) {\n const dir = join(rootDir, tokenDir);\n if (!existsSync(dir)) continue;\n const cssFiles = collectCSSFiles(dir, 0);\n for (const filePath of cssFiles) {\n const content = readSafe(filePath);\n if (content === null) continue;\n\n if (TAILWIND_V4_THEME_RE.test(content)) {\n sources.push({ kind: \"tailwind-v4-theme\", path: filePath });\n } else if (CSS_CUSTOM_PROPS_RE.test(content)) {\n sources.push({ kind: \"css-custom-properties\", path: filePath });\n }\n }\n }\n\n // 3. Theme files (*.theme.ts / .theme.js / .theme.tsx) — scan src/ recursively\n if (existsSync(srcDir)) {\n const scanThemeFiles = (dir: string, depth: number): void => {\n if (depth > MAX_SCAN_DEPTH) return;\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === \"node_modules\" || entry.name === \"dist\") continue;\n if (entry.isFile() && THEME_SUFFIXES.some((s) => entry.name.endsWith(s))) {\n sources.push({ kind: \"theme-file\", path: join(dir, entry.name) });\n } else if (entry.isDirectory()) {\n scanThemeFiles(join(dir, entry.name), depth + 1);\n }\n }\n } catch {\n // ignore\n }\n };\n scanThemeFiles(srcDir, 0);\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 const globalCSSFiles = detectGlobalCSSFiles(rootDir);\n\n return {\n framework,\n typescript,\n tsconfigPath,\n componentPatterns,\n tokenSources,\n packageManager,\n globalCSSFiles,\n };\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 { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport { BrowserPool } from \"@agent-scope/render\";\nimport { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { formatScopeDiagnostic } from \"../diagnostics.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 with both the Scope browser-entry (installs\n // __REACT_DEVTOOLS_GLOBAL_HOOK__) and the render-instrumentation script\n // (hooks into onCommitFiberRoot for causality tracking) injected as inline\n // <script> tags before the React bundle. We embed them directly because\n // addInitScript does NOT fire for page.setContent() (it uses\n // document.open/write/close, not a real navigation).\n const preScript = `${getBrowserEntryScript()}\n${buildInstrumentationScript()}`;\n const htmlHarness = await buildComponentHarness(\n filePath,\n options.componentName,\n {},\n 1280,\n undefined,\n preScript,\n );\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 // Load the harness (pre-scripts are already embedded)\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(\n \"Trace every re-render triggered by an interaction and identify root causes.\\n\\n\" +\n \"OUTPUT INCLUDES per render event:\\n\" +\n \" component which component re-rendered\\n\" +\n \" trigger why it re-rendered: state_change | props_change | context_change |\\n\" +\n \" parent_rerender | force_update | hook_dependency\\n\" +\n \" wasted true if re-rendered with no changed inputs and not memoized\\n\" +\n \" chain full causality chain from root cause to this render\\n\\n\" +\n \"WASTED RENDERS: propsChanged=false AND stateChanged=false AND contextChanged=false\\n\" +\n \"AND memoized=false — these are optimisation opportunities.\\n\\n\" +\n \"Examples:\\n\" +\n ' scope instrument renders SearchPage --interaction \\'[{\"action\":\"type\",\"target\":\"input\",\"text\":\"hello\"}]\\'\\n' +\n ' scope instrument renders Button --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\' --json\\n' +\n \" scope instrument renders Form --json | jq '.events[] | select(.wasted == true)'\",\n )\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(`${formatScopeDiagnostic(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 \"Runtime instrumentation for React component behaviour analysis.\\n\\n\" +\n \"All instrument commands:\\n\" +\n \" 1. Build an esbuild harness for the component\\n\" +\n \" 2. Load it in a Playwright browser\\n\" +\n \" 3. Inject instrumentation hooks into React DevTools fiber\\n\" +\n \" 4. Execute interactions and collect events\\n\\n\" +\n \"PREREQUISITES:\\n\" +\n \" scope manifest generate (component must be in manifest)\\n\" +\n \" reactscope.config.json (for wrappers/globalCSS)\\n\\n\" +\n \"INTERACTION FORMAT:\\n\" +\n \" JSON array of step objects: [{action, target, text?}]\" +\n \"\\n\" +\n \" Actions: click | type | focus | blur | hover | key\" +\n \"\\n\" +\n \" Target: CSS selector for the element to interact with\" +\n \"\\n\\n\" +\n \"Examples:\\n\" +\n ' scope instrument renders Button --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'\\n' +\n ' scope instrument hooks SearchInput --props \\'{\"value\":\"hello\"}\\'\\n' +\n ' scope instrument profile Modal --interaction \\'[{\"action\":\"click\",\"target\":\".open-btn\"}]\\'\\n' +\n \" scope instrument tree Card\",\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 * @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 { type CollectionConfig, 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(\n \"List all components in the manifest as a table (TTY) or JSON (piped).\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest list\\n\" +\n \" scope manifest list --format json | jq '.[].name'\\n\" +\n ' scope manifest list --filter \"Button*\"',\n )\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .option(\"--filter <glob>\", \"Filter components by name glob pattern\")\n .option(\"--collection <name>\", \"Filter to only components in the named collection\")\n .option(\"--internal\", \"Show only internal components\")\n .option(\"--no-internal\", \"Hide internal components from output\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n (opts: {\n format?: string;\n filter?: string;\n collection?: string;\n internal: boolean;\n manifest: string;\n }) => {\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 // Apply --collection filter\n if (opts.collection !== undefined) {\n const col = opts.collection;\n entries = entries.filter(([, d]) => d.collection === col);\n }\n\n // Apply --internal / --no-internal filters\n // Commander sets opts.internal = true for --internal, false for --no-internal\n if (opts.internal === true) {\n entries = entries.filter(([, d]) => d.internal);\n } else if (opts.internal === false) {\n entries = entries.filter(([, d]) => !d.internal);\n }\n // opts.internal undefined means neither flag was passed — show all\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 collection: descriptor.collection,\n internal: descriptor.internal,\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// ---------------------------------------------------------------------------\n// manifest get\n// ---------------------------------------------------------------------------\n\nfunction registerGet(manifestCmd: Command): void {\n manifestCmd\n .command(\"get <name>\")\n .description(\n \"Get full details of a single component: props, hooks, complexity class, file path.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest get Button\\n\" +\n \" scope manifest get Button --format json\\n\" +\n \" scope manifest get Button --format json | jq '.complexity'\",\n )\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(\n \"Filter components by structural attributes. All flags are AND-combined.\\n\\n\" +\n \"COMPLEXITY CLASSES:\\n\" +\n \" simple — pure/presentational, no side effects, Satori-renderable\\n\" +\n \" complex — uses context/hooks/effects, requires BrowserPool to render\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest query --complexity simple\\n\" +\n \" scope manifest query --has-fetch\\n\" +\n \" scope manifest query --hook useContext --side-effects\\n\" +\n ' scope manifest query --has-prop \"variant:union\" --format json\\n' +\n \" scope manifest query --composed-by Layout\",\n )\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(\n \"--has-prop <spec>\",\n \"Find components with a prop matching name or name:type (e.g. 'loading' or 'variant:union')\",\n )\n .option(\"--composed-by <name>\", \"Find components that compose the named component\")\n .option(\"--internal\", \"Find only internal components\", false)\n .option(\"--collection <name>\", \"Filter to only components in the named collection\")\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 hasProp?: string;\n composedBy?: string;\n internal: boolean;\n collection?: string;\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 if (opts.hasProp !== undefined) queryParts.push(`has-prop=${opts.hasProp}`);\n if (opts.composedBy !== undefined) queryParts.push(`composed-by=${opts.composedBy}`);\n if (opts.internal) queryParts.push(\"internal\");\n if (opts.collection !== undefined) queryParts.push(`collection=${opts.collection}`);\n\n if (queryParts.length === 0) {\n process.stderr.write(\n \"No query flags specified. Use --context, --hook, --complexity, --side-effects, --has-fetch, --has-prop, --composed-by, --internal, or --collection.\\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 if (opts.hasProp !== undefined) {\n const spec = opts.hasProp;\n const colonIdx = spec.indexOf(\":\");\n const propName = colonIdx >= 0 ? spec.slice(0, colonIdx) : spec;\n const propType = colonIdx >= 0 ? spec.slice(colonIdx + 1) : undefined;\n entries = entries.filter(([, d]) => {\n const props = (d as unknown as Record<string, unknown>).props as\n | Record<string, { type?: string }>\n | undefined;\n if (!props || !(propName in props)) return false;\n if (propType !== undefined) {\n return props[propName]?.type === propType;\n }\n return true;\n });\n }\n\n if (opts.composedBy !== undefined) {\n const targetName = opts.composedBy;\n entries = entries.filter(([, d]) => {\n const composedBy = (d as unknown as Record<string, unknown>).composedBy as\n | string[]\n | undefined;\n return composedBy?.includes(targetName);\n });\n }\n\n if (opts.internal) {\n entries = entries.filter(([, d]) => d.internal);\n }\n\n if (opts.collection !== undefined) {\n const col = opts.collection;\n entries = entries.filter(([, d]) => d.collection === col);\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 collection: d.collection,\n internal: d.internal,\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\n/**\n * Load `reactscope.config.json` from `rootDir` and extract manifest-relevant\n * fields: `components.include`, `components.exclude`, `internalPatterns`,\n * `collections`, and `icons.patterns`.\n * Returns `null` when the file doesn't exist or is malformed.\n */\nfunction loadReactScopeConfig(rootDir: string): {\n include?: string[];\n exclude?: string[];\n internalPatterns?: string[];\n collections?: CollectionConfig[];\n iconPatterns?: string[];\n} | null {\n const configPath = resolve(rootDir, \"reactscope.config.json\");\n if (!existsSync(configPath)) return null;\n\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as Record<string, unknown>;\n\n const result: {\n include?: string[];\n exclude?: string[];\n internalPatterns?: string[];\n collections?: CollectionConfig[];\n iconPatterns?: string[];\n } = {};\n\n const components = cfg.components as Record<string, unknown> | undefined;\n if (components !== undefined && typeof components === \"object\" && components !== null) {\n if (Array.isArray(components.include)) {\n result.include = components.include as string[];\n }\n if (Array.isArray(components.exclude)) {\n result.exclude = components.exclude as string[];\n }\n }\n\n if (Array.isArray(cfg.internalPatterns)) {\n result.internalPatterns = cfg.internalPatterns as string[];\n }\n if (Array.isArray(cfg.collections)) {\n result.collections = cfg.collections as CollectionConfig[];\n }\n\n const icons = cfg.icons as Record<string, unknown> | undefined;\n if (icons !== undefined && typeof icons === \"object\" && icons !== null) {\n if (Array.isArray(icons.patterns)) {\n result.iconPatterns = icons.patterns as string[];\n }\n }\n\n return result;\n } catch {\n return null;\n }\n}\n\nfunction registerGenerate(manifestCmd: Command): void {\n manifestCmd\n .command(\"generate\")\n .description(\n \"Scan source files and generate .reactscope/manifest.json.\\n\\n\" +\n \"Uses Babel static analysis — no runtime or bundler required.\\n\" +\n \"Re-run whenever components are added, removed, or significantly changed.\\n\\n\" +\n \"Reads reactscope.config.json for:\\n\" +\n \" components.include glob patterns for source files\\n\" +\n \" components.exclude glob patterns to skip\\n\" +\n \" internalPatterns globs to flag components as internal\\n\" +\n \" collections named groups of components\\n\\n\" +\n \"CLI flags (--include, --exclude) override config-file values.\\n\\n\" +\n \"WHAT IT CAPTURES per component:\\n\" +\n \" - File path and export name\\n\" +\n \" - All props with types and default values\\n\" +\n \" - Hook usage (useState, useEffect, useContext, custom hooks)\\n\" +\n \" - Side effects (fetch, timers, subscriptions)\\n\" +\n \" - Complexity class: simple | complex\\n\" +\n \" - Context dependencies and composed child components\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest generate\\n\" +\n \" scope manifest generate --root ./packages/ui\\n\" +\n ' scope manifest generate --include \"src/components/**/*.tsx\" --exclude \"**/*.stories.tsx\"\\n' +\n \" scope manifest generate --output ./custom-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 configValues = loadReactScopeConfig(rootDir);\n\n // CLI flags override config-file values\n const include = opts.include?.split(\",\").map((s) => s.trim()) ?? configValues?.include;\n const exclude = opts.exclude?.split(\",\").map((s) => s.trim()) ?? configValues?.exclude;\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 ...(configValues?.internalPatterns !== undefined && {\n internalPatterns: configValues.internalPatterns,\n }),\n ...(configValues?.collections !== undefined && {\n collections: configValues.collections,\n }),\n ...(configValues?.iconPatterns !== undefined && {\n iconPatterns: configValues.iconPatterns,\n }),\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 (.reactscope/manifest.json).\\n\\n\" +\n \"The manifest is the source-of-truth registry of every React component\\n\" +\n \"in your codebase — generated by static analysis (no runtime needed).\\n\\n\" +\n \"Run `scope manifest generate` first, then use list/get/query to explore.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest generate\\n\" +\n \" scope manifest list\\n\" +\n \" scope manifest get Button\\n\" +\n \" scope manifest query --complexity complex --has-fetch\",\n );\n\n registerList(manifestCmd);\n registerGet(manifestCmd);\n registerQuery(manifestCmd);\n registerGenerate(manifestCmd);\n\n return manifestCmd;\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 { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport type { Command } from \"commander\";\nimport { Command as Cmd } from \"commander\";\nimport { chromium } from \"playwright\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { formatScopeDiagnostic } from \"../diagnostics.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 // Inject the Scope browser-entry bundle as an inline <script> in the HTML\n // harness, BEFORE the React bundle. This installs\n // __REACT_DEVTOOLS_GLOBAL_HOOK__ so React registers its renderer into the\n // hook when it loads. We embed it directly rather than using addInitScript\n // because setContent does not trigger Playwright init scripts (it uses\n // document.open/write/close, not a real navigation).\n const scopeRuntime = getBrowserEntryScript();\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n 1280,\n undefined,\n scopeRuntime,\n );\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.\\n\\n\" +\n \"METRICS CAPTURED per hook instance:\\n\" +\n \" useState update count, current value\\n\" +\n \" useCallback cache hit rate (stable reference %)\\n\" +\n \" useMemo cache hit rate (recompute %)\\n\" +\n \" useEffect execution count\\n\" +\n \" useRef current value snapshot\\n\\n\" +\n \"Examples:\\n\" +\n \" scope instrument hooks SearchInput\\n\" +\n ' scope instrument hooks SearchInput --props \\'{\"value\":\"hello\"}\\' --json\\n' +\n \" scope instrument hooks Dropdown --json | jq '.hooks[] | select(.type == \\\"useMemo\\\")' \",\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(`${formatScopeDiagnostic(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 — deprecated heuristic, always null in JSON output\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 { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport type { Command } from \"commander\";\nimport { Command as Cmd } from \"commander\";\nimport { chromium } from \"playwright\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { formatScopeDiagnostic } from \"../diagnostics.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 /** Deprecated heuristic field retained for compatibility; always null because it is not directly measured. */\n wastedRenders: number | null;\n /** Explicit machine-readable note that wasted render counts are not directly measured. */\n wastedRendersHeuristic: {\n measured: false;\n value: null;\n note: string;\n };\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 return {\n commitCount: totalCommits,\n uniqueComponents: uniqueNames.length,\n componentNames: uniqueNames,\n wastedRenders: null,\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 | null,\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 (\n wastedRenders !== null &&\n wastedRenders > 0 &&\n wastedRenders / Math.max(1, totalRenders) > 0.3\n ) {\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 the component harness with the Scope browser-entry embedded as\n // an inline <script> before the React bundle. This installs\n // __REACT_DEVTOOLS_GLOBAL_HOOK__ so the profiling setup script can\n // attach commit-counting listeners.\n const scopeRuntime = getBrowserEntryScript();\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n 1280,\n undefined,\n scopeRuntime,\n );\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 | null;\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 ?? null;\n\n const flags = analyzeProfileFlags(totalRenders, wastedRenders, timing, layoutShifts);\n\n return {\n component: componentName,\n totalRenders,\n uniqueComponents,\n wastedRenders,\n wastedRendersHeuristic: {\n measured: false,\n value: null,\n note: \"profile.wastedRenders is retained for compatibility but set to null because Scope does not directly measure wasted renders yet.\",\n },\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 performance profile for an interaction sequence.\\n\\n\" +\n \"PROFILE INCLUDES:\\n\" +\n \" renders total re-renders triggered by the interaction\\n\" +\n \" timing interaction start → paint time (ms)\\n\" +\n \" layoutShifts cumulative layout shift (CLS) score\\n\" +\n \" scriptTime JS execution time (ms)\\n\" +\n \" longTasks count of tasks >50ms\\n\\n\" +\n \"Examples:\\n\" +\n ' scope instrument profile Button --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'\\n' +\n ' scope instrument profile Modal --interaction \\'[{\"action\":\"click\",\"target\":\".open-btn\"}]\\' --json\\n' +\n \" scope instrument profile Form --json | jq '.summary.renderCount'\",\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(`${formatScopeDiagnostic(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 { Command } from \"commander\";\nimport { chromium } from \"playwright\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { formatScopeDiagnostic } from \"../diagnostics.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 removed — instrument tree uses a fresh browser context per call\n// so that addInitScript takes effect before any page content executes.)\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 // Use a fresh browser context per call so that addInitScript() installs the\n // Scope runtime BEFORE any page content executes. Persistent BrowserPool\n // pages have already navigated, so addInitScript on them only takes effect\n // on the NEXT navigation — meaning the hook would never be present.\n const browser = await chromium.launch({ headless: true });\n\n try {\n const context = await browser.newContext({\n viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },\n });\n const page = await context.newPage();\n\n // 1. Build the component HTML harness with the Scope browser-entry script\n // injected as an inline <script> BEFORE the React bundle. This ensures\n // the DevTools hook is installed before React initialises, regardless of\n // how Playwright implements setContent (addInitScript does NOT fire for\n // setContent because it uses document.open/write/close, not a navigation).\n const scopeRuntime = getBrowserEntryScript();\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n {},\n DEFAULT_VIEWPORT_WIDTH,\n undefined,\n scopeRuntime,\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 await browser.close();\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(\n \"Render a component and output the full instrumentation tree:\\n\" +\n \"DOM structure, computed styles per node, a11y roles, and React fibers.\\n\\n\" +\n \"OUTPUT STRUCTURE per node:\\n\" +\n \" tag / id / className DOM identity\\n\" +\n \" computedStyles resolved CSS properties\\n\" +\n \" a11y role, name, focusable\\n\" +\n \" children nested child nodes\\n\\n\" +\n \"Examples:\\n\" +\n \" scope instrument tree Card\\n\" +\n ' scope instrument tree Button --props \\'{\"variant\":\"primary\"}\\' --json\\n' +\n \" scope instrument tree Input --json | jq '.tree.computedStyles'\",\n )\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 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 process.stderr.write(`${formatScopeDiagnostic(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 — 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 { existsSync, mkdirSync, readFileSync, rmSync, 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 { formatScopeDiagnostic } from \"./diagnostics.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 { type RunSummaryFailure, writeRunSummary } from \"./run-summary.js\";\nimport { buildWrapperScript, loadScopeFileForComponent } from \"./scope-file.js\";\nimport { getCompiledCssForClasses, getElementClassNames, loadGlobalCss } from \"./tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Config loader for globalCSS\n// ---------------------------------------------------------------------------\n\ninterface RenderConfig {\n components?: {\n wrappers?: {\n globalCSS?: string[];\n };\n };\n icons?: {\n patterns?: string[];\n };\n}\n\nexport function loadGlobalCssFilesFromConfig(cwd: string): string[] {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) return [];\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as RenderConfig;\n return cfg.components?.wrappers?.globalCSS ?? [];\n } catch {\n return [];\n }\n}\n\nconst TAILWIND_CONFIG_FILES = [\n \"tailwind.config.js\",\n \"tailwind.config.cjs\",\n \"tailwind.config.mjs\",\n \"tailwind.config.ts\",\n \"postcss.config.js\",\n \"postcss.config.cjs\",\n \"postcss.config.mjs\",\n \"postcss.config.ts\",\n];\n\nexport function shouldWarnForMissingGlobalCss(cwd: string): boolean {\n if (TAILWIND_CONFIG_FILES.some((file) => existsSync(resolve(cwd, file)))) {\n return true;\n }\n\n const packageJsonPath = resolve(cwd, \"package.json\");\n if (!existsSync(packageJsonPath)) return false;\n\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n };\n return [pkg.dependencies, pkg.devDependencies].some(\n (deps) =>\n deps &&\n Object.keys(deps).some(\n (name) => name === \"tailwindcss\" || name.startsWith(\"@tailwindcss/\"),\n ),\n );\n } catch {\n return false;\n }\n}\n\nexport function loadIconPatternsFromConfig(cwd: string): string[] {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) return [];\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as RenderConfig;\n return cfg.icons?.patterns ?? [];\n } catch {\n return [];\n }\n}\n\nfunction matchGlob(pattern: string, value: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"§GLOBSTAR§\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/§GLOBSTAR§/g, \".*\");\n return new RegExp(`^${regexStr}$`, \"i\").test(value);\n}\n\nexport function isIconComponent(\n filePath: string,\n displayName: string,\n patterns: string[],\n): boolean {\n return (\n patterns.length > 0 && patterns.some((p) => matchGlob(p, filePath) || matchGlob(p, displayName))\n );\n}\n\ninterface AggregateRenderFailureJson {\n command: string;\n status: \"failed\";\n component: string;\n scenarioCount: number;\n failureCount: number;\n failures: RunSummaryFailure[];\n runSummaryPath: string;\n}\n\nfunction formatAggregateRenderFailureJson(\n componentName: string,\n failures: RunSummaryFailure[],\n scenarioCount: number,\n runSummaryPath: string,\n): AggregateRenderFailureJson {\n return {\n command: `scope render component ${componentName}`,\n status: \"failed\",\n component: componentName,\n scenarioCount,\n failureCount: failures.length,\n failures,\n runSummaryPath,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\nconst DEFAULT_OUTPUT_DIR = \".reactscope/renders\";\n\nfunction renderArtifactBaseName(componentName: string, scenarioName?: string): string {\n return scenarioName === undefined ? componentName : `${componentName}-${scenarioName}`;\n}\n\nfunction removeStaleRenderError(\n outputDir: string,\n componentName: string,\n scenarioName?: string,\n): void {\n const errorPath = resolve(\n outputDir,\n `${renderArtifactBaseName(componentName, scenarioName)}.error.json`,\n );\n if (existsSync(errorPath)) {\n rmSync(errorPath, { force: true });\n }\n}\n\nfunction writeRenderErrorArtifact(\n outputDir: string,\n failure: {\n component: string;\n scenario?: string;\n errorMessage: string;\n heuristicFlags: string[];\n propsAtCrash: unknown;\n },\n): string {\n const errPath = resolve(\n outputDir,\n `${renderArtifactBaseName(failure.component, failure.scenario)}.error.json`,\n );\n writeFileSync(\n errPath,\n JSON.stringify(\n {\n component: failure.component,\n scenario: failure.scenario,\n errorMessage: failure.errorMessage,\n heuristicFlags: failure.heuristicFlags,\n propsAtCrash: failure.propsAtCrash,\n },\n null,\n 2,\n ),\n );\n return errPath;\n}\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\nexport async 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 */\nexport function buildRenderer(\n filePath: string,\n componentName: string,\n viewportWidth: number,\n viewportHeight: number,\n globalCssFiles: string[] = [],\n projectCwd: string = process.cwd(),\n wrapperScript?: string,\n iconMode = false,\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 // Compile globalCSS (e.g. Tailwind) so styles are applied in the render\n const projectCss = await loadGlobalCss(globalCssFiles, projectCwd);\n const PAD = 8;\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n projectCss ?? undefined,\n wrapperScript,\n PAD,\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 =\n ((await page.evaluate(() => {\n const set = new Set<string>();\n document.querySelectorAll(\"[class]\").forEach((el) => {\n for (const c of getElementClassNames(el)) {\n set.add(c);\n }\n });\n return [...set];\n })) as string[] | null) ?? [];\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 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\n // Clamp to viewport dimensions to avoid Playwright out-of-bounds errors.\n const safeW = Math.min(rawW, viewportWidth - clipX);\n const safeH = Math.min(rawH, viewportHeight - clipY);\n\n // For icon components, extract SVG innerHTML instead of taking a screenshot\n let svgContent: string | undefined;\n let screenshot: Buffer;\n\n if (iconMode) {\n svgContent =\n ((await page.evaluate((sel: string) => {\n const root = document.querySelector(sel);\n const el = root?.firstElementChild;\n if (!el) return undefined;\n return el.outerHTML;\n }, \"[data-reactscope-root]\")) as string | undefined) ?? undefined;\n screenshot = Buffer.alloc(0);\n } else {\n screenshot = await page.screenshot({\n clip: { x: clipX, y: clipY, width: safeW, height: safeH },\n type: \"png\",\n });\n }\n\n // ----- DOM extraction + per-node computed styles -----\n const STYLE_PROPS = [\n \"display\",\n \"width\",\n \"height\",\n \"color\",\n \"backgroundColor\",\n \"fontSize\",\n \"fontFamily\",\n \"fontWeight\",\n \"lineHeight\",\n \"padding\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"margin\",\n \"marginTop\",\n \"marginRight\",\n \"marginBottom\",\n \"marginLeft\",\n \"gap\",\n \"borderRadius\",\n \"borderWidth\",\n \"borderColor\",\n \"borderStyle\",\n \"boxShadow\",\n \"opacity\",\n \"position\",\n \"flexDirection\",\n \"alignItems\",\n \"justifyContent\",\n \"overflow\",\n ];\n\n const _domResult = (await page.evaluate(\n (args: { sel: string; props: string[] }) => {\n let count = 0;\n const styles: Record<number, Record<string, string>> = {};\n\n function captureStyles(el: Element, id: number, propList: string[]) {\n const computed = window.getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of propList) {\n const val = (computed as unknown as Record<string, string>)[prop] ?? \"\";\n if (val && val !== \"none\" && val !== \"normal\" && val !== \"auto\") out[prop] = val;\n }\n styles[id] = out;\n }\n\n function walk(node: Element | ChildNode): {\n tag: string;\n attrs: Record<string, string>;\n text?: string;\n nodeId?: number;\n children: ReturnType<typeof walk>[];\n } {\n if (node.nodeType === Node.TEXT_NODE) {\n return {\n tag: \"#text\",\n attrs: {},\n text: node.textContent?.trim() ?? \"\",\n children: [],\n };\n }\n const el = node as Element;\n const id = count++;\n captureStyles(el, id, args.props);\n const attrs: Record<string, string> = {};\n for (const attr of Array.from(el.attributes)) {\n attrs[attr.name] = attr.value;\n }\n const children = Array.from(el.childNodes)\n .filter(\n (n) =>\n n.nodeType === Node.ELEMENT_NODE ||\n (n.nodeType === Node.TEXT_NODE && (n.textContent?.trim() ?? \"\").length > 0),\n )\n .map(walk);\n return { tag: el.tagName.toLowerCase(), attrs, nodeId: id, children };\n }\n\n const root = document.querySelector(args.sel);\n if (!root)\n return {\n tree: { tag: \"div\", attrs: {}, children: [] },\n elementCount: 0,\n nodeStyles: {},\n };\n return { tree: walk(root), elementCount: count, nodeStyles: styles };\n },\n { sel: \"[data-reactscope-root] > *\", props: STYLE_PROPS },\n )) as {\n tree: {\n tag: string;\n attrs: Record<string, string>;\n nodeId?: number;\n children: unknown[];\n text?: string;\n };\n elementCount: number;\n nodeStyles: Record<number, Record<string, string>>;\n } | null;\n\n const domTree = _domResult?.tree ?? { tag: \"div\", attrs: {}, children: [] };\n const elementCount = _domResult?.elementCount ?? 0;\n const nodeStyles = _domResult?.nodeStyles ?? {};\n\n // Build computedStyles map keyed by node path for the render JSON\n // Also keep the legacy root-child key for compliance engine compatibility\n const computedStyles: Record<string, Record<string, string>> = {};\n if (nodeStyles[0]) computedStyles[\"[data-reactscope-root] > *\"] = nodeStyles[0];\n // Embed all node styles keyed by nodeId for x-ray display\n for (const [nodeId, styles] of Object.entries(nodeStyles)) {\n computedStyles[`#node-${nodeId}`] = styles;\n }\n\n const dom: import(\"@agent-scope/render\").RenderResult[\"dom\"] = {\n tree: domTree as import(\"@agent-scope/render\").RenderResult[\"dom\"] extends {\n tree: infer T;\n }\n ? T\n : never,\n elementCount,\n boundingBox: {\n x: boundingBox.x,\n y: boundingBox.y,\n width: boundingBox.width,\n height: boundingBox.height,\n },\n };\n\n // ----- Accessibility snapshot -----\n const a11yInfo = ((await page.evaluate((sel: string) => {\n // Use firstElementChild to skip the reactscope wrapper and target the component root\n const wrapper = document.querySelector(sel);\n const el = wrapper?.firstElementChild ?? wrapper;\n if (!el) return { role: \"generic\", name: \"\" };\n return {\n role: el.getAttribute(\"role\") ?? el.tagName.toLowerCase() ?? \"generic\",\n name:\n el.getAttribute(\"aria-label\") ??\n el.getAttribute(\"aria-labelledby\") ??\n el.textContent?.trim().slice(0, 100) ??\n \"\",\n };\n }, \"[data-reactscope-root]\")) as { role: string; name: string } | null) ?? {\n role: \"generic\",\n name: \"\",\n };\n\n const imgViolations =\n ((await page.evaluate((sel: string) => {\n const container = document.querySelector(sel);\n if (!container) return [] as string[];\n const issues: string[] = [];\n container.querySelectorAll(\"img\").forEach((img) => {\n if (!img.alt) issues.push(\"Image missing accessible name\");\n });\n return issues;\n }, \"[data-reactscope-root]\")) as string[] | null) ?? [];\n\n const accessibility: import(\"@agent-scope/render\").RenderResult[\"accessibility\"] = {\n role: a11yInfo.role,\n name: a11yInfo.name,\n violations: imgViolations,\n };\n\n const renderResult: RenderResult & { svgContent?: string } = {\n screenshot,\n width: Math.round(safeW),\n height: Math.round(safeH),\n renderTimeMs,\n computedStyles,\n dom,\n accessibility,\n };\n if (iconMode && svgContent) {\n renderResult.svgContent = svgContent;\n }\n return renderResult;\n } finally {\n pool.release(slot);\n }\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Scenario map builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build the ordered map of { scenarioName → props } to render.\n *\n * Priority:\n * 1. `--scenario <name>` — render exactly one named scenario from scope file\n * 2. `--props <json>` — render once with those props (no scope file needed)\n * 3. scope file has named scenarios — render all of them\n * 4. No scope file / no scenarios — render once with empty props {}\n */\nfunction buildScenarioMap(\n opts: { props?: string; scenario?: string },\n scopeData: import(\"./scope-file.js\").ScopeFileData | null,\n): Record<string, Record<string, unknown>> {\n // --scenario: single named scenario\n if (opts.scenario !== undefined) {\n if (scopeData === null) {\n throw new Error(`--scenario \"${opts.scenario}\" requires a .scope file next to the component`);\n }\n const props = scopeData.scenarios[opts.scenario];\n if (props === undefined) {\n const available = Object.keys(scopeData.scenarios).join(\", \") || \"(none)\";\n throw new Error(\n `Scenario \"${opts.scenario}\" not found in scope file.\\nAvailable: ${available}`,\n );\n }\n return { [opts.scenario]: props };\n }\n\n // --props: explicit one-off render\n if (opts.props !== undefined) {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(opts.props) as Record<string, unknown>;\n } catch {\n throw new Error(`Invalid props JSON: ${opts.props}`);\n }\n return { __default__: parsed };\n }\n\n // Scope file with named scenarios → render all\n if (scopeData !== null && Object.keys(scopeData.scenarios).length > 0) {\n return scopeData.scenarios;\n }\n\n // Fallback: bare render with no props\n return { __default__: {} };\n}\n\n// ---------------------------------------------------------------------------\n// scope render <component>\n// ---------------------------------------------------------------------------\n\nfunction registerRenderSingle(renderCmd: Command): void {\n renderCmd\n .command(\"component <component>\", { isDefault: true })\n .description(\n \"Render one component to a PNG screenshot or JSON data object.\\n\\n\" +\n \"PROP SOURCES (in priority order):\\n\" +\n \" --scenario <name> named scenario from <ComponentName>.scope file\\n\" +\n \" --props <json> inline props JSON string\\n\" +\n \" (no flag) component rendered with all-default props\\n\\n\" +\n \"FORMAT DETECTION:\\n\" +\n \" --format png always write PNG\\n\" +\n \" --format json always write JSON render data\\n\" +\n \" auto (default) PNG when -o has .png extension or stdout is file;\\n\" +\n \" JSON when stdout is a pipe\\n\\n\" +\n \"Examples:\\n\" +\n \" scope render component Button\\n\" +\n ' scope render component Button --props \\'{\"variant\":\"primary\",\"size\":\"lg\"}\\'\\n' +\n \" scope render component Button --scenario hover-state -o button-hover.png\\n\" +\n \" scope render component Card --viewport 375x812 --theme dark\\n\" +\n \" scope render component Badge --format json | jq '.a11y'\",\n )\n .option(\"--props <json>\", 'Inline props JSON, e.g. \\'{\"variant\":\"primary\"}\\'')\n .option(\"--scenario <name>\", \"Run a named scenario from the component's .scope file\")\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 scenario?: 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 // Auto-inject sensible defaults for required props that were not supplied.\n // This prevents renders returning a tiny/empty component when required props\n // like `children` are omitted on the command line.\n if (descriptor.props !== undefined) {\n const propDefs = descriptor.props as Record<\n string,\n {\n type?: string;\n required?: boolean;\n values?: string[];\n default?: string;\n }\n >;\n for (const [propName, propDef] of Object.entries(propDefs)) {\n if (propName in props) continue; // already supplied\n if (!propDef.required && propDef.default !== undefined) continue; // has default\n // Inject placeholder for required props\n if (propDef.type === \"node\" || propDef.type === \"string\") {\n props[propName] = propName === \"children\" ? componentName : propName;\n } else if (propDef.type === \"union\" && propDef.values && propDef.values.length > 0) {\n props[propName] = propDef.values[0];\n } else if (propDef.type === \"boolean\") {\n props[propName] = false;\n } else if (propDef.type === \"number\") {\n props[propName] = 0;\n }\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 // Load scope file if present (provides scenarios + optional wrapper)\n const scopeData = await loadScopeFileForComponent(filePath);\n const wrapperScript =\n scopeData?.hasWrapper === true\n ? await buildWrapperScript(scopeData.filePath)\n : undefined;\n\n // Build the prop scenarios to render\n // Priority: --scenario flag > --props flag > scope file scenarios > bare render\n const scenarios = buildScenarioMap(opts, scopeData);\n\n // Build renderer\n const globalCssFiles = loadGlobalCssFilesFromConfig(rootDir);\n if (globalCssFiles.length === 0 && shouldWarnForMissingGlobalCss(rootDir)) {\n process.stderr.write(\n \"warning: No globalCSS files configured. Tailwind/CSS styles will not be applied to renders.\\n\" +\n \" Add `components.wrappers.globalCSS` to reactscope.config.json\\n\",\n );\n }\n const renderer = buildRenderer(\n filePath,\n componentName,\n width,\n height,\n globalCssFiles,\n rootDir,\n wrapperScript,\n );\n\n process.stderr.write(\n `Rendering ${componentName} [${descriptor.complexityClass}] at ${width}×${height}…\\n`,\n );\n\n const fmt = resolveSingleFormat(opts.format);\n const failures: RunSummaryFailure[] = [];\n const outputPaths: string[] = [];\n\n for (const [scenarioName, props] of Object.entries(scenarios)) {\n const isNamed = scenarioName !== \"__default__\";\n const label = isNamed ? `${componentName}:${scenarioName}` : componentName;\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 if (outcome.crashed) {\n process.stderr.write(`✗ ${label} 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 failures.push({\n component: componentName,\n scenario: isNamed ? scenarioName : undefined,\n stage: \"render\",\n message: outcome.error.message,\n outputPath: `${DEFAULT_OUTPUT_DIR}/${isNamed ? `${componentName}-${scenarioName}.error.json` : `${componentName}.error.json`}`,\n hints: outcome.error.heuristicFlags,\n });\n continue;\n }\n\n const result = outcome.result;\n const outFileName = isNamed\n ? `${componentName}-${scenarioName}.png`\n : `${componentName}.png`;\n\n if (opts.output !== undefined && !isNamed) {\n // Explicit --output only applies to single (non-scenario) renders\n const outPath = resolve(process.cwd(), opts.output);\n writeFileSync(outPath, result.screenshot);\n outputPaths.push(outPath);\n process.stdout.write(\n `✓ ${label} → ${opts.output} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n } else if (fmt === \"json\") {\n const json = formatRenderJson(label, props, result);\n process.stdout.write(`${JSON.stringify(json, null, 2)}\\n`);\n } else {\n // file / png / default: write to .reactscope/renders/\n const dir = resolve(process.cwd(), DEFAULT_OUTPUT_DIR);\n mkdirSync(dir, { recursive: true });\n const outPath = resolve(dir, outFileName);\n writeFileSync(outPath, result.screenshot);\n const relPath = `${DEFAULT_OUTPUT_DIR}/${outFileName}`;\n outputPaths.push(relPath);\n process.stdout.write(\n `✓ ${label} → ${relPath} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n }\n }\n\n const summaryPath = writeRunSummary({\n command: `scope render ${componentName}`,\n status: failures.length > 0 ? \"failed\" : \"success\",\n outputPaths,\n failures,\n });\n process.stderr.write(`[scope/render] Run summary written to ${summaryPath}\\n`);\n\n if (fmt === \"json\" && failures.length > 0) {\n const aggregateFailure = formatAggregateRenderFailureJson(\n componentName,\n failures,\n Object.keys(scenarios).length,\n summaryPath,\n );\n process.stderr.write(`${JSON.stringify(aggregateFailure, null, 2)}\\n`);\n }\n\n await shutdownPool();\n if (failures.length > 0) process.exit(1);\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`${formatScopeDiagnostic(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(\n \"Render every combination of values across one or more prop axes.\\n\" +\n \"Produces a matrix of screenshots — one cell per combination.\\n\\n\" +\n \"AXES FORMAT (two equivalent forms):\\n\" +\n ' Short: --axes \"variant:primary,ghost size:sm,md,lg\"\\n' +\n ' JSON: --axes {\"variant\":[\"primary\",\"ghost\"],\"size\":[\"sm\",\"md\",\"lg\"]}\\n\\n' +\n \"COMPOSITION CONTEXTS (--contexts):\\n\" +\n \" Test component in different layout environments.\\n\" +\n \" Available IDs: centered, rtl, sidebar, dark-bg, light-bg\\n\" +\n \" (Define custom contexts in reactscope.config.json)\\n\\n\" +\n \"STRESS PRESETS (--stress):\\n\" +\n \" Inject adversarial content to test edge cases.\\n\" +\n \" Available IDs: text.long, text.unicode, text.empty\\n\\n\" +\n \"Examples:\\n\" +\n ' scope render matrix Button --axes \"variant:primary,ghost,destructive\"\\n' +\n ' scope render matrix Button --axes \"variant:primary,ghost size:sm,lg\" --sprite matrix.png\\n' +\n ' scope render matrix Badge --axes \"type:info,warn,error\" --contexts centered,rtl\\n' +\n \" scope render matrix Input --stress text.long,text.unicode --format json\",\n )\n .option(\n \"--axes <spec>\",\n 'Axis definitions: key:v1,v2 space-separated OR JSON object e.g. \\'variant:primary,ghost size:sm,lg\\' or \\'{\"variant\":[\"primary\",\"ghost\"],\"size\":[\"sm\",\"lg\"]}\\'',\n )\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 matrixCssFiles = loadGlobalCssFilesFromConfig(rootDir);\n const renderer = buildRenderer(\n filePath,\n componentName,\n width,\n height,\n matrixCssFiles,\n rootDir,\n );\n\n // Build axes\n const axes: MatrixAxis[] = [];\n\n if (opts.axes !== undefined) {\n const axesRaw = opts.axes.trim();\n // Support two formats:\n // 1. JSON object: {\"variant\":[\"primary\",\"ghost\"],\"size\":[\"sm\",\"lg\"]}\n // 2. Space-separated key:v1,v2 pairs: variant:primary,ghost size:sm,lg\n if (axesRaw.startsWith(\"{\")) {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(axesRaw) as Record<string, unknown>;\n } catch {\n throw new Error(`Invalid JSON in --axes: ${axesRaw}`);\n }\n for (const [name, vals] of Object.entries(parsed)) {\n if (!Array.isArray(vals)) {\n throw new Error(`Axis \"${name}\" must be an array of values in JSON format`);\n }\n axes.push({ name, values: (vals as unknown[]).map(String) });\n }\n } else {\n // Parse \"variant:primary,secondary size:sm,md,lg\"\n const axisSpecs = axesRaw.split(/\\s+/);\n for (const spec of axisSpecs) {\n const colonIdx = spec.indexOf(\":\");\n if (colonIdx < 0) {\n throw new Error(\n `Invalid axis spec \"${spec}\". Expected format: name:val1,val2,...`,\n );\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\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(`${formatScopeDiagnostic(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(\n \"Render every component in the manifest and write to .reactscope/renders/.\\n\\n\" +\n \"Also emits .reactscope/compliance-styles.json (computed CSS class→value map)\\n\" +\n \"which is required by `scope tokens compliance`.\\n\\n\" +\n \"SCENARIO SELECTION:\\n\" +\n \" Each component is rendered using its default scenario from its .scope file\\n\" +\n \" if one exists, otherwise with all-default props.\\n\\n\" +\n \"MATRIX AUTO-DETECTION:\\n\" +\n \" If a component has a .scope file with a matrix block, render all\\n\" +\n \" will render the matrix cells in addition to the default screenshot.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope render all\\n\" +\n \" scope render all --concurrency 8\\n\" +\n \" scope render all --format json --output-dir .reactscope/renders\\n\" +\n \" scope render all --manifest ./custom/manifest.json\",\n )\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 const summaryPath = writeRunSummary({\n command: \"scope render all\",\n status: \"failed\",\n outputPaths: [],\n failures: [\n {\n component: \"*\",\n stage: \"render\",\n message:\n \"No components found in manifest; refusing to report a false-green batch render.\",\n },\n ],\n });\n process.stderr.write(`[scope/render] Run summary written to ${summaryPath}\\n`);\n process.exit(1);\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 const failures: RunSummaryFailure[] = [];\n const outputPaths: string[] = [];\n\n // Accumulate compliance styles (component → categorized CSS)\n const complianceStylesMap: Record<\n string,\n {\n colors: Record<string, string>;\n spacing: Record<string, string>;\n typography: Record<string, string>;\n borders: Record<string, string>;\n shadows: Record<string, string>;\n }\n > = {};\n\n let completed = 0;\n const iconPatterns = loadIconPatternsFromConfig(process.cwd());\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 allCssFiles = loadGlobalCssFilesFromConfig(process.cwd());\n const isIcon = isIconComponent(descriptor.filePath, name, iconPatterns);\n\n // Load scope file to get realistic props — prefer 'default' scenario,\n // otherwise use the first defined scenario. Fall back to {} if no scope file.\n const scopeData = await loadScopeFileForComponent(filePath);\n const scenarioEntries = scopeData !== null ? Object.entries(scopeData.scenarios) : [];\n const defaultEntry =\n scenarioEntries.find(([k]) => k === \"default\") ?? scenarioEntries[0];\n const renderProps = defaultEntry !== undefined ? defaultEntry[1] : {};\n const wrapperScript =\n scopeData?.hasWrapper === true\n ? await buildWrapperScript(scopeData.filePath)\n : undefined;\n\n const renderer = buildRenderer(\n filePath,\n name,\n 375,\n 812,\n allCssFiles,\n process.cwd(),\n wrapperScript,\n isIcon,\n );\n\n const outcome = await safeRender(\n () => renderer.renderCell(renderProps, descriptor.complexityClass),\n {\n props: renderProps,\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 = writeRenderErrorArtifact(outputDir, {\n component: name,\n errorMessage: outcome.error.message,\n heuristicFlags: outcome.error.heuristicFlags,\n propsAtCrash: outcome.error.propsAtCrash,\n });\n failures.push({\n component: name,\n stage: \"render\",\n message: outcome.error.message,\n outputPath: errPath,\n hints: outcome.error.heuristicFlags,\n });\n outputPaths.push(errPath);\n return;\n }\n\n const result = outcome.result;\n results.push({ name, renderTimeMs: result.renderTimeMs, success: true });\n removeStaleRenderError(outputDir, name);\n\n // Write PNG (skip for icon components — they use inline SVG)\n if (!isIcon) {\n const pngPath = resolve(outputDir, `${name}.png`);\n writeFileSync(pngPath, result.screenshot);\n outputPaths.push(pngPath);\n }\n\n // Write JSON — for icons, inject svgContent from the extended result\n const jsonPath = resolve(outputDir, `${name}.json`);\n const renderJson = formatRenderJson(name, renderProps, result) as unknown as Record<\n string,\n unknown\n >;\n const extResult = result as RenderResult & { svgContent?: string };\n if (isIcon && extResult.svgContent) {\n renderJson.svgContent = extResult.svgContent;\n delete renderJson.screenshot;\n }\n writeFileSync(jsonPath, JSON.stringify(renderJson, null, 2));\n outputPaths.push(jsonPath);\n\n // Extract computed styles into compliance-styles format\n const rawStyles = result.computedStyles[\"[data-reactscope-root] > *\"] ?? {};\n const compStyles = {\n colors: {} as Record<string, string>,\n spacing: {} as Record<string, string>,\n typography: {} as Record<string, string>,\n borders: {} as Record<string, string>,\n shadows: {} as Record<string, string>,\n };\n for (const [prop, val] of Object.entries(rawStyles)) {\n if (!val || val === \"none\" || val === \"\") continue;\n const lower = prop.toLowerCase();\n if (lower.includes(\"color\") || lower.includes(\"background\")) {\n compStyles.colors[prop] = val;\n } else if (\n lower.includes(\"padding\") ||\n lower.includes(\"margin\") ||\n lower.includes(\"gap\") ||\n lower.includes(\"width\") ||\n lower.includes(\"height\")\n ) {\n compStyles.spacing[prop] = val;\n } else if (\n lower.includes(\"font\") ||\n lower.includes(\"lineheight\") ||\n lower.includes(\"letterspacing\") ||\n lower.includes(\"texttransform\")\n ) {\n compStyles.typography[prop] = val;\n } else if (\n lower.includes(\"border\") ||\n lower.includes(\"radius\") ||\n lower.includes(\"outline\")\n ) {\n compStyles.borders[prop] = val;\n } else if (lower.includes(\"shadow\")) {\n compStyles.shadows[prop] = val;\n }\n }\n complianceStylesMap[name] = compStyles;\n\n // If scope file has 2+ scenarios, run matrix render and merge cells into JSON\n if (scopeData !== null && Object.keys(scopeData.scenarios).length >= 2) {\n try {\n const scenarioEntries = Object.entries(scopeData.scenarios);\n const scenarioAxis: MatrixAxis = {\n name: \"scenario\",\n values: scenarioEntries.map(([k]) => k),\n };\n const scenarioPropsMap = Object.fromEntries(scenarioEntries);\n const matrixRenderer = buildRenderer(\n filePath,\n name,\n 375,\n 812,\n allCssFiles,\n process.cwd(),\n wrapperScript,\n );\n const wrappedRenderer: MatrixRenderer & { _satori: typeof matrixRenderer._satori } =\n {\n _satori: matrixRenderer._satori,\n async renderCell(\n props: Record<string, unknown>,\n cc?: import(\"@agent-scope/manifest\").ComplexityClass,\n ) {\n const scenarioName = props.scenario as string | undefined;\n const realProps =\n scenarioName !== undefined\n ? (scenarioPropsMap[scenarioName] ?? props)\n : props;\n return matrixRenderer.renderCell(realProps, cc ?? \"simple\");\n },\n };\n const matrix = new RenderMatrix(wrappedRenderer, [scenarioAxis], {\n concurrency: 2,\n });\n const matrixResult: MatrixResult = await matrix.render();\n const matrixCells = matrixResult.cells.map((cell) => {\n const scenarioName = scenarioEntries[cell.axisIndices[0] ?? 0]?.[0] ?? \"\";\n const artifactBaseName = renderArtifactBaseName(name, scenarioName);\n const scenarioPngPath = resolve(outputDir, `${artifactBaseName}.png`);\n const scenarioJsonPath = resolve(outputDir, `${artifactBaseName}.json`);\n if (!isIcon) {\n writeFileSync(scenarioPngPath, cell.result.screenshot);\n outputPaths.push(scenarioPngPath);\n }\n const scenarioJson = formatRenderJson(\n `${name}:${scenarioName}`,\n scenarioPropsMap[scenarioName] ?? {},\n cell.result,\n ) as unknown as Record<string, unknown>;\n writeFileSync(scenarioJsonPath, JSON.stringify(scenarioJson, null, 2));\n outputPaths.push(scenarioJsonPath);\n removeStaleRenderError(outputDir, name, scenarioName);\n return {\n axisValues: [scenarioName],\n scenario: scenarioName,\n outputPath: scenarioJsonPath,\n screenshotPath: isIcon ? undefined : scenarioPngPath,\n screenshot: cell.result.screenshot.toString(\"base64\"),\n width: cell.result.width,\n height: cell.result.height,\n renderTimeMs: cell.result.renderTimeMs,\n };\n });\n const existingJson = JSON.parse(readFileSync(jsonPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n existingJson.cells = matrixCells;\n existingJson.axisLabels = [scenarioAxis.values];\n writeFileSync(jsonPath, JSON.stringify(existingJson, null, 2));\n } catch (matrixErr) {\n const message = matrixErr instanceof Error ? matrixErr.message : String(matrixErr);\n process.stderr.write(` [warn] Matrix render for ${name} failed: ${message}\\n`);\n failures.push({\n component: name,\n stage: \"matrix\",\n message,\n outputPath: jsonPath,\n });\n }\n }\n\n // On TTY, print a per-component one-liner to stdout\n if (isTTY()) {\n const suffix = isIcon ? \" [icon/svg]\" : \"\";\n process.stdout.write(\n `✓ ${name} → ${opts.outputDir}/${name}${isIcon ? \".json\" : \".png\"} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)${suffix}\\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 // Write compliance-styles.json for use by `scope tokens compliance`\n const compStylesPath = resolve(\n resolve(process.cwd(), opts.outputDir),\n \"..\",\n \"compliance-styles.json\",\n );\n writeFileSync(compStylesPath, JSON.stringify(complianceStylesMap, null, 2));\n outputPaths.push(compStylesPath);\n process.stderr.write(`[scope/render] ✓ Wrote compliance-styles.json\\n`);\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\n const summaryPath = writeRunSummary({\n command: \"scope render all\",\n status: failures.length > 0 ? \"failed\" : \"success\",\n outputPaths,\n failures,\n });\n process.stderr.write(`[scope/render] Run summary written to ${summaryPath}\\n`);\n\n if (failures.length > 0) process.exit(1);\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`${formatScopeDiagnostic(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 React components to PNG screenshots or JSON render data.\\n\\n\" +\n \"Scope uses two render engines depending on component complexity:\\n\" +\n \" Satori — fast SVG→PNG renderer for simple/presentational components\\n\" +\n \" BrowserPool — Playwright headless browser for complex components\\n\" +\n \" (context providers, hooks, async, global CSS)\\n\\n\" +\n \"PREREQUISITES:\\n\" +\n \" 1. reactscope.config.json exists (scope init)\\n\" +\n \" 2. manifest.json is up to date (scope manifest generate)\\n\" +\n \" 3. If using globalCSS: Tailwind/PostCSS is configured in the project\\n\\n\" +\n \"OUTPUTS (written to .reactscope/renders/<ComponentName>/):\\n\" +\n \" screenshot.png retina-quality PNG (2× physical pixels, displayed at 1×)\\n\" +\n \" render.json props, dimensions, DOM snapshot, a11y, computed styles\\n\" +\n \" compliance-styles.json (render all only) — token matching input\\n\\n\" +\n \"Examples:\\n\" +\n \" scope render component Button\\n\" +\n ' scope render matrix Button --axes \"variant:primary,ghost size:sm,md,lg\"\\n' +\n \" scope render all\\n\" +\n \" scope render all --format json --output-dir ./out\",\n );\n\n registerRenderSingle(renderCmd);\n registerRenderMatrix(renderCmd);\n registerRenderAll(renderCmd);\n\n return renderCmd;\n}\n","import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nexport type RunSummaryStatus = \"success\" | \"failed\";\n\nexport interface RunSummaryFailure {\n component: string;\n scenario?: string;\n stage: \"render\" | \"matrix\" | \"playground\" | \"compliance\" | \"site\";\n message: string;\n outputPath?: string;\n hints?: string[];\n}\n\nexport interface RunSummary {\n command: string;\n status: RunSummaryStatus;\n generatedAt: string;\n outputPaths: string[];\n compliance?: {\n auditedProperties: number;\n onSystemProperties: number;\n offSystemProperties: number;\n score: number;\n threshold?: number;\n };\n failures: RunSummaryFailure[];\n nextActions: string[];\n}\n\nexport const RUN_SUMMARY_PATH = \".reactscope/run-summary.json\";\n\nexport function buildNextActions(summary: Pick<RunSummary, \"failures\" | \"compliance\">): string[] {\n const actions = new Set<string>();\n\n for (const failure of summary.failures) {\n if (failure.stage === \"render\" || failure.stage === \"matrix\") {\n actions.add(\n `Inspect ${failure.outputPath ?? \".reactscope/renders\"} and add/fix ${failure.component}.scope.tsx scenarios or wrappers.`,\n );\n } else if (failure.stage === \"playground\") {\n actions.add(\n `Open the generated component page and inspect the playground bundling error for ${failure.component}.`,\n );\n } else if (failure.stage === \"compliance\") {\n actions.add(\n \"Run `scope render all` first, then inspect .reactscope/compliance-styles.json and reactscope.tokens.json.\",\n );\n } else if (failure.stage === \"site\") {\n actions.add(\n \"Inspect .reactscope/site output and rerun `scope site build` after fixing render/playground failures.\",\n );\n }\n }\n\n if (summary.compliance && summary.compliance.auditedProperties === 0) {\n actions.add(\n \"No CSS properties were audited. Verify renders produced computed styles and your token file contains matching token categories.\",\n );\n } else if (\n summary.compliance &&\n summary.compliance.threshold !== undefined &&\n summary.compliance.score < summary.compliance.threshold\n ) {\n actions.add(\n \"Inspect .reactscope/compliance-report.json for off-system values and update tokens or component styles.\",\n );\n }\n\n if (actions.size === 0) {\n actions.add(\"No follow-up needed. Outputs are ready for inspection.\");\n }\n\n return [...actions];\n}\n\nexport function writeRunSummary(\n summary: Omit<RunSummary, \"generatedAt\" | \"nextActions\"> & {\n generatedAt?: string;\n nextActions?: string[];\n },\n summaryPath = RUN_SUMMARY_PATH,\n): string {\n const outputPath = resolve(process.cwd(), summaryPath);\n mkdirSync(dirname(outputPath), { recursive: true });\n const payload: RunSummary = {\n ...summary,\n generatedAt: summary.generatedAt ?? new Date().toISOString(),\n nextActions: summary.nextActions ?? buildNextActions(summary),\n };\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf-8\");\n return outputPath;\n}\n\nexport function readRunSummary(summaryPath = RUN_SUMMARY_PATH): RunSummary | null {\n try {\n return JSON.parse(readFileSync(resolve(process.cwd(), summaryPath), \"utf-8\")) as RunSummary;\n } catch {\n return null;\n }\n}\n","/**\n * scope-file.ts\n *\n * Discovers, bundles, and extracts data from `.scope.ts(x)` / `.scope.js(x)` files.\n *\n * A scope file lives next to its component and exports:\n *\n * - `scenarios` — Record<string, Record<string, unknown>>\n * Named prop sets for the component. Each key becomes a named scenario\n * that can be passed to `scope render <Component> --scenario <name>`.\n * Export either `export const scenarios = { ... }` or\n * `export default { scenarios: { ... } }`.\n *\n * - `wrapper` (optional) — React functional component ({ children }) => JSX\n * A component-specific provider wrapper injected around the rendered\n * component. Takes priority over any global provider config. Export either\n * `export const wrapper = ...` or `export default { wrapper, scenarios }`.\n *\n * Example (Button.scope.tsx):\n *\n * import { ThemeProvider } from '../providers/ThemeProvider'\n *\n * export const wrapper = ({ children }) => (\n * <ThemeProvider theme=\"dark\">{children}</ThemeProvider>\n * )\n *\n * export const scenarios = {\n * default: { variant: 'primary', children: 'Submit' },\n * danger: { variant: 'danger', children: 'Delete' },\n * disabled: { variant: 'primary', children: 'Submit', disabled: true },\n * }\n *\n * Design\n * ------\n * 1. Discovery: look for `<stem>.scope.tsx|ts|jsx|js` next to `<stem>.tsx|ts|jsx|js`.\n * 2. Bundling: esbuild bundles the scope file to a CJS bundle (no externals),\n * written to a temp file, then `require()`d at runtime to extract exports.\n * 3. Extraction: pull `scenarios` (plain object) and `hasWrapper` flag.\n * The wrapper itself is only meaningful inside the browser harness — we\n * don't need the actual function in Node, just its source so we can\n * re-bundle it into the harness.\n */\n\nimport { existsSync, mkdirSync, rmSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport * as esbuild from \"esbuild\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * The extracted data from a `.scope.ts(x)` file.\n */\nexport interface ScopeFileData {\n /** Absolute path to the discovered scope file. */\n filePath: string;\n /**\n * Named scenarios — Record<name, props>.\n * Empty object if the scope file does not export `scenarios`.\n */\n scenarios: Record<string, Record<string, unknown>>;\n /**\n * Whether the scope file exports a `wrapper` component.\n * When true, the wrapper is re-bundled into the render harness.\n */\n hasWrapper: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Discovery\n// ---------------------------------------------------------------------------\n\n/** Candidate scope file extensions in priority order. */\nconst SCOPE_EXTENSIONS = [\".scope.tsx\", \".scope.ts\", \".scope.jsx\", \".scope.js\"];\n\n/**\n * Find the scope file for a given component file path.\n * Returns the absolute path if found, otherwise null.\n *\n * @param componentFilePath - Absolute path to the component source file.\n */\nexport function findScopeFile(componentFilePath: string): string | null {\n const dir = dirname(componentFilePath);\n // Strip the component's own extension to get the stem\n const stem = componentFilePath.replace(/\\.(tsx?|jsx?)$/, \"\");\n const baseName = stem.slice(dir.length + 1); // e.g. \"Button\"\n\n for (const ext of SCOPE_EXTENSIONS) {\n const candidate = join(dir, `${baseName}${ext}`);\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Load + extract\n// ---------------------------------------------------------------------------\n\n/**\n * Load a scope file by path, bundle it with esbuild (CJS), require() it,\n * and return the extracted data.\n *\n * @param scopeFilePath - Absolute path to the `.scope.ts(x)` file.\n */\nexport async function loadScopeFile(scopeFilePath: string): Promise<ScopeFileData> {\n const tmpDir = join(tmpdir(), `scope-file-${Date.now()}-${Math.random().toString(36).slice(2)}`);\n mkdirSync(tmpDir, { recursive: true });\n const outFile = join(tmpDir, \"scope-file.cjs\");\n\n try {\n // Bundle to CJS so we can require() it in Node\n const result = await esbuild.build({\n entryPoints: [scopeFilePath],\n bundle: true,\n format: \"cjs\",\n platform: \"node\",\n target: \"node18\",\n outfile: outFile,\n write: true,\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n // Externalize React — we don't need to execute JSX, just extract plain data\n external: [\"react\", \"react-dom\", \"react/jsx-runtime\"],\n define: {\n \"process.env.NODE_ENV\": '\"development\"',\n },\n logLevel: \"silent\",\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(`Failed to bundle scope file ${scopeFilePath}:\\n${msg}`);\n }\n\n // require() the CJS bundle\n const req = createRequire(import.meta.url);\n // Clear require cache to avoid stale data across calls\n delete req.cache[resolve(outFile)];\n // biome-ignore lint/suspicious/noExplicitAny: dynamic require\n const mod = req(outFile) as any;\n\n // Extract scenarios — must be a plain object mapping string keys to prop objects\n const scenarios = extractScenarios(mod, scopeFilePath);\n const hasWrapper =\n typeof mod.wrapper === \"function\" || typeof mod.default?.wrapper === \"function\";\n\n return { filePath: scopeFilePath, scenarios, hasWrapper };\n } finally {\n // Clean up temp bundle\n try {\n rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // best-effort cleanup\n }\n }\n}\n\n/**\n * Convenience: find + load the scope file for a component.\n * Returns null if no scope file exists.\n */\nexport async function loadScopeFileForComponent(\n componentFilePath: string,\n): Promise<ScopeFileData | null> {\n const scopeFilePath = findScopeFile(componentFilePath);\n if (scopeFilePath === null) return null;\n return loadScopeFile(scopeFilePath);\n}\n\n// ---------------------------------------------------------------------------\n// Scenario extraction helpers\n// ---------------------------------------------------------------------------\n\nfunction extractScenarios(\n mod: Record<string, unknown>,\n filePath: string,\n): Record<string, Record<string, unknown>> {\n // Support both named export `scenarios` and default export `{ scenarios }`\n const raw = mod.scenarios ?? (mod.default as Record<string, unknown> | undefined)?.scenarios;\n\n if (raw === undefined) return {};\n\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n console.warn(`[scope] ${filePath}: \"scenarios\" export is not a plain object — ignoring.`);\n return {};\n }\n\n const result: Record<string, Record<string, unknown>> = {};\n for (const [name, props] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof props !== \"object\" || props === null || Array.isArray(props)) {\n console.warn(`[scope] ${filePath}: scenario \"${name}\" is not a plain object — skipping.`);\n continue;\n }\n result[name] = props as Record<string, unknown>;\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Wrapper source extraction (for harness injection)\n// ---------------------------------------------------------------------------\n\n/**\n * Build the scope file's wrapper export as a self-contained IIFE-compatible\n * script chunk that exposes `window.__SCOPE_WRAPPER__`.\n *\n * Called by component-bundler when the scope file has `hasWrapper: true`,\n * so the render harness can wrap the component before mounting.\n *\n * @param scopeFilePath - Absolute path to the `.scope.ts(x)` file.\n */\nexport async function buildWrapperScript(scopeFilePath: string): Promise<string> {\n const wrapperEntry = /* ts */ `\nimport * as __scopeMod from ${JSON.stringify(scopeFilePath)};\n// Expose the wrapper on window so the harness can access it\nvar wrapper =\n __scopeMod.wrapper ??\n (__scopeMod.default && __scopeMod.default.wrapper) ??\n null;\nwindow.__SCOPE_WRAPPER__ = wrapper;\n`;\n\n const result = await esbuild.build({\n stdin: {\n contents: wrapperEntry,\n resolveDir: dirname(scopeFilePath),\n loader: \"tsx\",\n sourcefile: \"__scope_wrapper_entry__.tsx\",\n },\n bundle: true,\n format: \"iife\",\n platform: \"browser\",\n target: \"es2020\",\n write: false,\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n external: [],\n define: {\n \"process.env.NODE_ENV\": '\"development\"',\n global: \"globalThis\",\n },\n logLevel: \"silent\",\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(`Failed to build wrapper script from ${scopeFilePath}:\\n${msg}`);\n }\n\n return result.outputFiles?.[0]?.text ?? \"\";\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, getElementClassNames } 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 PAD = 24;\n const pool = await getPool(viewportWidth, viewportHeight);\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n undefined,\n undefined,\n PAD,\n );\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 getElementClassNames(el)) {\n 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 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 * @agent-scope/cli — report diff command\n *\n * Implements `scope report diff`, which compares the current component library\n * state against a previously captured baseline snapshot.\n *\n * Diff analysis covers three dimensions:\n * 1. **Components** — added, removed, renamed (by displayName)\n * 2. **Compliance** — per-component token compliance delta (aggregateCompliance %)\n * 3. **Renders** — visual diff metadata (size changes, render time delta)\n *\n * The command re-renders all components using the same pipeline as\n * `scope report baseline`, then compares against the persisted baseline.\n *\n * Output (stdout):\n * - Human-readable summary table (TTY) or JSON (`--json`)\n *\n * Exit codes:\n * 0 — diff clean (no regressions beyond threshold)\n * 1 — regressions detected (use `--fail-on-regression` to trigger; default: 1 when any found)\n * 2 — operational error (missing baseline, render failure, etc.)\n *\n * Diff result file (optional):\n * Written to `--output <path>` when provided (JSON, always).\n *\n * Snapshot layout (baseline):\n * ```\n * .reactscope/baseline/\n * ├── manifest.json # component registry at baseline time\n * ├── renders/\n * │ ├── Button.json # structured render output\n * │ └── Button.png # screenshot\n * └── compliance.json # BatchReport\n * ```\n */\n\nimport { existsSync, readFileSync, 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 } 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 { renderProgressBar } from \"../render-formatter.js\";\nimport { getCompiledCssForClasses, getElementClassNames } from \"../tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_BASELINE_DIR = \".reactscope/baseline\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Status of a single component in the diff */\nexport type ComponentDiffStatus =\n | \"added\" // present in current, absent from baseline\n | \"removed\" // present in baseline, absent from current\n | \"unchanged\" // present in both, no meaningful change\n | \"compliance_regressed\" // compliance score dropped below threshold\n | \"compliance_improved\" // compliance score improved\n | \"size_changed\"; // render dimensions changed materially\n\n/** Per-component diff entry */\nexport interface ComponentDiffEntry {\n /** Component display name */\n name: string;\n /** Diff classification */\n status: ComponentDiffStatus;\n /** Compliance score in baseline (0–1). null when component was not in baseline */\n baselineCompliance: number | null;\n /** Compliance score in current run (0–1). null when component failed to render */\n currentCompliance: number | null;\n /** Compliance delta (current − baseline). null when either side is missing */\n complianceDelta: number | null;\n /** Baseline render dimensions */\n baselineDimensions: { width: number; height: number } | null;\n /** Current render dimensions */\n currentDimensions: { width: number; height: number } | null;\n /** Render time in ms for the current run. null on failure */\n renderTimeMs: number | null;\n /** true when the component failed to render in the current run */\n renderFailed: boolean;\n}\n\n/** Top-level diff result */\nexport interface DiffResult {\n /** ISO timestamp of when this diff was computed */\n diffedAt: string;\n /** Absolute path to the baseline that was compared against */\n baselineDir: string;\n /** Overall summary counts */\n summary: {\n total: number;\n added: number;\n removed: number;\n unchanged: number;\n complianceRegressed: number;\n complianceImproved: number;\n sizeChanged: number;\n renderFailed: number;\n };\n /** Per-component details */\n components: ComponentDiffEntry[];\n /** Aggregate compliance in baseline (0–1) */\n baselineAggregateCompliance: number;\n /** Aggregate compliance in current run (0–1) */\n currentAggregateCompliance: number;\n /** Whether any regressions were detected */\n hasRegressions: boolean;\n /** Wall-clock time for the diff run in ms */\n wallClockMs: number;\n}\n\n/** Options for runDiff() */\nexport interface DiffOptions {\n /** Baseline directory to compare against. Default: .reactscope/baseline */\n baselineDir?: string;\n /** Tokens to use for current compliance audit. Default: none */\n complianceTokens?: ConstructorParameters<typeof TokenResolver>[0];\n /** Glob to filter which components to diff. Default: all */\n componentsGlob?: string;\n /** Path to manifest.json to use instead of regenerating. Default: regenerate */\n manifestPath?: string;\n /** Viewport width. Default: 375 */\n viewportWidth?: number;\n /** Viewport height. Default: 812 */\n viewportHeight?: number;\n /**\n * Minimum compliance delta to classify a component as \"regressed\".\n * E.g. 0.05 = 5 percentage points drop triggers a regression flag.\n * Default: 0.01\n */\n regressionThreshold?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Baseline loaders\n// ---------------------------------------------------------------------------\n\ninterface BaselineCompliance {\n components: Record<\n string,\n {\n aggregateCompliance: number;\n totalProperties: number;\n totalOnSystem: number;\n totalOffSystem: number;\n auditedAt: string;\n }\n >;\n aggregateCompliance: number;\n}\n\ninterface BaselineRenderJson {\n component: string;\n width: number;\n height: number;\n renderTimeMs: number;\n}\n\n/**\n * Load the baseline compliance.json from the baseline directory.\n * Returns null when missing (e.g. baseline was created without compliance).\n */\nfunction loadBaselineCompliance(baselineDir: string): BaselineCompliance | null {\n const compliancePath = resolve(baselineDir, \"compliance.json\");\n if (!existsSync(compliancePath)) return null;\n\n const raw = JSON.parse(readFileSync(compliancePath, \"utf-8\")) as {\n components: BaselineCompliance[\"components\"];\n aggregateCompliance: number;\n };\n\n return raw as BaselineCompliance;\n}\n\n/**\n * Load baseline render metadata for a component.\n * Returns null when the component's .json file is absent (crashed or not in baseline).\n */\nfunction loadBaselineRenderJson(\n baselineDir: string,\n componentName: string,\n): BaselineRenderJson | null {\n const jsonPath = resolve(baselineDir, \"renders\", `${componentName}.json`);\n if (!existsSync(jsonPath)) return null;\n return JSON.parse(readFileSync(jsonPath, \"utf-8\")) as BaselineRenderJson;\n}\n\n// ---------------------------------------------------------------------------\n// Browser pool — lazy singleton\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 (shared with baseline — same pipeline)\n// ---------------------------------------------------------------------------\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 PAD = 24;\n const pool = await getPool(viewportWidth, viewportHeight);\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n undefined,\n undefined,\n PAD,\n );\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 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 getElementClassNames(el)) {\n 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 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 extraction (matches baseline.ts)\n// ---------------------------------------------------------------------------\n\nfunction extractComputedStyles(\n computedStylesRaw: Record<string, Record<string, string>>,\n): import(\"@agent-scope/tokens\").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// Diff classification\n// ---------------------------------------------------------------------------\n\n/**\n * Determine the ComponentDiffStatus for a single component based on its\n * compliance scores and dimension changes.\n */\nfunction classifyComponent(\n entry: Omit<ComponentDiffEntry, \"status\">,\n regressionThreshold: number,\n): ComponentDiffStatus {\n if (entry.renderFailed) return \"unchanged\"; // failed render — no useful classification\n\n if (entry.baselineCompliance === null && entry.currentCompliance !== null) {\n return \"added\";\n }\n if (entry.baselineCompliance !== null && entry.currentCompliance === null) {\n return \"removed\";\n }\n\n const delta = entry.complianceDelta;\n\n if (delta !== null) {\n if (delta <= -regressionThreshold) return \"compliance_regressed\";\n if (delta >= regressionThreshold) return \"compliance_improved\";\n }\n\n // Check for material dimension change (>10px on either axis)\n if (entry.baselineDimensions !== null && entry.currentDimensions !== null) {\n const dw = Math.abs(entry.currentDimensions.width - entry.baselineDimensions.width);\n const dh = Math.abs(entry.currentDimensions.height - entry.baselineDimensions.height);\n if (dw > 10 || dh > 10) return \"size_changed\";\n }\n\n return \"unchanged\";\n}\n\n// ---------------------------------------------------------------------------\n// Diff runner\n// ---------------------------------------------------------------------------\n\n/**\n * Run the full diff pipeline:\n * 1. Validate baseline directory exists\n * 2. Load baseline manifest + compliance + render metadata\n * 3. Generate (or load) current manifest\n * 4. Render all components in current manifest\n * 5. Run compliance audit on current renders\n * 6. Build per-component diff entries\n * 7. Return DiffResult\n */\nexport async function runDiff(options: DiffOptions = {}): Promise<DiffResult> {\n const {\n baselineDir: baselineDirRaw = DEFAULT_BASELINE_DIR,\n complianceTokens = [],\n componentsGlob,\n manifestPath,\n viewportWidth = 375,\n viewportHeight = 812,\n regressionThreshold = 0.01,\n } = options;\n\n const startTime = performance.now();\n const rootDir = process.cwd();\n const baselineDir = resolve(rootDir, baselineDirRaw);\n\n // ── 1. Validate baseline ─────────────────────────────────────────────────\n if (!existsSync(baselineDir)) {\n throw new Error(\n `Baseline directory not found at \"${baselineDir}\". ` +\n `Run \\`scope report baseline\\` first to create a baseline snapshot.`,\n );\n }\n\n const baselineManifestPath = resolve(baselineDir, \"manifest.json\");\n if (!existsSync(baselineManifestPath)) {\n throw new Error(\n `Baseline manifest.json not found at \"${baselineManifestPath}\". ` +\n `The baseline directory may be incomplete — re-run \\`scope report baseline\\`.`,\n );\n }\n\n // ── 2. Load baseline data ─────────────────────────────────────────────────\n const baselineManifest = JSON.parse(readFileSync(baselineManifestPath, \"utf-8\")) as Manifest;\n\n const baselineCompliance = loadBaselineCompliance(baselineDir);\n const baselineComponentNames = new Set(Object.keys(baselineManifest.components));\n\n process.stderr.write(\n `Comparing against baseline at ${baselineDir} ` +\n `(${baselineComponentNames.size} components)\\n`,\n );\n\n // ── 3. Generate (or load) current manifest ───────────────────────────────\n let currentManifest: Manifest;\n\n if (manifestPath !== undefined) {\n const absPath = resolve(rootDir, manifestPath);\n if (!existsSync(absPath)) {\n throw new Error(`Manifest not found at \"${absPath}\".`);\n }\n currentManifest = 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 currentManifest = await generateManifest({ rootDir });\n const count = Object.keys(currentManifest.components).length;\n process.stderr.write(`Found ${count} components.\\n`);\n }\n\n // ── 4. Determine component set ────────────────────────────────────────────\n let componentNames = Object.keys(currentManifest.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 // Add removed components (in baseline but not in current after glob filter)\n const removedNames = [...baselineComponentNames].filter(\n (name) =>\n !currentManifest.components[name] &&\n (componentsGlob === undefined || matchGlob(componentsGlob, name)),\n );\n\n const total = componentNames.length;\n\n // ── 5. Render current components ─────────────────────────────────────────\n process.stderr.write(`Rendering ${total} components for diff…\\n`);\n\n const computedStylesMap = new Map<string, import(\"@agent-scope/tokens\").ComputedStyles>();\n const currentRenderMeta = new Map<\n string,\n { width: number; height: number; renderTimeMs: number }\n >();\n const renderFailures = new Set<string>();\n\n let completed = 0;\n const CONCURRENCY = 4;\n let nextIdx = 0;\n\n const renderOne = async (name: string): Promise<void> => {\n const descriptor = currentManifest.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 renderFailures.add(name);\n return;\n }\n\n const result = outcome.result;\n currentRenderMeta.set(name, {\n width: result.width,\n height: result.height,\n renderTimeMs: result.renderTimeMs,\n });\n computedStylesMap.set(name, extractComputedStyles(result.computedStyles));\n };\n\n if (total > 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\n await shutdownPool();\n\n if (isTTY() && total > 0) {\n process.stderr.write(\"\\n\");\n }\n\n // ── 6. Compliance audit on current renders ────────────────────────────────\n const resolver = new TokenResolver(complianceTokens);\n const engine = new ComplianceEngine(resolver);\n const currentBatchReport: BatchReport = engine.auditBatch(computedStylesMap);\n\n // ── 7. Build diff entries ─────────────────────────────────────────────────\n const entries: ComponentDiffEntry[] = [];\n\n // Components in current run\n for (const name of componentNames) {\n const baselineComp = baselineCompliance?.components[name] ?? null;\n const currentComp = currentBatchReport.components[name] ?? null;\n const baselineMeta = loadBaselineRenderJson(baselineDir, name);\n const currentMeta = currentRenderMeta.get(name) ?? null;\n const failed = renderFailures.has(name);\n\n const baselineComplianceScore = baselineComp?.aggregateCompliance ?? null;\n const currentComplianceScore = currentComp?.compliance ?? null;\n const delta =\n baselineComplianceScore !== null && currentComplianceScore !== null\n ? currentComplianceScore - baselineComplianceScore\n : null;\n\n const partial: Omit<ComponentDiffEntry, \"status\"> = {\n name,\n baselineCompliance: baselineComplianceScore,\n currentCompliance: currentComplianceScore,\n complianceDelta: delta,\n baselineDimensions:\n baselineMeta !== null ? { width: baselineMeta.width, height: baselineMeta.height } : null,\n currentDimensions:\n currentMeta !== null ? { width: currentMeta.width, height: currentMeta.height } : null,\n renderTimeMs: currentMeta?.renderTimeMs ?? null,\n renderFailed: failed,\n };\n\n entries.push({ ...partial, status: classifyComponent(partial, regressionThreshold) });\n }\n\n // Components removed (in baseline but not current)\n for (const name of removedNames) {\n const baselineComp = baselineCompliance?.components[name] ?? null;\n const baselineMeta = loadBaselineRenderJson(baselineDir, name);\n\n entries.push({\n name,\n status: \"removed\",\n baselineCompliance: baselineComp?.aggregateCompliance ?? null,\n currentCompliance: null,\n complianceDelta: null,\n baselineDimensions:\n baselineMeta !== null ? { width: baselineMeta.width, height: baselineMeta.height } : null,\n currentDimensions: null,\n renderTimeMs: null,\n renderFailed: false,\n });\n }\n\n // ── 8. Summary ────────────────────────────────────────────────────────────\n const summary = {\n total: entries.length,\n added: entries.filter((e) => e.status === \"added\").length,\n removed: entries.filter((e) => e.status === \"removed\").length,\n unchanged: entries.filter((e) => e.status === \"unchanged\").length,\n complianceRegressed: entries.filter((e) => e.status === \"compliance_regressed\").length,\n complianceImproved: entries.filter((e) => e.status === \"compliance_improved\").length,\n sizeChanged: entries.filter((e) => e.status === \"size_changed\").length,\n renderFailed: entries.filter((e) => e.renderFailed).length,\n };\n\n const hasRegressions =\n summary.complianceRegressed > 0 || summary.removed > 0 || summary.renderFailed > 0;\n\n const wallClockMs = performance.now() - startTime;\n\n return {\n diffedAt: new Date().toISOString(),\n baselineDir,\n summary,\n components: entries,\n baselineAggregateCompliance: baselineCompliance?.aggregateCompliance ?? 0,\n currentAggregateCompliance: currentBatchReport.aggregateCompliance,\n hasRegressions,\n wallClockMs,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Human-readable formatter\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICON: Record<ComponentDiffStatus, string> = {\n added: \"+\",\n removed: \"-\",\n unchanged: \" \",\n compliance_regressed: \"↓\",\n compliance_improved: \"↑\",\n size_changed: \"~\",\n};\n\nconst STATUS_LABEL: Record<ComponentDiffStatus, string> = {\n added: \"added\",\n removed: \"removed\",\n unchanged: \"ok\",\n compliance_regressed: \"regressed\",\n compliance_improved: \"improved\",\n size_changed: \"size changed\",\n};\n\n/**\n * Format a DiffResult as a human-readable text report.\n */\nexport function formatDiffReport(result: DiffResult): string {\n const lines: string[] = [];\n\n const title = \"Scope Report Diff\";\n const rule = \"━\".repeat(Math.max(title.length, 40));\n lines.push(title, rule);\n\n // Compliance delta summary\n const complianceDelta = result.currentAggregateCompliance - result.baselineAggregateCompliance;\n const complianceSign = complianceDelta >= 0 ? \"+\" : \"\";\n lines.push(\n `Baseline compliance: ${(result.baselineAggregateCompliance * 100).toFixed(1)}%`,\n `Current compliance: ${(result.currentAggregateCompliance * 100).toFixed(1)}%`,\n `Delta: ${complianceSign}${(complianceDelta * 100).toFixed(1)}%`,\n \"\",\n );\n\n // Summary counts\n const s = result.summary;\n lines.push(\n `Components: ${s.total} total ` +\n [\n s.added > 0 ? `${s.added} added` : \"\",\n s.removed > 0 ? `${s.removed} removed` : \"\",\n s.complianceRegressed > 0 ? `${s.complianceRegressed} regressed` : \"\",\n s.complianceImproved > 0 ? `${s.complianceImproved} improved` : \"\",\n s.sizeChanged > 0 ? `${s.sizeChanged} size changed` : \"\",\n s.renderFailed > 0 ? `${s.renderFailed} failed` : \"\",\n ]\n .filter(Boolean)\n .join(\" \"),\n \"\",\n );\n\n // Per-component table — only show non-unchanged entries unless all are unchanged\n const notable = result.components.filter((e) => e.status !== \"unchanged\");\n\n if (notable.length === 0) {\n lines.push(\" No changes detected.\");\n } else {\n // Column widths\n const nameWidth = Math.max(9, ...notable.map((e) => e.name.length));\n const header =\n `${\"COMPONENT\".padEnd(nameWidth)} ` +\n `${\"STATUS\".padEnd(13)} ` +\n `${\"COMPLIANCE Δ\".padEnd(13)} ` +\n `DIMENSIONS`;\n const divider = \"-\".repeat(header.length);\n\n lines.push(header, divider);\n\n for (const entry of notable) {\n const icon = STATUS_ICON[entry.status];\n const label = STATUS_LABEL[entry.status].padEnd(13);\n const name = entry.name.padEnd(nameWidth);\n\n let complianceStr = \"—\".padEnd(13);\n if (entry.complianceDelta !== null) {\n const sign = entry.complianceDelta >= 0 ? \"+\" : \"\";\n complianceStr = `${sign}${(entry.complianceDelta * 100).toFixed(1)}%`.padEnd(13);\n }\n\n let dimStr = \"—\";\n if (entry.baselineDimensions !== null && entry.currentDimensions !== null) {\n const b = entry.baselineDimensions;\n const c = entry.currentDimensions;\n if (b.width !== c.width || b.height !== c.height) {\n dimStr = `${b.width}×${b.height} → ${c.width}×${c.height}`;\n } else {\n dimStr = `${c.width}×${c.height}`;\n }\n } else if (entry.currentDimensions !== null) {\n dimStr = `${entry.currentDimensions.width}×${entry.currentDimensions.height}`;\n } else if (entry.baselineDimensions !== null) {\n dimStr = `${entry.baselineDimensions.width}×${entry.baselineDimensions.height} (removed)`;\n }\n\n if (entry.renderFailed) {\n dimStr = \"render failed\";\n }\n\n lines.push(`${icon} ${name} ${label} ${complianceStr} ${dimStr}`);\n }\n }\n\n lines.push(\n \"\",\n rule,\n result.hasRegressions\n ? `Diff complete: ${result.summary.complianceRegressed + result.summary.renderFailed} regression(s) detected in ${(result.wallClockMs / 1000).toFixed(1)}s`\n : `Diff complete: no regressions in ${(result.wallClockMs / 1000).toFixed(1)}s`,\n );\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Registers the `diff` sub-command onto an existing Commander command\n * (typically the `report` command in program.ts).\n *\n * Exits with:\n * 0 — no regressions detected\n * 1 — regressions detected\n * 2 — operational error (missing baseline, render failure, etc.)\n */\nexport function registerDiffSubCommand(reportCmd: Command): void {\n reportCmd\n .command(\"diff\")\n .description(\"Compare the current component library against a saved baseline snapshot\")\n .option(\"-b, --baseline <dir>\", \"Baseline directory to compare against\", DEFAULT_BASELINE_DIR)\n .option(\"--components <glob>\", \"Glob pattern to diff 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 .option(\"--json\", \"Output diff as JSON instead of human-readable text\", false)\n .option(\"-o, --output <path>\", \"Write the diff JSON to a file\")\n .option(\n \"--regression-threshold <n>\",\n \"Minimum compliance drop (0–1) to classify as a regression\",\n \"0.01\",\n )\n .action(\n async (opts: {\n baseline: string;\n components?: string;\n manifest?: string;\n viewport: string;\n json: boolean;\n output?: string;\n regressionThreshold: 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 const regressionThreshold = Number.parseFloat(opts.regressionThreshold);\n\n const result = await runDiff({\n baselineDir: opts.baseline,\n componentsGlob: opts.components,\n manifestPath: opts.manifest,\n viewportWidth,\n viewportHeight,\n regressionThreshold,\n });\n\n // Write JSON output file if requested\n if (opts.output !== undefined) {\n writeFileSync(opts.output, JSON.stringify(result, null, 2), \"utf-8\");\n process.stderr.write(`Diff written to ${opts.output}\\n`);\n }\n\n // Emit to stdout\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n process.stdout.write(`${formatDiffReport(result)}\\n`);\n }\n\n // Exit 1 on regressions\n process.exit(result.hasRegressions ? 1 : 0);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(2);\n }\n },\n );\n}\n","/**\n * @agent-scope/cli — report pr-comment command\n *\n * Implements `scope report pr-comment`, which reads a `DiffResult` JSON file\n * (produced by `scope report diff --json`) and formats it as a GitHub-flavored\n * Markdown comment suitable for posting to a pull request.\n *\n * The generated comment is written to stdout so it can be piped directly into\n * the GitHub CLI (`gh pr comment`) or the GitHub Actions API.\n *\n * Output structure:\n * ```\n * ## 🔬 Scope Report\n *\n * | Metric | Value |\n * |---------------------|------------|\n * | Baseline compliance | 82.0% |\n * | Current compliance | 79.0% |\n * | Delta | ↓ -3.0% |\n * | Components | 12 total |\n *\n * ### Changes\n *\n * | Component | Status | Compliance Δ | Dimensions |\n * |------------|-------------|--------------|--------------|\n * | Button | ✅ added | — | 320 × 200 |\n * | TokenBadge | ❌ regressed | -15.0% | 320 × 200 |\n *\n * <details><summary>6 unchanged</summary>…</details>\n *\n * > Generated by [Scope](https://github.com/FlatFilers/Scope)\n * ```\n *\n * Exit codes:\n * 0 — comment rendered successfully\n * 1 — input file missing, unreadable, or not valid DiffResult JSON\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Command } from \"commander\";\nimport type { ComponentDiffEntry, DiffResult } from \"./diff.js\";\n\n// ---------------------------------------------------------------------------\n// Emoji / badge helpers\n// ---------------------------------------------------------------------------\n\nconst STATUS_BADGE: Record<ComponentDiffEntry[\"status\"], string> = {\n added: \"✅ added\",\n removed: \"🗑️ removed\",\n unchanged: \"— unchanged\",\n compliance_regressed: \"❌ regressed\",\n compliance_improved: \"📈 improved\",\n size_changed: \"📐 resized\",\n};\n\nfunction fmt(n: number): string {\n return `${(n * 100).toFixed(1)}%`;\n}\n\nfunction fmtDelta(delta: number | null): string {\n if (delta === null) return \"—\";\n const sign = delta >= 0 ? \"+\" : \"\";\n return `${sign}${(delta * 100).toFixed(1)}%`;\n}\n\nfunction fmtDimensions(d: { width: number; height: number } | null): string {\n if (d === null) return \"—\";\n return `${d.width} × ${d.height}`;\n}\n\nfunction complianceDeltaArrow(diff: DiffResult): string {\n const delta = diff.currentAggregateCompliance - diff.baselineAggregateCompliance;\n if (Math.abs(delta) < 0.0005) return `→ ${fmt(diff.currentAggregateCompliance)} (no change)`;\n const arrow = delta > 0 ? \"↑\" : \"↓\";\n return `${arrow} ${fmtDelta(delta)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Markdown renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Renders a `DiffResult` as a GitHub PR comment in Markdown.\n */\nexport function formatPrComment(diff: DiffResult): string {\n const { summary, components } = diff;\n\n const lines: string[] = [];\n\n // ── Header ────────────────────────────────────────────────────────────────\n const hasRegressions = diff.hasRegressions;\n const headerEmoji = hasRegressions ? \"⚠️\" : \"✅\";\n lines.push(`## ${headerEmoji} Scope Report`);\n lines.push(\"\");\n\n // ── Summary table ─────────────────────────────────────────────────────────\n lines.push(\"| Metric | Value |\");\n lines.push(\"|---|---|\");\n lines.push(`| Baseline compliance | ${fmt(diff.baselineAggregateCompliance)} |`);\n lines.push(`| Current compliance | ${fmt(diff.currentAggregateCompliance)} |`);\n lines.push(`| Delta | ${complianceDeltaArrow(diff)} |`);\n lines.push(\n `| Components | ${summary.total} total · ${summary.added} added · ${summary.removed} removed · ${summary.complianceRegressed} regressed |`,\n );\n if (summary.renderFailed > 0) {\n lines.push(`| Render failures | ${summary.renderFailed} |`);\n }\n lines.push(\"\");\n\n // ── Changed components table ───────────────────────────────────────────────\n const changed = components.filter((c) => c.status !== \"unchanged\");\n const unchanged = components.filter((c) => c.status === \"unchanged\");\n\n if (changed.length > 0) {\n lines.push(\"### Changes\");\n lines.push(\"\");\n lines.push(\"| Component | Status | Compliance Δ | Dimensions |\");\n lines.push(\"|---|---|---|---|\");\n for (const c of changed) {\n const badge = STATUS_BADGE[c.status];\n const delta = fmtDelta(c.complianceDelta);\n const dims = fmtDimensions(c.currentDimensions ?? c.baselineDimensions);\n lines.push(`| \\`${c.name}\\` | ${badge} | ${delta} | ${dims} |`);\n }\n lines.push(\"\");\n }\n\n // ── Unchanged (collapsed) ─────────────────────────────────────────────────\n if (unchanged.length > 0) {\n lines.push(\n `<details><summary>${unchanged.length} unchanged component${unchanged.length === 1 ? \"\" : \"s\"}</summary>`,\n );\n lines.push(\"\");\n lines.push(\"| Component | Compliance |\");\n lines.push(\"|---|---|\");\n for (const c of unchanged) {\n lines.push(\n `| \\`${c.name}\\` | ${c.currentCompliance !== null ? fmt(c.currentCompliance) : \"—\"} |`,\n );\n }\n lines.push(\"\");\n lines.push(\"</details>\");\n lines.push(\"\");\n }\n\n // ── Footer ────────────────────────────────────────────────────────────────\n lines.push(\n `> Generated by [Scope](https://github.com/FlatFilers/Scope) · diffed at ${diff.diffedAt}`,\n );\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Command registration\n// ---------------------------------------------------------------------------\n\nexport interface PrCommentOptions {\n /** Path to the DiffResult JSON file produced by `scope report diff --json` */\n input: string;\n /** Optional path to write the comment to instead of stdout */\n output?: string;\n}\n\n/**\n * Loads and validates a DiffResult from a JSON file.\n * Throws a descriptive Error if the file is missing or malformed.\n */\nexport function loadDiffResult(filePath: string): DiffResult {\n const abs = resolve(filePath);\n if (!existsSync(abs)) {\n throw new Error(`DiffResult file not found: ${abs}`);\n }\n let raw: string;\n try {\n raw = readFileSync(abs, \"utf-8\");\n } catch (err) {\n throw new Error(\n `Failed to read DiffResult file: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`DiffResult file is not valid JSON: ${abs}`);\n }\n // Minimal structural validation\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n !(\"diffedAt\" in parsed) ||\n !(\"components\" in parsed) ||\n !(\"summary\" in parsed)\n ) {\n throw new Error(\n `DiffResult file does not match expected shape (missing diffedAt/components/summary): ${abs}`,\n );\n }\n return parsed as DiffResult;\n}\n\n/**\n * Registers `scope report pr-comment` as a sub-command on the existing\n * `report` command.\n */\nexport function registerPrCommentSubCommand(reportCmd: Command): void {\n reportCmd\n .command(\"pr-comment\")\n .description(\n \"Format a DiffResult JSON file as a GitHub PR comment (Markdown, written to stdout)\",\n )\n .requiredOption(\"-i, --input <path>\", \"Path to DiffResult JSON (from scope report diff --json)\")\n .option(\"-o, --output <path>\", \"Write comment to file instead of stdout\")\n .action(async (opts: PrCommentOptions) => {\n try {\n const diff = loadDiffResult(opts.input);\n const comment = formatPrComment(diff);\n\n if (opts.output !== undefined) {\n writeFileSync(resolve(opts.output), comment, \"utf-8\");\n process.stderr.write(`PR comment written to ${opts.output}\\n`);\n } else {\n process.stdout.write(`${comment}\\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-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 — site sub-commands\n *\n * Registers the `scope site` command group with two sub-commands:\n * - `scope site build`\n * - `scope site serve`\n */\n\nimport {\n createReadStream,\n existsSync,\n watch as fsWatch,\n readFileSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { createServer, type ServerResponse } from \"node:http\";\nimport { extname, join, resolve } from \"node:path\";\nimport { type CollectionConfig, generateManifest, type Manifest } from \"@agent-scope/manifest\";\nimport { safeRender } from \"@agent-scope/render\";\nimport { buildSite } from \"@agent-scope/site\";\nimport { Command } from \"commander\";\nimport { formatScopeDiagnostic } from \"./diagnostics.js\";\nimport { buildPlaygroundHarness } from \"./playground-bundler.js\";\nimport { buildRenderer, isIconComponent, shutdownPool } from \"./render-commands.js\";\nimport { formatRenderJson } from \"./render-formatter.js\";\nimport { type RunSummaryFailure, writeRunSummary } from \"./run-summary.js\";\nimport { buildWrapperScript, loadScopeFileForComponent } from \"./scope-file.js\";\nimport { loadGlobalCss } from \"./tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Content-type map for static file serving\n// ---------------------------------------------------------------------------\n\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".js\": \"application/javascript; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction slugify(name: string): string {\n return name\n .replace(/([A-Z])/g, (m) => `-${m.toLowerCase()}`)\n .replace(/^-/, \"\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\ninterface SiteRenderConfig {\n components?: {\n wrappers?: {\n globalCSS?: string[];\n };\n };\n icons?: {\n patterns?: string[];\n };\n}\n\nfunction loadGlobalCssFilesFromConfig(cwd: string): string[] {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) return [];\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as SiteRenderConfig;\n return cfg.components?.wrappers?.globalCSS ?? [];\n } catch {\n return [];\n }\n}\n\nfunction loadIconPatternsFromConfig(cwd: string): string[] {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) return [];\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as SiteRenderConfig;\n return cfg.icons?.patterns ?? [];\n } catch {\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Livereload\n// ---------------------------------------------------------------------------\n\nconst LIVERELOAD_SCRIPT = `<script>(function(){var s=new EventSource(\"/__livereload\");s.onmessage=function(e){if(e.data===\"reload\")location.reload()};s.onerror=function(){setTimeout(function(){location.reload()},2000)}})()</script>`;\n\nfunction injectLiveReloadScript(html: string): string {\n const idx = html.lastIndexOf(\"</body>\");\n if (idx >= 0) return html.slice(0, idx) + LIVERELOAD_SCRIPT + html.slice(idx);\n return html + LIVERELOAD_SCRIPT;\n}\n\n// ---------------------------------------------------------------------------\n// Watch: config & glob helpers\n// ---------------------------------------------------------------------------\n\ninterface WatchConfig {\n include?: string[];\n exclude?: string[];\n internalPatterns?: string[];\n collections?: CollectionConfig[];\n iconPatterns?: string[];\n}\n\nfunction loadWatchConfig(rootDir: string): WatchConfig | null {\n const configPath = resolve(rootDir, \"reactscope.config.json\");\n if (!existsSync(configPath)) return null;\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as Record<string, unknown>;\n const result: WatchConfig = {};\n const components = cfg.components as Record<string, unknown> | undefined;\n if (components && typeof components === \"object\") {\n if (Array.isArray(components.include)) result.include = components.include as string[];\n if (Array.isArray(components.exclude)) result.exclude = components.exclude as string[];\n }\n if (Array.isArray(cfg.internalPatterns))\n result.internalPatterns = cfg.internalPatterns as string[];\n if (Array.isArray(cfg.collections)) result.collections = cfg.collections as CollectionConfig[];\n const icons = cfg.icons as Record<string, unknown> | undefined;\n if (icons && typeof icons === \"object\" && Array.isArray(icons.patterns)) {\n result.iconPatterns = icons.patterns as string[];\n }\n return result;\n } catch {\n return null;\n }\n}\n\nfunction watchGlob(pattern: string, filePath: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"\\u00a7GLOBSTAR\\u00a7\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\u00a7GLOBSTAR\\u00a7/g, \".*\");\n return new RegExp(`^${regexStr}$`, \"i\").test(filePath);\n}\n\nfunction matchesWatchPatterns(filePath: string, include: string[], exclude: string[]): boolean {\n for (const pattern of exclude) {\n if (watchGlob(pattern, filePath)) return false;\n }\n for (const pattern of include) {\n if (watchGlob(pattern, filePath)) return true;\n }\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Watch pipeline: manifest → render → compliance → site rebuild\n// ---------------------------------------------------------------------------\n\nfunction findAffectedComponents(\n manifest: Manifest,\n changedFiles: string[],\n previousManifest: Manifest | null,\n): string[] {\n const affected = new Set<string>();\n const normalised = changedFiles.map((f) => f.replace(/\\\\/g, \"/\"));\n\n for (const [name, descriptor] of Object.entries(manifest.components)) {\n const componentFile = descriptor.filePath.replace(/\\\\/g, \"/\");\n for (const changed of normalised) {\n if (componentFile === changed) {\n affected.add(name);\n break;\n }\n // Handle scope file changes (e.g. Button.scope.ts → re-render Button)\n const scopeBase = changed.replace(/\\.scope\\.(ts|tsx|js|jsx)$/, \"\");\n const compBase = componentFile.replace(/\\.(tsx|ts|jsx|js)$/, \"\");\n if (scopeBase !== changed && compBase === scopeBase) {\n affected.add(name);\n break;\n }\n }\n }\n\n if (previousManifest) {\n const oldNames = new Set(Object.keys(previousManifest.components));\n for (const name of Object.keys(manifest.components)) {\n if (!oldNames.has(name)) affected.add(name);\n }\n }\n\n return [...affected];\n}\n\nasync function renderComponentsForWatch(\n manifest: Manifest,\n componentNames: string[],\n rootDir: string,\n inputDir: string,\n): Promise<void> {\n if (componentNames.length === 0) return;\n\n const rendersDir = join(inputDir, \"renders\");\n await mkdir(rendersDir, { recursive: true });\n\n const cssFiles = loadGlobalCssFilesFromConfig(rootDir);\n const iconPatterns = loadIconPatternsFromConfig(rootDir);\n\n const complianceStylesPath = join(inputDir, \"compliance-styles.json\");\n let complianceStyles: Record<string, unknown> = {};\n if (existsSync(complianceStylesPath)) {\n try {\n complianceStyles = JSON.parse(readFileSync(complianceStylesPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n } catch {\n /* ignore */\n }\n }\n\n for (const name of componentNames) {\n const descriptor = manifest.components[name];\n if (!descriptor) continue;\n\n const filePath = resolve(rootDir, descriptor.filePath);\n const isIcon = isIconComponent(descriptor.filePath, name, iconPatterns);\n\n let scopeData: Awaited<ReturnType<typeof loadScopeFileForComponent>> = null;\n try {\n scopeData = await loadScopeFileForComponent(filePath);\n } catch {\n /* ignore */\n }\n\n const scenarioEntries = scopeData ? Object.entries(scopeData.scenarios) : [];\n const defaultEntry = scenarioEntries.find(([k]) => k === \"default\") ?? scenarioEntries[0];\n const renderProps = defaultEntry?.[1] ?? {};\n\n let wrapperScript: string | undefined;\n try {\n wrapperScript = scopeData?.hasWrapper\n ? await buildWrapperScript(scopeData.filePath)\n : undefined;\n } catch {\n /* ignore */\n }\n\n const renderer = buildRenderer(\n filePath,\n name,\n 375,\n 812,\n cssFiles,\n rootDir,\n wrapperScript,\n isIcon,\n );\n\n const outcome = await safeRender(\n () => renderer.renderCell(renderProps, descriptor.complexityClass),\n {\n props: renderProps,\n sourceLocation: { file: descriptor.filePath, line: descriptor.loc.start, column: 0 },\n },\n );\n\n if (outcome.crashed) {\n process.stderr.write(` \\u2717 ${name}: ${outcome.error.message}\\n`);\n continue;\n }\n\n const result = outcome.result;\n\n if (!isIcon) {\n writeFileSync(join(rendersDir, `${name}.png`), result.screenshot);\n }\n\n const renderJson = formatRenderJson(name, renderProps, result) as unknown as Record<\n string,\n unknown\n >;\n const extResult = result as typeof result & { svgContent?: string };\n if (isIcon && extResult.svgContent) {\n renderJson.svgContent = extResult.svgContent;\n delete renderJson.screenshot;\n }\n writeFileSync(join(rendersDir, `${name}.json`), JSON.stringify(renderJson, null, 2));\n\n // Extract compliance styles\n const rawStyles = result.computedStyles[\"[data-reactscope-root] > *\"] ?? {};\n const compStyles = {\n colors: {} as Record<string, string>,\n spacing: {} as Record<string, string>,\n typography: {} as Record<string, string>,\n borders: {} as Record<string, string>,\n shadows: {} as Record<string, string>,\n };\n for (const [prop, val] of Object.entries(rawStyles)) {\n if (!val || val === \"none\" || val === \"\") continue;\n const lower = prop.toLowerCase();\n if (lower.includes(\"color\") || lower.includes(\"background\")) {\n compStyles.colors[prop] = val;\n } else if (\n lower.includes(\"padding\") ||\n lower.includes(\"margin\") ||\n lower.includes(\"gap\") ||\n lower.includes(\"width\") ||\n lower.includes(\"height\")\n ) {\n compStyles.spacing[prop] = val;\n } else if (\n lower.includes(\"font\") ||\n lower.includes(\"lineheight\") ||\n lower.includes(\"letterspacing\") ||\n lower.includes(\"texttransform\")\n ) {\n compStyles.typography[prop] = val;\n } else if (\n lower.includes(\"border\") ||\n lower.includes(\"radius\") ||\n lower.includes(\"outline\")\n ) {\n compStyles.borders[prop] = val;\n } else if (lower.includes(\"shadow\")) {\n compStyles.shadows[prop] = val;\n }\n }\n complianceStyles[name] = compStyles;\n\n process.stderr.write(` \\u2713 ${name} (${result.renderTimeMs.toFixed(0)}ms)\\n`);\n }\n\n await shutdownPool();\n writeFileSync(complianceStylesPath, JSON.stringify(complianceStyles, null, 2), \"utf-8\");\n}\n\nasync function watchRebuildSite(\n inputDir: string,\n outputDir: string,\n title: string,\n basePath: string,\n): Promise<void> {\n const rootDir = process.cwd();\n await generatePlaygrounds(inputDir, outputDir);\n\n const iconPatterns = loadIconPatternsFromConfig(rootDir);\n\n let tokenFilePath: string | undefined;\n const autoPath = resolve(rootDir, \"reactscope.tokens.json\");\n if (existsSync(autoPath)) tokenFilePath = autoPath;\n\n let compliancePath: string | undefined;\n const crPath = join(inputDir, \"compliance-report.json\");\n if (existsSync(crPath)) compliancePath = crPath;\n\n await buildSite({\n inputDir,\n outputDir,\n basePath,\n ...(compliancePath && { compliancePath }),\n ...(tokenFilePath && { tokenFilePath }),\n title,\n iconPatterns,\n });\n}\n\n/**\n * Determine which components need rendering by comparing the new manifest\n * against the previous one and checking for existing render outputs.\n * A component needs rendering when:\n * - it has no render JSON on disk\n * - it is new (not in the previous manifest)\n * - its descriptor changed (filePath, props, hooks, etc.)\n */\nfunction findStaleComponents(\n manifest: Manifest,\n previousManifest: Manifest | null,\n rendersDir: string,\n): string[] {\n const stale: string[] = [];\n\n for (const [name, descriptor] of Object.entries(manifest.components)) {\n const jsonPath = join(rendersDir, `${name}.json`);\n if (!existsSync(jsonPath)) {\n stale.push(name);\n continue;\n }\n\n if (!previousManifest) continue;\n\n const prev = previousManifest.components[name];\n if (!prev) {\n stale.push(name);\n continue;\n }\n\n if (JSON.stringify(prev) !== JSON.stringify(descriptor)) {\n stale.push(name);\n }\n }\n\n return stale;\n}\n\nasync function runFullBuild(\n rootDir: string,\n inputDir: string,\n outputDir: string,\n title: string,\n basePath: string,\n): Promise<Manifest> {\n process.stderr.write(\"[watch] Starting\\u2026\\n\");\n\n const config = loadWatchConfig(rootDir);\n\n // Load previous manifest if it exists (to diff against)\n const manifestPath = join(inputDir, \"manifest.json\");\n let previousManifest: Manifest | null = null;\n if (existsSync(manifestPath)) {\n try {\n previousManifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as Manifest;\n } catch {\n /* ignore corrupt manifest */\n }\n }\n\n process.stderr.write(\"[watch] Generating manifest\\u2026\\n\");\n const manifest = await generateManifest({\n rootDir,\n ...(config?.include && { include: config.include }),\n ...(config?.exclude && { exclude: config.exclude }),\n ...(config?.internalPatterns && { internalPatterns: config.internalPatterns }),\n ...(config?.collections && { collections: config.collections }),\n ...(config?.iconPatterns && { iconPatterns: config.iconPatterns }),\n });\n\n await mkdir(inputDir, { recursive: true });\n writeFileSync(join(inputDir, \"manifest.json\"), JSON.stringify(manifest, null, 2), \"utf-8\");\n const count = Object.keys(manifest.components).length;\n process.stderr.write(`[watch] Found ${count} components\\n`);\n\n const rendersDir = join(inputDir, \"renders\");\n const stale = findStaleComponents(manifest, previousManifest, rendersDir);\n\n if (stale.length > 0) {\n process.stderr.write(\n `[watch] Rendering ${stale.length} component(s) (${count - stale.length} already up-to-date)\\n`,\n );\n await renderComponentsForWatch(manifest, stale, rootDir, inputDir);\n } else {\n process.stderr.write(\"[watch] All renders up-to-date, skipping render step\\n\");\n }\n\n process.stderr.write(\"[watch] Building site\\u2026\\n\");\n await watchRebuildSite(inputDir, outputDir, title, basePath);\n\n process.stderr.write(\"[watch] Ready\\n\");\n return manifest;\n}\n\nfunction startFileWatcher(opts: {\n rootDir: string;\n inputDir: string;\n outputDir: string;\n title: string;\n basePath: string;\n previousManifest: Manifest;\n notifyReload: () => void;\n}): void {\n const { rootDir, inputDir, outputDir, title, basePath, notifyReload } = opts;\n let previousManifest = opts.previousManifest;\n\n const config = loadWatchConfig(rootDir);\n const includePatterns = config?.include ?? [\"src/**/*.tsx\", \"src/**/*.ts\"];\n const excludePatterns = config?.exclude ?? [\n \"**/node_modules/**\",\n \"**/*.test.*\",\n \"**/*.spec.*\",\n \"**/dist/**\",\n \"**/*.d.ts\",\n ];\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n const pendingFiles = new Set<string>();\n let isRunning = false;\n\n const IGNORE_PREFIXES = [\"node_modules/\", \".reactscope/\", \"dist/\", \".git/\", \".next/\", \".turbo/\"];\n\n const handleChange = async (): Promise<void> => {\n if (isRunning) return;\n isRunning = true;\n const changedFiles = [...pendingFiles];\n pendingFiles.clear();\n\n try {\n process.stderr.write(`\\n[watch] ${changedFiles.length} file(s) changed\\n`);\n\n process.stderr.write(\"[watch] Regenerating manifest\\u2026\\n\");\n const newManifest = await generateManifest({\n rootDir,\n ...(config?.include && { include: config.include }),\n ...(config?.exclude && { exclude: config.exclude }),\n ...(config?.internalPatterns && { internalPatterns: config.internalPatterns }),\n ...(config?.collections && { collections: config.collections }),\n ...(config?.iconPatterns && { iconPatterns: config.iconPatterns }),\n });\n writeFileSync(join(inputDir, \"manifest.json\"), JSON.stringify(newManifest, null, 2), \"utf-8\");\n\n const affected = findAffectedComponents(newManifest, changedFiles, previousManifest);\n\n if (affected.length > 0) {\n process.stderr.write(`[watch] Re-rendering: ${affected.join(\", \")}\\n`);\n await renderComponentsForWatch(newManifest, affected, rootDir, inputDir);\n } else {\n process.stderr.write(\"[watch] No components directly affected\\n\");\n }\n\n process.stderr.write(\"[watch] Rebuilding site\\u2026\\n\");\n await watchRebuildSite(inputDir, outputDir, title, basePath);\n\n previousManifest = newManifest;\n process.stderr.write(\"[watch] Done\\n\");\n notifyReload();\n } catch (err) {\n process.stderr.write(`[watch] Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n } finally {\n isRunning = false;\n if (pendingFiles.size > 0) {\n handleChange();\n }\n }\n };\n\n const onFileChange = (_eventType: string, filename: string | null): void => {\n if (!filename) return;\n const normalised = filename.replace(/\\\\/g, \"/\");\n for (const prefix of IGNORE_PREFIXES) {\n if (normalised.startsWith(prefix)) return;\n }\n if (!matchesWatchPatterns(normalised, includePatterns, excludePatterns)) return;\n\n pendingFiles.add(normalised);\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n handleChange();\n }, 500);\n };\n\n try {\n fsWatch(rootDir, { recursive: true }, onFileChange);\n process.stderr.write(`[watch] Watching for changes (${includePatterns.join(\", \")})\\n`);\n } catch (err) {\n process.stderr.write(\n `[watch] Warning: Could not start watcher: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n}\n\nasync function generatePlaygrounds(\n inputDir: string,\n outputDir: string,\n): Promise<RunSummaryFailure[]> {\n const manifestPath = join(inputDir, \"manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as Manifest;\n\n const rootDir = process.cwd();\n const componentNames = Object.keys(manifest.components);\n if (componentNames.length === 0) return [];\n\n const playgroundDir = join(outputDir, \"playground\");\n await mkdir(playgroundDir, { recursive: true });\n\n const cssFiles = loadGlobalCssFilesFromConfig(rootDir);\n const projectCss = (await loadGlobalCss(cssFiles, rootDir)) ?? undefined;\n\n let succeeded = 0;\n const failures: RunSummaryFailure[] = [];\n const allDefaults: Record<string, Record<string, unknown>> = {};\n\n for (const name of componentNames) {\n const descriptor = manifest.components[name];\n if (!descriptor) continue;\n\n const filePath = resolve(rootDir, descriptor.filePath);\n const slug = slugify(name);\n\n // Load default props from .scope.ts file\n try {\n const scopeData = await loadScopeFileForComponent(filePath);\n if (scopeData) {\n const defaultScenario =\n scopeData.scenarios.default ?? Object.values(scopeData.scenarios)[0];\n if (defaultScenario) allDefaults[name] = defaultScenario;\n }\n } catch {\n // scope file loading is best-effort\n }\n\n try {\n const html = await buildPlaygroundHarness(filePath, name, projectCss);\n await writeFile(join(playgroundDir, `${slug}.html`), html, \"utf-8\");\n succeeded++;\n } catch (err) {\n process.stderr.write(\n `[scope/site] ⚠ playground skip: ${name} — ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n failures.push({\n component: name,\n stage: \"playground\",\n message: err instanceof Error ? err.message : String(err),\n outputPath: join(playgroundDir, `${slug}.html`),\n });\n }\n }\n\n // Write playground defaults to input dir so the site builder can read them for prop controls\n await writeFile(\n join(inputDir, \"playground-defaults.json\"),\n JSON.stringify(allDefaults, null, 2),\n \"utf-8\",\n );\n\n process.stderr.write(\n `[scope/site] Playgrounds: ${succeeded} built${failures.length > 0 ? `, ${failures.length} failed` : \"\"}\\n`,\n );\n return failures;\n}\n\n// ---------------------------------------------------------------------------\n// site build\n// ---------------------------------------------------------------------------\n\nfunction registerBuild(siteCmd: Command): void {\n siteCmd\n .command(\"build\")\n .description(\n \"Build the static HTML site from manifest + render outputs.\\n\\n\" +\n \"INPUT DIRECTORY (.reactscope/ by default) must contain:\\n\" +\n \" manifest.json component registry\\n\" +\n \" renders/ screenshots and render.json files from `scope render all`\\n\\n\" +\n \"OPTIONAL:\\n\" +\n \" --compliance <path> include token compliance scores on detail pages\\n\" +\n \" --base-path <path> set if deploying to a subdirectory (e.g. /ui-docs)\\n\\n\" +\n \"Examples:\\n\" +\n \" scope site build\\n\" +\n ' scope site build --title \"Design System\" -o .reactscope/site\\n' +\n \" scope site build --compliance .reactscope/compliance-report.json\\n\" +\n \" scope site build --tokens reactscope.tokens.json\\n\" +\n \" scope site build --base-path /ui\",\n )\n .option(\"-i, --input <path>\", \"Path to .reactscope input directory\", \".reactscope\")\n .option(\"-o, --output <path>\", \"Output directory for generated site\", \".reactscope/site\")\n .option(\"--base-path <path>\", \"Base URL path prefix for subdirectory deployment\", \"/\")\n .option(\"--compliance <path>\", \"Path to compliance batch report JSON\")\n .option(\"--tokens <path>\", \"Path to reactscope.tokens.json (enables token browser page)\")\n .option(\"--title <text>\", \"Site title\", \"Scope — Component Gallery\")\n .action(\n async (opts: {\n input: string;\n output: string;\n basePath: string;\n compliance?: string;\n tokens?: string;\n title: string;\n }) => {\n try {\n const inputDir = resolve(process.cwd(), opts.input);\n const outputDir = resolve(process.cwd(), opts.output);\n\n if (!existsSync(inputDir)) {\n throw new Error(\n `Input directory not found: ${inputDir}\\nRun \\`scope manifest generate\\` and \\`scope render\\` first.`,\n );\n }\n\n const manifestPath = join(inputDir, \"manifest.json\");\n if (!existsSync(manifestPath)) {\n throw new Error(\n `Manifest not found at ${manifestPath}\\nRun \\`scope manifest generate\\` first.`,\n );\n }\n\n process.stderr.write(`Building site from ${inputDir}…\\n`);\n\n // Bundle playgrounds first so defaults are available to the site builder\n process.stderr.write(\"Bundling playgrounds…\\n\");\n const failures = await generatePlaygrounds(inputDir, outputDir);\n\n const iconPatterns = loadIconPatternsFromConfig(process.cwd());\n\n // Auto-detect token file if not specified\n let tokenFilePath = opts.tokens ? resolve(process.cwd(), opts.tokens) : undefined;\n if (tokenFilePath === undefined) {\n const autoPath = resolve(process.cwd(), \"reactscope.tokens.json\");\n if (existsSync(autoPath)) {\n tokenFilePath = autoPath;\n }\n }\n\n await buildSite({\n inputDir,\n outputDir,\n basePath: opts.basePath,\n ...(opts.compliance !== undefined && {\n compliancePath: resolve(process.cwd(), opts.compliance),\n }),\n ...(tokenFilePath !== undefined && { tokenFilePath }),\n title: opts.title,\n iconPatterns,\n });\n\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as Manifest;\n const componentCount = Object.keys(manifest.components).length;\n const generatedPlaygroundCount =\n componentCount === 0\n ? 0\n : statSync(join(outputDir, \"playground\")).isDirectory()\n ? componentCount - failures.length\n : 0;\n const siteFailures = [...failures];\n if (componentCount === 0) {\n siteFailures.push({\n component: \"*\",\n stage: \"site\",\n message:\n \"Manifest contains zero components; generated site is structurally degraded.\",\n outputPath: manifestPath,\n });\n } else if (generatedPlaygroundCount === 0) {\n siteFailures.push({\n component: \"*\",\n stage: \"site\",\n message:\n \"No playground pages were generated successfully; site build is degraded and should not be treated as green.\",\n outputPath: join(outputDir, \"playground\"),\n });\n }\n\n const summaryPath = writeRunSummary({\n command: \"scope site build\",\n status: siteFailures.length > 0 ? \"failed\" : \"success\",\n outputPaths: [outputDir, join(outputDir, \"index.html\")],\n failures: siteFailures,\n });\n process.stderr.write(`Site written to ${outputDir}\\n`);\n process.stderr.write(`[scope/site] Run summary written to ${summaryPath}\\n`);\n process.stdout.write(`${outputDir}\\n`);\n if (siteFailures.length > 0) process.exit(1);\n } catch (err) {\n process.stderr.write(`${formatScopeDiagnostic(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// site serve\n// ---------------------------------------------------------------------------\n\nfunction registerServe(siteCmd: Command): void {\n siteCmd\n .command(\"serve\")\n .description(\n \"Start a local HTTP server for the built site directory.\\n\\n\" +\n \"Run `scope site build` first, or use --watch to auto-rebuild on changes.\\n\" +\n \"Ctrl+C to stop.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope site serve\\n\" +\n \" scope site serve --port 8080\\n\" +\n \" scope site serve --dir ./my-site-output\\n\" +\n \" scope site serve --watch\",\n )\n .option(\"-p, --port <number>\", \"Port to listen on\", \"3000\")\n .option(\"-d, --dir <path>\", \"Directory to serve\", \".reactscope/site\")\n .option(\"-w, --watch\", \"Watch source files and rebuild on changes\")\n .option(\n \"-i, --input <path>\",\n \"Input directory for .reactscope data (watch mode)\",\n \".reactscope\",\n )\n .option(\"--title <text>\", \"Site title (watch mode)\", \"Scope \\u2014 Component Gallery\")\n .option(\"--base-path <path>\", \"Base URL path prefix (watch mode)\", \"/\")\n .action(\n async (opts: {\n port: string;\n dir: string;\n watch?: boolean;\n input: string;\n title: string;\n basePath: string;\n }) => {\n try {\n const port = Number.parseInt(opts.port, 10);\n if (Number.isNaN(port) || port < 1 || port > 65535) {\n throw new Error(`Invalid port: ${opts.port}`);\n }\n\n const serveDir = resolve(process.cwd(), opts.dir);\n const watchMode = opts.watch === true;\n\n const sseClients = new Set<ServerResponse>();\n function notifyReload(): void {\n for (const client of sseClients) {\n client.write(\"data: reload\\n\\n\");\n }\n }\n\n if (watchMode) {\n await mkdir(serveDir, { recursive: true });\n }\n\n if (!watchMode && !existsSync(serveDir)) {\n throw new Error(\n `Serve directory not found: ${serveDir}\\nRun \\`scope site build\\` first.`,\n );\n }\n\n const server = createServer((req, res) => {\n const rawUrl = req.url ?? \"/\";\n const urlPath = decodeURIComponent(rawUrl.split(\"?\")[0] ?? \"/\");\n\n // SSE livereload endpoint\n if (watchMode && urlPath === \"/__livereload\") {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.write(\"data: connected\\n\\n\");\n sseClients.add(res);\n req.on(\"close\", () => sseClients.delete(res));\n return;\n }\n\n const filePath = join(\n serveDir,\n urlPath.endsWith(\"/\") ? `${urlPath}index.html` : urlPath,\n );\n\n if (!filePath.startsWith(serveDir)) {\n res.writeHead(403, { \"Content-Type\": \"text/plain\" });\n res.end(\"Forbidden\");\n return;\n }\n\n if (existsSync(filePath) && statSync(filePath).isFile()) {\n const ext = extname(filePath).toLowerCase();\n const contentType = MIME_TYPES[ext] ?? \"application/octet-stream\";\n\n if (watchMode && ext === \".html\") {\n const html = injectLiveReloadScript(readFileSync(filePath, \"utf-8\"));\n res.writeHead(200, { \"Content-Type\": contentType });\n res.end(html);\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": contentType });\n createReadStream(filePath).pipe(res);\n return;\n }\n\n const htmlPath = `${filePath}.html`;\n if (existsSync(htmlPath) && statSync(htmlPath).isFile()) {\n if (watchMode) {\n const html = injectLiveReloadScript(readFileSync(htmlPath, \"utf-8\"));\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n createReadStream(htmlPath).pipe(res);\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(`Not found: ${urlPath}`);\n });\n\n server.listen(port, () => {\n process.stderr.write(`Scope site running at http://localhost:${port}\\n`);\n process.stderr.write(`Serving ${serveDir}\\n`);\n if (watchMode) {\n process.stderr.write(\n \"Watch mode enabled \\u2014 source changes trigger rebuild + browser reload\\n\",\n );\n }\n process.stderr.write(\"Press Ctrl+C to stop.\\n\");\n });\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n process.stderr.write(`Error: Port ${port} is already in use.\\n`);\n } else {\n process.stderr.write(`Server error: ${err.message}\\n`);\n }\n process.exit(1);\n });\n\n if (watchMode) {\n const rootDir = process.cwd();\n const inputDir = resolve(rootDir, opts.input);\n\n const initialManifest = await runFullBuild(\n rootDir,\n inputDir,\n serveDir,\n opts.title,\n opts.basePath,\n );\n\n notifyReload();\n\n startFileWatcher({\n rootDir,\n inputDir,\n outputDir: serveDir,\n title: opts.title,\n basePath: opts.basePath,\n previousManifest: initialManifest,\n notifyReload,\n });\n }\n } catch (err) {\n process.stderr.write(`${formatScopeDiagnostic(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Public factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create and return the `site` command group (does not attach to any\n * parent — caller is responsible for mounting it).\n */\nexport function createSiteCommand(): Command {\n const siteCmd = new Command(\"site\").description(\n \"Build and serve the static HTML component gallery site.\\n\\n\" +\n \"PREREQUISITES:\\n\" +\n \" scope manifest generate (manifest.json)\\n\" +\n \" scope render all (renders/ + compliance-styles.json)\\n\\n\" +\n \"SITE CONTENTS:\\n\" +\n \" /index.html component gallery with screenshots + metadata\\n\" +\n \" /<component>/index.html detail page: props, renders, matrix, X-Ray, compliance\\n\\n\" +\n \"Examples:\\n\" +\n \" scope site build && scope site serve\\n\" +\n ' scope site build --title \"Acme UI\" --compliance .reactscope/compliance-report.json\\n' +\n \" scope site serve --port 8080\",\n );\n\n registerBuild(siteCmd);\n registerServe(siteCmd);\n\n return siteCmd;\n}\n","/**\n * playground-bundler.ts\n *\n * Bundles a React component into a self-contained HTML playground page.\n * Unlike component-bundler.ts (which hardcodes props for Playwright screenshots),\n * the playground harness accepts props dynamically via postMessage and reports\n * its content height back to the parent frame via ResizeObserver.\n *\n * Communication protocol (parent ↔ iframe):\n * Parent → Iframe: { type: \"scope-playground-props\", props: Record<string, unknown> }\n * Iframe → Parent: { type: \"scope-playground-height\", height: number }\n */\n\nimport { dirname } from \"node:path\";\nimport * as esbuild from \"esbuild\";\n\n/**\n * Bundle a component into a standalone playground HTML page.\n *\n * @param filePath Absolute path to the component source file\n * @param componentName Export name to try first (falls back to default / PascalCase)\n * @param projectCss Optional compiled CSS string (e.g. Tailwind) to inject\n * @param wrapperScript Optional pre-built wrapper IIFE from a .scope.ts(x) file\n */\nexport async function buildPlaygroundHarness(\n filePath: string,\n componentName: string,\n projectCss?: string,\n wrapperScript?: string,\n): Promise<string> {\n const bundledScript = await bundlePlaygroundIIFE(filePath, componentName);\n return wrapPlaygroundHtml(bundledScript, projectCss, wrapperScript);\n}\n\n// ---------------------------------------------------------------------------\n// esbuild bundling\n// ---------------------------------------------------------------------------\n\nasync function bundlePlaygroundIIFE(filePath: string, componentName: string): Promise<string> {\n const wrapperCode = /* ts */ `\nimport * as __scopeMod from ${JSON.stringify(filePath)};\nimport { createRoot } from \"react-dom/client\";\nimport { createElement, Component as ReactComponent } from \"react\";\n\n(function scopePlaygroundHarness() {\n var Target =\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 (!Target) {\n document.getElementById(\"scope-root\").innerHTML =\n '<p style=\"color:#dc2626;font-family:system-ui;font-size:13px\">No renderable component found.</p>';\n return;\n }\n\n // Error boundary to catch async render errors (React unmounts the whole\n // root when an error is uncaught — this keeps the error visible instead).\n var errorStyle = \"color:#dc2626;font-family:system-ui;font-size:13px;padding:12px\";\n class ScopeBoundary extends ReactComponent {\n constructor(p) { super(p); this.state = { error: null }; }\n static getDerivedStateFromError(err) { return { error: err }; }\n render() {\n if (this.state.error) {\n return createElement(\"pre\", { style: errorStyle },\n \"Render error: \" + (this.state.error.message || String(this.state.error)));\n }\n return this.props.children;\n }\n }\n\n var rootEl = document.getElementById(\"scope-root\");\n var root = createRoot(rootEl);\n var Wrapper = window.__SCOPE_WRAPPER__;\n\n function render(props) {\n var inner = createElement(Target, props);\n if (Wrapper) inner = createElement(Wrapper, null, inner);\n root.render(createElement(ScopeBoundary, null, inner));\n }\n\n // Render immediately with empty props\n render({});\n\n // Listen for messages from the parent frame\n window.addEventListener(\"message\", function(e) {\n if (!e.data) return;\n if (e.data.type === \"scope-playground-props\") {\n render(e.data.props || {});\n } else if (e.data.type === \"scope-playground-theme\") {\n document.documentElement.classList.toggle(\"dark\", e.data.theme === \"dark\");\n }\n });\n\n // Report content height changes to the parent frame\n var ro = new ResizeObserver(function() {\n var h = rootEl.scrollHeight;\n if (parent !== window) {\n parent.postMessage({ type: \"scope-playground-height\", height: h }, \"*\");\n }\n });\n ro.observe(rootEl);\n})();\n`;\n\n const result = await esbuild.build({\n stdin: {\n contents: wrapperCode,\n resolveDir: dirname(filePath),\n loader: \"tsx\",\n sourcefile: \"__scope_playground__.tsx\",\n },\n bundle: true,\n format: \"iife\",\n write: false,\n platform: \"browser\",\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n target: \"es2020\",\n external: [],\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n global: \"globalThis\",\n },\n logLevel: \"silent\",\n banner: {\n js: \"/* @agent-scope/cli playground harness */\",\n },\n loader: {\n \".css\": \"empty\",\n \".svg\": \"dataurl\",\n \".png\": \"dataurl\",\n \".jpg\": \"dataurl\",\n \".jpeg\": \"dataurl\",\n \".gif\": \"dataurl\",\n \".webp\": \"dataurl\",\n \".ttf\": \"dataurl\",\n \".woff\": \"dataurl\",\n \".woff2\": \"dataurl\",\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 playground 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 playground output\");\n }\n\n return outputFile.text;\n}\n\n// ---------------------------------------------------------------------------\n// HTML template\n// ---------------------------------------------------------------------------\n\nfunction wrapPlaygroundHtml(\n bundledScript: string,\n projectCss?: string,\n wrapperScript?: string,\n): 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 const wrapperScriptBlock =\n wrapperScript != null && wrapperScript.length > 0\n ? `<script id=\"scope-wrapper-script\">${wrapperScript}</script>`\n : \"\";\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 <script>\n window.__SCOPE_WRAPPER__ = null;\n // Prevent React DevTools from interfering with the embedded playground.\n // The hook causes render instability in same-origin iframes.\n delete window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n </script>\n <style>\n *, *::before, *::after { box-sizing: border-box; }\n html, body { margin: 0; padding: 0; font-family: system-ui, sans-serif; }\n #scope-root { padding: 16px; min-width: 1px; min-height: 1px; }\n </style>\n ${projectStyleBlock}\n <style>html, body { background: transparent !important; }</style>\n</head>\n<body>\n <div id=\"scope-root\" data-reactscope-root></div>\n ${wrapperScriptBlock}\n <script>${bundledScript}</script>\n</body>\n</html>`;\n}\n","/**\n * @agent-scope/cli — tokens sub-commands\n *\n * Registers the `scope tokens` command group with sub-commands:\n * - `scope tokens init` — detect sources & generate token file\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 { registerCompliance } from \"./compliance.js\";\nimport { createTokensExportCommand } from \"./export.js\";\nimport { registerImpact } from \"./impact.js\";\nimport { registerTokensInit } from \"./init.js\";\nimport { registerPreview } from \"./preview.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(\n \"Resolve a token path and print its final computed value.\\n\" +\n \"Follows all {ref} chains to the raw value.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens get color.primary.500\\n\" +\n \" scope tokens get spacing.4 --format json\\n\" +\n \" scope tokens get font.size.base --file ./tokens/brand.json\",\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((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(\n \"List all tokens, optionally filtered by category prefix or type.\\n\\n\" +\n 'CATEGORY: top-level token namespace (e.g. \"color\", \"spacing\", \"typography\")\\n' +\n \"TYPE: token value type — color | spacing | typography | shadow | radius | opacity\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens list\\n\" +\n \" scope tokens list color\\n\" +\n \" scope tokens list --type spacing\\n\" +\n \" scope tokens list color --format json | jq '.[].path'\",\n )\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(\n \"Find the token(s) whose computed value matches the given raw value.\\n\" +\n \"Supports fuzzy color matching (hex ↔ rgb ↔ hsl equivalence).\\n\\n\" +\n \"Examples:\\n\" +\n ' scope tokens search \"#3b82f6\"\\n' +\n ' scope tokens search \"16px\"\\n' +\n ' scope tokens search \"rgb(59, 130, 246)\" # fuzzy-matches #3b82f6',\n )\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(\n \"Print the full reference chain from a token path down to its raw value.\\n\" +\n \"Useful for debugging circular references or understanding token inheritance.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens resolve color.primary.500\\n\" +\n \" scope tokens resolve button.background --format json\",\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((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 and report errors.\\n\\n\" +\n \"CHECKS:\\n\" +\n \" - Circular reference chains (A → B → A)\\n\" +\n \" - Broken references ({path.that.does.not.exist})\\n\" +\n ' - Type mismatches (token declared as \"color\" but value is a number)\\n' +\n \" - Duplicate paths\\n\\n\" +\n \"Exits 1 if any errors are found (suitable for CI).\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens validate\\n\" +\n \" scope tokens validate --format json | jq '.errors'\",\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, validate, and export design tokens from reactscope.tokens.json.\\n\\n\" +\n \"TOKEN FILE RESOLUTION (in priority order):\\n\" +\n \" 1. --file <path> explicit override\\n\" +\n \" 2. tokens.file in reactscope.config.json\\n\" +\n \" 3. reactscope.tokens.json default (project root)\\n\\n\" +\n \"TOKEN FILE FORMAT (reactscope.tokens.json):\\n\" +\n \" Nested JSON. Each leaf is a token with { value, type } or just a raw value.\\n\" +\n \" Paths use dot notation: color.primary.500, spacing.4, font.size.base\\n\" +\n \" References use {path.to.other.token} syntax.\\n\" +\n ' Themes: top-level \"themes\" key with named override maps.\\n\\n' +\n \"TOKEN TYPES: color | spacing | typography | shadow | radius | opacity | other\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens validate\\n\" +\n \" scope tokens list color\\n\" +\n \" scope tokens get color.primary.500\\n\" +\n \" scope tokens compliance\\n\" +\n \" scope tokens export --format css --out tokens.css\",\n );\n\n registerTokensInit(tokensCmd);\n registerGet(tokensCmd);\n registerList(tokensCmd);\n registerSearch(tokensCmd);\n registerResolve(tokensCmd);\n registerValidate(tokensCmd);\n tokensCmd.addCommand(createTokensExportCommand());\n\n // Phase 11: compliance, impact, preview\n registerCompliance(tokensCmd);\n registerImpact(tokensCmd);\n registerPreview(tokensCmd);\n\n return tokensCmd;\n}\n","/**\n * @agent-scope/cli — tokens compliance sub-command\n *\n * Implements `scope tokens compliance`.\n *\n * Reads per-component computed styles from a styles file (default:\n * `.reactscope/compliance-styles.json`), runs the ComplianceEngine over every\n * component in batch, and renders an aggregate compliance report matching the\n * Token Spec §3.3 format:\n *\n * Overall compliance score: 87%\n * By category:\n * color: 92% (3 off-system values)\n * spacing: 88% (5 off-system values)\n * shadow: 71% (9 off-system values)\n *\n * Top off-system offenders (sorted by count):\n * Button box-shadow: 0 2px 4px rgba(0,0,0,0.1) → nearest: shadow.sm (0 1px 2px...)\n * Card color: #666666 → nearest: color.neutral.500 (#6B7280)\n *\n * Supports --threshold <0-100>: exits 1 if compliance score is below threshold.\n *\n * Styles file format:\n * {\n * \"ComponentName\": {\n * \"colors\": { \"background\": \"#3B82F6\" },\n * \"spacing\": { \"paddingTop\": \"16px\" },\n * \"typography\": {},\n * \"borders\": {},\n * \"shadows\": {}\n * }\n * }\n *\n * @packageDocumentation\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n type BatchReport,\n ComplianceEngine,\n type ComputedStyles,\n TokenResolver,\n} from \"@agent-scope/tokens\";\nimport type { Command } from \"commander\";\nimport { isTTY } from \"../render-formatter.js\";\nimport { type RunSummaryFailure, writeRunSummary } from \"../run-summary.js\";\nimport { loadTokens, resolveTokenFilePath } from \"./commands.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STYLES_PATH = \".reactscope/compliance-styles.json\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Shape of the compliance styles file — a plain JSON object mapping component\n * names to their ComputedStyles.\n */\ntype StylesFile = Record<string, ComputedStyles>;\n\n/**\n * A single off-system offender entry for the top-offenders list.\n */\ninterface Offender {\n component: string;\n property: string;\n value: string;\n nearestToken: string;\n nearestValue: string;\n offSystemCount: number;\n}\n\n// ---------------------------------------------------------------------------\n// Styles file loader\n// ---------------------------------------------------------------------------\n\n/**\n * Load a compliance styles file (JSON mapping component → ComputedStyles).\n * Throws with a helpful message if the file is missing or malformed.\n */\nexport function loadStylesFile(stylesPath: string): StylesFile {\n const absPath = resolve(process.cwd(), stylesPath);\n if (!existsSync(absPath)) {\n throw new Error(\n `Compliance styles file not found at ${absPath}.\\n` +\n `Run \\`scope render all\\` first to generate component styles, or use --styles to specify a path.\\n` +\n `Expected format: { \"ComponentName\": { colors: {}, spacing: {}, typography: {}, borders: {}, shadows: {} } }`,\n );\n }\n const raw = readFileSync(absPath, \"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new Error(`Failed to parse compliance styles file as JSON: ${String(err)}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\n `Compliance styles file must be a JSON object mapping component names to ComputedStyles.`,\n );\n }\n return parsed as StylesFile;\n}\n\n// ---------------------------------------------------------------------------\n// Aggregate helpers\n// ---------------------------------------------------------------------------\n\n/**\n * CSS property → category mapping for per-category breakdown.\n * Mirrors the structure in @agent-scope/tokens ComplianceEngine.\n */\nfunction categoryForProperty(\n property: string,\n): \"color\" | \"spacing\" | \"typography\" | \"border\" | \"shadow\" {\n const lower = property.toLowerCase();\n if (lower.includes(\"shadow\")) return \"shadow\";\n if (lower.includes(\"color\") || lower === \"background\" || lower === \"fill\" || lower === \"stroke\")\n return \"color\";\n if (\n lower.includes(\"padding\") ||\n lower.includes(\"margin\") ||\n lower === \"gap\" ||\n lower === \"width\" ||\n lower === \"height\" ||\n lower === \"top\" ||\n lower === \"right\" ||\n lower === \"bottom\" ||\n lower === \"left\"\n )\n return \"spacing\";\n if (lower.includes(\"border\")) return \"border\";\n if (\n lower.includes(\"font\") ||\n lower.includes(\"line\") ||\n lower.includes(\"letter\") ||\n lower === \"texttransform\" ||\n lower === \"textdecoration\"\n )\n return \"typography\";\n return \"spacing\"; // fallback\n}\n\ninterface CategorySummary {\n total: number;\n onSystem: number;\n offSystem: number;\n compliance: number;\n}\n\n/**\n * Builds per-category summary from a batch report.\n */\nfunction buildCategorySummary(\n batch: BatchReport,\n): Record<\"color\" | \"spacing\" | \"typography\" | \"border\" | \"shadow\", CategorySummary> {\n const cats: Record<string, CategorySummary> = {\n color: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n spacing: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n typography: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n border: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n shadow: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n };\n\n for (const report of Object.values(batch.components)) {\n for (const [property, result] of Object.entries(report.properties)) {\n const cat = categoryForProperty(property);\n const summary = cats[cat];\n if (summary === undefined) continue;\n summary.total++;\n if (result.status === \"on_system\") {\n summary.onSystem++;\n } else {\n summary.offSystem++;\n }\n }\n }\n\n // Compute compliance percentages\n for (const summary of Object.values(cats)) {\n summary.compliance = summary.total === 0 ? 0 : summary.onSystem / summary.total;\n }\n\n return cats as Record<\"color\" | \"spacing\" | \"typography\" | \"border\" | \"shadow\", CategorySummary>;\n}\n\n/**\n * Collect top off-system offenders — sorted by per-component off-system count.\n * Returns the top-N component × property pairs.\n */\nfunction collectOffenders(batch: BatchReport, limit = 10): Offender[] {\n const offenders: Offender[] = [];\n\n // Group by component first, sort by off-system count descending\n const componentEntries = Object.entries(batch.components).map(([name, report]) => ({\n name,\n report,\n offSystemCount: report.offSystem,\n }));\n componentEntries.sort((a, b) => b.offSystemCount - a.offSystemCount);\n\n for (const { name, report, offSystemCount } of componentEntries) {\n if (offSystemCount === 0) continue;\n\n for (const [property, result] of Object.entries(report.properties)) {\n if (result.status !== \"OFF_SYSTEM\") continue;\n\n offenders.push({\n component: name,\n property,\n value: result.value,\n nearestToken: result.nearest?.token ?? \"—\",\n nearestValue: result.nearest?.value ?? \"—\",\n offSystemCount,\n });\n\n if (offenders.length >= limit) break;\n }\n\n if (offenders.length >= limit) break;\n }\n\n return offenders;\n}\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\n\nfunction formatPct(n: number): string {\n return `${Math.round(n * 100)}%`;\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? `${s.slice(0, max - 1)}…` : s;\n}\n\n/**\n * Format the batch report as human-readable TTY output (Token Spec §3.3).\n */\nexport function formatComplianceReport(batch: BatchReport, threshold?: number): string {\n const pct = Math.round(batch.aggregateCompliance * 100);\n const lines: string[] = [];\n\n const thresholdLabel =\n threshold !== undefined\n ? pct >= threshold\n ? \" ✓ (pass)\"\n : ` ✗ (below threshold ${threshold}%)`\n : \"\";\n\n lines.push(`Overall compliance score: ${pct}%${thresholdLabel}`);\n if (batch.totalProperties === 0) {\n lines.push(\n \"No CSS properties were audited; run `scope render all` and inspect .reactscope/compliance-styles.json before treating compliance as green.\",\n );\n }\n lines.push(\"\");\n\n // Category breakdown (only show categories that have at least one audited property)\n const cats = buildCategorySummary(batch);\n const catEntries = Object.entries(cats).filter(([, s]) => s.total > 0);\n\n if (catEntries.length > 0) {\n lines.push(\"By category:\");\n const catWidth = Math.max(...catEntries.map(([k]) => k.length));\n for (const [cat, summary] of catEntries) {\n const label = cat.padEnd(catWidth);\n lines.push(\n ` ${label} ${formatPct(summary.compliance).padStart(4)} (${summary.offSystem} off-system value${summary.offSystem !== 1 ? \"s\" : \"\"})`,\n );\n }\n lines.push(\"\");\n }\n\n // Top off-system offenders\n const offenders = collectOffenders(batch);\n if (offenders.length > 0) {\n lines.push(\"Top off-system offenders (sorted by count):\");\n\n // Compute column widths\n const nameWidth = Math.max(9, ...offenders.map((o) => o.component.length));\n const propWidth = Math.max(8, ...offenders.map((o) => o.property.length));\n const valWidth = Math.max(5, ...offenders.map((o) => truncate(o.value, 40).length));\n\n for (const offender of offenders) {\n const name = offender.component.padEnd(nameWidth);\n const prop = offender.property.padEnd(propWidth);\n const val = truncate(offender.value, 40).padEnd(valWidth);\n const nearest = `${offender.nearestToken} (${truncate(offender.nearestValue, 30)})`;\n lines.push(` ${name} ${prop}: ${val} → nearest: ${nearest}`);\n }\n } else {\n lines.push(\"No off-system values detected. 🎉\");\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// registerCompliance\n// ---------------------------------------------------------------------------\n\n/**\n * Registers `scope tokens compliance` on the given `tokens` Command.\n */\nexport function registerCompliance(tokensCmd: Command): void {\n tokensCmd\n .command(\"compliance\")\n .description(\n \"Compute a token compliance score across all rendered components.\\n\\n\" +\n \"Compares computed CSS values from .reactscope/compliance-styles.json\\n\" +\n \"against the token file — reports what % of style values are on-token.\\n\\n\" +\n \"PREREQUISITES:\\n\" +\n \" scope render all must have run first (produces compliance-styles.json)\\n\\n\" +\n \"SCORING:\\n\" +\n \" compliant value exactly matches a token\\n\" +\n \" near-match value is within tolerance of a token (e.g. close color)\\n\" +\n \" off-token value not found in token file\\n\\n\" +\n \"EXIT CODES:\\n\" +\n \" 0 compliance >= threshold (or no --threshold set)\\n\" +\n \" 1 compliance < threshold\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens compliance\\n\" +\n \" scope tokens compliance --threshold 90\\n\" +\n \" scope tokens compliance --format json | jq '.summary'\\n\" +\n \" scope tokens compliance --out .reactscope/compliance-report.json\\n\" +\n \" scope tokens compliance --styles ./custom/compliance-styles.json\",\n )\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--styles <path>\", `Path to compliance styles JSON (default: ${DEFAULT_STYLES_PATH})`)\n .option(\n \"--out <path>\",\n \"Write JSON report to file (for use with scope site build --compliance)\",\n )\n .option(\"--threshold <n>\", \"Exit code 1 if compliance score is below this percentage (0-100)\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action(\n (opts: {\n file?: string;\n styles?: string;\n out?: string;\n threshold?: string;\n format?: string;\n }) => {\n try {\n const tokenFilePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(tokenFilePath);\n const resolver = new TokenResolver(tokens);\n const engine = new ComplianceEngine(resolver);\n\n const stylesPath = opts.styles ?? DEFAULT_STYLES_PATH;\n const stylesFile = loadStylesFile(stylesPath);\n\n // Build the component map\n const componentMap = new Map<string, ComputedStyles>();\n for (const [name, styles] of Object.entries(stylesFile)) {\n componentMap.set(name, styles);\n }\n\n if (componentMap.size === 0) {\n process.stderr.write(`Warning: No components found in styles file at ${stylesPath}\\n`);\n }\n\n const batch = engine.auditBatch(componentMap);\n const threshold =\n opts.threshold !== undefined ? Number.parseInt(opts.threshold, 10) : undefined;\n const failures: RunSummaryFailure[] = [];\n if (batch.totalProperties === 0) {\n failures.push({\n component: \"*\",\n stage: \"compliance\",\n message: `No CSS properties were audited from ${stylesPath}; refusing to report silent success.`,\n outputPath: stylesPath,\n });\n } else if (\n threshold !== undefined &&\n Math.round(batch.aggregateCompliance * 100) < threshold\n ) {\n failures.push({\n component: \"*\",\n stage: \"compliance\",\n message: `Compliance ${Math.round(batch.aggregateCompliance * 100)}% is below threshold ${threshold}%.`,\n outputPath: opts.out ?? \".reactscope/compliance-report.json\",\n });\n }\n\n // Write to file if --out is specified\n if (opts.out !== undefined) {\n const outPath = resolve(process.cwd(), opts.out);\n writeFileSync(outPath, JSON.stringify(batch, null, 2), \"utf-8\");\n process.stderr.write(`Compliance report written to ${outPath}\\n`);\n }\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify(batch, null, 2)}\\n`);\n } else {\n process.stdout.write(`${formatComplianceReport(batch, threshold)}\\n`);\n }\n\n const summaryPath = writeRunSummary({\n command: \"scope tokens compliance\",\n status: failures.length > 0 ? \"failed\" : \"success\",\n outputPaths: [opts.out ?? \".reactscope/compliance-report.json\", stylesPath],\n compliance: {\n auditedProperties: batch.totalProperties,\n onSystemProperties: batch.totalOnSystem,\n offSystemProperties: batch.totalOffSystem,\n score: Math.round(batch.aggregateCompliance * 100),\n threshold,\n },\n failures,\n });\n process.stderr.write(`[scope/tokens] Run summary written to ${summaryPath}\\n`);\n\n if (failures.length > 0) {\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","/**\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(\n \"Export design tokens to CSS variables, TypeScript, SCSS, Tailwind config, Figma, or flat JSON.\\n\\n\" +\n \"FORMATS:\\n\" +\n \" css CSS custom properties (:root { --color-primary-500: #3b82f6; })\\n\" +\n \" scss SCSS variables ($color-primary-500: #3b82f6;)\\n\" +\n \" ts TypeScript const export (export const tokens = {...})\\n\" +\n \" tailwind Tailwind theme.extend block (paste into tailwind.config.js)\\n\" +\n \" flat-json Flat { path: value } map (useful for tooling integration)\\n\" +\n \" figma Figma Tokens plugin format\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens export --format css --out src/tokens.css\\n\" +\n ' scope tokens export --format css --prefix brand --selector \":root, [data-theme]\"\\n' +\n \" scope tokens export --format tailwind --out tailwind-tokens.js\\n\" +\n \" scope tokens export --format ts --out src/tokens.ts\\n\" +\n \" scope tokens export --format css --theme dark --out dark-tokens.css\",\n )\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 // Provide a helpful hint for common aliases\n const FORMAT_ALIASES: Record<string, string> = {\n json: \"flat-json\",\n \"json-flat\": \"flat-json\",\n javascript: \"ts\",\n js: \"ts\",\n sass: \"scss\",\n tw: \"tailwind\",\n };\n const hint = FORMAT_ALIASES[opts.format.toLowerCase()];\n process.stderr.write(\n `Error: unsupported format \"${opts.format}\".\\n` +\n `Supported formats: ${SUPPORTED_FORMATS.join(\", \")}\\n` +\n (hint ? `Did you mean \"${hint}\"?\\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 impact sub-command\n *\n * Implements `scope tokens impact <path>`.\n *\n * Queries which components use a given token path and returns a component list\n * with element selectors, matching Token Spec §4.3.\n *\n * Usage:\n * scope tokens impact color.primary.500\n * → Button (3 elements), Badge (1 element), Link (2 elements)\n *\n * The command loads:\n * 1. The token file (default: reactscope.tokens.json)\n * 2. The compliance styles file (default: .reactscope/compliance-styles.json)\n * — same file used by `scope tokens compliance`\n *\n * It builds an ImpactAnalyzer over the compliance reports and calls\n * impactOf(tokenPath) to find all referencing components and properties.\n *\n * With --new-value <value>, it also reports the visual severity of the change.\n *\n * @packageDocumentation\n */\n\nimport {\n ComplianceEngine,\n ImpactAnalyzer,\n type ImpactReport,\n TokenResolver,\n} from \"@agent-scope/tokens\";\nimport type { Command } from \"commander\";\nimport { isTTY } from \"../render-formatter.js\";\nimport { loadTokens, resolveTokenFilePath } from \"./commands.js\";\nimport { loadStylesFile } from \"./compliance.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STYLES_PATH = \".reactscope/compliance-styles.json\";\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\n\nconst SEVERITY_EMOJI: Record<string, string> = {\n none: \"○\",\n subtle: \"◔\",\n moderate: \"◑\",\n significant: \"●\",\n};\n\n/**\n * Format an ImpactReport as human-readable TTY output (Token Spec §4.3).\n *\n * Example:\n * Token: color.primary.500 (#3B82F6)\n *\n * Button background (on_system) ● significant\n * Card color (on_system) ◔ subtle\n * Link color (on_system) ◑ moderate\n *\n * 3 component(s) affected — overall severity: significant\n */\nexport function formatImpactReport(report: ImpactReport): string {\n const lines: string[] = [];\n\n const newValueSuffix = report.newValue !== report.oldValue ? ` → ${report.newValue}` : \"\";\n lines.push(`Token: ${report.tokenPath} (${report.oldValue})${newValueSuffix}`);\n\n if (report.components.length === 0) {\n lines.push(\"\");\n lines.push(\"No components reference this token.\");\n return lines.join(\"\\n\");\n }\n\n lines.push(\"\");\n\n const nameWidth = Math.max(9, ...report.components.map((c) => c.name.length));\n const propWidth = Math.max(\n 8,\n ...report.components.flatMap((c) => c.affectedProperties.map((p) => p.length)),\n );\n\n for (const comp of report.components) {\n for (const property of comp.affectedProperties) {\n const name = comp.name.padEnd(nameWidth);\n const prop = property.padEnd(propWidth);\n const severityIcon = SEVERITY_EMOJI[comp.severity] ?? \"?\";\n lines.push(` ${name} ${prop} ${severityIcon} ${comp.severity}`);\n }\n }\n\n lines.push(\"\");\n\n const countLabel = `${report.affectedComponentCount} component${report.affectedComponentCount !== 1 ? \"s\" : \"\"}`;\n const severityIcon = SEVERITY_EMOJI[report.overallSeverity] ?? \"?\";\n\n lines.push(\n `${countLabel} affected — overall severity: ${severityIcon} ${report.overallSeverity}`,\n );\n\n if (report.colorDelta !== undefined) {\n lines.push(`Color delta: ΔE ${report.colorDelta.toFixed(2)}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Compact summary line for each component (Token Spec §4.3 short form):\n * → Button (3 elements), Badge (1 element), Link (2 elements)\n */\nexport function formatImpactSummary(report: ImpactReport): string {\n if (report.components.length === 0) {\n return `No components reference token \"${report.tokenPath}\".`;\n }\n const parts = report.components.map(\n (c) =>\n `${c.name} (${c.affectedProperties.length} element${c.affectedProperties.length !== 1 ? \"s\" : \"\"})`,\n );\n return `→ ${parts.join(\", \")}`;\n}\n\n// ---------------------------------------------------------------------------\n// registerImpact\n// ---------------------------------------------------------------------------\n\n/**\n * Registers `scope tokens impact <path>` on the given `tokens` Command.\n */\nexport function registerImpact(tokensCmd: Command): void {\n tokensCmd\n .command(\"impact <path>\")\n .description(\n \"List every component and CSS element that uses a given token.\\n\" +\n \"Use this to understand the blast radius before changing a token value.\\n\\n\" +\n \"PREREQUISITE: scope render all (populates compliance-styles.json)\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens impact color.primary.500\\n\" +\n \" scope tokens impact spacing.4 --format json\\n\" +\n \" scope tokens impact font.size.base | grep Button\",\n )\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--styles <path>\", `Path to compliance styles JSON (default: ${DEFAULT_STYLES_PATH})`)\n .option(\"--new-value <value>\", \"Proposed new value — report visual severity of the change\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action(\n (\n tokenPath: string,\n opts: {\n file?: string;\n styles?: string;\n newValue?: string;\n format?: string;\n },\n ) => {\n try {\n const tokenFilePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(tokenFilePath);\n const resolver = new TokenResolver(tokens);\n const engine = new ComplianceEngine(resolver);\n\n const stylesPath = opts.styles ?? DEFAULT_STYLES_PATH;\n const stylesFile = loadStylesFile(stylesPath);\n\n // Build compliance reports\n const componentMap = new Map(Object.entries(stylesFile));\n const batchReport = engine.auditBatch(componentMap);\n const complianceReports = new Map(Object.entries(batchReport.components));\n\n const analyzer = new ImpactAnalyzer(resolver, complianceReports);\n\n // Determine new value — default to current value (no-change analysis)\n const currentValue = resolver.resolve(tokenPath);\n const newValue = opts.newValue ?? currentValue;\n\n const report = analyzer.impactOf(tokenPath, newValue);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n } else {\n // On TTY: full report; when piped without --format: full report in text\n process.stdout.write(`${formatImpactReport(report)}\\n`);\n if (isTTY()) {\n process.stdout.write(`\\n${formatImpactSummary(report)}\\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 init sub-command\n *\n * Implements `scope tokens init` which detects design-token sources in the\n * current project and scaffolds a reactscope.tokens.json file.\n *\n * Detected sources:\n * - Tailwind config (colors, spacing, fontFamily, borderRadius)\n * - CSS custom properties (:root { --var: value })\n * - Theme files (*.theme.{ts,js})\n *\n * Will not overwrite an existing token file unless --force is passed.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Command } from \"commander\";\nimport type { TokenSource } from \"../init/detect.js\";\nimport { detectProject } from \"../init/detect.js\";\nimport { extractTailwindTokens } from \"../init/index.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TOKEN_FILE = \"reactscope.tokens.json\";\nconst CONFIG_FILE = \"reactscope.config.json\";\n\n// ---------------------------------------------------------------------------\n// Output path resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve where the token file should be written.\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 */\nfunction resolveOutputPath(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 // fall through to default\n }\n }\n\n return resolve(process.cwd(), DEFAULT_TOKEN_FILE);\n}\n\n// ---------------------------------------------------------------------------\n// CSS custom properties extractor\n// ---------------------------------------------------------------------------\n\nconst CSS_VAR_RE = /--([\\w-]+)\\s*:\\s*([^;]+)/g;\nconst HEX_COLOR_RE = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst COLOR_FN_RE = /^(?:rgba?|hsla?|oklch|oklab|lch|lab|color|hwb)\\(/;\nconst DIMENSION_RE = /^-?\\d+(?:\\.\\d+)?(?:px|rem|em|%|vw|vh|ch|ex|cap|lh|dvh|svh|lvh)$/;\nconst DURATION_RE = /^-?\\d+(?:\\.\\d+)?(?:ms|s)$/;\nconst FONT_FAMILY_RE = /^[\"']|,\\s*(?:sans-serif|serif|monospace|cursive|fantasy|system-ui)/;\nconst NUMBER_RE = /^-?\\d+(?:\\.\\d+)?$/;\nconst CUBIC_BEZIER_RE = /^cubic-bezier\\(/;\nconst SHADOW_RE = /^\\d.*(?:px|rem|em)\\s+(?:#|rgba?|hsla?|oklch|oklab)/i;\n\nfunction inferTokenType(value: string): string {\n const v = value.trim();\n if (HEX_COLOR_RE.test(v) || COLOR_FN_RE.test(v)) return \"color\";\n if (DURATION_RE.test(v)) return \"duration\";\n if (DIMENSION_RE.test(v)) return \"dimension\";\n if (FONT_FAMILY_RE.test(v)) return \"fontFamily\";\n if (CUBIC_BEZIER_RE.test(v)) return \"cubicBezier\";\n if (SHADOW_RE.test(v)) return \"shadow\";\n if (NUMBER_RE.test(v)) return \"number\";\n return \"color\";\n}\n\n/**\n * Convert a CSS custom-property name like `color-primary-500` into a\n * nested token path structure: `{ color: { primary: { \"500\": { value, type } } } }`.\n */\nfunction setNestedToken(\n root: Record<string, unknown>,\n segments: string[],\n value: string,\n type: string,\n): void {\n let node = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (seg === undefined) continue;\n if (!(seg in node) || typeof node[seg] !== \"object\" || node[seg] === null) {\n node[seg] = {};\n }\n node = node[seg] as Record<string, unknown>;\n }\n const leaf = segments[segments.length - 1];\n if (leaf === undefined) return;\n node[leaf] = { value, type };\n}\n\n/**\n * Extract the body of a CSS block starting at `openBrace` in `css`.\n * Uses brace counting to handle nested blocks.\n */\nfunction extractBlockBody(css: string, openBrace: number): string {\n let depth = 0;\n let end = -1;\n for (let i = openBrace; i < css.length; i++) {\n if (css[i] === \"{\") depth++;\n else if (css[i] === \"}\") {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end === -1) return \"\";\n return css.slice(openBrace + 1, end);\n}\n\n/** Scoped block with its selector/at-rule and body content. */\ninterface CSSBlock {\n scope: \"root\" | \"theme\" | \"dark\" | \"dark-high-contrast\";\n body: string;\n}\n\n/**\n * Parse a CSS file into scoped blocks.\n * Recognises: `:root`, `@theme`, `@theme inline`, `.dark`, `.dark.high-contrast`\n */\nfunction parseScopedBlocks(css: string): CSSBlock[] {\n const blocks: CSSBlock[] = [];\n const blockRe = /(?::root|@theme(?:\\s+inline)?|\\.dark\\.high-contrast|\\.dark)\\s*\\{/g;\n\n let match: RegExpExecArray | null = blockRe.exec(css);\n while (match !== null) {\n const selector = match[0];\n const braceIdx = css.indexOf(\"{\", match.index);\n if (braceIdx === -1) {\n match = blockRe.exec(css);\n continue;\n }\n\n const body = extractBlockBody(css, braceIdx);\n\n let scope: CSSBlock[\"scope\"];\n if (selector.includes(\".dark.high-contrast\")) scope = \"dark-high-contrast\";\n else if (selector.includes(\".dark\")) scope = \"dark\";\n else if (selector.includes(\"@theme\")) scope = \"theme\";\n else scope = \"root\";\n\n blocks.push({ scope, body });\n match = blockRe.exec(css);\n }\n\n return blocks;\n}\n\n/**\n * Extract concrete custom-property declarations from a CSS block body.\n * Skips var() references and calc() expressions.\n */\nfunction extractVarsFromBody(body: string): Array<{ name: string; value: string }> {\n const results: Array<{ name: string; value: string }> = [];\n for (const m of body.matchAll(CSS_VAR_RE)) {\n const name = m[1];\n const value = m[2]?.trim();\n if (name === undefined || value === undefined || value.length === 0) continue;\n if (value.startsWith(\"var(\") || value.startsWith(\"calc(\")) continue;\n results.push({ name, value });\n }\n return results;\n}\n\ninterface CSSExtractionResult {\n tokens: Record<string, unknown>;\n themes: Record<string, Record<string, string>>;\n}\n\n/**\n * Extract tokens from CSS files, scope-aware.\n * `:root` and `@theme` → base tokens.\n * `.dark` → themes.dark overrides.\n * `.dark.high-contrast` → themes[\"dark-high-contrast\"] overrides.\n */\nfunction extractCSSCustomProperties(tokenSources: TokenSource[]): CSSExtractionResult | null {\n const cssSources = tokenSources.filter(\n (s) => s.kind === \"css-custom-properties\" || s.kind === \"tailwind-v4-theme\",\n );\n if (cssSources.length === 0) return null;\n\n const tokens: Record<string, unknown> = {};\n const themes: Record<string, Record<string, string>> = {};\n let found = false;\n\n for (const source of cssSources) {\n try {\n if (source.path.includes(\"compiled\") || source.path.includes(\".min.\")) continue;\n\n const raw = readFileSync(source.path, \"utf-8\");\n const blocks = parseScopedBlocks(raw);\n\n for (const block of blocks) {\n const vars = extractVarsFromBody(block.body);\n\n for (const { name, value } of vars) {\n const segments = name.split(\"-\").filter(Boolean);\n if (segments.length === 0) continue;\n\n if (block.scope === \"root\" || block.scope === \"theme\") {\n const type = inferTokenType(value);\n setNestedToken(tokens, segments, value, type);\n found = true;\n } else {\n const themeName = block.scope;\n if (!themes[themeName]) themes[themeName] = {};\n const path = segments.join(\".\");\n themes[themeName][path] = value;\n found = true;\n }\n }\n }\n } catch {\n // skip unreadable files\n }\n }\n\n return found ? { tokens, themes } : null;\n}\n\n// ---------------------------------------------------------------------------\n// Public registration\n// ---------------------------------------------------------------------------\n\nexport function registerTokensInit(tokensCmd: Command): void {\n tokensCmd\n .command(\"init\")\n .description(\n \"Detect design-token sources in the project and generate a token file.\\n\\n\" +\n \"DETECTED SOURCES:\\n\" +\n \" - Tailwind config (colors, spacing, fontFamily, borderRadius)\\n\" +\n \" - CSS custom properties (:root { --color-primary: #0070f3; })\\n\\n\" +\n \"Will not overwrite an existing token file unless --force is passed.\\n\\n\" +\n \"OUTPUT PATH RESOLUTION (in priority order):\\n\" +\n \" 1. --file <path> explicit override\\n\" +\n \" 2. tokens.file in reactscope.config.json\\n\" +\n \" 3. reactscope.tokens.json default (project root)\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens init\\n\" +\n \" scope tokens init --force\\n\" +\n \" scope tokens init --file tokens/brand.json\\n\" +\n \" scope tokens init --force --file custom-tokens.json\",\n )\n .option(\"--file <path>\", \"Output path for the token file (overrides config)\")\n .option(\"--force\", \"Overwrite existing token file\", false)\n .action((opts: { file?: string; force: boolean }) => {\n try {\n const outPath = resolveOutputPath(opts.file);\n\n if (existsSync(outPath) && !opts.force) {\n process.stderr.write(\n `Token file already exists at ${outPath}.\\n` + `Run with --force to overwrite.\\n`,\n );\n process.exit(1);\n }\n\n const rootDir = process.cwd();\n const detected = detectProject(rootDir);\n\n const tailwindTokens = extractTailwindTokens(detected.tokenSources);\n const cssResult = extractCSSCustomProperties(detected.tokenSources);\n\n const mergedTokens: Record<string, unknown> = {};\n const mergedThemes: Record<string, Record<string, string>> = {};\n\n if (tailwindTokens !== null) {\n Object.assign(mergedTokens, tailwindTokens);\n }\n if (cssResult !== null) {\n for (const [key, value] of Object.entries(cssResult.tokens)) {\n if (!(key in mergedTokens)) {\n mergedTokens[key] = value;\n }\n }\n for (const [themeName, overrides] of Object.entries(cssResult.themes)) {\n if (!mergedThemes[themeName]) mergedThemes[themeName] = {};\n Object.assign(mergedThemes[themeName], overrides);\n }\n }\n\n const tokenFile: Record<string, unknown> = {\n $schema:\n \"https://raw.githubusercontent.com/FlatFilers/Scope/main/packages/tokens/schema.json\",\n version: \"1.0.0\",\n meta: {\n name: \"Design Tokens\",\n lastUpdated: new Date().toISOString().split(\"T\")[0],\n },\n tokens: mergedTokens,\n };\n\n if (Object.keys(mergedThemes).length > 0) {\n tokenFile.themes = mergedThemes;\n }\n\n writeFileSync(outPath, `${JSON.stringify(tokenFile, null, 2)}\\n`);\n\n // Summary\n const tokenGroupCount = Object.keys(mergedTokens).length;\n const themeNames = Object.keys(mergedThemes);\n\n if (detected.tokenSources.length > 0) {\n process.stdout.write(\"Detected token sources:\\n\");\n for (const source of detected.tokenSources) {\n process.stdout.write(` ${source.kind}: ${source.path}\\n`);\n }\n process.stdout.write(\"\\n\");\n }\n\n if (tokenGroupCount > 0) {\n process.stdout.write(`Extracted ${tokenGroupCount} token group(s) → ${outPath}\\n`);\n if (themeNames.length > 0) {\n for (const name of themeNames) {\n const count = Object.keys(mergedThemes[name] ?? {}).length;\n process.stdout.write(` theme \"${name}\": ${count} override(s)\\n`);\n }\n }\n } else {\n process.stdout.write(\n `No token sources detected. Created empty token file → ${outPath}\\n` +\n `Add tokens manually or re-run after configuring a design system.\\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 * @agent-scope/cli — tokens preview sub-command\n *\n * Implements `scope tokens preview <path> --new-value <value> --sprite`.\n *\n * Re-renders components affected by a token change with both the current and\n * proposed token values, and outputs a side-by-side sprite sheet PNG showing\n * the before / after visual diff.\n *\n * Usage:\n * scope tokens preview color.primary.500 --new-value \"#2563EB\" --sprite\n * scope tokens preview color.primary.500 --new-value \"#2563EB\" -o out.png\n *\n * Flags:\n * --new-value <value> (required) The proposed new value for the token\n * --sprite Write a PNG sprite sheet (default when stdout is TTY)\n * -o, --output <path> Output PNG path (default: .reactscope/previews/<token>.png)\n * --file <path> Token file path (overrides config)\n * --styles <path> Compliance styles file path\n * --manifest <path> Manifest path for component file resolution\n * --format <fmt> json or text (default: auto-detect)\n * --timeout <ms> Browser timeout per render (ms, default: 10000)\n * --viewport-width <px> Viewport width in pixels (default: 1280)\n * --viewport-height <px> Viewport height in pixels (default: 720)\n *\n * The command:\n * 1. Loads token file + styles → runs impact analysis to find affected components\n * 2. For each affected component, loads the file path from the manifest\n * 3. Bundles and renders each component twice via BrowserPool:\n * - Once with current token value (CSS var override injected)\n * - Once with new token value\n * 4. Composites the before/after renders into a sprite sheet using\n * SpriteSheetGenerator (rows = before/after, cols = components)\n * 5. Writes the PNG and reports cell coordinates\n *\n * @packageDocumentation\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { BrowserPool, SpriteSheetGenerator } from \"@agent-scope/render\";\nimport { ComplianceEngine, ImpactAnalyzer, TokenResolver } from \"@agent-scope/tokens\";\nimport type { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { loadManifest } from \"../manifest-commands.js\";\nimport { isTTY } from \"../render-formatter.js\";\nimport { loadTokens, resolveTokenFilePath } from \"./commands.js\";\nimport { loadStylesFile } from \"./compliance.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STYLES_PATH = \".reactscope/compliance-styles.json\";\nconst DEFAULT_MANIFEST_PATH = \".reactscope/manifest.json\";\nconst DEFAULT_OUTPUT_DIR = \".reactscope/previews\";\n\n// ---------------------------------------------------------------------------\n// Render a single component with an optional CSS override via page.setContent\n// ---------------------------------------------------------------------------\n\nasync function renderComponentWithCssOverride(\n filePath: string,\n componentName: string,\n cssOverride: string,\n vpWidth: number,\n vpHeight: number,\n timeoutMs: number,\n): Promise<{ screenshot: Buffer; width: number; height: number }> {\n const PAD = 16;\n // Build harness with CSS injection via projectCss parameter\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n {}, // no props\n vpWidth,\n cssOverride, // injected as <style>\n undefined,\n PAD,\n );\n\n const pool = new BrowserPool({\n size: { browsers: 1, pagesPerBrowser: 1 },\n viewportWidth: vpWidth,\n viewportHeight: vpHeight,\n });\n await pool.init();\n\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: timeoutMs },\n );\n\n const rootLocator = page.locator(\"[data-reactscope-root]\");\n const bb = await rootLocator.boundingBox();\n\n const MIN_W = 320;\n const MIN_H = 120;\n\n const clipX = Math.max(0, (bb?.x ?? 0) - PAD);\n const clipY = Math.max(0, (bb?.y ?? 0) - PAD);\n const rawW = (bb?.width ?? MIN_W) + PAD * 2;\n const rawH = (bb?.height ?? MIN_H) + PAD * 2;\n const clipW = Math.min(Math.max(rawW, MIN_W), vpWidth - clipX);\n const clipH = Math.min(Math.max(rawH, MIN_H), vpHeight - clipY);\n\n const screenshot = await page.screenshot({\n clip: { x: clipX, y: clipY, width: clipW, height: clipH },\n type: \"png\",\n });\n\n return { screenshot, width: Math.round(clipW), height: Math.round(clipH) };\n } finally {\n pool.release(slot);\n await pool.close().catch(() => undefined);\n }\n}\n\n// ---------------------------------------------------------------------------\n// registerPreview\n// ---------------------------------------------------------------------------\n\n/**\n * Registers `scope tokens preview <path>` on the given `tokens` Command.\n */\nexport function registerPreview(tokensCmd: Command): void {\n tokensCmd\n .command(\"preview <path>\")\n .description(\n \"Render before/after screenshots of all components affected by a token change.\\n\" +\n \"Useful for visual review before committing a token value update.\\n\\n\" +\n \"PREREQUISITE: scope render all (provides baseline renders)\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens preview color.primary.500\\n\" +\n ' scope tokens preview color.primary.500 --new-value \"#2563eb\" -o preview.png',\n )\n .requiredOption(\"--new-value <value>\", \"The proposed new resolved value for the token\")\n .option(\"--sprite\", \"Output a PNG sprite sheet (default when TTY)\", false)\n .option(\"-o, --output <path>\", \"Output PNG path (default: .reactscope/previews/<token>.png)\")\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--styles <path>\", `Path to compliance styles JSON (default: ${DEFAULT_STYLES_PATH})`)\n .option(\"--manifest <path>\", \"Path to manifest.json\", DEFAULT_MANIFEST_PATH)\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .option(\"--timeout <ms>\", \"Browser timeout per render (ms)\", \"10000\")\n .option(\"--viewport-width <px>\", \"Viewport width in pixels\", \"1280\")\n .option(\"--viewport-height <px>\", \"Viewport height in pixels\", \"720\")\n .action(\n async (\n tokenPath: string,\n opts: {\n newValue: string;\n sprite: boolean;\n output?: string;\n file?: string;\n styles?: string;\n manifest: string;\n format?: string;\n timeout: string;\n viewportWidth: string;\n viewportHeight: string;\n },\n ) => {\n try {\n const tokenFilePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(tokenFilePath);\n const resolver = new TokenResolver(tokens);\n const engine = new ComplianceEngine(resolver);\n\n const stylesPath = opts.styles ?? DEFAULT_STYLES_PATH;\n const stylesFile = loadStylesFile(stylesPath);\n\n const componentMap = new Map(Object.entries(stylesFile));\n const batchReport = engine.auditBatch(componentMap);\n const complianceReports = new Map(Object.entries(batchReport.components));\n\n const analyzer = new ImpactAnalyzer(resolver, complianceReports);\n const currentValue = resolver.resolve(tokenPath);\n const impactReport = analyzer.impactOf(tokenPath, opts.newValue);\n\n if (impactReport.components.length === 0) {\n process.stdout.write(\n `No components reference token \"${tokenPath}\". Nothing to preview.\\n`,\n );\n return;\n }\n\n const affectedNames = impactReport.components.map((c) => c.name);\n process.stderr.write(\n `Rendering ${affectedNames.length} component(s): ${affectedNames.join(\", \")}\\n`,\n );\n\n const manifest = loadManifest(opts.manifest);\n const vpWidth = Number.parseInt(opts.viewportWidth, 10);\n const vpHeight = Number.parseInt(opts.viewportHeight, 10);\n const timeout = Number.parseInt(opts.timeout, 10);\n\n const tokenCssVar = `--token-${tokenPath.replace(/\\./g, \"-\")}`;\n const beforeCss = `:root { ${tokenCssVar}: ${currentValue}; }`;\n const afterCss = `:root { ${tokenCssVar}: ${opts.newValue}; }`;\n\n // Render before/after for each affected component\n const renders: Array<{\n name: string;\n before: { screenshot: Buffer; width: number; height: number };\n after: { screenshot: Buffer; width: number; height: number };\n }> = [];\n\n for (const componentName of affectedNames) {\n const descriptor = manifest.components[componentName];\n if (descriptor === undefined) {\n process.stderr.write(\n `Warning: \"${componentName}\" not found in manifest — skipping\\n`,\n );\n continue;\n }\n\n process.stderr.write(` Rendering ${componentName} (before)...\\n`);\n const before = await renderComponentWithCssOverride(\n descriptor.filePath,\n componentName,\n beforeCss,\n vpWidth,\n vpHeight,\n timeout,\n );\n\n process.stderr.write(` Rendering ${componentName} (after)...\\n`);\n const after = await renderComponentWithCssOverride(\n descriptor.filePath,\n componentName,\n afterCss,\n vpWidth,\n vpHeight,\n timeout,\n );\n\n renders.push({ name: componentName, before, after });\n }\n\n if (renders.length === 0) {\n process.stderr.write(\n \"Warning: No components could be rendered (all missing from manifest).\\n\",\n );\n return;\n }\n\n // Normalise cell dimensions to max across all renders\n const cellW = Math.max(...renders.flatMap((r) => [r.before.width, r.after.width]));\n const cellH = Math.max(...renders.flatMap((r) => [r.before.height, r.after.height]));\n\n // Build MatrixResult — rows=2 (before/after), cols=components\n const cells = renders.flatMap((r, colIdx) => [\n {\n props: { version: \"before\", component: r.name },\n result: {\n screenshot: r.before.screenshot,\n width: cellW,\n height: cellH,\n renderTimeMs: 0,\n computedStyles: {},\n },\n index: colIdx * 2,\n axisIndices: [0, colIdx],\n },\n {\n props: { version: \"after\", component: r.name },\n result: {\n screenshot: r.after.screenshot,\n width: cellW,\n height: cellH,\n renderTimeMs: 0,\n computedStyles: {},\n },\n index: colIdx * 2 + 1,\n axisIndices: [1, colIdx],\n },\n ]);\n\n const matrixResult = {\n cells,\n axes: [\n { name: \"component\", values: renders.map((r) => r.name) },\n { name: \"version\", values: [\"before\", \"after\"] },\n ],\n axisLabels: [renders.map((r) => r.name), [\"before\", \"after\"]],\n rows: 2,\n cols: renders.length,\n stats: {\n totalCells: cells.length,\n totalRenderTimeMs: 0,\n avgRenderTimeMs: 0,\n minRenderTimeMs: 0,\n maxRenderTimeMs: 0,\n wallClockTimeMs: 0,\n },\n };\n\n const generator = new SpriteSheetGenerator({\n cellPadding: 8,\n borderWidth: 1,\n labelHeight: 32,\n labelWidth: 120,\n });\n\n const spriteResult = await generator.generate(matrixResult);\n\n // Determine output path\n const tokenLabel = tokenPath.replace(/\\./g, \"-\");\n const outputPath =\n opts.output ?? resolve(process.cwd(), DEFAULT_OUTPUT_DIR, `preview-${tokenLabel}.png`);\n\n const outputDir = resolve(outputPath, \"..\");\n mkdirSync(outputDir, { recursive: true });\n writeFileSync(outputPath, spriteResult.png);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(\n `${JSON.stringify(\n {\n tokenPath,\n oldValue: currentValue,\n newValue: opts.newValue,\n outputPath,\n width: spriteResult.width,\n height: spriteResult.height,\n components: renders.map((r) => r.name),\n cells: spriteResult.coordinates.length,\n },\n null,\n 2,\n )}\\n`,\n );\n } else {\n process.stdout.write(\n `Preview written to ${outputPath} (${spriteResult.width}×${spriteResult.height}px)\\n`,\n );\n process.stdout.write(`Components: ${renders.map((r) => r.name).join(\", \")}\\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 — binary entry point\n *\n * Parses argv and executes the Scope CLI.\n */\n\nimport { createProgram } from \"./program.js\";\n\nconst program = createProgram();\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;AAOA,SAAS,gBAAAA,sBAAoB;AAC7B,SAAS,cAAc,iBAAiB;AACxC,SAAS,WAAAC,iBAAe;;;ACGxB,SAAS,qBAAqB;AAE9B,SAAS,6BAA6B;AACtC,SAAS,gBAAgB;AA2BzB,eAAsB,eACpB,SAC+B;AAC/B,QAAM,EAAE,KAAK,UAAU,KAAQ,OAAO,EAAE,IAAI;AAE5C,QAAM,UAAU,MAAM,SAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AAExD,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,WAAW;AACzC,UAAM,OAAO,MAAM,QAAQ,QAAQ;AAMnC,UAAM,KAAK,cAAc,EAAE,SAAS,sBAAsB,EAAE,CAAC;AAG7D,UAAM,KAAK,KAAK,KAAK;AAAA,MACnB,WAAW;AAAA,MACX,SAAS,UAAU;AAAA,IACrB,CAAC;AAGD,UAAM,KAAK;AAAA,MACT,MAAM;AACJ,eACE,OAAQ,OAAoD,sBAC1D,eACD,SAAS,eAAe,cAAc,SAAS,eAAe;AAAA,MAEnE;AAAA,MACA,EAAE,QAAQ;AAAA,IACZ;AAGA,QAAI,OAAO,GAAG;AACZ,YAAM,KAAK,eAAe,IAAI;AAAA,IAChC;AAGA,UAAM,MAAM,MAAM,KAAK,SAAS,YAAY;AAC1C,YAAM,MAAM;AACZ,UAAI,OAAO,IAAI,sBAAsB,YAAY;AAC/C,cAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C;AACA,aAAO,IAAI,kBAAkB;AAAA,IAC/B,CAAC;AAED,QACE,QAAQ,QACR,OAAO,QAAQ,YACf,WAAW,OACX,OAAQ,IAAgC,UAAU,UAClD;AACA,YAAM,IAAI,MAAM,yBAA0B,IAAgC,KAAe,EAAE;AAAA,IAC7F;AAEA,UAAM,SAAS,EAAE,GAAI,KAAmC,OAAO,KAAK;AACpE,WAAO,EAAE,OAAO;AAAA,EAClB,UAAE;AACA,UAAM,QAAQ,MAAM;AAAA,EACtB;AACF;AAKO,SAAS,kBAAkB,QAAoB,YAAoB,QAAuB;AAC/F,QAAM,OAAO,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,KAAK,UAAU,MAAM;AAC7E,gBAAc,YAAY,MAAM,OAAO;AACzC;;;ACjFA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,iBAAAC,sBAAqB;AACxD,SAAS,WAAAC,gBAAe;AACxB,SAAS,wBAAuC;AAChD,SAAS,aAAgC,kBAAkB;AAE3D,SAAS,kBAAkB,qBAAqB;AAChD,SAAS,eAAe;;;ACfxB,SAAS,eAAe;AACxB,YAAY,aAAa;AAoBzB,eAAsB,sBACpB,UACA,eACA,OACA,eACA,YAEA,eAEA,oBAAoB,GACH;AACjB,QAAM,gBAAgB,MAAM,sBAAsB,UAAU,eAAe,KAAK;AAChF,SAAO,WAAW,eAAe,eAAe,YAAY,eAAe,iBAAiB;AAC9F;AAUA,eAAe,sBACb,UACA,eACA,OACiB;AAEjB,QAAM,YAAY,KAAK,UAAU,KAAK,EAAE,QAAQ,gBAAgB,aAAa;AAI7E,QAAM;AAAA;AAAA,IAAuB;AAAA,8BACD,KAAK,UAAU,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAOrC,KAAK,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQtC,KAAK,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAOnB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwBzB,QAAM,SAAS,MAAc,cAAM;AAAA,IACjC,OAAO;AAAA,MACL,UAAU;AAAA;AAAA,MAEV,YAAY,QAAQ,QAAQ;AAAA,MAC5B,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,IACL,iBAAiB;AAAA,IACjB,QAAQ;AAAA;AAAA,IAER,UAAU,CAAC;AAAA,IACX,QAAQ;AAAA,MACN,wBAAwB;AAAA,MACxB,QAAQ;AAAA,IACV;AAAA,IACA,UAAU;AAAA;AAAA,IAEV,QAAQ;AAAA,MACN,IAAI;AAAA,IACN;AAAA;AAAA;AAAA;AAAA,IAIA,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,MAAM,OAAO,OAChB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,WAAW,KAAK,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,IAAI,MAAM,EAAE,EAAE,EACrF,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM;AAAA,EAAwC,GAAG,EAAE;AAAA,EAC/D;AAEA,QAAM,aAAa,OAAO,cAAc,CAAC;AACzC,MAAI,eAAe,UAAa,WAAW,KAAK,WAAW,GAAG;AAC5D,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AAEA,SAAO,WAAW;AACpB;AAMA,SAAS,WACP,eACA,eACA,YACA,eACA,oBAAoB,GACZ;AACR,QAAM,oBACJ,cAAc,QAAQ,WAAW,SAAS,IACtC;AAAA,EAAmC,WAAW,QAAQ,eAAe,YAAY,CAAC;AAAA,YAClF;AACN,QAAM,qBACJ,iBAAiB,QAAQ,cAAc,SAAS,IAC5C,qCAAqC,aAAa,cAClD;AACN,SAAO;AAAA;AAAA;AAAA;AAAA,yCAIgC,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oFAW8B,iBAAiB;AAAA;AAAA,IAEjG,iBAAiB;AAAA;AAAA;AAAA;AAAA,IAIjB,kBAAkB;AAAA,YACV,aAAa;AAAA;AAAA;AAGzB;;;ACjNO,SAAS,QAAiB;AAC/B,SAAO,QAAQ,OAAO,UAAU;AAClC;AAMA,SAAS,IAAI,OAAe,OAAuB;AACjD,SAAO,MAAM,UAAU,QAAQ,MAAM,MAAM,GAAG,KAAK,IAAI,QAAQ,IAAI,OAAO,QAAQ,MAAM,MAAM;AAChG;AAEA,SAAS,WAAW,SAAmB,MAA0B;AAC/D,QAAM,YAAY,QAAQ;AAAA,IAAI,CAAC,GAAG,MAChC,KAAK,IAAI,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC;AAAA,EAC5D;AAEA,QAAM,UAAU,UAAU,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAC7D,QAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAC5E,QAAM,WAAW,KAAK;AAAA,IAAI,CAACC,SACzBA,KAAI,IAAI,CAAC,MAAM,MAAM,IAAI,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EACpE;AAEA,SAAO,CAAC,WAAW,SAAS,GAAG,QAAQ,EAAE,KAAK,IAAI;AACpD;AAgBO,SAAS,gBAAgB,MAAyB;AACvD,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QAAM,UAAU,CAAC,QAAQ,QAAQ,cAAc,SAAS,YAAY,cAAc,UAAU;AAC5F,QAAM,YAAY,KAAK,IAAI,CAAC,MAAM;AAAA,IAChC,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF,OAAO,EAAE,SAAS;AAAA,IAClB,OAAO,EAAE,YAAY;AAAA,IACrB,EAAE,cAAc;AAAA,IAChB,EAAE,WAAW,QAAQ;AAAA,EACvB,CAAC;AAED,SAAO,WAAW,SAAS,SAAS;AACtC;AAEO,SAAS,eAAe,MAAyB;AACtD,SAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACrC;AAMA,SAAS,kBAAkB,IAAyB;AAClD,QAAM,QAAkB,CAAC;AACzB,MAAI,GAAG,QAAQ,SAAS,EAAG,OAAM,KAAK,YAAY,GAAG,QAAQ,KAAK,IAAI,CAAC,EAAE;AACzE,MAAI,GAAG,OAAQ,OAAM,KAAK,QAAQ;AAClC,MAAI,GAAG,cAAc,SAAS,EAAG,OAAM,KAAK,kBAAkB,GAAG,cAAc,KAAK,IAAI,CAAC,EAAE;AAC3F,MAAI,GAAG,gBAAiB,OAAM,KAAK,iBAAiB;AACpD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,KAAK,IAAI;AAChD;AAEO,SAAS,eAAe,MAAc,YAAyC;AACpF,QAAM,YAAY,OAAO,KAAK,WAAW,KAAK;AAE9C,QAAM,QAAkB;AAAA,IACtB,cAAc,IAAI;AAAA,IAClB,qBAAqB,WAAW,QAAQ;AAAA,IACxC,qBAAqB,WAAW,UAAU;AAAA,IAC1C,qBAAqB,WAAW,WAAW;AAAA,IAC3C,qBAAqB,WAAW,eAAe;AAAA,IAC/C,qBAAqB,WAAW,QAAQ;AAAA,IACxC,qBAAqB,WAAW,YAAY;AAAA,IAC5C,qBAAqB,WAAW,YAAY,KAAK,IAAI,KAAK,MAAM;AAAA,IAChE,qBAAqB,WAAW,cAAc,KAAK,IAAI,KAAK,MAAM;AAAA,IAClE,qBAAqB,WAAW,iBAAiB,KAAK,IAAI,KAAK,MAAM;AAAA,IACrE,qBAAqB,WAAW,SAAS,KAAK,IAAI,KAAK,MAAM;AAAA,IAC7D,qBAAqB,WAAW,WAAW,KAAK,IAAI,KAAK,MAAM;AAAA,IAC/D,qBAAqB,kBAAkB,WAAW,WAAW,CAAC;AAAA,IAC9D,qBAAqB,WAAW,cAAc,QAAG;AAAA,IACjD,qBAAqB,WAAW,QAAQ;AAAA,IACxC;AAAA,IACA,YAAY,UAAU,MAAM;AAAA,EAC9B;AAEA,MAAI,UAAU,WAAW,GAAG;AAC1B,UAAM,KAAK,YAAY;AAAA,EACzB,OAAO;AACL,eAAW,YAAY,WAAW;AAChC,YAAM,IAAI,WAAW,MAAM,QAAQ;AACnC,UAAI,MAAM,OAAW;AACrB,YAAM,MAAM,EAAE,WAAW,aAAa;AACtC,YAAM,MAAM,EAAE,YAAY,SAAY,cAAc,EAAE,OAAO,MAAM;AACnE,YAAM,OAAO,EAAE,WAAW,SAAY,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,MAAM;AACrE,YAAM,KAAK,OAAO,QAAQ,KAAK,EAAE,OAAO,GAAG,IAAI,WAAM,GAAG,GAAG,GAAG,EAAE;AAAA,IAClE;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,cAAc,MAAc,YAAyC;AACnF,SAAO,KAAK,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;AACxD;AAgBO,SAAS,iBAAiB,MAAkB,WAA2B;AAC5E,MAAI,KAAK,WAAW,EAAG,QAAO,wBAAwB,SAAS;AAE/D,QAAM,UAAU,CAAC,QAAQ,QAAQ,cAAc,SAAS,YAAY,cAAc,UAAU;AAC5F,QAAM,YAAY,KAAK,IAAI,CAAC,MAAM;AAAA,IAChC,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE;AAAA,IACF,EAAE,cAAc;AAAA,IAChB,EAAE,WAAW,QAAQ;AAAA,EACvB,CAAC;AAED,SAAO,UAAU,SAAS;AAAA;AAAA,EAAO,WAAW,SAAS,SAAS,CAAC;AACjE;AAEO,SAAS,gBAAgB,MAA0B;AACxD,SAAO,KAAK,UAAU,MAAM,MAAM,CAAC;AACrC;AAUO,SAAS,UAAU,SAAiB,OAAwB;AAEjE,QAAM,UAAU,QAAQ,QAAQ,qBAAqB,MAAM;AAC3D,QAAM,WAAW,QACd,QAAQ,SAAS,kBAAY,EAC7B,QAAQ,OAAO,OAAO,EACtB,QAAQ,eAAe,IAAI;AAC9B,QAAM,QAAQ,IAAI,OAAO,IAAI,QAAQ,KAAK,GAAG;AAC7C,SAAO,MAAM,KAAK,KAAK;AACzB;;;AC5JO,SAAS,cAAc,MAAiD;AAC7E,QAAM,QAAQ,KAAK,YAAY;AAC/B,QAAM,QAAQ,mBAAmB,KAAK,KAAK;AAC3C,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,qBAAqB,IAAI,kDAAkD;AAAA,EAC7F;AACA,QAAM,QAAQ,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AAC1C,QAAM,SAAS,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AAC3C,MAAI,SAAS,KAAK,UAAU,GAAG;AAC7B,UAAM,IAAI,MAAM,uDAAuD,IAAI,EAAE;AAAA,EAC/E;AACA,SAAO,EAAE,OAAO,OAAO;AACzB;AAuBO,SAAS,iBACd,eACA,OACA,QACkB;AAClB,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,IACf,cAAc,OAAO;AAAA,IACrB,gBAAgB,OAAO;AAAA,IACvB,YAAY,OAAO,WAAW,SAAS,QAAQ;AAAA,IAC/C,KAAK,OAAO;AAAA,IACZ,SAAS,OAAO;AAAA,IAChB,eAAe,OAAO;AAAA,EACxB;AACF;AA8BO,SAAS,iBAAiB,QAAwC;AACvE,SAAO;AAAA,IACL,MAAM,OAAO,KAAK,IAAI,CAAC,UAAU;AAAA,MAC/B,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAAA,IAC1C,EAAE;AAAA,IACF,OAAO,EAAE,GAAG,OAAO,MAAM;AAAA,IACzB,OAAO,OAAO,MAAM,IAAI,CAAC,UAAsB;AAAA,MAC7C,OAAO,KAAK;AAAA,MACZ,aAAa,KAAK;AAAA,MAClB,OAAO,KAAK;AAAA,MACZ,cAAc,KAAK,OAAO;AAAA,MAC1B,OAAO,KAAK,OAAO;AAAA,MACnB,QAAQ,KAAK,OAAO;AAAA,MACpB,YAAY,KAAK,OAAO,WAAW,SAAS,QAAQ;AAAA,IACtD,EAAE;AAAA,EACJ;AACF;AAYO,SAAS,iBAAiB,eAAuB,QAA8B;AACpF,QAAM,YAAY,OAAO,MACtB,IAAI,CAAC,SAAqB;AACzB,UAAM,MAAM,KAAK,OAAO,WAAW,SAAS,QAAQ;AACpD,UAAM,YAAY;AAAA,MAChB,OAAO,QAAQ,KAAK,KAAK,EACtB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,OAAO,CAAC,CAAC,EAAE,EACpC,KAAK,IAAI;AAAA,IACd;AACA,WAAO;AAAA,wCAC2B,GAAG,UAAU,SAAS,YAAY,KAAK,OAAO,KAAK,aAAa,KAAK,OAAO,MAAM;AAAA,2BAC/F,SAAS;AAAA,0BACV,KAAK,OAAO,aAAa,QAAQ,CAAC,CAAC;AAAA;AAAA,EAEzD,CAAC,EACA,KAAK,IAAI;AAEZ,QAAM,WAAW,OAAO,KACrB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,EAAE,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EACpE,KAAK,KAAK;AAEb,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKE,WAAW,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAc5B,WAAW,aAAa,CAAC;AAAA,4BACL,WAAW,QAAQ,CAAC;AAAA;AAAA,EAE9C,SAAS;AAAA;AAAA;AAAA,MAGL,OAAO,MAAM,UAAU;AAAA,UACnB,OAAO,MAAM,gBAAgB,QAAQ,CAAC,CAAC;AAAA,UACvC,OAAO,MAAM,gBAAgB,QAAQ,CAAC,CAAC;AAAA,UACvC,OAAO,MAAM,gBAAgB,QAAQ,CAAC,CAAC;AAAA,WACtC,OAAO,MAAM,gBAAgB,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAKlD;AAWO,SAAS,gBAAgB,eAAuB,QAA8B;AACnF,QAAM,YAAY,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI;AAC/C,QAAM,UAAU,CAAC,aAAa,GAAG,WAAW,gBAAgB,SAAS,QAAQ;AAE7E,QAAM,OAAO,OAAO,MAAM,IAAI,CAAC,SAAqB;AAClD,UAAM,WAAW,OAAO,KAAK,IAAI,CAAC,GAAG,MAAM;AACzC,YAAM,UAAU,KAAK,YAAY,CAAC;AAClC,YAAM,OAAO,OAAO,KAAK,CAAC;AAC1B,UAAI,YAAY,UAAa,SAAS,OAAW,QAAO;AACxD,YAAM,MAAM,KAAK,OAAO,OAAO;AAC/B,aAAO,QAAQ,SAAY,UAAU,OAAO,GAAG,CAAC,IAAI;AAAA,IACtD,CAAC;AACD,WAAO;AAAA,MACL,UAAU,aAAa;AAAA,MACvB,GAAG;AAAA,MACH,KAAK,OAAO,aAAa,QAAQ,CAAC;AAAA,MAClC,OAAO,KAAK,OAAO,KAAK;AAAA,MACxB,OAAO,KAAK,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,GAAG;AAAA,EACZ,CAAC;AAED,SAAO,GAAG,CAAC,QAAQ,KAAK,GAAG,GAAG,GAAG,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA;AACnD;AAYO,SAAS,kBACd,WACA,OACA,aACA,KACA,WAAW,IACH;AACR,QAAM,SAAS,KAAK,MAAO,MAAM,MAAO,QAAQ;AAChD,QAAM,QAAQ,WAAW;AACzB,QAAM,MAAM,IAAI,OAAO,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM,MAAM,IAAI,OAAO,KAAK;AAC5F,QAAM,YAAY,YAAY,MAAM,GAAG,EAAE,EAAE,OAAO,EAAE;AACpD,SAAO,aAAa,SAAS,IAAI,KAAK,IAAI,SAAS,KAAK,GAAG,KAAK,GAAG;AACrE;AAgBO,SAAS,kBAAkB,SAAmC,WAA2B;AAC9F,QAAM,QAAQ,QAAQ;AACtB,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAChD,QAAM,SAAS,QAAQ;AACvB,QAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY;AAC/E,QAAM,QACJ,aAAa,SAAS,IAAI,aAAa,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,IAAI,aAAa,SAAS;AAE5F,QAAM,QAAkB;AAAA,IACtB,SAAI,OAAO,EAAE;AAAA,IACb;AAAA,IACA,SAAI,OAAO,EAAE;AAAA,IACb,wBAAwB,KAAK;AAAA,IAC7B,wBAAwB,MAAM;AAAA,IAC9B,wBAAwB,MAAM;AAAA,IAC9B,wBAAwB,MAAM,QAAQ,CAAC,CAAC;AAAA,IACxC,wBAAwB,SAAS;AAAA,EACnC;AAEA,MAAI,SAAS,GAAG;AACd,UAAM,KAAK,IAAI,sBAAsB;AACrC,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,EAAE,SAAS;AACd,cAAM,KAAK,cAAS,EAAE,IAAI,KAAK,EAAE,gBAAgB,eAAe,EAAE;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,SAAI,OAAO,EAAE,CAAC;AACzB,SAAO,MAAM,KAAK,IAAI;AACxB;AAMA,SAAS,WAAW,KAAqB;AACvC,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ;AAC3B;AAEA,SAAS,UAAU,OAAuB;AACxC,MAAI,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,GAAG,KAAK,MAAM,SAAS,IAAI,GAAG;AACtE,WAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AAAA,EACtC;AACA,SAAO;AACT;;;AChTA,SAAS,YAAY,oBAAoB;AACzC,SAAS,qBAAqB;AAC9B,SAAS,eAAe;AAExB,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAM,yBAAyB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,kBAAkB;AAEjB,SAAS,qBAAqB,IAAuB;AAC1D,QAAM,YAAY,GAAG;AACrB,QAAM,MACJ,OAAO,cAAc,WACjB,YACA,OAAQ,WAA6C,YAAY,WAC9D,UAAgC,UAChC,GAAG,aAAa,OAAO,KAAK;AACrC,SAAO,IAAI,MAAM,KAAK,EAAE,OAAO,OAAO;AACxC;AAQA,IAAI,gBAGO;AAEX,SAAS,eAAe,KAAwD;AAC9E,MAAI,kBAAkB,QAAQ,QAAQ,cAAc,GAAG,MAAM,QAAQ,GAAG,GAAG;AACzE,WAAO,cAAc;AAAA,EACvB;AACA,SAAO;AACT;AAMO,SAAS,gBAAgB,KAA4B;AAE1D,aAAW,QAAQ,kBAAkB;AACnC,UAAM,IAAI,QAAQ,KAAK,IAAI;AAC3B,QAAI,CAAC,WAAW,CAAC,EAAG;AACpB,QAAI;AACF,UAAI,KAAK,SAAS,OAAO,GAAG;AAC1B,cAAM,MAAM,aAAa,GAAG,OAAO;AACnC,cAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,cAAM,QAAQ,KAAK;AACnB,cAAM,QAAQ,OAAO,eAAgB,KAAK;AAC1C,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,cAAI,WAAW,IAAI,EAAG,QAAO;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,KAAK,cAAc;AAC3C,MAAI,WAAW,OAAO,GAAG;AACvB,QAAI;AACF,YAAM,MAAM,aAAa,SAAS,OAAO;AACzC,YAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,YAAM,QAAQ,IAAI,OAAO;AACzB,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,YAAI,WAAW,IAAI,EAAG,QAAO;AAAA,MAC/B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,aAAW,aAAa,wBAAwB;AAC9C,UAAM,OAAO,QAAQ,KAAK,SAAS;AACnC,QAAI,WAAW,IAAI,GAAG;AACpB,UAAI;AACF,cAAM,UAAU,aAAa,MAAM,OAAO;AAC1C,YAAI,gBAAgB,KAAK,OAAO,EAAG,QAAO;AAAA,MAC5C,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAsB,oBACpB,KACoD;AACpD,QAAM,SAAS,eAAe,GAAG;AACjC,MAAI,WAAW,KAAM,QAAO;AAE5B,QAAM,YAAY,gBAAgB,GAAG;AACrC,MAAI,cAAc,KAAM,QAAO;AAG/B,MAAI;AACJ,MAAI;AACF,UAAMC,WAAU,cAAc,QAAQ,KAAK,cAAc,CAAC;AAC1D,UAAM,WAAWA,SAAQ,aAAa;AAMtC,UAAM,KAAK,SAAS;AACpB,QAAI,OAAO,OAAO,WAAY,QAAO;AACrC,cAAU;AAAA,EACZ,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,aAAa,WAAW,OAAO;AAEpD,QAAM,iBAAiB,OACrB,IACA,SAC6D;AAC7D,QAAI,OAAO,eAAe;AACxB,YAAM,cAAc,QAAQ,KAAK,cAAc;AAC/C,YAAM,kBAAkB,QAAQ,aAAa,eAAe,WAAW;AACvE,UAAI,CAAC,WAAW,eAAe,GAAG;AAChC,cAAM,IAAI;AAAA,UACR,iDAAiD,eAAe;AAAA,QAClE;AAAA,MACF;AACA,YAAM,UAAU,aAAa,iBAAiB,OAAO;AACrD,aAAO,EAAE,MAAM,iCAAiC,MAAM,QAAQ;AAAA,IAChE;AACA,UAAM,OAAO,QAAQ,MAAM,EAAE;AAC7B,QAAI,WAAW,IAAI,GAAG;AACpB,YAAM,UAAU,aAAa,MAAM,OAAO;AAC1C,aAAO,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,IAAI,GAAG,QAAQ;AAAA,IAC1D;AACA,UAAM,IAAI,MAAM,2CAA2C,EAAE,WAAW,IAAI,GAAG;AAAA,EACjF;AAEA,QAAM,SAAS,MAAM,QAAQ,cAAc;AAAA,IACzC,MAAM;AAAA,IACN,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AAED,QAAMC,SAAQ,OAAO,MAAM,KAAK,MAAM;AACtC,kBAAgB,EAAE,KAAK,OAAAA,OAAM;AAC7B,SAAOA;AACT;AAMA,eAAsB,yBACpB,KACA,SACwB;AACxB,QAAMA,SAAQ,MAAM,oBAAoB,GAAG;AAC3C,MAAIA,WAAU,KAAM,QAAO;AAC3B,QAAM,UAAU,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC,EAAE,OAAO,OAAO;AACpD,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAOA,OAAM,OAAO;AACtB;AAYA,eAAsB,qBACpB,aACA,KACwB;AACxB,QAAM,EAAE,YAAAC,cAAY,cAAAC,eAAa,IAAI,MAAM,OAAO,IAAS;AAC3D,QAAM,EAAE,eAAAC,eAAc,IAAI,MAAM,OAAO,QAAa;AAEpD,MAAI,CAACF,aAAW,WAAW,EAAG,QAAO;AAErC,QAAM,MAAMC,eAAa,aAAa,OAAO;AAG7C,QAAM,eAAe,sCAAsC,KAAK,GAAG;AACnE,MAAI,CAAC,cAAc;AAEjB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAMH,WAAUI,eAAc,QAAQ,KAAK,cAAc,CAAC;AAG1D,QAAI;AAGJ,QAAI;AAEJ,QAAI;AACF,gBAAUJ,SAAQ,SAAS;AAC3B,iBAAWA,SAAQ,aAAa;AAAA,IAClC,QAAQ;AAEN,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,2BAAqBA,SAAQ,cAAc;AAAA,IAC7C,QAAQ;AACN,2BAAqB;AAAA,IACvB;AAEA,UAAM,UAAU,qBAAqB,CAAC,UAAU,kBAAkB,IAAI,CAAC,QAAQ;AAC/E,UAAM,SAAS,MAAM,QAAQ,OAAO,EAAE,QAAQ,KAAK;AAAA,MACjD,MAAM;AAAA,MACN,IAAI;AAAA,IACN,CAAC;AACD,WAAO,OAAO;AAAA,EAChB,SAAS,KAAK;AAEZ,YAAQ,OAAO;AAAA,MACb,sDAAsD,WAAW,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA;AAAA,IACxH;AACA,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,cAAc,gBAA0B,KAAqC;AACjG,MAAI,eAAe,WAAW,EAAG,QAAO;AACxC,QAAM,QAAkB,CAAC;AACzB,aAAW,WAAW,gBAAgB;AACpC,UAAM,UAAU,QAAQ,KAAK,OAAO;AACpC,UAAM,MAAM,MAAM,qBAAqB,SAAS,GAAG;AACnD,QAAI,QAAQ,QAAQ,IAAI,KAAK,EAAE,SAAS,GAAG;AACzC,YAAM,KAAK,GAAG;AAAA,IAChB;AAAA,EACF;AACA,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;;;AJzOO,IAAM,UAAU;AAAA;AAAA,EAErB,IAAI;AAAA;AAAA,EAEJ,4BAA4B;AAAA;AAAA,EAE5B,iBAAiB;AAAA;AAAA,EAEjB,gBAAgB;AAAA;AAAA,EAEhB,mBAAmB;AAAA;AAAA,EAEnB,iBAAiB;AACnB;AAUA,IAAM,aAA4B,CAAC,cAAc,QAAQ,kBAAkB,mBAAmB;AAiE9F,IAAI,QAA4B;AAEhC,eAAe,QAAQ,eAAuB,gBAA8C;AAC1F,MAAI,UAAU,MAAM;AAClB,YAAQ,IAAI,YAAY;AAAA,MACtB,MAAM,EAAE,UAAU,GAAG,iBAAiB,EAAE;AAAA,MACxC;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,MAAM,KAAK;AAAA,EACnB;AACA,SAAO;AACT;AAEA,eAAe,eAA8B;AAC3C,MAAI,UAAU,MAAM;AAClB,UAAM,MAAM,MAAM;AAClB,YAAQ;AAAA,EACV;AACF;AAMA,eAAe,gBACb,UACA,eACA,OACA,eACA,gBACuB;AACvB,QAAM,MAAM;AACZ,QAAM,OAAO,MAAM,QAAQ,eAAe,cAAc;AACxD,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,QAAM,EAAE,KAAK,IAAI;AAEjB,MAAI;AACF,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAExD,UAAM,KAAK;AAAA,MACT,MAAM;AACJ,cAAM,IAAI;AAIV,eAAO,EAAE,8BAA8B;AAAA,MACzC;AAAA,MACA,EAAE,SAAS,KAAO;AAAA,IACpB;AAEA,UAAM,cAAc,MAAM,KAAK,SAAS,MAAM;AAC5C,aAEI,OAGA,0BAA0B;AAAA,IAEhC,CAAC;AAED,QAAI,gBAAgB,MAAM;AACxB,YAAM,IAAI,MAAM,2BAA2B,WAAW,EAAE;AAAA,IAC1D;AAEA,UAAM,UAAU,QAAQ,IAAI;AAC5B,UAAM,UAAU,MAAM,KAAK,SAAS,MAAM;AACxC,YAAM,MAAM,oBAAI,IAAY;AAC5B,eAAS,iBAAiB,SAAS,EAAE,QAAQ,CAAC,OAAO;AACnD,mBAAW,KAAK,qBAAqB,EAAE,GAAG;AACxC,cAAI,IAAI,CAAC;AAAA,QACX;AAAA,MACF,CAAC;AACD,aAAO,CAAC,GAAG,GAAG;AAAA,IAChB,CAAC;AACD,UAAM,aAAa,MAAM,yBAAyB,SAAS,OAAO;AAClE,QAAI,cAAc,QAAQ,WAAW,SAAS,GAAG;AAC/C,YAAM,KAAK,YAAY,EAAE,SAAS,WAAW,CAAC;AAAA,IAChD;AAEA,UAAM,UAAU,YAAY,IAAI;AAEhC,UAAM,cAAc,KAAK,QAAQ,wBAAwB;AACzD,UAAM,cAAc,MAAM,YAAY,YAAY;AAElD,QAAI,gBAAgB,QAAQ,YAAY,UAAU,KAAK,YAAY,WAAW,GAAG;AAC/E,YAAM,IAAI;AAAA,QACR,cAAc,aAAa;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,QAAQ;AACd,UAAM,QAAQ;AAEd,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI,GAAG;AAC7C,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI,GAAG;AAC7C,UAAM,OAAO,YAAY,QAAQ,MAAM;AACvC,UAAM,OAAO,YAAY,SAAS,MAAM;AACxC,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;AAClC,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;AAClC,UAAM,QAAQ,KAAK,IAAI,OAAO,gBAAgB,KAAK;AACnD,UAAM,QAAQ,KAAK,IAAI,OAAO,iBAAiB,KAAK;AAEpD,UAAM,aAAa,MAAM,KAAK,WAAW;AAAA,MACvC,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,MACxD,MAAM;AAAA,IACR,CAAC;AAED,UAAM,oBAA4D,CAAC;AACnE,UAAM,SAAS,MAAM,KAAK,SAAS,CAAC,QAAgB;AAClD,YAAM,KAAK,SAAS,cAAc,GAAG;AACrC,UAAI,OAAO,KAAM,QAAO,CAAC;AACzB,YAAM,WAAW,OAAO,iBAAiB,EAAE;AAC3C,YAAM,MAA8B,CAAC;AACrC,iBAAW,QAAQ;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AACD,YAAI,IAAI,IAAI,SAAS,iBAAiB,IAAI;AAAA,MAC5C;AACA,aAAO;AAAA,IACT,GAAG,4BAA4B;AAC/B,sBAAkB,4BAA4B,IAAI;AAElD,UAAM,eAAe,YAAY,IAAI,IAAI;AAEzC,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,MAAM,KAAK;AAAA,MACvB,QAAQ,KAAK,MAAM,KAAK;AAAA,MACxB;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF,UAAE;AACA,SAAK,QAAQ,IAAI;AAAA,EACnB;AACF;AAMA,SAAS,sBACP,mBACgB;AAChB,QAAM,OAA+B,CAAC;AACtC,aAAW,UAAU,OAAO,OAAO,iBAAiB,GAAG;AACrD,WAAO,OAAO,MAAM,MAAM;AAAA,EAC5B;AAEA,QAAM,SAAiC,CAAC;AACxC,QAAM,UAAkC,CAAC;AACzC,QAAM,aAAqC,CAAC;AAC5C,QAAM,UAAkC,CAAC;AACzC,QAAM,UAAkC,CAAC;AAEzC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAChD,QAAI,SAAS,WAAW,SAAS,mBAAmB;AAClD,aAAO,IAAI,IAAI;AAAA,IACjB,WAAW,SAAS,aAAa,SAAS,UAAU;AAClD,cAAQ,IAAI,IAAI;AAAA,IAClB,WACE,SAAS,cACT,SAAS,gBACT,SAAS,gBACT,SAAS,cACT;AACA,iBAAW,IAAI,IAAI;AAAA,IACrB,WAAW,SAAS,kBAAkB,SAAS,eAAe;AAC5D,cAAQ,IAAI,IAAI;AAAA,IAClB,WAAW,SAAS,aAAa;AAC/B,cAAQ,IAAI,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,SAAS,YAAY,SAAS,QAAQ;AACzD;AAYA,SAAS,uBACP,aACA,eAC2B;AAC3B,QAAM,WAAWK,SAAQ,aAAa,WAAW,GAAG,aAAa,OAAO;AACxE,MAAI,CAACC,YAAW,QAAQ,EAAG,QAAO;AAClC,SAAO,KAAK,MAAMC,cAAa,UAAU,OAAO,CAAC;AACnD;AAYA,eAAsB,MAAM,UAAqB,CAAC,GAAsB;AACtE,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,SAAS;AAAA,IACT,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB,IAAI;AAEJ,QAAM,YAAY,YAAY,IAAI;AAClC,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,YAAY,IAAI,IAAiB,MAAM;AAC7C,QAAM,cAAc,mBAAmB,SAAYF,SAAQ,SAAS,cAAc,IAAI;AAGtF,UAAQ,OAAO,MAAM,uCAAkC;AACvD,QAAM,WAAqB,MAAM,iBAAiB,EAAE,QAAQ,CAAC;AAC7D,QAAM,iBAAiB,OAAO,KAAK,SAAS,UAAU;AACtD,QAAM,QAAQ,eAAe;AAC7B,UAAQ,OAAO,MAAM,SAAS,KAAK;AAAA,CAAgB;AAGnD,UAAQ,OAAO,MAAM,aAAa,KAAK;AAAA,CAAgB;AAEvD,QAAM,oBAAoB,oBAAI,IAA4B;AAC1D,QAAM,oBAAoB,oBAAI,IAA+C;AAC7E,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,MAAI,YAAY;AAChB,QAAM,cAAc;AACpB,MAAI,UAAU;AAEd,QAAM,YAAY,OAAO,SAAgC;AACvD,UAAM,aAAa,SAAS,WAAW,IAAI;AAC3C,QAAI,eAAe,OAAW;AAE9B,UAAM,WAAWA,SAAQ,SAAS,WAAW,QAAQ;AAErD,UAAM,UAAU,MAAM;AAAA,MACpB,MAAM,gBAAgB,UAAU,MAAM,CAAC,GAAG,eAAe,cAAc;AAAA,MACvE;AAAA,QACE,OAAO,CAAC;AAAA,QACR,gBAAgB;AAAA,UACd,MAAM,WAAW;AAAA,UACjB,MAAM,WAAW,IAAI;AAAA,UACrB,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA;AACA,UAAM,MAAM,KAAK,MAAO,YAAY,QAAS,GAAG;AAEhD,QAAI,MAAM,GAAG;AACX,cAAQ,OAAO,MAAM,GAAG,kBAAkB,WAAW,OAAO,MAAM,GAAG,CAAC,IAAI;AAAA,IAC5E;AAEA,QAAI,QAAQ,SAAS;AACnB,qBAAe,IAAI,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ;AACvB,sBAAkB,IAAI,MAAM,EAAE,OAAO,OAAO,OAAO,QAAQ,OAAO,OAAO,CAAC;AAC1E,sBAAkB,IAAI,MAAM,sBAAsB,OAAO,cAAc,CAAC;AAAA,EAC1E;AAEA,MAAI,QAAQ,GAAG;AACb,UAAM,SAAS,YAA2B;AACxC,aAAO,UAAU,eAAe,QAAQ;AACtC,cAAM,IAAI;AACV,cAAM,OAAO,eAAe,CAAC;AAC7B,YAAI,SAAS,QAAW;AACtB,gBAAM,UAAU,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAA2B,CAAC;AAClC,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,aAAa,KAAK,GAAG,KAAK;AACrD,cAAQ,KAAK,OAAO,CAAC;AAAA,IACvB;AACA,UAAM,QAAQ,IAAI,OAAO;AAAA,EAC3B;AAEA,QAAM,aAAa;AAEnB,MAAI,MAAM,KAAK,QAAQ,GAAG;AACxB,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAGA,QAAM,WAAW,IAAI,cAAc,CAAC,CAAC;AACrC,QAAM,SAAS,IAAI,iBAAiB,QAAQ;AAC5C,QAAM,cAA2B,OAAO,WAAW,iBAAiB;AACpE,QAAM,kBAAkB,YAAY;AAGpC,QAAM,eAAgC,CAAC;AAGvC,QAAM,qBAAqB,eAAe;AAC1C,QAAM,gBAAgB,uBAAuB;AAG7C,MAAI,UAAU,IAAI,YAAY,GAAG;AAC/B,UAAM,mBAAmB,mBAAmB;AAC5C,iBAAa,KAAK;AAAA,MAChB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,mBACL,eAAe,kBAAkB,KAAK,QAAQ,CAAC,CAAC,mBAAmB,sBAAsB,KAAK,QAAQ,CAAC,CAAC,MACxG,eAAe,kBAAkB,KAAK,QAAQ,CAAC,CAAC,kBAAkB,sBAAsB,KAAK,QAAQ,CAAC,CAAC;AAAA,MAC3G,OAAO;AAAA,MACP,WAAW;AAAA,IACb,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,IAAI,MAAM,GAAG;AAGzB,iBAAa,KAAK;AAAA,MAChB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,IAAI,gBAAgB,GAAG;AAGnC,UAAM,sBAAsB;AAC5B,iBAAa,KAAK;AAAA,MAChB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS,sBACL,+BACA,gCAA2B,kBAAkB;AAAA,IACnD,CAAC;AAAA,EACH;AAGA,MAAI,sBAAsB;AAE1B,MAAI,UAAU,IAAI,mBAAmB,KAAK,gBAAgB,QAAW;AACnE,QAAI,CAACC,YAAW,WAAW,GAAG;AAC5B,cAAQ,OAAO;AAAA,QACb,6CAA6C,WAAW;AAAA;AAAA,MAC1D;AACA,mBAAa,KAAK;AAAA,QAChB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,SAAS,yBAAyB,WAAW;AAAA,MAC/C,CAAC;AAAA,IACH,OAAO;AAGL,YAAM,cAAwB,CAAC;AAE/B,iBAAW,QAAQ,gBAAgB;AACjC,cAAM,eAAe,uBAAuB,aAAa,IAAI;AAC7D,cAAM,cAAc,kBAAkB,IAAI,IAAI;AAE9C,YAAI,iBAAiB,QAAQ,gBAAgB,QAAW;AACtD,gBAAM,KAAK,KAAK,IAAI,YAAY,QAAQ,aAAa,KAAK;AAC1D,gBAAM,KAAK,KAAK,IAAI,YAAY,SAAS,aAAa,MAAM;AAC5D,cAAI,KAAK,MAAM,KAAK,IAAI;AACtB,wBAAY,KAAK,IAAI;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAEA,4BAAsB,YAAY,SAAS;AAC3C,mBAAa,KAAK;AAAA,QAChB,OAAO;AAAA,QACP,QAAQ,CAAC;AAAA,QACT,SAAS,sBACL,iCAAiC,YAAY,MAAM,kBAAkB,YAAY,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,GAAG,YAAY,SAAS,IAAI,QAAQ,EAAE,KAC7I;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAKA,MAAI,WAAuB,QAAQ;AAEnC,QAAM,mBAAmB,aAAa,KAAK,CAAC,MAAM,EAAE,UAAU,YAAY;AAC1E,QAAM,aAAa,aAAa,KAAK,CAAC,MAAM,EAAE,UAAU,MAAM;AAC9D,QAAM,gBAAgB,aAAa,KAAK,CAAC,MAAM,EAAE,UAAU,gBAAgB;AAC3E,QAAM,eAAe,aAAa,KAAK,CAAC,MAAM,EAAE,UAAU,mBAAmB;AAE7E,MAAI,qBAAqB,UAAa,CAAC,iBAAiB,QAAQ;AAC9D,eAAW,QAAQ;AAAA,EACrB,WAAW,eAAe,UAAa,CAAC,WAAW,QAAQ;AACzD,eAAW,QAAQ;AAAA,EACrB,WAAW,kBAAkB,UAAa,CAAC,cAAc,QAAQ;AAC/D,eAAW,QAAQ;AAAA,EACrB,WAAW,iBAAiB,UAAa,CAAC,aAAa,QAAQ;AAC7D,eAAW,QAAQ;AAAA,EACrB,WAAW,CAAC,eAAe;AACzB,eAAW,QAAQ;AAAA,EACrB;AAEA,QAAM,SAAS,aAAa,QAAQ;AACpC,QAAM,cAAc,YAAY,IAAI,IAAI;AAExC,SAAO;AAAA,IACL,QAAO,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,MACV;AAAA,MACA,UAAU,QAAQ;AAAA,MAClB,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,gBAAgB,UAAaA,YAAW,WAAW;AAAA,IACrE;AAAA,EACF;AACF;AASO,SAAS,eAAe,QAA0B;AACvD,QAAM,QAAkB,CAAC;AAEzB,QAAM,QAAQ;AACd,QAAME,QAAO,IAAI,OAAO,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC;AAClD,QAAM,KAAK,OAAOA,KAAI;AAGtB,QAAM,EAAE,OAAO,UAAU,OAAO,IAAI,OAAO;AAC3C,QAAM;AAAA,IACJ,eAAe,KAAK,WAAW,QAAQ,YAAY,SAAS,IAAI,KAAK,MAAM,YAAY,EAAE;AAAA,EAC3F;AAGA,QAAM,KAAK,EAAE;AACb,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,OAAO,MAAM,SAAS,SAAS;AACrC,UAAM,KAAK,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,EAC3C;AAGA,MAAI,OAAO,WAAW,SAAS,GAAG;AAChC,UAAM,KAAK,YAAY,OAAO,WAAW,MAAM,gCAAgC;AAAA,EACjF;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAKA,KAAI;AAEf,MAAI,OAAO,QAAQ;AACjB,UAAM;AAAA,MACJ,iBAAiB,OAAO,cAAc,KAAM,QAAQ,CAAC,CAAC,iBAAiB,OAAO,QAAQ;AAAA,IACxF;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ,iBAAiB,OAAO,cAAc,KAAM,QAAQ,CAAC,CAAC,iBAAiB,OAAO,QAAQ;AAAA,IACxF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAUA,SAAS,YAAY,KAAoD;AACvE,MAAI,QAAQ,OAAW,QAAO;AAE9B,QAAM,QAAQ,IACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAEjB,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,QAAQ,IAAI,IAAY,UAAU;AACxC,QAAM,SAAwB,CAAC;AAE/B,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,MAAM,IAAI,IAAI,GAAG;AACpB,cAAQ,OAAO;AAAA,QACb,2BAA2B,IAAI,8BAAyB,WAAW,KAAK,IAAI,CAAC;AAAA;AAAA,MAC/E;AACA;AAAA,IACF;AACA,WAAO,KAAK,IAAmB;AAAA,EACjC;AAEA,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAQO,SAAS,kBAA2B;AACzC,SAAO,IAAI,QAAQ,IAAI,EACpB;AAAA,IACC;AAAA,EAwBF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA,wDAAwD,WAAW,KAAK,IAAI,CAAC;AAAA,EAC/E,EACC,OAAO,mBAAmB,kDAAkD,MAAM,EAClF,OAAO,oBAAoB,gCAAgC,SAAS,EACpE,OAAO,UAAU,6DAA6D,KAAK,EACnF,OAAO,uBAAuB,oCAAoC,EAClE;AAAA,IACC,OAAO,SAOD;AACJ,UAAI;AACF,cAAM,CAAC,MAAM,IAAI,IAAI,KAAK,SAAS,MAAM,GAAG;AAC5C,cAAM,gBAAgB,OAAO,SAAS,QAAQ,OAAO,EAAE;AACvD,cAAM,iBAAiB,OAAO,SAAS,QAAQ,OAAO,EAAE;AACxD,cAAM,sBAAsB,OAAO,WAAW,KAAK,SAAS;AAC5D,cAAM,SAAS,YAAY,KAAK,MAAM;AAEtC,cAAM,SAAS,MAAM,MAAM;AAAA,UACzB,aAAa,KAAK;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAGD,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,UAAUH,SAAQ,QAAQ,IAAI,GAAG,KAAK,MAAM;AAClD,UAAAI,eAAc,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AAC/D,kBAAQ,OAAO,MAAM,wBAAwB,KAAK,MAAM;AAAA,CAAI;AAAA,QAC9D;AAGA,gBAAQ,OAAO,MAAM,GAAG,eAAe,MAAM,CAAC;AAAA,CAAI;AAGlD,YAAI,KAAK,MAAM;AACb,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QAC7D;AAEA,gBAAQ,KAAK,OAAO,QAAQ;AAAA,MAC9B,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,QAAQ,eAAe;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACJ;;;AKjvBA,SAAS,cAAAC,aAAY,aAAa,gBAAAC,eAAc,gBAAgB;AAChE,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,WAAAC,gBAAe;;;ACTxB,SAAS,WAAW,cAAAC,aAAY,gBAAAC,qBAAoB;AACpD,SAAS,cAAc;AACvB,SAAS,WAAAC,UAAS,YAAY;AAiB9B,IAAM,2BAA2B;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,2BAA2B,CAAC,qBAAqB,sBAAsB,kBAAkB;AAE/F,IAAM,gCAAgC,CAAC,SAAS,aAAa,mBAAmB;AAEzE,SAAS,qCAAoD;AAClE,QAAM,QAAQ,QAAQ,IAAI;AAC1B,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEO,SAAS,gCACd,QAIQ;AACR,QAAM,gBAAgB,QAAQ,wBAAwB,mCAAmC;AACzF,MAAI,kBAAkB,MAAM;AAC1B,UAAM,cACJ,QAAQ,sBAAsB,QAC1B,YACA,QAAQ,wBAAwB,QAC9B,eACA;AACR,WAAO,sCAAsC,aAAa,+BAA+B,WAAW,6JAA6J,aAAa;AAAA,EAChR;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAgB,MAAM,QAAQ,IAAI,GAA2B;AAC9F,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAM,aAAa,QAAQ,YAAY;AAEvC,MAAI,yBAAyB,KAAK,CAAC,SAAS,WAAW,SAAS,IAAI,CAAC,GAAG;AACtE,UAAM,cAAc,6BAA6B,OAAO;AACxD,UAAM,kBACJ,gBAAgB,OAAO,KAAK,wCAAwC,WAAW;AAEjF,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UACE,gCAAgC,IAChC,kBACA;AAAA,IACJ;AAAA,EACF;AAEA,MAAI,yBAAyB,KAAK,CAAC,SAAS,WAAW,SAAS,IAAI,CAAC,GAAG;AACtE,UAAM,iBAAiB,qBAAqB,GAAG;AAC/C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU,SAAS,cAAc,iBAAiB,GAAG;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,OAAgB,MAAM,QAAQ,IAAI,GAAW;AACjF,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAM,aAAa,mBAAmB,OAAO,GAAG;AAChD,MAAI,eAAe,KAAM,QAAO,UAAU,OAAO;AACjD,SAAO,UAAU,WAAW,IAAI,MAAM,WAAW,OAAO;AAAA,YAAe,WAAW,QAAQ;AAAA,SAAY,OAAO;AAC/G;AAEA,eAAsB,2BACpB,MAAM,QAAQ,IAAI,GACgB;AAClC,QAAM,uBAAuB,mCAAmC;AAChE,QAAM,iBAAiB,oCAAoC,GAAG;AAC9D,QAAM,YAAY,mBAAmB,QAAQC,YAAW,cAAc;AACtE,QAAM,oBAAoB,yBAAyB,OAAO,OAAOA,YAAW,oBAAoB;AAChG,QAAM,sBACJ,yBAAyB,OAAO,OAAO,MAAM,sBAAsB,oBAAoB;AAEzF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,gCAAgC;AAAA,MAC3C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAOA,SAAS,oCAAoC,MAAM,QAAQ,IAAI,GAAkB;AAC/E,MAAI;AACF,UAAM,kBAAkB,UAAQ,QAAQ,2BAA2B,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;AACnF,UAAM,cAAc,KAAK,MAAMC,cAAa,iBAAiB,OAAO,CAAC;AACrE,QAAI,CAAC,YAAY,QAAS,QAAO;AAEjC,UAAM,iBAAiB,UAAQ,QAAQ,cAAc,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;AACrE,UAAM,EAAE,UAAAC,UAAS,IAAI,UAAQ,cAAc;AAG3C,UAAM,iBAAiBA,WAAU,iBAAiB;AAClD,QAAI,OAAO,mBAAmB,YAAY,eAAe,WAAW,EAAG,QAAO;AAE9E,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,sBAAsB,aAAuC;AAC1E,QAAM,YAAYC,YAAW,WAAW,IAAI,cAAcC,SAAQ,WAAW;AAC7E,MAAI;AACF,UAAM,OAAO,WAAW,UAAU,IAAI;AACtC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AACO,SAAS,qBAAqB,MAAM,QAAQ,IAAI,GAAoC;AACzF,MAAID,YAAW,KAAK,KAAK,UAAU,CAAC,KAAKA,YAAW,KAAK,KAAK,WAAW,CAAC,EAAG,QAAO;AACpF,MAAIA,YAAW,KAAK,KAAK,gBAAgB,CAAC,EAAG,QAAO;AACpD,MAAIA,YAAW,KAAK,KAAK,WAAW,CAAC,EAAG,QAAO;AAC/C,SAAO;AACT;AAEO,SAAS,+BAA+B,MAAM,QAAQ,IAAI,GAAY;AAC3E,SAAOA,YAAW,KAAK,KAAK,cAAc,CAAC;AAC7C;AAEO,SAAS,8BAA8B,MAAM,QAAQ,IAAI,GAAa;AAC3E,SAAO,8BAA8B,OAAO,CAAC,mBAAmB;AAC9D,QAAI;AACF,gBAAQ,QAAQ,gBAAgB,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;AAChD,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEA,SAAS,6BAA6B,SAAgC;AACpE,QAAM,QAAQ,QAAQ,MAAM,yCAAyC;AACrE,SAAO,QAAQ,CAAC,GAAG,KAAK,KAAK;AAC/B;;;AD/IA,SAAS,mBAAmB,KAAuB;AACjD,MAAI,CAACE,YAAW,GAAG,EAAG,QAAO,CAAC;AAC9B,QAAM,UAAoB,CAAC;AAC3B,aAAW,SAAS,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,UAAM,OAAOC,MAAK,KAAK,MAAM,IAAI;AACjC,QAAI,MAAM,YAAY,KAAK,MAAM,SAAS,kBAAkB,MAAM,SAAS,eAAe;AACxF,cAAQ,KAAK,GAAG,mBAAmB,IAAI,CAAC;AAAA,IAC1C,WAAW,MAAM,OAAO,KAAK,iBAAiB,KAAK,MAAM,IAAI,GAAG;AAC9D,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,iBAAiB,KAAsB;AAC9C,MAAI,sBAAsB,KAAK,CAAC,SAASD,YAAWE,SAAQ,KAAK,IAAI,CAAC,CAAC,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkBA,SAAQ,KAAK,cAAc;AACnD,MAAI,CAACF,YAAW,eAAe,EAAG,QAAO;AAEzC,MAAI;AACF,UAAM,MAAM,KAAK,MAAMG,cAAa,iBAAiB,OAAO,CAAC;AAI7D,WAAO,CAAC,IAAI,cAAc,IAAI,eAAe,EAAE;AAAA,MAC7C,CAAC,SACC,QACA,OAAO,KAAK,IAAI,EAAE;AAAA,QAChB,CAAC,SAAS,SAAS,iBAAiB,KAAK,WAAW,eAAe;AAAA,MACrE;AAAA,IACJ;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOA,SAAS,4BAA4B,sBAA6C;AAChF,SAAO,yBAAyB,OAC5B,qCACA,4BAA4B,oBAAoB;AACtD;AAEA,SAAS,YAAY,KAA0B;AAC7C,QAAM,aAAaD,SAAQ,KAAK,wBAAwB;AACxD,MAAI,CAACF,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI;AACF,SAAK,MAAMG,cAAa,YAAY,OAAO,CAAC;AAC5C,WAAO,EAAE,MAAM,UAAU,QAAQ,MAAM,SAAS,+BAA+B;AAAA,EACjF,QAAQ;AACN,WAAO,EAAE,MAAM,UAAU,QAAQ,SAAS,SAAS,2CAA2C;AAAA,EAChG;AACF;AAEA,SAAS,YAAY,KAA0B;AAC7C,QAAM,aAAaD,SAAQ,KAAK,wBAAwB;AACxD,MAAI,aAAaA,SAAQ,KAAK,wBAAwB;AACtD,MAAIF,YAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,MAAM,KAAK,MAAMG,cAAa,YAAY,OAAO,CAAC;AACxD,UAAI,IAAI,QAAQ,KAAM,cAAaD,SAAQ,KAAK,IAAI,OAAO,IAAI;AAAA,IACjE,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,CAACF,YAAW,UAAU,GAAG;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,2BAA2B,UAAU;AAAA,IAChD;AAAA,EACF;AACA,MAAI;AACF,UAAM,MAAM,KAAK,MAAMG,cAAa,YAAY,OAAO,CAAC;AACxD,QAAI,CAAC,IAAI,SAAS;AAChB,aAAO,EAAE,MAAM,UAAU,QAAQ,QAAQ,SAAS,0CAA0C;AAAA,IAC9F;AACA,WAAO,EAAE,MAAM,UAAU,QAAQ,MAAM,SAAS,mBAAmB;AAAA,EACrE,QAAQ;AACN,WAAO,EAAE,MAAM,UAAU,QAAQ,SAAS,SAAS,+BAA+B;AAAA,EACpF;AACF;AAEA,SAAS,eAAe,KAA0B;AAChD,QAAM,aAAaD,SAAQ,KAAK,wBAAwB;AACxD,MAAI,YAAsB,CAAC;AAC3B,MAAIF,YAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,MAAM,KAAK,MAAMG,cAAa,YAAY,OAAO,CAAC;AAGxD,kBAAY,IAAI,YAAY,UAAU,aAAa,CAAC;AAAA,IACtD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,MAAI,UAAU,WAAW,GAAG;AAC1B,QAAI,CAAC,iBAAiB,GAAG,GAAG;AAC1B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SACE;AAAA,IAEJ;AAAA,EACF;AACA,QAAM,UAAU,UAAU,OAAO,CAAC,MAAM,CAACH,YAAWE,SAAQ,KAAK,CAAC,CAAC,CAAC;AACpE,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,gCAAgC,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS,GAAG,UAAU,MAAM;AAAA,EAC9B;AACF;AAEA,SAAS,cAAc,KAA0B;AAC/C,QAAM,eAAeA,SAAQ,KAAK,eAAe,eAAe;AAChE,MAAI,CAACF,YAAW,YAAY,GAAG;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,gBAAgB,SAAS,YAAY,EAAE;AAC7C,QAAM,YAAYE,SAAQ,KAAK,KAAK;AACpC,QAAM,cAAc,mBAAmB,SAAS;AAChD,QAAM,QAAQ,YAAY,OAAO,CAAC,MAAM,SAAS,CAAC,EAAE,UAAU,aAAa;AAE3E,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,gCAA2B,MAAM,MAAM;AAAA,IAClD;AAAA,EACF;AACA,SAAO,EAAE,MAAM,YAAY,QAAQ,MAAM,SAAS,kCAAkC;AACtF;AAMA,IAAM,QAAQ,EAAE,IAAI,UAAK,MAAM,KAAK,OAAO,SAAI;AAE/C,SAAS,kBAAkB,KAA0B;AACnD,QAAM,iBAAiB,qBAAqB,GAAG;AAE/C,MAAI,CAAC,+BAA+B,GAAG,GAAG;AACxC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,YAAY,GAAG,cAAc;AAAA,MAC7B,SAAS,uCAAkC,cAAc,iBAAiB,GAAG;AAAA,IAC/E;AAAA,EACF;AAEA,QAAM,6BAA6B,8BAA8B,GAAG;AACpE,MAAI,2BAA2B,SAAS,GAAG;AACzC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,YAAY,GAAG,cAAc;AAAA,MAC7B,SACE,uCAAuC,2BAA2B,KAAK,IAAI,CAAC,WACnE,cAAc,iBAAiB,GAAG;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;AAEA,eAAe,gBAAgB,KAAmC;AAChE,QAAM,SAAS,MAAM,2BAA2B,GAAG;AACnD,QAAM,cACJ,OAAO,yBAAyB,OAC5B,sCACA,4BAA4B,OAAO,oBAAoB,YAAY,OAAO,iBAAiB,cAAc,OAAO,mBAAmB;AAEzI,MAAI,OAAO,WAAW;AACpB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS,iCAAiC,WAAW;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,YAAY,4BAA4B,OAAO,oBAAoB;AAAA,IACnE,SAAS,oCAAoC,WAAW,YAAO,OAAO,WAAW;AAAA,EACnF;AACF;AAEA,SAAS,mBAAmB,QAAiC;AAC3D,SAAO,OACJ,OAAO,CAAC,UAAU,MAAM,WAAW,WAAW,MAAM,eAAe,MAAS,EAC5E,IAAI,CAAC,UAAU,MAAM,UAAoB,EACzC,OAAO,CAAC,SAAS,OAAO,aAAa,SAAS,QAAQ,OAAO,MAAM,KAAK;AAC7E;AAEA,SAAS,YAAY,OAA4B;AAC/C,SAAO,MAAM,MAAM,MAAM,MAAM,CAAC,KAAK,MAAM,KAAK,OAAO,EAAE,CAAC,IAAI,MAAM,OAAO;AAC7E;AAMO,SAAS,sBAA+B;AAC7C,SAAO,IAAIE,SAAQ,QAAQ,EACxB;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBF,EACC,OAAO,UAAU,+BAA+B,KAAK,EACrD;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,OAAO,SAAuD;AACpE,UAAM,MAAM,QAAQ,IAAI;AACxB,UAAM,SAAwB;AAAA,MAC5B,YAAY,GAAG;AAAA,MACf,YAAY,GAAG;AAAA,MACf,eAAe,GAAG;AAAA,MAClB,cAAc,GAAG;AAAA,MACjB,kBAAkB,GAAG;AAAA,MACrB,MAAM,gBAAgB,GAAG;AAAA,IAC3B;AAEA,UAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,EAAE;AAC1D,UAAM,WAAW,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,EAAE;AAE3D,UAAM,cAAc,mBAAmB,MAAM;AAE7C,QAAI,KAAK,kBAAkB;AACzB,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,KAAK,YAAY,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACzE,UAAI,SAAS,EAAG,SAAQ,KAAK,CAAC;AAC9B;AAAA,IACF;AAEA,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO;AAAA,QACb,GAAG,KAAK,UAAU,EAAE,QAAQ,OAAO,SAAS,SAAS,UAAU,UAAU,QAAQ,aAAa,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,MAClH;AACA,UAAI,SAAS,EAAG,SAAQ,KAAK,CAAC;AAC9B;AAAA,IACF;AAEA,YAAQ,OAAO,MAAM,kBAAkB;AACvC,YAAQ,OAAO,MAAM,oPAA4C;AACjE,eAAW,SAAS,OAAQ,SAAQ,OAAO,MAAM,GAAG,YAAY,KAAK,CAAC;AAAA,CAAI;AAC1E,YAAQ,OAAO,MAAM,oPAA4C;AAEjE,QAAI,SAAS,GAAG;AACd,cAAQ,OAAO,MAAM,KAAK,MAAM,cAAc,QAAQ;AAAA;AAAA,CAAiB;AACvE,cAAQ,KAAK,CAAC;AAAA,IAChB,WAAW,WAAW,GAAG;AACvB,cAAQ,OAAO,MAAM,KAAK,QAAQ;AAAA;AAAA,CAAwD;AAAA,IAC5F,OAAO;AACL,cAAQ,OAAO,MAAM,0BAA0B;AAAA,IACjD;AAAA,EACF,CAAC;AACL;;;AEvVA,SAAS,WAAAC,gBAAe;;;ACZjB,IAAM,gBACX;;;ADcK,SAAS,wBAAiC;AAC/C,SAAO,IAAIC,SAAQ,WAAW,EAC3B;AAAA,IACC;AAAA,EAWF,EACC,OAAO,UAAU,+DAA+D,EAChF,OAAO,CAAC,SAA6B;AACpC,QAAI,KAAK,MAAM;AACb,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,OAAO,cAAc,GAAG,MAAM,CAAC,CAAC;AAAA,CAChF;AAAA,IACK,OAAO;AACL,cAAQ,OAAO,MAAM,aAAa;AAAA,IACpC;AAAA,EACF,CAAC;AACL;;;AEvBA,SAAS,gBAAgB,cAAAC,aAAY,WAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnF,SAAS,QAAAC,aAAY;AACrB,YAAY,cAAc;;;ACT1B,SAAS,cAAAC,aAAY,eAAAC,cAAa,gBAAAC,qBAAoB;AACtD,SAAS,QAAAC,aAAY;AAqCrB,SAAS,cAAc,KAAa,MAAuB;AACzD,MAAI,CAACH,YAAW,GAAG,EAAG,QAAO;AAC7B,MAAI;AACF,UAAM,UAAUC,aAAY,GAAG;AAC/B,WAAO,QAAQ,KAAK,CAAC,MAAM,MAAM,QAAQ,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,SAAS,MAA6B;AAC7C,MAAI;AACF,WAAOC,cAAa,MAAM,OAAO;AAAA,EACnC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,gBACP,SACA,aAC8B;AAE9B,MAAI,cAAc,SAAS,aAAa,EAAG,QAAO;AAGlD,MAAI,cAAc,SAAS,aAAa,EAAG,QAAO;AAGlD,MAAI,cAAc,SAAS,cAAc,EAAG,QAAO;AAGnD,MAAI,mBAAmB,YAAa,QAAO;AAE3C,SAAO;AACT;AAMA,SAASE,sBAAqB,SAAoD;AAChF,MAAIJ,YAAWG,MAAK,SAAS,UAAU,CAAC,EAAG,QAAO;AAClD,MAAIH,YAAWG,MAAK,SAAS,WAAW,CAAC,EAAG,QAAO;AACnD,MAAIH,YAAWG,MAAK,SAAS,gBAAgB,CAAC,EAAG,QAAO;AACxD,MAAIH,YAAWG,MAAK,SAAS,mBAAmB,CAAC,EAAG,QAAO;AAC3D,SAAO;AACT;AAMA,SAAS,iBAAiB,SAAuE;AAC/F,QAAM,YAAYA,MAAK,SAAS,eAAe;AAC/C,MAAIH,YAAW,SAAS,GAAG;AACzB,WAAO,EAAE,YAAY,MAAM,cAAc,UAAU;AAAA,EACrD;AACA,SAAO,EAAE,YAAY,OAAO,cAAc,KAAK;AACjD;AAOA,IAAM,iBAAiB,CAAC,kBAAkB,WAAW,aAAa,UAAU,gBAAgB,KAAK;AAGjG,IAAM,iBAAiB,CAAC,QAAQ,MAAM;AAEtC,SAAS,wBAAwB,SAAiB,YAA+B;AAC/E,QAAM,WAAqB,CAAC;AAC5B,QAAM,MAAM,aAAa,QAAQ;AACjC,QAAM,SAAS,aAAa,QAAQ;AAEpC,aAAW,OAAO,gBAAgB;AAChC,UAAM,SAASG,MAAK,SAAS,GAAG;AAChC,QAAI,CAACH,YAAW,MAAM,EAAG;AAGzB,QAAI,gBAAgB;AACpB,QAAI;AACF,YAAM,UAAUC,aAAY,QAAQ,EAAE,eAAe,KAAK,CAAC;AAC3D,sBAAgB,QAAQ;AAAA,QACtB,CAAC,MAAM,EAAE,OAAO,KAAK,eAAe,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,CAAC,CAAC;AAAA,MACpE;AAEA,UAAI,CAAC,eAAe;AAClB,wBAAgB,QAAQ;AAAA,UACtB,CAAC,MACC,EAAE,YAAY,MACb,MAAM;AACL,gBAAI;AACF,qBAAOA,aAAYE,MAAK,QAAQ,EAAE,IAAI,CAAC,EAAE;AAAA,gBAAK,CAAC,MAC7C,eAAe,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,cAC1C;AAAA,YACF,QAAQ;AACN,qBAAO;AAAA,YACT;AAAA,UACF,GAAG;AAAA,QACP;AAAA,MACF;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAEA,QAAI,eAAe;AACjB,eAAS,KAAK,GAAG,GAAG,SAAS,GAAG,EAAE;AAClC,UAAI,WAAW,KAAK;AAClB,iBAAS,KAAK,GAAG,GAAG,SAAS,MAAM,EAAE;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAS,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AACpC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,CAAC,QAAQ,GAAG,EAAE;AAAA,EACvB;AACA,SAAO;AACT;AAOA,IAAM,wBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,SAAS,qBAAqB,SAA2B;AACvD,SAAO,sBAAsB,OAAO,CAAC,QAAQH,YAAWG,MAAK,SAAS,GAAG,CAAC,CAAC;AAC7E;AAOA,IAAM,iBAAiB,CAAC,iBAAiB;AAGzC,IAAM,WAAW,CAAC,QAAQ,SAAS,SAAS,OAAO;AAGnD,IAAM,iBAAiB,CAAC,aAAa,aAAa,YAAY;AAG9D,IAAM,sBAAsB;AAG5B,IAAM,uBAAuB;AAG7B,IAAM,iBAAiB;AAGvB,IAAM,iBAAiB,CAAC,YAAY,OAAO;AAM3C,SAAS,gBAAgB,KAAa,OAAyB;AAC7D,MAAI,QAAQ,eAAgB,QAAO,CAAC;AACpC,QAAM,UAAoB,CAAC;AAC3B,MAAI;AACF,UAAM,UAAUF,aAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AACxD,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,UAAU,MAAM,SAAS,SAAS;AACpF;AAAA,MACF;AACA,YAAM,OAAOE,MAAK,KAAK,MAAM,IAAI;AACjC,UAAI,MAAM,OAAO,KAAK,SAAS,KAAK,CAAC,MAAM,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG;AAClE,YAAI,CAAC,eAAe,KAAK,CAAC,SAAS,MAAM,KAAK,SAAS,IAAI,CAAC,GAAG;AAC7D,kBAAQ,KAAK,IAAI;AAAA,QACnB;AAAA,MACF,WAAW,MAAM,YAAY,GAAG;AAC9B,gBAAQ,KAAK,GAAG,gBAAgB,MAAM,QAAQ,CAAC,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAgC;AAC1D,QAAM,UAAyB,CAAC;AAGhC,aAAW,QAAQ,gBAAgB;AACjC,QAAI,cAAc,SAAS,IAAI,GAAG;AAChC,UAAI;AACF,cAAM,UAAUF,aAAY,OAAO;AACnC,cAAM,QAAQ,QAAQ,KAAK,CAAC,MAAM,MAAM,QAAQ,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC;AACxE,YAAI,OAAO;AACT,kBAAQ,KAAK,EAAE,MAAM,mBAAmB,MAAME,MAAK,SAAS,KAAK,EAAE,CAAC;AAAA,QACtE;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAIA,QAAM,SAASA,MAAK,SAAS,KAAK;AAClC,MAAIH,YAAW,MAAM,GAAG;AACtB,UAAM,WAAW,gBAAgB,QAAQ,CAAC;AAC1C,UAAM,OAAO,oBAAI,IAAY;AAE7B,eAAW,YAAY,UAAU;AAC/B,YAAM,UAAU,SAAS,QAAQ;AACjC,UAAI,YAAY,KAAM;AAEtB,UAAI,qBAAqB,KAAK,OAAO,KAAK,CAAC,KAAK,IAAI,QAAQ,GAAG;AAC7D,gBAAQ,KAAK,EAAE,MAAM,qBAAqB,MAAM,SAAS,CAAC;AAC1D,aAAK,IAAI,QAAQ;AAAA,MACnB;AACA,UAAI,oBAAoB,KAAK,OAAO,KAAK,CAAC,KAAK,IAAI,QAAQ,GAAG;AAC5D,gBAAQ,KAAK,EAAE,MAAM,yBAAyB,MAAM,SAAS,CAAC;AAC9D,aAAK,IAAI,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,aAAW,YAAY,CAAC,UAAU,UAAU,OAAO,GAAG;AACpD,UAAM,MAAMG,MAAK,SAAS,QAAQ;AAClC,QAAI,CAACH,YAAW,GAAG,EAAG;AACtB,UAAM,WAAW,gBAAgB,KAAK,CAAC;AACvC,eAAW,YAAY,UAAU;AAC/B,YAAM,UAAU,SAAS,QAAQ;AACjC,UAAI,YAAY,KAAM;AAEtB,UAAI,qBAAqB,KAAK,OAAO,GAAG;AACtC,gBAAQ,KAAK,EAAE,MAAM,qBAAqB,MAAM,SAAS,CAAC;AAAA,MAC5D,WAAW,oBAAoB,KAAK,OAAO,GAAG;AAC5C,gBAAQ,KAAK,EAAE,MAAM,yBAAyB,MAAM,SAAS,CAAC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAGA,MAAIA,YAAW,MAAM,GAAG;AACtB,UAAM,iBAAiB,CAAC,KAAa,UAAwB;AAC3D,UAAI,QAAQ,eAAgB;AAC5B,UAAI;AACF,cAAM,UAAUC,aAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AACxD,mBAAW,SAAS,SAAS;AAC3B,cAAI,MAAM,SAAS,kBAAkB,MAAM,SAAS,OAAQ;AAC5D,cAAI,MAAM,OAAO,KAAK,eAAe,KAAK,CAAC,MAAM,MAAM,KAAK,SAAS,CAAC,CAAC,GAAG;AACxE,oBAAQ,KAAK,EAAE,MAAM,cAAc,MAAME,MAAK,KAAK,MAAM,IAAI,EAAE,CAAC;AAAA,UAClE,WAAW,MAAM,YAAY,GAAG;AAC9B,2BAAeA,MAAK,KAAK,MAAM,IAAI,GAAG,QAAQ,CAAC;AAAA,UACjD;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,mBAAe,QAAQ,CAAC;AAAA,EAC1B;AAEA,SAAO;AACT;AAWO,SAAS,cAAc,SAAkC;AAE9D,QAAM,UAAUA,MAAK,SAAS,cAAc;AAC5C,MAAI,cAAsC,CAAC;AAC3C,QAAM,aAAa,SAAS,OAAO;AACnC,MAAI,eAAe,MAAM;AACvB,QAAI;AACF,YAAM,MAAM,KAAK,MAAM,UAAU;AAIjC,oBAAc;AAAA,QACZ,GAAG,IAAI;AAAA,QACP,GAAG,IAAI;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,YAAY,gBAAgB,SAAS,WAAW;AACtD,QAAM,EAAE,YAAY,aAAa,IAAI,iBAAiB,OAAO;AAC7D,QAAM,iBAAiBC,sBAAqB,OAAO;AACnD,QAAM,oBAAoB,wBAAwB,SAAS,UAAU;AACrE,QAAM,eAAe,mBAAmB,OAAO;AAE/C,QAAM,iBAAiB,qBAAqB,OAAO;AAEnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AD8HA,SAAS,oBAAAC,yBAAwB;AACjC,SAAS,WAAAC,gBAAe;AA3bxB,SAAS,mBACP,UACA,WACA,WACkB;AAClB,QAAM,UACJ,SAAS,kBAAkB,SAAS,IAAI,SAAS,oBAAoB,CAAC,cAAc;AAEtF,SAAO;AAAA,IACL,YAAY;AAAA,MACV;AAAA,MACA,SAAS,CAAC,iBAAiB,kBAAkB;AAAA,MAC7C,UAAU,EAAE,WAAW,CAAC,GAAG,WAAW,SAAS,kBAAkB,CAAC,EAAE;AAAA,IACtE;AAAA,IACA,QAAQ;AAAA,MACN,UAAU,EAAE,SAAS,EAAE,OAAO,MAAM,QAAQ,IAAI,EAAE;AAAA,MAClD,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,YAAY,EAAE,WAAW,GAAG;AAAA,IAC9B;AAAA,IACA,QAAQ;AAAA,MACN,KAAK;AAAA,MACL,SAAS,EAAE,QAAQ,OAAO,aAAa,GAAG,WAAW,KAAK;AAAA,MAC1D,MAAM,EAAE,QAAQ,KAAK;AAAA,IACvB;AAAA,IACA,IAAI;AAAA,MACF,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,qBAAqB;AAAA,MACrB,cAAc,GAAG,SAAS;AAAA,IAC5B;AAAA,EACF;AACF;AAMA,SAAS,WAA+B;AACtC,SAAgB,yBAAgB;AAAA,IAC9B,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;AAEA,eAAe,IAAI,IAAwB,UAAmC;AAC5E,SAAO,IAAI,QAAQ,CAACC,cAAY;AAC9B,OAAG,SAAS,UAAU,CAAC,WAAW;AAChC,MAAAA,UAAQ,OAAO,KAAK,CAAC;AAAA,IACvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,eACb,IACA,OACA,cACiB;AACjB,QAAM,SAAS,MAAM,IAAI,IAAI,KAAK,KAAK,KAAK,YAAY,KAAK;AAC7D,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAMA,SAAS,qBAAqB,SAAiB,OAAqB;AAClE,QAAM,gBAAgBC,MAAK,SAAS,YAAY;AAEhD,MAAIC,YAAW,aAAa,GAAG;AAC7B,UAAM,UAAUC,cAAa,eAAe,OAAO;AAEnD,UAAM,aAAa,MAAM,QAAQ,OAAO,EAAE;AAC1C,UAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACrD,QAAI,MAAM,SAAS,KAAK,KAAK,MAAM,SAAS,UAAU,GAAG;AAEvD;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,SAAS,IAAI,IAAI,KAAK;AAC7C,mBAAe,eAAe,GAAG,MAAM,GAAG,KAAK;AAAA,CAAI;AAAA,EACrD,OAAO;AAEL,IAAAC,eAAc,eAAe,GAAG,KAAK;AAAA,CAAI;AAAA,EAC3C;AACF;AAUO,SAAS,sBACd,cACgC;AAChC,QAAM,iBAAiB,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,iBAAiB;AAC5E,MAAI,CAAC,eAAgB,QAAO;AAE5B,MAAI;AAQF,QAASC,cAAT,SAAoB,OAAuC;AACzD,YAAM,SAAiC,CAAC;AAGxC,YAAM,SACJ;AACF,iBAAW,KAAK,MAAM,SAAS,MAAM,GAAG;AACtC,YAAI,EAAE,CAAC,MAAM,UAAa,EAAE,CAAC,MAAM,QAAW;AAC5C,iBAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAAA,QACpB;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAZS,qBAAAA;AAPT,UAAM,MAAMF,cAAa,eAAe,MAAM,OAAO;AAErD,UAAM,SAAkC,CAAC;AAqBzC,UAAM,eAAe,IAAI,QAAQ,SAAS;AAC1C,QAAI,iBAAiB,IAAI;AACvB,YAAM,mBAAmB,IAAI,QAAQ,KAAK,YAAY;AACtD,UAAI,qBAAqB,IAAI;AAC3B,YAAI,aAAa;AACjB,YAAI,iBAAiB;AACrB,iBAAS,KAAK,kBAAkB,KAAK,IAAI,QAAQ,MAAM;AACrD,cAAI,IAAI,EAAE,MAAM,IAAK;AAAA,mBACZ,IAAI,EAAE,MAAM,KAAK;AACxB;AACA,gBAAI,eAAe,GAAG;AACpB,+BAAiB;AACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,YAAI,iBAAiB,kBAAkB;AACrC,gBAAM,eAAe,IAAI,MAAM,mBAAmB,GAAG,cAAc;AACnE,gBAAM,UAAU;AAChB,gBAAM,cAAuC,CAAC;AAC9C,qBAAW,MAAM,aAAa,SAAS,OAAO,GAAG;AAC/C,gBAAI,GAAG,CAAC,MAAM,UAAa,GAAG,CAAC,MAAM,OAAW;AAChD,kBAAM,YAAY,GAAG,CAAC;AACtB,kBAAM,cAAcE,YAAW,GAAG,CAAC,CAAC;AACpC,gBAAI,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;AACvC,oBAAM,cAAuC,CAAC;AAC9C,yBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,WAAW,GAAG;AACrD,4BAAY,IAAI,IAAI,EAAE,OAAO,KAAK,MAAM,QAAQ;AAAA,cAClD;AACA,0BAAY,SAAS,IAAI;AAAA,YAC3B;AAAA,UACF;AACA,cAAI,OAAO,KAAK,WAAW,EAAE,SAAS,GAAG;AACvC,mBAAO,QAAQ;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAe,IAAI,MAAM,mCAAmC;AAClE,QAAI,eAAe,CAAC,MAAM,QAAW;AACnC,YAAM,gBAAgBA,YAAW,aAAa,CAAC,CAAC;AAChD,UAAI,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AACzC,cAAM,gBAAyC,CAAC;AAChD,mBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,aAAa,GAAG;AACtD,wBAAc,GAAG,IAAI,EAAE,OAAO,KAAK,MAAM,YAAY;AAAA,QACvD;AACA,eAAO,UAAU;AAAA,MACnB;AAAA,IACF;AAGA,UAAM,kBAAkB,IAAI,MAAM,sCAAsC;AACxE,QAAI,kBAAkB,CAAC,MAAM,QAAW;AACtC,YAAM,eAAe;AACrB,YAAM,aAAsC,CAAC;AAC7C,iBAAW,MAAM,gBAAgB,CAAC,EAAE,SAAS,YAAY,GAAG;AAC1D,YAAI,GAAG,CAAC,MAAM,UAAa,GAAG,CAAC,MAAM,QAAW;AAC9C,qBAAW,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,GAAG,CAAC,GAAG,MAAM,aAAa;AAAA,QACzD;AAAA,MACF;AACA,UAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,eAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAGA,UAAM,oBAAoB,IAAI,MAAM,wCAAwC;AAC5E,QAAI,oBAAoB,CAAC,MAAM,QAAW;AACxC,YAAM,eAAeA,YAAW,kBAAkB,CAAC,CAAC;AACpD,UAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACxC,cAAM,eAAwC,CAAC;AAC/C,mBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,YAAY,GAAG;AACrD,uBAAa,GAAG,IAAI,EAAE,OAAO,KAAK,MAAM,YAAY;AAAA,QACtD;AACA,eAAO,SAAS;AAAA,MAClB;AAAA,IACF;AAEA,WAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,EACnD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,eAAe,SAAiB,QAAkC;AACzE,QAAM,OAAOJ,MAAK,SAAS,wBAAwB;AACnD,EAAAG,eAAc,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAC1D,SAAO;AACT;AAEA,SAAS,kBACP,SACA,WACA,iBACQ;AACR,QAAM,OAAOH,MAAK,SAAS,SAAS;AACpC,MAAI,CAACC,YAAW,IAAI,GAAG;AACrB,UAAM,OAAO;AAAA,MACX,SACE;AAAA,MACF,SAAS;AAAA,MACT,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,MACpD;AAAA,MACA,QAAQ,mBAAmB,CAAC;AAAA,IAC9B;AACA,IAAAE,eAAc,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EAC1D;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,SAAiB,WAA2B;AACrE,QAAM,UAAUH,MAAK,SAAS,SAAS;AACvC,YAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAEtC,QAAM,WAAWA,MAAK,SAAS,UAAU;AACzC,MAAI,CAACC,YAAW,QAAQ,GAAG;AACzB,IAAAE,eAAc,UAAU,EAAE;AAAA,EAC5B;AACA,SAAO;AACT;AAoCA,eAAsB,QAAQ,SAA2C;AACvE,QAAM,UAAU,QAAQ,OAAO,QAAQ,IAAI;AAC3C,QAAM,aAAaH,MAAK,SAAS,wBAAwB;AACzD,QAAM,UAAoB,CAAC;AAG3B,MAAIC,YAAW,UAAU,KAAK,CAAC,QAAQ,OAAO;AAC5C,UAAM,MAAM;AACZ,YAAQ,OAAO,MAAM,iBAAO,GAAG;AAAA,CAAI;AACnC,WAAO,EAAE,SAAS,OAAO,SAAS,KAAK,SAAS,CAAC,GAAG,SAAS,KAAK;AAAA,EACpE;AAGA,QAAM,WAAW,cAAc,OAAO;AAGtC,QAAM,mBAAmB;AACzB,QAAM,mBAAmB;AACzB,MAAI,SAAS,mBAAmB,UAAU,kBAAkB,gBAAgB;AAE5E,MAAI,QAAQ,KAAK;AAEf,YAAQ,OAAO,MAAM,2CAAoC;AACzD,YAAQ,OAAO,MAAM,uBAAuB,SAAS,SAAS;AAAA,CAAI;AAClE,YAAQ,OAAO,MAAM,uBAAuB,SAAS,UAAU;AAAA,CAAI;AACnE,YAAQ,OAAO,MAAM,uBAAuB,OAAO,WAAW,QAAQ,KAAK,IAAI,CAAC;AAAA,CAAI;AACpF,YAAQ,OAAO,MAAM,uBAAuB,OAAO,OAAO,IAAI;AAAA,CAAI;AAClE,YAAQ,OAAO,MAAM,uBAAuB,OAAO,OAAO,GAAG;AAAA;AAAA,CAAM;AAAA,EACrE,OAAO;AAEL,UAAM,KAAK,SAAS;AAEpB,YAAQ,OAAO,MAAM,wDAA4C;AACjE,YAAQ,OAAO,MAAM,oEAAoE;AAEzF,QAAI;AAEF,cAAQ,OAAO,MAAM,0BAA0B,SAAS,SAAS;AAAA,CAAI;AAGrE,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,QACA,OAAO,WAAW,QAAQ,KAAK,IAAI;AAAA,MACrC;AACA,aAAO,WAAW,UAAU,WACzB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAGjB,YAAM,aAAa,MAAM;AAAA,QACvB;AAAA,QACA;AAAA,QACA,OAAO,WAAW,QAAQ,KAAK,IAAI;AAAA,MACrC;AACA,aAAO,WAAW,UAAU,WACzB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAGjB,YAAM,YAAY,MAAM,eAAe,IAAI,uBAAuB,OAAO,OAAO,IAAI;AACpF,aAAO,OAAO,OAAO;AACrB,aAAO,GAAG,eAAe,GAAG,OAAO,OAAO,GAAG;AAG7C,YAAM,YAAY,MAAM,eAAe,IAAI,oBAAoB,OAAO,OAAO,GAAG;AAChF,aAAO,OAAO,MAAM,UAAU,SAAS,GAAG,IAAI,YAAY,GAAG,SAAS;AACtE,aAAO,GAAG,eAAe,GAAG,OAAO,OAAO,GAAG;AAG7C,eAAS,mBAAmB,UAAU,OAAO,OAAO,MAAM,OAAO,OAAO,GAAG;AAE3E,aAAO,WAAW,UAAU,WACzB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,aAAO,WAAW,UAAU,WACzB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAAA,IACnB,UAAE;AACA,SAAG,MAAM;AAAA,IACX;AAEA,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAKA,QAAM,UAAU,eAAe,SAAS,MAAM;AAC9C,UAAQ,KAAK,OAAO;AAGpB,QAAM,kBAAkB,sBAAsB,SAAS,YAAY;AACnE,MAAI,oBAAoB,MAAM;AAC5B,UAAM,kBAAkB,OAAO,KAAK,eAAe,EAAE;AACrD,YAAQ,OAAO,MAAM,gBAAgB,eAAe;AAAA,CAAwC;AAAA,EAC9F;AACA,QAAM,UAAU,kBAAkB,SAAS,OAAO,OAAO,MAAM,mBAAmB,MAAS;AAC3F,UAAQ,KAAK,OAAO;AAGpB,QAAM,aAAa,kBAAkB,SAAS,OAAO,OAAO,GAAG;AAC/D,UAAQ,KAAK,UAAU;AAGvB,uBAAqB,SAAS,OAAO,OAAO,GAAG;AAG/C,UAAQ,OAAO,MAAM,wCAAmC;AACxD,UAAQ,OAAO,MAAM,qBAAqB;AAC1C,aAAW,KAAK,SAAS;AACvB,YAAQ,OAAO,MAAM,QAAQ,CAAC;AAAA,CAAI;AAAA,EACpC;AAEA,UAAQ,OAAO,MAAM,+BAA+B;AACpD,MAAI;AACF,UAAM,iBAAiB;AAAA,MACrB,SAAS,OAAO,WAAW;AAAA,MAC3B;AAAA,IACF;AACA,UAAM,WAAW,MAAMJ,kBAAiB,cAAc;AACtD,UAAM,gBAAgB,OAAO,KAAK,SAAS,UAAU,EAAE;AACvD,UAAM,kBAAkBG,MAAK,SAAS,OAAO,OAAO,KAAK,eAAe;AACxE,cAAUA,MAAK,SAAS,OAAO,OAAO,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,IAAAG,eAAc,iBAAiB,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AACvE,YAAQ,OAAO;AAAA,MACb,YAAY,aAAa,4CAAuC,eAAe;AAAA;AAAA,IACjF;AAAA,EACF,QAAQ;AACN,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,IAAI;AAEzB,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,IACA,SAAS;AAAA,EACX;AACF;AASO,SAAS,oBAA6B;AAC3C,SAAO,IAAIL,SAAQ,MAAM,EACtB;AAAA,IACC;AAAA,EAmBF,EACC,OAAO,aAAa,kDAAkD,KAAK,EAC3E,OAAO,WAAW,wDAAwD,KAAK,EAC/E,OAAO,OAAO,SAA2C;AACxD,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,EAAE,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,CAAC;AACjE,UAAI,CAAC,OAAO,WAAW,CAAC,OAAO,SAAS;AACtC,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AErgBA,SAAS,WAAAO,gBAAe;AACxB,SAAS,yBAAAC,8BAA6B;AACtC,SAAS,eAAAC,oBAAmB;AAC5B,SAAS,WAAAC,gBAAe;;;ACpBxB,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACnE,SAAS,WAAAC,gBAAe;AACxB,SAAgC,oBAAAC,yBAAuC;AACvE,SAAS,WAAAC,gBAAe;AAkBxB,IAAM,gBAAgB;AAMf,SAAS,aAAa,eAAuB,eAAyB;AAC3E,QAAM,UAAUC,SAAQ,QAAQ,IAAI,GAAG,YAAY;AACnD,MAAI,CAACC,YAAW,OAAO,GAAG;AACxB,UAAM,IAAI,MAAM,yBAAyB,OAAO;AAAA,uCAA2C;AAAA,EAC7F;AACA,QAAM,MAAMC,cAAa,SAAS,OAAO;AACzC,SAAO,KAAK,MAAM,GAAG;AACvB;AAKA,SAAS,cAAc,YAAkD;AACvE,MAAI,eAAe,OAAQ,QAAO;AAClC,MAAI,eAAe,QAAS,QAAO;AACnC,SAAO,MAAM,IAAI,UAAU;AAC7B;AAMA,SAAS,aAAa,aAA4B;AAChD,cACG,QAAQ,MAAM,EACd;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKF,EACC,OAAO,kBAAkB,qDAAqD,EAC9E,OAAO,mBAAmB,wCAAwC,EAClE,OAAO,uBAAuB,mDAAmD,EACjF,OAAO,cAAc,+BAA+B,EACpD,OAAO,iBAAiB,sCAAsC,EAC9D,OAAO,qBAAqB,yBAAyB,aAAa,EAClE;AAAA,IACC,CAAC,SAMK;AACJ,UAAI;AACF,cAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,cAAM,SAAS,cAAc,KAAK,MAAM;AAExC,YAAI,UAAU,OAAO,QAAQ,SAAS,UAAU;AAGhD,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,gBAAgB,KAAK,UAAU;AACrC,oBAAU,QAAQ,OAAO,CAAC,CAAC,IAAI,MAAM,UAAU,eAAe,IAAI,CAAC;AAAA,QACrE;AAGA,YAAI,KAAK,eAAe,QAAW;AACjC,gBAAM,MAAM,KAAK;AACjB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,GAAG;AAAA,QAC1D;AAIA,YAAI,KAAK,aAAa,MAAM;AAC1B,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ;AAAA,QAChD,WAAW,KAAK,aAAa,OAAO;AAClC,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,QAAQ;AAAA,QACjD;AAGA,cAAM,OAAkB,QAAQ,IAAI,CAAC,CAAC,MAAM,UAAU,OAAO;AAAA,UAC3D;AAAA,UACA,MAAM,WAAW;AAAA,UACjB,iBAAiB,WAAW;AAAA,UAC5B,WAAW,WAAW,cAAc;AAAA,UACpC,cAAc,WAAW,iBAAiB;AAAA,UAC1C,YAAY,WAAW;AAAA,UACvB,UAAU,WAAW;AAAA,QACvB,EAAE;AAEF,cAAM,SAAS,WAAW,SAAS,eAAe,IAAI,IAAI,gBAAgB,IAAI;AAE9E,gBAAQ,OAAO,MAAM,GAAG,MAAM;AAAA,CAAI;AAAA,MACpC,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAMA,SAAS,YAAY,aAA4B;AAC/C,cACG,QAAQ,YAAY,EACpB;AAAA,IACC;AAAA,EAKF,EACC,OAAO,kBAAkB,qDAAqD,EAC9E,OAAO,qBAAqB,yBAAyB,aAAa,EAClE,OAAO,CAAC,MAAc,SAAgD;AACrE,QAAI;AACF,YAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,YAAM,SAAS,cAAc,KAAK,MAAM;AAExC,YAAM,aAAa,SAAS,WAAW,IAAI;AAC3C,UAAI,eAAe,QAAW;AAC5B,cAAM,YAAY,OAAO,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACxE,cAAM,OAAO,OAAO,KAAK,SAAS,UAAU,EAAE,SAAS,IAAI,aAAQ;AACnE,cAAM,IAAI;AAAA,UACR,cAAc,IAAI;AAAA,aAAwC,SAAS,GAAG,IAAI;AAAA,QAC5E;AAAA,MACF;AAEA,YAAM,SACJ,WAAW,SAAS,cAAc,MAAM,UAAU,IAAI,eAAe,MAAM,UAAU;AAEvF,cAAQ,OAAO,MAAM,GAAG,MAAM;AAAA,CAAI;AAAA,IACpC,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAMA,SAAS,cAAc,aAA4B;AACjD,cACG,QAAQ,OAAO,EACf;AAAA,IACC;AAAA,EAUF,EACC,OAAO,oBAAoB,qCAAqC,EAChE,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,wBAAwB,+CAA+C,EAC9E,OAAO,kBAAkB,yCAAyC,KAAK,EACvE,OAAO,eAAe,oCAAoC,KAAK,EAC/D;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,wBAAwB,kDAAkD,EACjF,OAAO,cAAc,iCAAiC,KAAK,EAC3D,OAAO,uBAAuB,mDAAmD,EACjF,OAAO,kBAAkB,qDAAqD,EAC9E,OAAO,qBAAqB,yBAAyB,aAAa,EAClE;AAAA,IACC,CAAC,SAYK;AACJ,UAAI;AACF,cAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,cAAM,SAAS,cAAc,KAAK,MAAM;AAGxC,cAAM,aAAuB,CAAC;AAC9B,YAAI,KAAK,YAAY,OAAW,YAAW,KAAK,WAAW,KAAK,OAAO,EAAE;AACzE,YAAI,KAAK,SAAS,OAAW,YAAW,KAAK,QAAQ,KAAK,IAAI,EAAE;AAChE,YAAI,KAAK,eAAe,OAAW,YAAW,KAAK,cAAc,KAAK,UAAU,EAAE;AAClF,YAAI,KAAK,YAAa,YAAW,KAAK,cAAc;AACpD,YAAI,KAAK,SAAU,YAAW,KAAK,WAAW;AAC9C,YAAI,KAAK,YAAY,OAAW,YAAW,KAAK,YAAY,KAAK,OAAO,EAAE;AAC1E,YAAI,KAAK,eAAe,OAAW,YAAW,KAAK,eAAe,KAAK,UAAU,EAAE;AACnF,YAAI,KAAK,SAAU,YAAW,KAAK,UAAU;AAC7C,YAAI,KAAK,eAAe,OAAW,YAAW,KAAK,cAAc,KAAK,UAAU,EAAE;AAElF,YAAI,WAAW,WAAW,GAAG;AAC3B,kBAAQ,OAAO;AAAA,YACb;AAAA,UACF;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,YAAY,WAAW,KAAK,IAAI;AAEtC,YAAI,UAAU,OAAO,QAAQ,SAAS,UAAU;AAGhD,YAAI,KAAK,YAAY,QAAW;AAC9B,gBAAM,MAAM,KAAK;AACjB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,SAAS,GAAG,CAAC;AAAA,QACtE;AAEA,YAAI,KAAK,SAAS,QAAW;AAC3B,gBAAM,OAAO,KAAK;AAClB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,SAAS,IAAI,CAAC;AAAA,QACpE;AAEA,YAAI,KAAK,eAAe,QAAW;AACjC,gBAAM,MAAM,KAAK;AACjB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,GAAG;AAAA,QAC/D;AAEA,YAAI,KAAK,aAAa;AACpB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM;AAClC,kBAAM,KAAK,EAAE;AACb,mBACE,GAAG,QAAQ,SAAS,KACpB,GAAG,UACH,GAAG,cAAc,SAAS,KAC1B,GAAG;AAAA,UAEP,CAAC;AAAA,QACH;AAEA,YAAI,KAAK,UAAU;AACjB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,QAAQ,SAAS,CAAC;AAAA,QACtE;AAEA,YAAI,KAAK,YAAY,QAAW;AAC9B,gBAAM,OAAO,KAAK;AAClB,gBAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,gBAAM,WAAW,YAAY,IAAI,KAAK,MAAM,GAAG,QAAQ,IAAI;AAC3D,gBAAM,WAAW,YAAY,IAAI,KAAK,MAAM,WAAW,CAAC,IAAI;AAC5D,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM;AAClC,kBAAM,QAAS,EAAyC;AAGxD,gBAAI,CAAC,SAAS,EAAE,YAAY,OAAQ,QAAO;AAC3C,gBAAI,aAAa,QAAW;AAC1B,qBAAO,MAAM,QAAQ,GAAG,SAAS;AAAA,YACnC;AACA,mBAAO;AAAA,UACT,CAAC;AAAA,QACH;AAEA,YAAI,KAAK,eAAe,QAAW;AACjC,gBAAM,aAAa,KAAK;AACxB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM;AAClC,kBAAM,aAAc,EAAyC;AAG7D,mBAAO,YAAY,SAAS,UAAU;AAAA,UACxC,CAAC;AAAA,QACH;AAEA,YAAI,KAAK,UAAU;AACjB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ;AAAA,QAChD;AAEA,YAAI,KAAK,eAAe,QAAW;AACjC,gBAAM,MAAM,KAAK;AACjB,oBAAU,QAAQ,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,GAAG;AAAA,QAC1D;AAEA,cAAM,OAAmB,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;AAAA,UACnD;AAAA,UACA,MAAM,EAAE;AAAA,UACR,iBAAiB,EAAE;AAAA,UACnB,OAAO,EAAE,cAAc,KAAK,IAAI,KAAK;AAAA,UACrC,UAAU,EAAE,iBAAiB,KAAK,IAAI,KAAK;AAAA,UAC3C,YAAY,EAAE;AAAA,UACd,UAAU,EAAE;AAAA,QACd,EAAE;AAEF,cAAM,SACJ,WAAW,SAAS,gBAAgB,IAAI,IAAI,iBAAiB,MAAM,SAAS;AAE9E,gBAAQ,OAAO,MAAM,GAAG,MAAM;AAAA,CAAI;AAAA,MACpC,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAYA,SAAS,qBAAqB,SAMrB;AACP,QAAM,aAAaF,SAAQ,SAAS,wBAAwB;AAC5D,MAAI,CAACC,YAAW,UAAU,EAAG,QAAO;AAEpC,MAAI;AACF,UAAM,MAAMC,cAAa,YAAY,OAAO;AAC5C,UAAM,MAAM,KAAK,MAAM,GAAG;AAE1B,UAAM,SAMF,CAAC;AAEL,UAAM,aAAa,IAAI;AACvB,QAAI,eAAe,UAAa,OAAO,eAAe,YAAY,eAAe,MAAM;AACrF,UAAI,MAAM,QAAQ,WAAW,OAAO,GAAG;AACrC,eAAO,UAAU,WAAW;AAAA,MAC9B;AACA,UAAI,MAAM,QAAQ,WAAW,OAAO,GAAG;AACrC,eAAO,UAAU,WAAW;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,IAAI,gBAAgB,GAAG;AACvC,aAAO,mBAAmB,IAAI;AAAA,IAChC;AACA,QAAI,MAAM,QAAQ,IAAI,WAAW,GAAG;AAClC,aAAO,cAAc,IAAI;AAAA,IAC3B;AAEA,UAAM,QAAQ,IAAI;AAClB,QAAI,UAAU,UAAa,OAAO,UAAU,YAAY,UAAU,MAAM;AACtE,UAAI,MAAM,QAAQ,MAAM,QAAQ,GAAG;AACjC,eAAO,eAAe,MAAM;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,aAA4B;AACpD,cACG,QAAQ,UAAU,EAClB;AAAA,IACC;AAAA,EAqBF,EACC,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,mBAAmB,iCAAiC,aAAa,EACxE,OAAO,qBAAqB,0CAA0C,EACtE,OAAO,qBAAqB,0CAA0C,EACtE,OAAO,OAAO,SAAgF;AAC7F,QAAI;AACF,YAAM,UAAUF,SAAQ,QAAQ,IAAI,GAAG,KAAK,QAAQ,GAAG;AACvD,YAAM,aAAaA,SAAQ,QAAQ,IAAI,GAAG,KAAK,MAAM;AAErD,YAAM,eAAe,qBAAqB,OAAO;AAGjD,YAAM,UAAU,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,cAAc;AAC/E,YAAM,UAAU,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,cAAc;AAE/E,cAAQ,OAAO,MAAM,YAAY,OAAO;AAAA,CAA4B;AAEpE,YAAM,WAAW,MAAMG,kBAAiB;AAAA,QACtC;AAAA,QACA,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,QACvC,GAAI,YAAY,UAAa,EAAE,QAAQ;AAAA,QACvC,GAAI,cAAc,qBAAqB,UAAa;AAAA,UAClD,kBAAkB,aAAa;AAAA,QACjC;AAAA,QACA,GAAI,cAAc,gBAAgB,UAAa;AAAA,UAC7C,aAAa,aAAa;AAAA,QAC5B;AAAA,QACA,GAAI,cAAc,iBAAiB,UAAa;AAAA,UAC9C,cAAc,aAAa;AAAA,QAC7B;AAAA,MACF,CAAC;AAED,YAAM,iBAAiB,OAAO,KAAK,SAAS,UAAU,EAAE;AACxD,cAAQ,OAAO,MAAM,SAAS,cAAc;AAAA,CAAgB;AAG5D,YAAM,YAAY,WAAW,QAAQ,YAAY,EAAE;AACnD,UAAI,CAACF,YAAW,SAAS,GAAG;AAC1B,QAAAG,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,MAC1C;AAEA,MAAAC,eAAc,YAAY,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AACpE,cAAQ,OAAO,MAAM,uBAAuB,UAAU;AAAA,CAAI;AAC1D,cAAQ,OAAO,MAAM,GAAG,UAAU;AAAA,CAAI;AAAA,IACxC,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAUO,SAAS,wBAAiC;AAC/C,QAAM,cAAc,IAAIC,SAAQ,UAAU,EAAE;AAAA,IAC1C;AAAA,EASF;AAEA,eAAa,WAAW;AACxB,cAAY,WAAW;AACvB,gBAAc,WAAW;AACzB,mBAAiB,WAAW;AAE5B,SAAO;AACT;;;ACleA,SAAS,WAAAC,gBAAe;AACxB,SAAS,yBAAAC,8BAA6B;AAEtC,SAAS,WAAW,WAAW;AAC/B,SAAS,YAAAC,iBAAgB;AASzB,IAAMC,iBAAgB;AA6EtB,SAAS,iCAAyC;AAEhD,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAkOT;AAMA,SAAS,iBAAiB,OAA2C;AACnE,QAAM,QAAQ,oBAAI,IAAuB;AAEzC,aAAW,QAAQ,OAAO;AAExB,SACG,KAAK,SAAS,eAAe,KAAK,SAAS,sBAC5C,KAAK,qBAAqB,UAC1B,KAAK,qBAAqB,MAC1B;AAEA,YAAM,IAAI,qBAAqB;AAAA,IACjC;AAGA,SACG,KAAK,SAAS,eAAe,KAAK,SAAS,sBAC5C,KAAK,oBAAoB,SACzB,KAAK,qBAAqB,MAC1B;AACA,YAAM,IAAI,iBAAiB;AAAA,IAC7B;AAGA,SACG,KAAK,SAAS,aAAa,KAAK,SAAS,kBAC1C,KAAK,qBAAqB,MAC1B;AACA,YAAM,IAAI,kBAAkB;AAAA,IAC9B;AAGA,SACG,KAAK,SAAS,aAAa,KAAK,SAAS,kBAC1C,KAAK,iBAAiB,UACtB,KAAK,iBAAiB,KACtB,KAAK,mBAAmB,UACxB,KAAK,iBAAiB,GACtB;AACA,YAAM,IAAI,kBAAkB;AAAA,IAC9B;AAGA,SACG,KAAK,SAAS,cAAc,KAAK,SAAS,iBAC3C,KAAK,gBAAgB,UACrB,KAAK,cAAc,IACnB;AACA,YAAM,IAAI,mBAAmB;AAAA,IAC/B;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,KAAK;AAClB;AASA,eAAsB,kBACpB,eACA,UACA,OAC+B;AAC/B,QAAM,UAAU,MAAMC,UAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AAExD,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,WAAW;AACzC,UAAM,OAAO,MAAM,QAAQ,QAAQ;AAQnC,UAAM,eAAeC,uBAAsB;AAC3C,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAGxD,UAAM,KAAK;AAAA,MACT,MAAM;AACJ,cAAM,IAAI;AAIV,eAAO,EAAE,8BAA8B;AAAA,MACzC;AAAA,MACA,EAAE,SAAS,KAAO;AAAA,IACpB;AAGA,UAAM,cAAc,MAAM,KAAK,SAAS,MAAM;AAC5C,aAEI,OAGA,0BAA0B;AAAA,IAEhC,CAAC;AAED,QAAI,gBAAgB,MAAM;AACxB,YAAM,IAAI,MAAM,2BAA2B,WAAW,EAAE;AAAA,IAC1D;AAGA,UAAM,mBAAmB,+BAA+B;AACxD,UAAM,MAAM,MAAM,KAAK,SAAS,gBAAgB;AAEhD,UAAM,SAAS;AASf,QAAI,OAAO,OAAO;AAChB,YAAM,IAAI,MAAM,gCAAgC,OAAO,KAAK,EAAE;AAAA,IAChE;AAEA,UAAM,gBAAgB,OAAO,cAAc,CAAC;AAG5C,UAAM,aAAqC,cAAc,IAAI,CAAC,OAAO;AAAA,MACnE,MAAM,EAAE;AAAA,MACR,QAAQ,EAAE;AAAA,MACV,OAAO,EAAE;AAAA,MACT,OAAO,iBAAiB,EAAE,KAAK;AAAA,IACjC,EAAE;AAGF,UAAM,WAAW,oBAAI,IAAuB;AAC5C,eAAW,QAAQ,YAAY;AAC7B,iBAAW,QAAQ,KAAK,OAAO;AAC7B,iBAAS,IAAI,IAAI;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA,OAAO,CAAC,GAAG,QAAQ;AAAA,IACrB;AAAA,EACF,UAAE;AACA,UAAM,QAAQ,MAAM;AAAA,EACtB;AACF;AASO,SAAS,+BAAwC;AACtD,QAAM,MAAM,IAAI,IAAI,OAAO,EACxB;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWF,EACC,SAAS,eAAe,6CAA6C,EACrE,OAAO,kBAAkB,6CAA6C,IAAI,EAC1E,OAAO,qBAAqB,yBAAyBF,cAAa,EAClE,OAAO,kBAAkB,4CAA4C,MAAM,EAC3E,OAAO,gBAAgB,oDAAoD,KAAK,EAChF;AAAA,IACC,OACE,eACA,SAMG;AACH,UAAI;AACF,cAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,cAAM,aAAa,SAAS,WAAW,aAAa;AACpD,YAAI,eAAe,QAAW;AAC5B,gBAAM,YAAY,OAAO,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACxE,gBAAM,IAAI;AAAA,YACR,cAAc,aAAa;AAAA,aAAwC,SAAS;AAAA,UAC9E;AAAA,QACF;AAEA,YAAI,QAAiC,CAAC;AACtC,YAAI;AACF,kBAAQ,KAAK,MAAM,KAAK,KAAK;AAAA,QAC/B,QAAQ;AACN,gBAAM,IAAI,MAAM,uBAAuB,KAAK,KAAK,EAAE;AAAA,QACrD;AAEA,cAAM,UAAU,QAAQ,IAAI;AAC5B,cAAM,WAAWG,SAAQ,SAAS,WAAW,QAAQ;AAErD,gBAAQ,OAAO,MAAM,2BAA2B,aAAa;AAAA,CAAK;AAElE,cAAM,SAAS,MAAM,kBAAkB,eAAe,UAAU,KAAK;AAErE,YAAI,KAAK,WAAW;AAClB,cAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,oBAAQ,OAAO,MAAM,gCAAgC;AAAA,UACvD,OAAO;AACL,uBAAW,QAAQ,OAAO,OAAO;AAC/B,sBAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,YAClC;AAAA,UACF;AACA;AAAA,QACF;AAEA,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,MAC7D,SAAS,KAAc;AACrB,gBAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;ACtjBA,SAAS,WAAAC,gBAAe;AACxB,SAAS,yBAAAC,8BAA6B;AAEtC,SAAS,WAAWC,YAAW;AAC/B,SAAS,YAAAC,iBAAgB;AASzB,IAAMC,iBAAgB;AA8EtB,SAAS,4BAAoC;AAC3C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2ET;AAKA,SAAS,8BAAsC;AAC7C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA2BT;AASA,eAAe,kBACb,MACA,OACe;AACf,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,QAAQ;AAAA,MACnB,KAAK;AACH,YAAI,KAAK,QAAQ;AACf,gBAAM,KAAK,MAAM,KAAK,QAAQ,EAAE,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAE5D,oBAAQ,OAAO,MAAM,0BAAqB,KAAK,MAAM;AAAA,CAAyB;AAAA,UAChF,CAAC;AAAA,QACH;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,UAAU,KAAK,UAAU,QAAW;AAC3C,gBAAM,KAAK,KAAK,KAAK,QAAQ,KAAK,OAAO,EAAE,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AACvE,oBAAQ,OAAO,MAAM,yBAAoB,KAAK,MAAM;AAAA,CAAyB;AAAA,UAC/E,CAAC;AAAA,QACH;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,QAAQ;AACf,gBAAM,KAAK,MAAM,KAAK,QAAQ,EAAE,SAAS,IAAM,CAAC,EAAE,MAAM,MAAM;AAC5D,oBAAQ,OAAO,MAAM,0BAAqB,KAAK,MAAM;AAAA,CAAyB;AAAA,UAChF,CAAC;AAAA,QACH;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,OAAO;AACd,gBAAM,KAAK,SAAS,MAAM,KAAK,KAAK;AAAA,QACtC;AACA;AAAA,MACF,KAAK;AACH,cAAM,KAAK,eAAe,KAAK,SAAS,GAAG;AAC3C;AAAA,IACJ;AAAA,EACF;AACF;AAMA,SAAS,oBACP,cACA,eACA,QACA,cACwB;AACxB,QAAM,QAAQ,oBAAI,IAA0B;AAG5C,MACE,kBAAkB,QAClB,gBAAgB,KAChB,gBAAgB,KAAK,IAAI,GAAG,YAAY,IAAI,KAC5C;AACA,UAAM,IAAI,eAAe;AAAA,EAC3B;AAGA,MAAI,eAAe,IAAI;AACrB,UAAM,IAAI,mBAAmB;AAAA,EAC/B;AAGA,MAAI,aAAa,kBAAkB,KAAK;AACtC,UAAM,IAAI,uBAAuB;AAAA,EACnC;AAGA,MAAI,OAAO,KAAK,KAAK;AACnB,UAAM,IAAI,kBAAkB;AAAA,EAC9B;AAEA,SAAO,CAAC,GAAG,KAAK;AAClB;AASA,eAAsB,sBACpB,eACA,UACA,OACA,aAC6B;AAC7B,QAAM,UAAU,MAAMC,UAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AAExD,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,WAAW;AACzC,UAAM,OAAO,MAAM,QAAQ,QAAQ;AAMnC,UAAM,eAAeC,uBAAsB;AAC3C,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAGxD,UAAM,KAAK;AAAA,MACT,MAAM;AACJ,cAAM,IAAI;AAIV,eAAO,EAAE,8BAA8B;AAAA,MACzC;AAAA,MACA,EAAE,SAAS,KAAO;AAAA,IACpB;AAEA,UAAM,cAAc,MAAM,KAAK,SAAS,MAAM;AAC5C,aAEI,OAGA,0BAA0B;AAAA,IAEhC,CAAC;AAED,QAAI,gBAAgB,MAAM;AACxB,YAAM,IAAI,MAAM,2BAA2B,WAAW,EAAE;AAAA,IAC1D;AAGA,UAAM,cAAc,MAAM,KAAK,SAAS,0BAA0B,CAAC;AACnE,UAAM,YAAY;AAClB,QAAI,UAAU,OAAO;AACnB,YAAM,IAAI,MAAM,2BAA2B,UAAU,KAAK,EAAE;AAAA,IAC9D;AAGA,UAAM,UAAU,KAAK,IAAI;AAGzB,QAAI,YAAY,SAAS,GAAG;AAC1B,cAAQ,OAAO,MAAM,eAAe,YAAY,MAAM;AAAA,CAAyB;AAC/E,YAAM,kBAAkB,MAAM,WAAW;AAGzC,YAAM,KAAK,eAAe,GAAG;AAAA,IAC/B;AAEA,UAAM,aAAa,KAAK,IAAI,IAAI;AAGhC,UAAM,YAAY,MAAM,KAAK,SAAS,4BAA4B,CAAC;AACnE,UAAM,cAAc;AAUpB,QAAI,YAAY,OAAO;AACrB,YAAM,IAAI,MAAM,8BAA8B,YAAY,KAAK,EAAE;AAAA,IACnE;AAEA,UAAM,SAA4B;AAAA,MAChC,IAAI;AAAA,MACJ,QAAQ,YAAY,cAAc;AAAA,MAClC,OAAO,YAAY,aAAa;AAAA,IAClC;AAEA,UAAM,eAAgC;AAAA,MACpC,OAAO,YAAY,cAAc,SAAS;AAAA,MAC1C,iBAAiB,YAAY,cAAc,SAAS;AAAA,IACtD;AAEA,UAAM,eAAe,YAAY,eAAe;AAChD,UAAM,mBAAmB,YAAY,oBAAoB;AACzD,UAAM,gBAAgB,YAAY,iBAAiB;AAEnD,UAAM,QAAQ,oBAAoB,cAAc,eAAe,QAAQ,YAAY;AAEnF,WAAO;AAAA,MACL,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,wBAAwB;AAAA,QACtB,UAAU;AAAA,QACV,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,UAAE;AACA,UAAM,QAAQ,MAAM;AAAA,EACtB;AACF;AASO,SAAS,iCAA0C;AACxD,QAAM,MAAM,IAAIC,KAAI,SAAS,EAC1B;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWF,EACC,SAAS,eAAe,6CAA6C,EACrE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,kBAAkB,6CAA6C,IAAI,EAC1E,OAAO,qBAAqB,yBAAyBH,cAAa,EAClE,OAAO,kBAAkB,4CAA4C,MAAM,EAC3E,OAAO,gBAAgB,oDAAoD,KAAK,EAChF;AAAA,IACC,OACE,eACA,SAOG;AACH,UAAI;AACF,cAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,cAAM,aAAa,SAAS,WAAW,aAAa;AACpD,YAAI,eAAe,QAAW;AAC5B,gBAAM,YAAY,OAAO,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACxE,gBAAM,IAAI;AAAA,YACR,cAAc,aAAa;AAAA,aAAwC,SAAS;AAAA,UAC9E;AAAA,QACF;AAEA,YAAI,QAAiC,CAAC;AACtC,YAAI;AACF,kBAAQ,KAAK,MAAM,KAAK,KAAK;AAAA,QAC/B,QAAQ;AACN,gBAAM,IAAI,MAAM,uBAAuB,KAAK,KAAK,EAAE;AAAA,QACrD;AAEA,YAAI,cAAiC,CAAC;AACtC,YAAI;AACF,wBAAc,KAAK,MAAM,KAAK,WAAW;AACzC,cAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,kBAAM,IAAI,MAAM,kCAAkC;AAAA,UACpD;AAAA,QACF,QAAQ;AACN,gBAAM,IAAI,MAAM,6BAA6B,KAAK,WAAW,EAAE;AAAA,QACjE;AAEA,cAAM,UAAU,QAAQ,IAAI;AAC5B,cAAM,WAAWI,SAAQ,SAAS,WAAW,QAAQ;AAErD,gBAAQ,OAAO,MAAM,6BAA6B,aAAa;AAAA,CAAK;AAEpE,cAAM,SAAS,MAAM,sBAAsB,eAAe,UAAU,OAAO,WAAW;AAEtF,YAAI,KAAK,WAAW;AAClB,cAAI,OAAO,MAAM,WAAW,GAAG;AAC7B,oBAAQ,OAAO,MAAM,gCAAgC;AAAA,UACvD,OAAO;AACL,uBAAW,QAAQ,OAAO,OAAO;AAC/B,sBAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,YAClC;AAAA,UACF;AACA;AAAA,QACF;AAEA,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,MAC7D,SAAS,KAAc;AACrB,gBAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEF,SAAO;AACT;;;AClgBA,SAAS,WAAAC,gBAAe;AAOxB,SAAS,yBAAAC,8BAA6B;AACtC,SAAS,WAAAC,gBAAe;AACxB,SAAS,YAAAC,iBAAgB;AAUzB,IAAMC,iBAAgB;AACtB,IAAM,yBAAyB;AAC/B,IAAM,0BAA0B;AAqEhC,SAAS,YAAY,MAAyC;AAC5D,MAAI,KAAK,SAAS,cAAe,QAAO;AACxC,MAAI,KAAK,SAAS,OAAQ,QAAO;AAEjC,QAAM,OAAO,KAAK;AAClB,MAAI,KAAK,SAAS,WAAW,KAAK,SAAS,WAAY,QAAO;AAC9D,MAAI,KAAK,SAAS,WAAW,KAAK,SAAS,WAAY,QAAO;AAC9D,SAAO,KAAK;AACd;AAMA,SAAS,uBAAuB,IAA8B;AAC5D,MAAI,OAAO,QAAQ,OAAO,OAAW,QAAO;AAC5C,QAAM,IAAI;AACV,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,EAAE;AAAA,IACX,KAAK,UAAU;AACb,UAAI,CAAC,MAAM,QAAQ,EAAE,OAAO,EAAG,QAAO,CAAC;AACvC,YAAM,SAAkC,CAAC;AACzC,iBAAW,SAAS,EAAE,SAA2D;AAC/E,eAAO,MAAM,GAAG,IAAI,uBAAuB,MAAM,KAAK;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,SAAS;AACZ,UAAI,CAAC,MAAM,QAAQ,EAAE,KAAK,EAAG,QAAO,CAAC;AACrC,aAAQ,EAAE,MAA4B,IAAI,sBAAsB;AAAA,IAClE;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,YAAY,EAAE,eAAe,EAAE;AAAA,IACxC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,eAAe,EAAE,WAAW,EAAE;AAAA,IACvC;AACE,aAAO,EAAE,WAAW;AAAA,EACxB;AACF;AAMA,SAAS,iBAAiB,OAA6C;AACrE,QAAM,SAAkC,CAAC;AACzC,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,SAAS,OAAW;AAExB,UAAM,MAAM,KAAK,SAAS,QAAQ,KAAK,SAAS,SAAY,KAAK,OAAO,GAAG,KAAK,IAAI,IAAI,CAAC;AACzF,WAAO,GAAG,IAAI,uBAAuB,KAAK,KAAK;AAAA,EACjD;AACA,SAAO;AACT;AAMA,SAAS,oBAAoB,UAA0C;AACrE,QAAM,QAAQ,SACX,IAAI,CAAC,MAAM,EAAE,eAAe,SAAS,EACrC,OAAO,CAAC,MAAM,KAAK,QAAQ,IAAI,QAAQ,IAAI,MAAM,GAAG;AACvD,SAAO;AACT;AAKA,SAAS,kBAAkB,UAAyC;AAClE,SAAO,SAAS,KAAK,CAAC,MAAM,EAAE,gBAAgB;AAChD;AAKO,SAAS,wBAAwB,MAAqB,QAAQ,GAAuB;AAC1F,QAAM,WAAW,oBAAoB,KAAK,OAAO;AACjD,QAAM,iBAAiB,kBAAkB,KAAK,OAAO;AACrD,QAAM,QAAQ,iBAAiB,KAAK,KAAK;AACzC,QAAM,YAAY,uBAAuB,KAAK,KAAK;AACnD,QAAM,QACJ,cAAc,QAAQ,OAAO,cAAc,YAAY,CAAC,MAAM,QAAQ,SAAS,IAC1E,YACD,CAAC;AAEP,SAAO;AAAA,IACL,WAAW,KAAK;AAAA,IAChB,MAAM,YAAY,IAAI;AAAA,IACtB,aAAa,KAAK;AAAA,IAClB,oBAAoB,KAAK;AAAA,IACzB,UAAU,KAAK,SAAS;AAAA;AAAA;AAAA,IAGxB,aAAa;AAAA,IACb;AAAA;AAAA;AAAA,IAGA,cAAc;AAAA,IACd;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,wBAAwB,OAAO,QAAQ,CAAC,CAAC;AAAA,EAClF;AACF;AA4BO,SAAS,gBACd,MACA,aAC2B;AAC3B,QAAM,mBAAmB,KAAK,SAC3B,IAAI,CAAC,UAAU,gBAAgB,OAAO,WAAW,CAAC,EAClD,OAAO,CAAC,MAA+B,MAAM,IAAI;AAEpD,QAAM,cAAc,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,MAAM,YAAY,YAAY,CAAC;AAE3F,MAAI,CAAC,eAAe,iBAAiB,WAAW,EAAG,QAAO;AAE1D,SAAO,EAAE,GAAG,MAAM,UAAU,iBAAiB;AAC/C;AAUO,SAAS,oBAAoB,MAAqD;AACvF,QAAM,mBAAmB,KAAK,SAC3B,IAAI,CAAC,UAAU,oBAAoB,KAAK,CAAC,EACzC,OAAO,CAAC,MAA+B,MAAM,IAAI;AAEpD,QAAM,WACJ,CAAC,KAAK,gBACN,CAAC,KAAK,gBACN,CAAC,KAAK,kBACN,CAAC,KAAK,YACN,KAAK,cAAc;AAErB,MAAI,CAAC,YAAY,iBAAiB,WAAW,EAAG,QAAO;AAEvD,SAAO,EAAE,GAAG,MAAM,UAAU,iBAAiB;AAC/C;AAMO,SAAS,SACd,MACA,QACoB;AACpB,QAAM,iBAAiB,KAAK,SACzB,IAAI,CAAC,UAAU,SAAS,OAAO,MAAM,CAAC,EACtC,KAAK,CAAC,GAAG,MAAM;AACd,QAAI,WAAW,cAAe,QAAO,EAAE,cAAc,EAAE;AACvD,WAAO,EAAE,QAAQ,EAAE;AAAA,EACrB,CAAC;AACH,SAAO,EAAE,GAAG,MAAM,UAAU,eAAe;AAC7C;AAMO,SAAS,sBACd,MACA,gBAAgB,GACiC;AACjD,QAAM,aAAa,KAAK,SAAS;AACjC,QAAM,qBAAqB,aAAa,gBAAgB,IAAI;AAC5D,SAAO;AAAA,IACL,GAAG;AAAA,IACH,gBAAgB;AAAA,IAChB,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,sBAAsB,OAAO,kBAAkB,CAAC;AAAA,EACzF;AACF;AAKO,SAAS,WAAW,MAA0B,OAAmC;AACtF,MAAI,YAAY;AAEhB,QAAM,OAAO,CAAC,SAAwD;AACpE,QAAI,aAAa,EAAG,QAAO;AAC3B;AACA,UAAM,kBAAwC,CAAC;AAC/C,eAAW,SAAS,KAAK,UAAU;AACjC,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,YAAY,KAAM,iBAAgB,KAAK,OAAO;AAAA,IACpD;AACA,WAAO,EAAE,GAAG,MAAM,UAAU,gBAAgB;AAAA,EAC9C;AAEA,SAAO,KAAK,IAAI,KAAK;AACvB;AAMA,IAAM,SAAS;AACf,IAAM,cAAc;AACpB,IAAM,WAAW;AACjB,IAAM,QAAQ;AAEd,SAAS,cAAc,MAA0B,mBAAoC;AACnF,QAAM,QAAkB,CAAC,KAAK,SAAS;AAGvC,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,YAAM,KAAK,QAAQ;AACnB;AAAA,IACF,KAAK;AACH,YAAM,KAAK,cAAc;AACzB;AAAA,IACF,KAAK;AACH,YAAM,KAAK,SAAS;AACpB;AAAA,IACF,KAAK;AACH,YAAM,KAAK,YAAY;AACvB;AAAA,IACF,KAAK;AACH,YAAM,KAAK,YAAY;AACvB;AAAA,IACF;AACE;AAAA,EACJ;AAGA,MAAI,KAAK,cAAc,GAAG;AACxB,UAAM,cACJ,KAAK,qBAAqB,IAAI,IAAI,KAAK,mBAAmB,QAAQ,CAAC,CAAC,OAAO;AAC7E,UAAM,KAAK,YAAY,KAAK,WAAW,GAAG,WAAW,GAAG;AAAA,EAC1D;AAGA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,UAAM,KAAK,QAAQ,KAAK,SAAS,KAAK,GAAG,CAAC,GAAG;AAAA,EAC/C;AAGA,MAAI,mBAAmB;AACrB,UAAM,KAAM,KAA0D;AACtE,QAAI,OAAO,UAAa,KAAK,GAAG;AAC9B,YAAM,KAAK,OAAO,EAAE,GAAG;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,GAAG;AACvB;AAEA,SAAS,cACP,MACA,QACA,QACA,mBACA,OACM;AAEN,MAAI,KAAK,SAAS,QAAQ;AACxB,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC7C,YAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,UAAI,UAAU,QAAW;AACvB,sBAAc,OAAO,QAAQ,MAAM,KAAK,SAAS,SAAS,GAAG,mBAAmB,KAAK;AAAA,MACvF;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,YAAY,SAAS,cAAc;AACzC,QAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,cAAc,MAAM,iBAAiB,CAAC,EAAE;AAE3E,QAAM,aAAa,UAAU,SAAS,QAAQ;AAC9C,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC7C,UAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,QAAI,UAAU,QAAW;AACvB,oBAAc,OAAO,YAAY,MAAM,KAAK,SAAS,SAAS,GAAG,mBAAmB,KAAK;AAAA,IAC3F;AAAA,EACF;AACF;AAKO,SAAS,qBAAqB,MAA0B,oBAAoB,OAAe;AAChG,QAAM,QAAkB,CAAC;AAEzB,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,KAAK,cAAc,MAAM,iBAAiB,CAAC;AACjD,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC7C,YAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,UAAI,UAAU,QAAW;AACvB,sBAAc,OAAO,IAAI,MAAM,KAAK,SAAS,SAAS,GAAG,mBAAmB,KAAK;AAAA,MACnF;AAAA,IACF;AAAA,EACF,OAAO;AAEL,aAAS,IAAI,GAAG,IAAI,KAAK,SAAS,QAAQ,KAAK;AAC7C,YAAM,QAAQ,KAAK,SAAS,CAAC;AAC7B,UAAI,UAAU,QAAW;AACvB,sBAAc,OAAO,IAAI,MAAM,KAAK,SAAS,SAAS,GAAG,mBAAmB,KAAK;AAAA,MACnF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAqBA,eAAsB,kBACpB,SAC6B;AAC7B,QAAM,EAAE,eAAe,SAAS,IAAI;AAMpC,QAAM,UAAU,MAAMC,UAAS,OAAO,EAAE,UAAU,KAAK,CAAC;AAExD,MAAI;AACF,UAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,MACvC,UAAU,EAAE,OAAO,wBAAwB,QAAQ,wBAAwB;AAAA,IAC7E,CAAC;AACD,UAAM,OAAO,MAAM,QAAQ,QAAQ;AAOnC,UAAM,eAAeC,uBAAsB;AAC3C,UAAM,cAAc,MAAM;AAAA,MACxB;AAAA,MACA;AAAA,MACA,CAAC;AAAA,MACD;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAGxD,UAAM,KAAK;AAAA,MACT,MAAM;AACJ,cAAM,IAAI;AAIV,eAAO,EAAE,8BAA8B;AAAA,MACzC;AAAA,MACA,EAAE,SAAS,KAAO;AAAA,IACpB;AAEA,UAAM,cAAc,MAAM,KAAK;AAAA,MAC7B,MAEI,OAGA,0BAA0B;AAAA,IAChC;AAEA,QAAI,gBAAgB,MAAM;AACxB,YAAM,IAAI,MAAM,2BAA2B,WAAW,EAAE;AAAA,IAC1D;AAGA,UAAM,cAAc,MAAM,KAAK,SAAS,YAAY;AAClD,YAAM,IAAI;AAGV,UAAI,OAAO,EAAE,2BAA2B,YAAY;AAClD,cAAM,IAAI,MAAM,wEAAmE;AAAA,MACrF;AACA,aAAO,EAAE,uBAAuB,EAAE,aAAa,MAAM,CAAC;AAAA,IACxD,CAAC;AAGD,UAAM,gBAAgB,KAAK,MAAM,WAAW;AAC5C,UAAM,gBAAgB,cAAc;AAEpC,QAAI,kBAAkB,UAAa,kBAAkB,MAAM;AACzD,YAAM,IAAI,MAAM,gCAAgC,aAAa,GAAG;AAAA,IAClE;AAGA,QAAI,iBAAiB,wBAAwB,eAAe,CAAC;AAG7D,QAAI,QAAQ,gBAAgB,QAAW;AACrC,YAAM,WAAW,gBAAgB,gBAAgB,QAAQ,WAAW;AACpE,uBAAiB,aAAa,OAAO,WAAW,EAAE,GAAG,gBAAgB,UAAU,CAAC,EAAE;AAAA,IACpF;AAEA,QAAI,QAAQ,kBAAkB,MAAM;AAClC,YAAM,WAAW,oBAAoB,cAAc;AACnD,uBAAiB,aAAa,OAAO,WAAW,EAAE,GAAG,gBAAgB,UAAU,CAAC,EAAE;AAAA,IACpF;AAEA,QAAI,QAAQ,WAAW,QAAW;AAChC,uBAAiB,SAAS,gBAAgB,QAAQ,MAAM;AAAA,IAC1D;AAEA,QAAI,QAAQ,kBAAkB,MAAM;AAClC,uBAAiB,sBAAsB,gBAAgB,CAAC;AAAA,IAC1D;AAEA,QAAI,QAAQ,UAAU,UAAa,QAAQ,QAAQ,GAAG;AACpD,uBAAiB,WAAW,gBAAgB,QAAQ,KAAK;AAAA,IAC3D;AAEA,WAAO;AAAA,EACT,UAAE;AACA,UAAM,QAAQ,MAAM;AAAA,EACtB;AACF;AAmBO,SAAS,8BAAuC;AACrD,SAAO,IAAIC,SAAQ,MAAM,EACtB;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWF,EACC,SAAS,eAAe,2DAA2D,EACnF,OAAO,qBAAqB,0CAA0C,EACtE,OAAO,eAAe,iDAAiD,EACvE,OAAO,yBAAyB,kDAAkD,EAClF,OAAO,oBAAoB,8DAA8D,KAAK,EAC9F;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,kBAAkB,4CAA4C,EACrE,OAAO,qBAAqB,yBAAyBC,cAAa,EAClE,OAAO,OAAO,eAAuB,SAA6B;AACjE,QAAI;AACF,YAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,YAAM,aAAa,SAAS,WAAW,aAAa;AACpD,UAAI,eAAe,QAAW;AAC5B,cAAM,YAAY,OAAO,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACxE,cAAM,IAAI;AAAA,UACR,cAAc,aAAa;AAAA,aAAwC,SAAS;AAAA,QAC9E;AAAA,MACF;AAEA,UAAI,KAAK,WAAW,QAAW;AAC7B,cAAM,UAAU,CAAC,eAAe,OAAO;AACvC,YAAI,CAAE,QAA8B,SAAS,KAAK,MAAM,GAAG;AACzD,gBAAM,IAAI;AAAA,YACR,4BAA4B,KAAK,MAAM,eAAe,QAAQ,KAAK,IAAI,CAAC;AAAA,UAC1E;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,QAAQ,IAAI;AAC5B,YAAM,WAAWC,SAAQ,SAAS,WAAW,QAAQ;AAErD,cAAQ,OAAO,MAAM,iBAAiB,aAAa;AAAA,CAAK;AAExD,YAAM,iBAAiB,MAAM,kBAAkB;AAAA,QAC7C;AAAA,QACA;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK,UAAU,SAAY,KAAK,IAAI,GAAG,SAAS,KAAK,OAAO,EAAE,CAAC,IAAI;AAAA,QAC1E,aAAa,KAAK;AAAA,QAClB,eAAe,KAAK;AAAA,QACpB,eAAe,KAAK;AAAA,MACtB,CAAC;AAED,YAAMC,OAAMC,eAAc,KAAK,MAAM;AAErC,UAAID,SAAQ,QAAQ;AAClB,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,gBAAgB,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,MACrE,OAAO;AACL,cAAM,OAAO,qBAAqB,gBAAgB,KAAK,iBAAiB,KAAK;AAC7E,gBAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,MAClC;AAAA,IACF,SAAS,KAAc;AACrB,cAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAMA,SAASC,eAAc,YAAiD;AACtE,MAAI,eAAe,QAAW;AAC5B,UAAM,QAAQ,WAAW,YAAY;AACrC,QAAI,UAAU,UAAU,UAAU,QAAQ;AACxC,YAAM,IAAI,MAAM,mBAAmB,UAAU,wBAAwB;AAAA,IACvE;AACA,WAAO;AAAA,EACT;AACA,SAAO,MAAM,IAAI,SAAS;AAC5B;;;AJrpBA,IAAMC,iBAAgB;AAoGf,SAAS,iBAAiB,OAAsC;AACrE,MAAI,MAAM,YAAa,QAAO;AAC9B,MAAI,MAAM,aAAc,QAAO;AAC/B,MAAI,MAAM,aAAc,QAAO;AAC/B,MAAI,MAAM,eAAgB,QAAO;AACjC,MAAI,MAAM,gBAAiB,QAAO;AAClC,SAAO;AACT;AAMO,SAAS,eAAe,OAAgC;AAC7D,SAAO,CAAC,MAAM,gBAAgB,CAAC,MAAM,gBAAgB,CAAC,MAAM,kBAAkB,CAAC,MAAM;AACvF;AASO,SAAS,qBAAqB,WAA4C;AAC/E,QAAM,SAAwB,CAAC;AAG/B,QAAM,sBAAsB,oBAAI,IAA4B;AAE5D,aAAW,OAAO,WAAW;AAC3B,UAAM,UAAU,iBAAiB,GAAG;AACpC,UAAM,SAAS,eAAe,GAAG;AAGjC,UAAM,QAAyB,CAAC;AAGhC,QAAI,UAA0B;AAC9B,UAAM,UAAU,oBAAI,IAAY;AAEhC,WAAO,MAAM;AACX,UAAI,QAAQ,IAAI,QAAQ,SAAS,EAAG;AACpC,cAAQ,IAAI,QAAQ,SAAS;AAE7B,YAAM,iBAAiB,iBAAiB,OAAO;AAC/C,YAAM,QAAQ;AAAA,QACZ,WAAW,QAAQ;AAAA,QACnB,SAAS;AAAA,QACT,cAAc,QAAQ;AAAA,QACtB,cAAc,QAAQ;AAAA,QACtB,gBAAgB,QAAQ;AAAA,MAC1B,CAAC;AAGD,UAAI,mBAAmB,qBAAqB,QAAQ,oBAAoB,MAAM;AAC5E;AAAA,MACF;AAGA,YAAM,cAAc,oBAAoB,IAAI,QAAQ,eAAe;AACnE,UAAI,gBAAgB,OAAW;AAC/B,gBAAU;AAAA,IACZ;AAGA,UAAM,YAAY,MAAM,CAAC;AACzB,UAAM,iBAAiB,UAAU,OAAO,CAAC,MAAM;AAC7C,UAAI,cAAc,OAAW,QAAO;AAEpC,aAAO,EAAE,cAAc,UAAU,aAAa,CAAC,EAAE,gBAAgB,CAAC,EAAE;AAAA,IACtE,CAAC;AAED,WAAO,KAAK;AAAA,MACV,WAAW,IAAI;AAAA,MACf,aAAa,IAAI;AAAA,MACjB;AAAA,MACA,cAAc,IAAI;AAAA,MAClB,cAAc,IAAI;AAAA,MAClB,gBAAgB,IAAI;AAAA,MACpB,UAAU,IAAI;AAAA,MACd;AAAA,MACA;AAAA,MACA,SAAS;AAAA,QACP,uBAAuB,eAAe;AAAA,QACtC,kBAAkB,IAAI,IAAI,eAAe,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;AAAA,QAClE,sBAAsB,eAAe,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE;AAAA,MACtE;AAAA,IACF,CAAC;AAED,wBAAoB,IAAI,IAAI,WAAW,GAAG;AAAA,EAC5C;AAEA,SAAO;AACT;AAUO,SAAS,oBAAoB,SAA0C;AAC5E,QAAM,QAA0B,CAAC;AAGjC,QAAM,cAAc,oBAAI,IAA2B;AACnD,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,YAAY,IAAI,EAAE,SAAS,EAAG,aAAY,IAAI,EAAE,WAAW,CAAC,CAAC;AAElE,gBAAY,IAAI,EAAE,SAAS,EAAG,KAAK,CAAC;AAAA,EACtC;AAEA,aAAW,CAAC,WAAW,MAAM,KAAK,aAAa;AAC7C,UAAM,cAAc,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AACnD,UAAM,aAAa,OAAO;AAG1B,QAAI,cAAc,GAAG;AACnB,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,UAAU;AAAA,QACV;AAAA,QACA,QAAQ,GAAG,WAAW,IAAI,UAAU;AAAA,QACpC,MAAM,EAAE,aAAa,YAAY,aAAa,cAAc,WAAW;AAAA,MACzE,CAAC;AAAA,IACH;AAGA,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,QAAQ,wBAAwB,IAAI;AAC5C,cAAM,KAAK;AAAA,UACT,IAAI;AAAA,UACJ,UAAU;AAAA,UACV;AAAA,UACA,QAAQ,mBAAmB,SAAS,cAAc,MAAM,QAAQ,qBAAqB;AAAA,UACrF,MAAM;AAAA,YACJ,uBAAuB,MAAM,QAAQ;AAAA,YACrC,kBAAkB,MAAM,QAAQ;AAAA,YAChC,sBAAsB,MAAM,QAAQ;AAAA,UACtC;AAAA,QACF,CAAC;AACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAaO,SAAS,6BAAqC;AACnD;AAAA;AAAA,IAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA0IlB;AAUA,eAAsBC,mBACpB,MACA,OACe;AACf,aAAW,QAAQ,OAAO;AACxB,YAAQ,KAAK,QAAQ;AAAA,MACnB,KAAK;AACH,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,KAAK,MAAM,KAAK,QAAQ,EAAE,SAAS,IAAK,CAAC,EAAE,MAAM,MAAM;AAAA,UAE7D,CAAC;AAAA,QACH;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,WAAW,UAAa,KAAK,SAAS,QAAW;AACxD,gBAAM,KAAK,KAAK,KAAK,QAAQ,KAAK,MAAM,EAAE,SAAS,IAAK,CAAC,EAAE,MAAM,YAAY;AAG3E,kBAAM,KAAK,KAAK,KAAK,QAAS,KAAK,MAAO,EAAE,SAAS,IAAK,CAAC,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAAA,UAC7E,CAAC;AAAA,QACH;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,KAAK,MAAM,KAAK,QAAQ,EAAE,SAAS,IAAK,CAAC,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QACjE;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,KACH,QAAQ,KAAK,MAAM,EACnB,KAAK,EAAE,SAAS,IAAK,CAAC,EACtB,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QACnB;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,KAAK,MAAM,KAAK,QAAQ,EAAE,SAAS,IAAK,CAAC,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QACjE;AACA;AAAA,MACF,KAAK;AACH,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,KACH,QAAQ,KAAK,MAAM,EACnB,uBAAuB,EAAE,SAAS,IAAK,CAAC,EACxC,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QACnB;AACA;AAAA,MACF,KAAK,QAAQ;AACX,cAAM,UAAU,KAAK,WAAW;AAChC,YAAI,KAAK,cAAc,QAAQ;AAE7B,gBAAM,KAAK,iBAAiB,eAAe,EAAE,QAAQ,CAAC,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AAAA,QACxE,OAAO;AACL,gBAAM,KAAK,eAAe,OAAO;AAAA,QACnC;AACA;AAAA,MACF;AAAA,MACA;AAEE;AAAA,IACJ;AAAA,EACF;AACF;AAMA,IAAIC,SAAiD;AAErD,eAAeC,WAAqD;AAClE,MAAID,WAAU,MAAM;AAClB,IAAAA,SAAQ,IAAIE,aAAY;AAAA,MACtB,MAAM,EAAE,UAAU,GAAG,iBAAiB,EAAE;AAAA,MACxC,eAAe;AAAA,MACf,gBAAgB;AAAA,IAClB,CAAC;AACD,UAAMF,OAAM,KAAK;AAAA,EACnB;AACA,SAAOA;AACT;AAEA,eAAeG,gBAA8B;AAC3C,MAAIH,WAAU,MAAM;AAClB,UAAMA,OAAM,MAAM;AAClB,IAAAA,SAAQ;AAAA,EACV;AACF;AAqBA,eAAsB,eAAe,SAAyD;AAC5F,QAAM,eAAe,QAAQ,gBAAgBF;AAC7C,QAAM,WAAW,aAAa,YAAY;AAC1C,QAAM,aAAa,SAAS,WAAW,QAAQ,aAAa;AAE5D,MAAI,eAAe,QAAW;AAC5B,UAAM,YAAY,OAAO,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACxE,UAAM,IAAI;AAAA,MACR,cAAc,QAAQ,aAAa;AAAA,aAAwC,SAAS;AAAA,IACtF;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,WAAWM,SAAQ,SAAS,WAAW,QAAQ;AAQrD,QAAM,YAAY,GAAGC,uBAAsB,CAAC;AAAA,EAC5C,2BAA2B,CAAC;AAC5B,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA,QAAQ;AAAA,IACR,CAAC;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,OAAO,MAAMJ,SAAQ;AAC3B,QAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,QAAM,EAAE,KAAK,IAAI;AAEjB,QAAM,UAAU,YAAY,IAAI;AAEhC,MAAI;AAEF,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAGxD,UAAM,KAAK;AAAA,MACT,MACG,OAA4D,8BAC7D;AAAA,MACF,EAAE,SAAS,KAAO;AAAA,IACpB;AAGA,UAAM,KAAK,eAAe,GAAG;AAG7B,UAAM,KAAK,SAAS,MAAM;AAExB,MAAC,OAAe,0BAA0B,CAAC;AAE3C,MAAC,OAAe,yBAAyB;AAAA,IAC3C,CAAC;AAGD,UAAMF,mBAAkB,MAAM,QAAQ,WAAW;AAGjD,UAAM,KAAK,eAAe,GAAG;AAE7B,UAAM,wBAAwB,YAAY,IAAI,IAAI;AAGlD,UAAM,YAAa,MAAM,KAAK,SAAS,MAAM;AAC3C,aACG,OACE,2BAA2B,CAAC;AAAA,IAEnC,CAAC;AAGD,UAAM,UAAU,qBAAqB,SAAS;AAG9C,UAAM,QAAQ,oBAAoB,OAAO;AAEzC,UAAM,mBAAmB,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE;AAClE,UAAM,gBAAgB,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAEtD,WAAO;AAAA,MACL,WAAW,QAAQ;AAAA,MACnB,aAAa,QAAQ;AAAA,MACrB,SAAS;AAAA,QACP,cAAc,QAAQ;AAAA,QACtB;AAAA,QACA;AAAA,QACA,uBAAuB,KAAK,MAAM,qBAAqB;AAAA,MACzD;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,UAAE;AACA,SAAK,QAAQ,IAAI;AAAA,EACnB;AACF;AASO,SAAS,mBAAmB,QAAuC;AACxE,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK;AAAA,gCAA4B,OAAO,SAAS,EAAE;AACzD,QAAM,KAAK,GAAG,SAAI,OAAO,EAAE,CAAC,EAAE;AAC9B,QAAM,KAAK,qBAAqB,OAAO,QAAQ,YAAY,EAAE;AAC7D,QAAM,KAAK,sBAAsB,OAAO,QAAQ,gBAAgB,EAAE;AAClE,QAAM,KAAK,qBAAqB,OAAO,QAAQ,aAAa,EAAE;AAC9D,QAAM,KAAK,qBAAqB,OAAO,QAAQ,qBAAqB,IAAI;AACxE,QAAM,KAAK,EAAE;AAEb,MAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,UAAM,KAAK,4CAA4C;AAAA,EACzD,OAAO;AACL,UAAM,KAAK,aAAa;AACxB,UAAM;AAAA,MACJ,GAAG,IAAI,OAAO,CAAC,CAAC,IAAI,YAAY,OAAO,EAAE,CAAC,IAAI,UAAU,OAAO,EAAE,CAAC,IAAI,SAAS,OAAO,CAAC,CAAC,IAAI,aAAa;AAAA,IAC3G;AACA,UAAM,KAAK,SAAI,OAAO,EAAE,CAAC;AAEzB,eAAW,KAAK,OAAO,SAAS;AAC9B,YAAM,SAAS,EAAE,SAAS,eAAU;AACpC,YAAM,MAAM,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC;AAC1C,YAAM,OAAO,EAAE,UAAU,MAAM,GAAG,EAAE,EAAE,OAAO,EAAE;AAC/C,YAAM,OAAO,EAAE,QAAQ,OAAO,EAAE;AAChC,YAAM,IAAI,OAAO,OAAO,CAAC;AACzB,YAAM,QAAQ,EAAE,MAAM;AACtB,YAAM,KAAK,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,EAAE;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,QAAQ;AACnB,eAAW,QAAQ,OAAO,OAAO;AAC/B,YAAM,OAAO,KAAK,aAAa,UAAU,WAAM,KAAK,aAAa,YAAY,WAAM;AACnF,YAAM,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE,KAAK,KAAK,SAAS,KAAK,KAAK,MAAM,EAAE;AAAA,IACvE;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AASO,SAAS,iCAA0C;AACxD,SAAO,IAAIO,SAAQ,SAAS,EACzB;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF,EACC,SAAS,eAAe,oDAAoD,EAC5E;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,UAAU,oCAAoC,KAAK,EAC1D,OAAO,qBAAqB,yBAAyBR,cAAa,EAClE;AAAA,IACC,OACE,eACA,SAKG;AACH,UAAI,cAAiC,CAAC;AACtC,UAAI;AACF,sBAAc,KAAK,MAAM,KAAK,WAAW;AACzC,YAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,gBAAM,IAAI,MAAM,kCAAkC;AAAA,QACpD;AAAA,MACF,QAAQ;AACN,gBAAQ,OAAO,MAAM,sCAAsC,KAAK,WAAW;AAAA,CAAI;AAC/E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI;AACF,gBAAQ,OAAO;AAAA,UACb,iBAAiB,aAAa,KAAK,YAAY,MAAM;AAAA;AAAA,QACvD;AAEA,cAAM,SAAS,MAAM,eAAe;AAAA,UAClC;AAAA,UACA;AAAA,UACA,cAAc,KAAK;AAAA,QACrB,CAAC;AAED,cAAMK,cAAa;AAEnB,YAAI,KAAK,QAAQ,CAAC,MAAM,GAAG;AACzB,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QAC7D,OAAO;AACL,kBAAQ,OAAO,MAAM,GAAG,mBAAmB,MAAM,CAAC;AAAA,CAAI;AAAA,QACxD;AAAA,MACF,SAAS,KAAc;AACrB,cAAMA,cAAa;AACnB,gBAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAMO,SAAS,0BAAmC;AACjD,QAAM,gBAAgB,IAAIG,SAAQ,YAAY,EAAE;AAAA,IAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBF;AAEA,gBAAc,WAAW,+BAA+B,CAAC;AACzD,gBAAc,WAAW,6BAA6B,CAAC;AACvD,gBAAc,WAAW,+BAA+B,CAAC;AACzD,gBAAc,WAAW,4BAA4B,CAAC;AAEtD,SAAO;AACT;;;AKryBA,SAAS,cAAAC,aAAY,aAAAC,YAAW,gBAAAC,eAAc,UAAAC,SAAQ,iBAAAC,sBAAqB;AAC3E,SAAS,WAAAC,iBAAe;AAExB;AAAA,EACE;AAAA,EACA;AAAA,EACA,eAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,WAAAC,gBAAe;;;ACvCxB,SAAS,aAAAC,YAAW,gBAAAC,eAAc,iBAAAC,sBAAqB;AACvD,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AA6B1B,IAAM,mBAAmB;AAEzB,SAAS,iBAAiB,SAAgE;AAC/F,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,WAAW,QAAQ,UAAU;AACtC,QAAI,QAAQ,UAAU,YAAY,QAAQ,UAAU,UAAU;AAC5D,cAAQ;AAAA,QACN,WAAW,QAAQ,cAAc,qBAAqB,gBAAgB,QAAQ,SAAS;AAAA,MACzF;AAAA,IACF,WAAW,QAAQ,UAAU,cAAc;AACzC,cAAQ;AAAA,QACN,mFAAmF,QAAQ,SAAS;AAAA,MACtG;AAAA,IACF,WAAW,QAAQ,UAAU,cAAc;AACzC,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF,WAAW,QAAQ,UAAU,QAAQ;AACnC,cAAQ;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,cAAc,QAAQ,WAAW,sBAAsB,GAAG;AACpE,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF,WACE,QAAQ,cACR,QAAQ,WAAW,cAAc,UACjC,QAAQ,WAAW,QAAQ,QAAQ,WAAW,WAC9C;AACA,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,IAAI,wDAAwD;AAAA,EACtE;AAEA,SAAO,CAAC,GAAG,OAAO;AACpB;AAEO,SAAS,gBACd,SAIA,cAAc,kBACN;AACR,QAAM,aAAaA,SAAQ,QAAQ,IAAI,GAAG,WAAW;AACrD,EAAAJ,WAAUG,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,UAAsB;AAAA,IAC1B,GAAG;AAAA,IACH,aAAa,QAAQ,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC3D,aAAa,QAAQ,eAAe,iBAAiB,OAAO;AAAA,EAC9D;AACA,EAAAD,eAAc,YAAY,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,OAAO;AAC1E,SAAO;AACT;;;ACjDA,SAAS,cAAAG,aAAY,aAAAC,YAAW,cAAc;AAC9C,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,cAAc;AACvB,SAAS,WAAAC,UAAS,QAAAC,OAAM,WAAAC,iBAAe;AACvC,YAAYC,cAAa;AA6BzB,IAAM,mBAAmB,CAAC,cAAc,aAAa,cAAc,WAAW;AAQvE,SAAS,cAAc,mBAA0C;AACtE,QAAM,MAAMH,SAAQ,iBAAiB;AAErC,QAAM,OAAO,kBAAkB,QAAQ,kBAAkB,EAAE;AAC3D,QAAM,WAAW,KAAK,MAAM,IAAI,SAAS,CAAC;AAE1C,aAAW,OAAO,kBAAkB;AAClC,UAAM,YAAYC,MAAK,KAAK,GAAG,QAAQ,GAAG,GAAG,EAAE;AAC/C,QAAIJ,YAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AACA,SAAO;AACT;AAYA,eAAsB,cAAc,eAA+C;AACjF,QAAM,SAASI,MAAK,OAAO,GAAG,cAAc,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE;AAC/F,EAAAH,WAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACrC,QAAM,UAAUG,MAAK,QAAQ,gBAAgB;AAE7C,MAAI;AAEF,UAAM,SAAS,MAAc,eAAM;AAAA,MACjC,aAAa,CAAC,aAAa;AAAA,MAC3B,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA,MACL,iBAAiB;AAAA;AAAA,MAEjB,UAAU,CAAC,SAAS,aAAa,mBAAmB;AAAA,MACpD,QAAQ;AAAA,QACN,wBAAwB;AAAA,MAC1B;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AAED,QAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAM,MAAM,OAAO,OAChB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,WAAW,KAAK,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,IAAI,MAAM,EAAE,EAAE,EACrF,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,+BAA+B,aAAa;AAAA,EAAM,GAAG,EAAE;AAAA,IACzE;AAGA,UAAM,MAAMF,eAAc,YAAY,GAAG;AAEzC,WAAO,IAAI,MAAMG,UAAQ,OAAO,CAAC;AAEjC,UAAM,MAAM,IAAI,OAAO;AAGvB,UAAM,YAAY,iBAAiB,KAAK,aAAa;AACrD,UAAM,aACJ,OAAO,IAAI,YAAY,cAAc,OAAO,IAAI,SAAS,YAAY;AAEvE,WAAO,EAAE,UAAU,eAAe,WAAW,WAAW;AAAA,EAC1D,UAAE;AAEA,QAAI;AACF,aAAO,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACjD,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAMA,eAAsB,0BACpB,mBAC+B;AAC/B,QAAM,gBAAgB,cAAc,iBAAiB;AACrD,MAAI,kBAAkB,KAAM,QAAO;AACnC,SAAO,cAAc,aAAa;AACpC;AAMA,SAAS,iBACP,KACA,UACyC;AAEzC,QAAM,MAAM,IAAI,aAAc,IAAI,SAAiD;AAEnF,MAAI,QAAQ,OAAW,QAAO,CAAC;AAE/B,MAAI,OAAO,QAAQ,YAAY,QAAQ,QAAQ,MAAM,QAAQ,GAAG,GAAG;AACjE,YAAQ,KAAK,WAAW,QAAQ,6DAAwD;AACxF,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAkD,CAAC;AACzD,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,GAA8B,GAAG;AAC1E,QAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GAAG;AACvE,cAAQ,KAAK,WAAW,QAAQ,eAAe,IAAI,0CAAqC;AACxF;AAAA,IACF;AACA,WAAO,IAAI,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAeA,eAAsB,mBAAmB,eAAwC;AAC/E,QAAM;AAAA;AAAA,IAAwB;AAAA,8BACF,KAAK,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASzD,QAAM,SAAS,MAAc,eAAM;AAAA,IACjC,OAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAYF,SAAQ,aAAa;AAAA,MACjC,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,KAAK;AAAA,IACL,iBAAiB;AAAA,IACjB,UAAU,CAAC;AAAA,IACX,QAAQ;AAAA,MACN,wBAAwB;AAAA,MACxB,QAAQ;AAAA,IACV;AAAA,IACA,UAAU;AAAA,EACZ,CAAC;AAED,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,MAAM,OAAO,OAChB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,WAAW,KAAK,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,IAAI,MAAM,EAAE,EAAE,EACrF,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM,uCAAuC,aAAa;AAAA,EAAM,GAAG,EAAE;AAAA,EACjF;AAEA,SAAO,OAAO,cAAc,CAAC,GAAG,QAAQ;AAC1C;;;AFzLO,SAAS,6BAA6B,KAAuB;AAClE,QAAM,aAAaI,UAAQ,KAAK,wBAAwB;AACxD,MAAI,CAACC,YAAW,UAAU,EAAG,QAAO,CAAC;AACrC,MAAI;AACF,UAAM,MAAMC,cAAa,YAAY,OAAO;AAC5C,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,WAAO,IAAI,YAAY,UAAU,aAAa,CAAC;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,IAAMC,yBAAwB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,8BAA8B,KAAsB;AAClE,MAAIA,uBAAsB,KAAK,CAAC,SAASF,YAAWD,UAAQ,KAAK,IAAI,CAAC,CAAC,GAAG;AACxE,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkBA,UAAQ,KAAK,cAAc;AACnD,MAAI,CAACC,YAAW,eAAe,EAAG,QAAO;AAEzC,MAAI;AACF,UAAM,MAAM,KAAK,MAAMC,cAAa,iBAAiB,OAAO,CAAC;AAI7D,WAAO,CAAC,IAAI,cAAc,IAAI,eAAe,EAAE;AAAA,MAC7C,CAAC,SACC,QACA,OAAO,KAAK,IAAI,EAAE;AAAA,QAChB,CAAC,SAAS,SAAS,iBAAiB,KAAK,WAAW,eAAe;AAAA,MACrE;AAAA,IACJ;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,2BAA2B,KAAuB;AAChE,QAAM,aAAaF,UAAQ,KAAK,wBAAwB;AACxD,MAAI,CAACC,YAAW,UAAU,EAAG,QAAO,CAAC;AACrC,MAAI;AACF,UAAM,MAAMC,cAAa,YAAY,OAAO;AAC5C,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,WAAO,IAAI,OAAO,YAAY,CAAC;AAAA,EACjC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAASE,WAAU,SAAiB,OAAwB;AAC1D,QAAM,UAAU,QAAQ,QAAQ,qBAAqB,MAAM;AAC3D,QAAM,WAAW,QACd,QAAQ,SAAS,kBAAY,EAC7B,QAAQ,OAAO,OAAO,EACtB,QAAQ,eAAe,IAAI;AAC9B,SAAO,IAAI,OAAO,IAAI,QAAQ,KAAK,GAAG,EAAE,KAAK,KAAK;AACpD;AAEO,SAAS,gBACd,UACA,aACA,UACS;AACT,SACE,SAAS,SAAS,KAAK,SAAS,KAAK,CAAC,MAAMA,WAAU,GAAG,QAAQ,KAAKA,WAAU,GAAG,WAAW,CAAC;AAEnG;AAYA,SAAS,iCACP,eACA,UACA,eACA,gBAC4B;AAC5B,SAAO;AAAA,IACL,SAAS,0BAA0B,aAAa;AAAA,IAChD,QAAQ;AAAA,IACR,WAAW;AAAA,IACX;AAAA,IACA,cAAc,SAAS;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;AAMA,IAAMC,iBAAgB;AACtB,IAAM,qBAAqB;AAE3B,SAAS,uBAAuB,eAAuB,cAA+B;AACpF,SAAO,iBAAiB,SAAY,gBAAgB,GAAG,aAAa,IAAI,YAAY;AACtF;AAEA,SAAS,uBACP,WACA,eACA,cACM;AACN,QAAM,YAAYL;AAAA,IAChB;AAAA,IACA,GAAG,uBAAuB,eAAe,YAAY,CAAC;AAAA,EACxD;AACA,MAAIC,YAAW,SAAS,GAAG;AACzB,IAAAK,QAAO,WAAW,EAAE,OAAO,KAAK,CAAC;AAAA,EACnC;AACF;AAEA,SAAS,yBACP,WACA,SAOQ;AACR,QAAM,UAAUN;AAAA,IACd;AAAA,IACA,GAAG,uBAAuB,QAAQ,WAAW,QAAQ,QAAQ,CAAC;AAAA,EAChE;AACA,EAAAO;AAAA,IACE;AAAA,IACA,KAAK;AAAA,MACH;AAAA,QACE,WAAW,QAAQ;AAAA,QACnB,UAAU,QAAQ;AAAA,QAClB,cAAc,QAAQ;AAAA,QACtB,gBAAgB,QAAQ;AAAA,QACxB,cAAc,QAAQ;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,IAAIC,SAA4B;AAEhC,eAAeC,SAAQ,eAAuB,gBAA8C;AAC1F,MAAID,WAAU,MAAM;AAClB,IAAAA,SAAQ,IAAIE,aAAY;AAAA,MACtB,MAAM,EAAE,UAAU,GAAG,iBAAiB,EAAE;AAAA,MACxC;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAMF,OAAM,KAAK;AAAA,EACnB;AACA,SAAOA;AACT;AAEA,eAAsBG,gBAA8B;AAClD,MAAIH,WAAU,MAAM;AAClB,UAAMA,OAAM,MAAM;AAClB,IAAAA,SAAQ;AAAA,EACV;AACF;AAeO,SAAS,cACd,UACA,eACA,eACA,gBACA,iBAA2B,CAAC,GAC5B,aAAqB,QAAQ,IAAI,GACjC,eACA,WAAW,OACmC;AAG9C,QAAM,SAAS,IAAI,eAAe;AAAA,IAChC,iBAAiB,EAAE,OAAO,eAAe,QAAQ,eAAe;AAAA,EAClE,CAAC;AAED,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,WACJ,OACA,kBACuB;AACvB,YAAM,UAAU,YAAY,IAAI;AAEhC,YAAM,OAAO,MAAMC,SAAQ,eAAe,cAAc;AAIxD,YAAM,aAAa,MAAM,cAAc,gBAAgB,UAAU;AACjE,YAAM,MAAM;AACZ,YAAM,cAAc,MAAM;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd;AAAA,QACA;AAAA,MACF;AAGA,YAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,YAAM,EAAE,KAAK,IAAI;AAEjB,UAAI;AAEF,cAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAGxD,cAAM,KAAK;AAAA,UACT,MAAM;AACJ,kBAAM,IAAI;AAIV,mBAAO,EAAE,8BAA8B;AAAA,UACzC;AAAA,UACA,EAAE,SAAS,KAAO;AAAA,QACpB;AAGA,cAAM,cAAc,MAAM,KAAK,SAAS,MAAM;AAC5C,iBAEI,OAGA,0BAA0B;AAAA,QAEhC,CAAC;AAED,YAAI,gBAAgB,MAAM;AACxB,gBAAM,IAAI,MAAM,2BAA2B,WAAW,EAAE;AAAA,QAC1D;AAGA,cAAM,UAAU,QAAQ,IAAI;AAC5B,cAAM,UACF,MAAM,KAAK,SAAS,MAAM;AAC1B,gBAAM,MAAM,oBAAI,IAAY;AAC5B,mBAAS,iBAAiB,SAAS,EAAE,QAAQ,CAAC,OAAO;AACnD,uBAAW,KAAK,qBAAqB,EAAE,GAAG;AACxC,kBAAI,IAAI,CAAC;AAAA,YACX;AAAA,UACF,CAAC;AACD,iBAAO,CAAC,GAAG,GAAG;AAAA,QAChB,CAAC,KAA0B,CAAC;AAC9B,cAAMG,cAAa,MAAM,yBAAyB,SAAS,OAAO;AAClE,YAAIA,eAAc,QAAQA,YAAW,SAAS,GAAG;AAC/C,gBAAM,KAAK,YAAY,EAAE,SAASA,YAAW,CAAC;AAAA,QAChD;AAEA,cAAM,eAAe,YAAY,IAAI,IAAI;AAGzC,cAAM,cAAc,KAAK,QAAQ,wBAAwB;AACzD,cAAM,cAAc,MAAM,YAAY,YAAY;AAElD,YAAI,gBAAgB,QAAQ,YAAY,UAAU,KAAK,YAAY,WAAW,GAAG;AAC/E,gBAAM,IAAI;AAAA,YACR,cAAc,aAAa;AAAA,UAC7B;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI,GAAG;AAC7C,cAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI,GAAG;AAC7C,cAAM,OAAO,YAAY,QAAQ,MAAM;AACvC,cAAM,OAAO,YAAY,SAAS,MAAM;AAGxC,cAAM,QAAQ,KAAK,IAAI,MAAM,gBAAgB,KAAK;AAClD,cAAM,QAAQ,KAAK,IAAI,MAAM,iBAAiB,KAAK;AAGnD,YAAI;AACJ,YAAI;AAEJ,YAAI,UAAU;AACZ,uBACI,MAAM,KAAK,SAAS,CAAC,QAAgB;AACrC,kBAAM,OAAO,SAAS,cAAc,GAAG;AACvC,kBAAM,KAAK,MAAM;AACjB,gBAAI,CAAC,GAAI,QAAO;AAChB,mBAAO,GAAG;AAAA,UACZ,GAAG,wBAAwB,KAA6B;AAC1D,uBAAa,OAAO,MAAM,CAAC;AAAA,QAC7B,OAAO;AACL,uBAAa,MAAM,KAAK,WAAW;AAAA,YACjC,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,YACxD,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAGA,cAAM,cAAc;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,cAAM,aAAc,MAAM,KAAK;AAAA,UAC7B,CAAC,SAA2C;AAC1C,gBAAI,QAAQ;AACZ,kBAAM,SAAiD,CAAC;AAExD,qBAAS,cAAc,IAAa,IAAY,UAAoB;AAClE,oBAAM,WAAW,OAAO,iBAAiB,EAAE;AAC3C,oBAAM,MAA8B,CAAC;AACrC,yBAAW,QAAQ,UAAU;AAC3B,sBAAM,MAAO,SAA+C,IAAI,KAAK;AACrE,oBAAI,OAAO,QAAQ,UAAU,QAAQ,YAAY,QAAQ,OAAQ,KAAI,IAAI,IAAI;AAAA,cAC/E;AACA,qBAAO,EAAE,IAAI;AAAA,YACf;AAEA,qBAAS,KAAK,MAMZ;AACA,kBAAI,KAAK,aAAa,KAAK,WAAW;AACpC,uBAAO;AAAA,kBACL,KAAK;AAAA,kBACL,OAAO,CAAC;AAAA,kBACR,MAAM,KAAK,aAAa,KAAK,KAAK;AAAA,kBAClC,UAAU,CAAC;AAAA,gBACb;AAAA,cACF;AACA,oBAAM,KAAK;AACX,oBAAM,KAAK;AACX,4BAAc,IAAI,IAAI,KAAK,KAAK;AAChC,oBAAM,QAAgC,CAAC;AACvC,yBAAW,QAAQ,MAAM,KAAK,GAAG,UAAU,GAAG;AAC5C,sBAAM,KAAK,IAAI,IAAI,KAAK;AAAA,cAC1B;AACA,oBAAM,WAAW,MAAM,KAAK,GAAG,UAAU,EACtC;AAAA,gBACC,CAAC,MACC,EAAE,aAAa,KAAK,gBACnB,EAAE,aAAa,KAAK,cAAc,EAAE,aAAa,KAAK,KAAK,IAAI,SAAS;AAAA,cAC7E,EACC,IAAI,IAAI;AACX,qBAAO,EAAE,KAAK,GAAG,QAAQ,YAAY,GAAG,OAAO,QAAQ,IAAI,SAAS;AAAA,YACtE;AAEA,kBAAM,OAAO,SAAS,cAAc,KAAK,GAAG;AAC5C,gBAAI,CAAC;AACH,qBAAO;AAAA,gBACL,MAAM,EAAE,KAAK,OAAO,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,gBAC5C,cAAc;AAAA,gBACd,YAAY,CAAC;AAAA,cACf;AACF,mBAAO,EAAE,MAAM,KAAK,IAAI,GAAG,cAAc,OAAO,YAAY,OAAO;AAAA,UACrE;AAAA,UACA,EAAE,KAAK,8BAA8B,OAAO,YAAY;AAAA,QAC1D;AAYA,cAAM,UAAU,YAAY,QAAQ,EAAE,KAAK,OAAO,OAAO,CAAC,GAAG,UAAU,CAAC,EAAE;AAC1E,cAAM,eAAe,YAAY,gBAAgB;AACjD,cAAM,aAAa,YAAY,cAAc,CAAC;AAI9C,cAAM,iBAAyD,CAAC;AAChE,YAAI,WAAW,CAAC,EAAG,gBAAe,4BAA4B,IAAI,WAAW,CAAC;AAE9E,mBAAW,CAAC,QAAQ,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACzD,yBAAe,SAAS,MAAM,EAAE,IAAI;AAAA,QACtC;AAEA,cAAM,MAAyD;AAAA,UAC7D,MAAM;AAAA,UAKN;AAAA,UACA,aAAa;AAAA,YACX,GAAG,YAAY;AAAA,YACf,GAAG,YAAY;AAAA,YACf,OAAO,YAAY;AAAA,YACnB,QAAQ,YAAY;AAAA,UACtB;AAAA,QACF;AAGA,cAAM,WAAa,MAAM,KAAK,SAAS,CAAC,QAAgB;AAEtD,gBAAM,UAAU,SAAS,cAAc,GAAG;AAC1C,gBAAM,KAAK,SAAS,qBAAqB;AACzC,cAAI,CAAC,GAAI,QAAO,EAAE,MAAM,WAAW,MAAM,GAAG;AAC5C,iBAAO;AAAA,YACL,MAAM,GAAG,aAAa,MAAM,KAAK,GAAG,QAAQ,YAAY,KAAK;AAAA,YAC7D,MACE,GAAG,aAAa,YAAY,KAC5B,GAAG,aAAa,iBAAiB,KACjC,GAAG,aAAa,KAAK,EAAE,MAAM,GAAG,GAAG,KACnC;AAAA,UACJ;AAAA,QACF,GAAG,wBAAwB,KAAgD;AAAA,UACzE,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAEA,cAAM,gBACF,MAAM,KAAK,SAAS,CAAC,QAAgB;AACrC,gBAAM,YAAY,SAAS,cAAc,GAAG;AAC5C,cAAI,CAAC,UAAW,QAAO,CAAC;AACxB,gBAAM,SAAmB,CAAC;AAC1B,oBAAU,iBAAiB,KAAK,EAAE,QAAQ,CAAC,QAAQ;AACjD,gBAAI,CAAC,IAAI,IAAK,QAAO,KAAK,+BAA+B;AAAA,UAC3D,CAAC;AACD,iBAAO;AAAA,QACT,GAAG,wBAAwB,KAA0B,CAAC;AAExD,cAAM,gBAA6E;AAAA,UACjF,MAAM,SAAS;AAAA,UACf,MAAM,SAAS;AAAA,UACf,YAAY;AAAA,QACd;AAEA,cAAM,eAAuD;AAAA,UAC3D;AAAA,UACA,OAAO,KAAK,MAAM,KAAK;AAAA,UACvB,QAAQ,KAAK,MAAM,KAAK;AAAA,UACxB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,YAAI,YAAY,YAAY;AAC1B,uBAAa,aAAa;AAAA,QAC5B;AACA,eAAO;AAAA,MACT,UAAE;AACA,aAAK,QAAQ,IAAI;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACF;AAeA,SAAS,iBACP,MACA,WACyC;AAEzC,MAAI,KAAK,aAAa,QAAW;AAC/B,QAAI,cAAc,MAAM;AACtB,YAAM,IAAI,MAAM,eAAe,KAAK,QAAQ,gDAAgD;AAAA,IAC9F;AACA,UAAM,QAAQ,UAAU,UAAU,KAAK,QAAQ;AAC/C,QAAI,UAAU,QAAW;AACvB,YAAM,YAAY,OAAO,KAAK,UAAU,SAAS,EAAE,KAAK,IAAI,KAAK;AACjE,YAAM,IAAI;AAAA,QACR,aAAa,KAAK,QAAQ;AAAA,aAA0C,SAAS;AAAA,MAC/E;AAAA,IACF;AACA,WAAO,EAAE,CAAC,KAAK,QAAQ,GAAG,MAAM;AAAA,EAClC;AAGA,MAAI,KAAK,UAAU,QAAW;AAC5B,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,KAAK,KAAK;AAAA,IAChC,QAAQ;AACN,YAAM,IAAI,MAAM,uBAAuB,KAAK,KAAK,EAAE;AAAA,IACrD;AACA,WAAO,EAAE,aAAa,OAAO;AAAA,EAC/B;AAGA,MAAI,cAAc,QAAQ,OAAO,KAAK,UAAU,SAAS,EAAE,SAAS,GAAG;AACrE,WAAO,UAAU;AAAA,EACnB;AAGA,SAAO,EAAE,aAAa,CAAC,EAAE;AAC3B;AAMA,SAAS,qBAAqB,WAA0B;AACtD,YACG,QAAQ,yBAAyB,EAAE,WAAW,KAAK,CAAC,EACpD;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBF,EACC,OAAO,kBAAkB,iDAAmD,EAC5E,OAAO,qBAAqB,uDAAuD,EACnF,OAAO,oBAAoB,+BAA+B,SAAS,EACnE,OAAO,kBAAkB,kCAAkC,EAC3D,OAAO,uBAAuB,qCAAqC,EACnE,OAAO,kBAAkB,4CAA4C,EACrE,OAAO,qBAAqB,yBAAyBP,cAAa,EAClE;AAAA,IACC,OACE,eACA,SASG;AACH,UAAI;AACF,cAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,cAAM,aAAa,SAAS,WAAW,aAAa;AACpD,YAAI,eAAe,QAAW;AAC5B,gBAAM,YAAY,OAAO,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACxE,gBAAM,IAAI;AAAA,YACR,cAAc,aAAa;AAAA,aAAwC,SAAS;AAAA,UAC9E;AAAA,QACF;AAGA,YAAI,QAAiC,CAAC;AACtC,YAAI,KAAK,UAAU,QAAW;AAC5B,cAAI;AACF,oBAAQ,KAAK,MAAM,KAAK,KAAK;AAAA,UAC/B,QAAQ;AACN,kBAAM,IAAI,MAAM,uBAAuB,KAAK,KAAK,EAAE;AAAA,UACrD;AAAA,QACF;AAKA,YAAI,WAAW,UAAU,QAAW;AAClC,gBAAM,WAAW,WAAW;AAS5B,qBAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAC1D,gBAAI,YAAY,MAAO;AACvB,gBAAI,CAAC,QAAQ,YAAY,QAAQ,YAAY,OAAW;AAExD,gBAAI,QAAQ,SAAS,UAAU,QAAQ,SAAS,UAAU;AACxD,oBAAM,QAAQ,IAAI,aAAa,aAAa,gBAAgB;AAAA,YAC9D,WAAW,QAAQ,SAAS,WAAW,QAAQ,UAAU,QAAQ,OAAO,SAAS,GAAG;AAClF,oBAAM,QAAQ,IAAI,QAAQ,OAAO,CAAC;AAAA,YACpC,WAAW,QAAQ,SAAS,WAAW;AACrC,oBAAM,QAAQ,IAAI;AAAA,YACpB,WAAW,QAAQ,SAAS,UAAU;AACpC,oBAAM,QAAQ,IAAI;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AAGA,cAAM,EAAE,OAAO,OAAO,IAAI,cAAc,KAAK,QAAQ;AAGrD,cAAM,UAAU,QAAQ,IAAI;AAC5B,cAAM,WAAWL,UAAQ,SAAS,WAAW,QAAQ;AAGrD,cAAM,YAAY,MAAM,0BAA0B,QAAQ;AAC1D,cAAM,gBACJ,WAAW,eAAe,OACtB,MAAM,mBAAmB,UAAU,QAAQ,IAC3C;AAIN,cAAM,YAAY,iBAAiB,MAAM,SAAS;AAGlD,cAAM,iBAAiB,6BAA6B,OAAO;AAC3D,YAAI,eAAe,WAAW,KAAK,8BAA8B,OAAO,GAAG;AACzE,kBAAQ,OAAO;AAAA,YACb;AAAA,UAEF;AAAA,QACF;AACA,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,gBAAQ,OAAO;AAAA,UACb,aAAa,aAAa,KAAK,WAAW,eAAe,QAAQ,KAAK,OAAI,MAAM;AAAA;AAAA,QAClF;AAEA,cAAMa,OAAM,oBAAoB,KAAK,MAAM;AAC3C,cAAM,WAAgC,CAAC;AACvC,cAAM,cAAwB,CAAC;AAE/B,mBAAW,CAAC,cAAcC,MAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC7D,gBAAM,UAAU,iBAAiB;AACjC,gBAAM,QAAQ,UAAU,GAAG,aAAa,IAAI,YAAY,KAAK;AAE7D,gBAAM,UAAU,MAAMC;AAAA,YACpB,MAAM,SAAS,WAAWD,QAAO,WAAW,eAAe;AAAA,YAC3D;AAAA,cACE,OAAAA;AAAA,cACA,gBAAgB;AAAA,gBACd,MAAM,WAAW;AAAA,gBACjB,MAAM,WAAW,IAAI;AAAA,gBACrB,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAEA,cAAI,QAAQ,SAAS;AACnB,oBAAQ,OAAO,MAAM,UAAK,KAAK,mBAAmB,QAAQ,MAAM,OAAO;AAAA,CAAI;AAC3E,kBAAM,WAAW,QAAQ,MAAM,eAAe,KAAK,IAAI;AACvD,gBAAI,SAAS,SAAS,GAAG;AACvB,sBAAQ,OAAO,MAAM,YAAY,QAAQ;AAAA,CAAI;AAAA,YAC/C;AACA,qBAAS,KAAK;AAAA,cACZ,WAAW;AAAA,cACX,UAAU,UAAU,eAAe;AAAA,cACnC,OAAO;AAAA,cACP,SAAS,QAAQ,MAAM;AAAA,cACvB,YAAY,GAAG,kBAAkB,IAAI,UAAU,GAAG,aAAa,IAAI,YAAY,gBAAgB,GAAG,aAAa,aAAa;AAAA,cAC5H,OAAO,QAAQ,MAAM;AAAA,YACvB,CAAC;AACD;AAAA,UACF;AAEA,gBAAM,SAAS,QAAQ;AACvB,gBAAM,cAAc,UAChB,GAAG,aAAa,IAAI,YAAY,SAChC,GAAG,aAAa;AAEpB,cAAI,KAAK,WAAW,UAAa,CAAC,SAAS;AAEzC,kBAAM,UAAUd,UAAQ,QAAQ,IAAI,GAAG,KAAK,MAAM;AAClD,YAAAO,eAAc,SAAS,OAAO,UAAU;AACxC,wBAAY,KAAK,OAAO;AACxB,oBAAQ,OAAO;AAAA,cACb,UAAK,KAAK,WAAM,KAAK,MAAM,KAAK,OAAO,KAAK,OAAI,OAAO,MAAM,KAAK,OAAO,aAAa,QAAQ,CAAC,CAAC;AAAA;AAAA,YAClG;AAAA,UACF,WAAWM,SAAQ,QAAQ;AACzB,kBAAM,OAAO,iBAAiB,OAAOC,QAAO,MAAM;AAClD,oBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,UAC3D,OAAO;AAEL,kBAAM,MAAMd,UAAQ,QAAQ,IAAI,GAAG,kBAAkB;AACrD,YAAAgB,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,kBAAM,UAAUhB,UAAQ,KAAK,WAAW;AACxC,YAAAO,eAAc,SAAS,OAAO,UAAU;AACxC,kBAAM,UAAU,GAAG,kBAAkB,IAAI,WAAW;AACpD,wBAAY,KAAK,OAAO;AACxB,oBAAQ,OAAO;AAAA,cACb,UAAK,KAAK,WAAM,OAAO,KAAK,OAAO,KAAK,OAAI,OAAO,MAAM,KAAK,OAAO,aAAa,QAAQ,CAAC,CAAC;AAAA;AAAA,YAC9F;AAAA,UACF;AAAA,QACF;AAEA,cAAM,cAAc,gBAAgB;AAAA,UAClC,SAAS,gBAAgB,aAAa;AAAA,UACtC,QAAQ,SAAS,SAAS,IAAI,WAAW;AAAA,UACzC;AAAA,UACA;AAAA,QACF,CAAC;AACD,gBAAQ,OAAO,MAAM,yCAAyC,WAAW;AAAA,CAAI;AAE7E,YAAIM,SAAQ,UAAU,SAAS,SAAS,GAAG;AACzC,gBAAM,mBAAmB;AAAA,YACvB;AAAA,YACA;AAAA,YACA,OAAO,KAAK,SAAS,EAAE;AAAA,YACvB;AAAA,UACF;AACA,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,kBAAkB,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QACvE;AAEA,cAAMF,cAAa;AACnB,YAAI,SAAS,SAAS,EAAG,SAAQ,KAAK,CAAC;AAAA,MACzC,SAAS,KAAc;AACrB,cAAMA,cAAa;AACnB,gBAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAMA,SAAS,qBAAqB,WAA0B;AACtD,YACG,QAAQ,oBAAoB,EAC5B;AAAA,IACC;AAAA,EAiBF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,kBAAkB,kEAAkE,EAC3F,OAAO,mBAAmB,gCAAgC,EAC1D,OAAO,kBAAkB,kDAAkD,EAC3E,OAAO,qBAAqB,wBAAwB,GAAG,EACvD,OAAO,qBAAqB,yBAAyBN,cAAa,EAClE;AAAA,IACC,OACE,eACA,SASG;AACH,UAAI;AACF,cAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,cAAM,aAAa,SAAS,WAAW,aAAa;AACpD,YAAI,eAAe,QAAW;AAC5B,gBAAM,YAAY,OAAO,KAAK,SAAS,UAAU,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AACxE,gBAAM,IAAI;AAAA,YACR,cAAc,aAAa;AAAA,aAAwC,SAAS;AAAA,UAC9E;AAAA,QACF;AAEA,cAAM,cAAc,KAAK,IAAI,GAAG,SAAS,KAAK,aAAa,EAAE,KAAK,CAAC;AACnE,cAAM,EAAE,OAAO,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ,IAAI;AAGpD,cAAM,UAAU,QAAQ,IAAI;AAC5B,cAAM,WAAWL,UAAQ,SAAS,WAAW,QAAQ;AAErD,cAAM,iBAAiB,6BAA6B,OAAO;AAC3D,cAAM,WAAW;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAGA,cAAM,OAAqB,CAAC;AAE5B,YAAI,KAAK,SAAS,QAAW;AAC3B,gBAAM,UAAU,KAAK,KAAK,KAAK;AAI/B,cAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,gBAAI;AACJ,gBAAI;AACF,uBAAS,KAAK,MAAM,OAAO;AAAA,YAC7B,QAAQ;AACN,oBAAM,IAAI,MAAM,2BAA2B,OAAO,EAAE;AAAA,YACtD;AACA,uBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,kBAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,sBAAM,IAAI,MAAM,SAAS,IAAI,6CAA6C;AAAA,cAC5E;AACA,mBAAK,KAAK,EAAE,MAAM,QAAS,KAAmB,IAAI,MAAM,EAAE,CAAC;AAAA,YAC7D;AAAA,UACF,OAAO;AAEL,kBAAM,YAAY,QAAQ,MAAM,KAAK;AACrC,uBAAW,QAAQ,WAAW;AAC5B,oBAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,kBAAI,WAAW,GAAG;AAChB,sBAAM,IAAI;AAAA,kBACR,sBAAsB,IAAI;AAAA,gBAC5B;AAAA,cACF;AACA,oBAAM,OAAO,KAAK,MAAM,GAAG,QAAQ;AACnC,oBAAM,SAAS,KACZ,MAAM,WAAW,CAAC,EAClB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtB,kBAAI,KAAK,WAAW,KAAK,OAAO,WAAW,GAAG;AAC5C,sBAAM,IAAI,MAAM,sBAAsB,IAAI,GAAG;AAAA,cAC/C;AACA,mBAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,YAC5B;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,aAAa,QAAW;AAC/B,gBAAM,MAAM,KAAK,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACxD,gBAAM,WAAW,IAAI,IAAY,eAAe;AAChD,qBAAW,MAAM,KAAK;AACpB,gBAAI,CAAC,SAAS,IAAI,EAAE,GAAG;AACrB,oBAAM,IAAI;AAAA,gBACR,uBAAuB,EAAE,iBAAiB,gBAAgB,KAAK,IAAI,CAAC;AAAA,cACtE;AAAA,YACF;AAAA,UACF;AACA,gBAAM,QAAQ,YAAY,GAAwC;AAClE,eAAK,KAAK,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QACtD;AAEA,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,MAAM,KAAK,OAAO,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AACtD,qBAAW,MAAM,KAAK;AACpB,gBAAI;AACF,oBAAM,QAAQ,WAAW,EAAsC;AAC/D,mBAAK,KAAK,EAAE,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,YACtD,QAAQ;AACN,oBAAM,IAAI;AAAA,gBACR,0BAA0B,EAAE,iBAAiB,eAAe,KAAK,IAAI,CAAC;AAAA,cACxE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,WAAW,GAAG;AACrB,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,gBAAQ,OAAO;AAAA,UACb,wBAAwB,aAAa,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,IAAI,EAAE,OAAO,MAAM,GAAG,EAAE,KAAK,QAAK,CAAC;AAAA;AAAA,QACxG;AAEA,cAAM,SAAS,IAAI,aAAa,UAAU,MAAM;AAAA,UAC9C,iBAAiB,WAAW;AAAA,UAC5B;AAAA,QACF,CAAC;AACD,cAAM,SAAuB,MAAM,OAAO,OAAO;AAEjD,cAAMW,cAAa;AAEnB,gBAAQ,OAAO;AAAA,UACb,SAAS,OAAO,MAAM,UAAU,eAAe,OAAO,MAAM,gBAAgB,QAAQ,CAAC,CAAC;AAAA;AAAA,QACxF;AAGA,YAAI,KAAK,WAAW,QAAW;AAC7B,gBAAM,EAAE,sBAAAM,sBAAqB,IAAI,MAAM,OAAO,qBAAqB;AACnE,gBAAM,MAAM,IAAIA,sBAAqB;AACrC,gBAAM,QAAQ,MAAM,IAAI,SAAS,MAAM;AACvC,gBAAM,aAAajB,UAAQ,QAAQ,IAAI,GAAG,KAAK,MAAM;AACrD,UAAAO,eAAc,YAAY,MAAM,GAAG;AACnC,kBAAQ,OAAO,MAAM,yBAAyB,UAAU;AAAA,CAAI;AAAA,QAC9D;AAMA,cAAMM,OAAM,oBAAoB,KAAK,QAAQ,KAAK,WAAW,MAAS;AAEtE,YAAIA,SAAQ,QAAQ;AAElB,gBAAM,EAAE,sBAAAI,sBAAqB,IAAI,MAAM,OAAO,qBAAqB;AACnE,gBAAM,MAAM,IAAIA,sBAAqB;AACrC,gBAAM,QAAQ,MAAM,IAAI,SAAS,MAAM;AACvC,gBAAM,MAAMjB,UAAQ,QAAQ,IAAI,GAAG,kBAAkB;AACrD,UAAAgB,WAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,gBAAM,UAAUhB,UAAQ,KAAK,GAAG,aAAa,aAAa;AAC1D,UAAAO,eAAc,SAAS,MAAM,GAAG;AAChC,gBAAM,UAAU,GAAG,kBAAkB,IAAI,aAAa;AACtD,kBAAQ,OAAO;AAAA,YACb,UAAK,aAAa,YAAY,OAAO,MAAM,UAAU,kBAAa,OAAO,KAAK,OAAO,MAAM,gBAAgB,QAAQ,CAAC,CAAC;AAAA;AAAA,UACvH;AAAA,QACF,WAAWM,SAAQ,QAAQ;AACzB,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,iBAAiB,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QAC/E,WAAWA,SAAQ,OAAO;AACxB,cAAI,KAAK,WAAW,QAAW;AAAA,UAE/B,OAAO;AACL,kBAAM,EAAE,sBAAAI,sBAAqB,IAAI,MAAM,OAAO,qBAAqB;AACnE,kBAAM,MAAM,IAAIA,sBAAqB;AACrC,kBAAM,QAAQ,MAAM,IAAI,SAAS,MAAM;AACvC,oBAAQ,OAAO,MAAM,MAAM,GAAG;AAAA,UAChC;AAAA,QACF,WAAWJ,SAAQ,QAAQ;AACzB,kBAAQ,OAAO,MAAM,iBAAiB,eAAe,MAAM,CAAC;AAAA,QAC9D,WAAWA,SAAQ,OAAO;AACxB,kBAAQ,OAAO,MAAM,gBAAgB,eAAe,MAAM,CAAC;AAAA,QAC7D;AAAA,MACF,SAAS,KAAc;AACrB,cAAMF,cAAa;AACnB,gBAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAMA,SAAS,kBAAkB,WAA0B;AACnD,YACG,QAAQ,KAAK,EACb;AAAA,IACC;AAAA,EAcF,EACC,OAAO,qBAAqB,wBAAwB,GAAG,EACvD,OAAO,sBAAsB,gCAAgC,kBAAkB,EAC/E,OAAO,qBAAqB,yBAAyBN,cAAa,EAClE,OAAO,kBAAkB,0CAA0C,KAAK,EACxE;AAAA,IACC,OAAO,SAKD;AACJ,UAAI;AACF,cAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,cAAM,iBAAiB,OAAO,KAAK,SAAS,UAAU;AACtD,cAAM,QAAQ,eAAe;AAE7B,YAAI,UAAU,GAAG;AACf,kBAAQ,OAAO,MAAM,oCAAoC;AACzD,gBAAMa,eAAc,gBAAgB;AAAA,YAClC,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,aAAa,CAAC;AAAA,YACd,UAAU;AAAA,cACR;AAAA,gBACE,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP,SACE;AAAA,cACJ;AAAA,YACF;AAAA,UACF,CAAC;AACD,kBAAQ,OAAO,MAAM,yCAAyCA,YAAW;AAAA,CAAI;AAC7E,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,cAAc,KAAK,IAAI,GAAG,SAAS,KAAK,aAAa,EAAE,KAAK,CAAC;AACnE,cAAM,YAAYlB,UAAQ,QAAQ,IAAI,GAAG,KAAK,SAAS;AACvD,QAAAgB,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,cAAM,UAAU,QAAQ,IAAI;AAE5B,gBAAQ,OAAO,MAAM,aAAa,KAAK,6BAA6B,WAAW;AAAA,CAAM;AAErF,cAAM,UAKD,CAAC;AACN,cAAM,WAAgC,CAAC;AACvC,cAAM,cAAwB,CAAC;AAG/B,cAAM,sBASF,CAAC;AAEL,YAAI,YAAY;AAChB,cAAM,eAAe,2BAA2B,QAAQ,IAAI,CAAC;AAE7D,cAAM,YAAY,OAAO,SAAgC;AACvD,gBAAM,aAAa,SAAS,WAAW,IAAI;AAC3C,cAAI,eAAe,OAAW;AAE9B,gBAAM,WAAWhB,UAAQ,SAAS,WAAW,QAAQ;AACrD,gBAAM,cAAc,6BAA6B,QAAQ,IAAI,CAAC;AAC9D,gBAAM,SAAS,gBAAgB,WAAW,UAAU,MAAM,YAAY;AAItE,gBAAM,YAAY,MAAM,0BAA0B,QAAQ;AAC1D,gBAAM,kBAAkB,cAAc,OAAO,OAAO,QAAQ,UAAU,SAAS,IAAI,CAAC;AACpF,gBAAM,eACJ,gBAAgB,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,SAAS,KAAK,gBAAgB,CAAC;AACrE,gBAAM,cAAc,iBAAiB,SAAY,aAAa,CAAC,IAAI,CAAC;AACpE,gBAAM,gBACJ,WAAW,eAAe,OACtB,MAAM,mBAAmB,UAAU,QAAQ,IAC3C;AAEN,gBAAM,WAAW;AAAA,YACf;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,IAAI;AAAA,YACZ;AAAA,YACA;AAAA,UACF;AAEA,gBAAM,UAAU,MAAMe;AAAA,YACpB,MAAM,SAAS,WAAW,aAAa,WAAW,eAAe;AAAA,YACjE;AAAA,cACE,OAAO;AAAA,cACP,gBAAgB;AAAA,gBACd,MAAM,WAAW;AAAA,gBACjB,MAAM,WAAW,IAAI;AAAA,gBACrB,QAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAEA;AACA,gBAAM,MAAM,KAAK,MAAO,YAAY,QAAS,GAAG;AAChD,kBAAQ,OAAO,MAAM,GAAG,kBAAkB,WAAW,OAAO,MAAM,GAAG,CAAC,IAAI;AAE1E,cAAI,QAAQ,SAAS;AACnB,oBAAQ,KAAK;AAAA,cACX;AAAA,cACA,cAAc;AAAA,cACd,SAAS;AAAA,cACT,cAAc,QAAQ,MAAM;AAAA,YAC9B,CAAC;AAED,kBAAM,UAAU,yBAAyB,WAAW;AAAA,cAClD,WAAW;AAAA,cACX,cAAc,QAAQ,MAAM;AAAA,cAC5B,gBAAgB,QAAQ,MAAM;AAAA,cAC9B,cAAc,QAAQ,MAAM;AAAA,YAC9B,CAAC;AACD,qBAAS,KAAK;AAAA,cACZ,WAAW;AAAA,cACX,OAAO;AAAA,cACP,SAAS,QAAQ,MAAM;AAAA,cACvB,YAAY;AAAA,cACZ,OAAO,QAAQ,MAAM;AAAA,YACvB,CAAC;AACD,wBAAY,KAAK,OAAO;AACxB;AAAA,UACF;AAEA,gBAAM,SAAS,QAAQ;AACvB,kBAAQ,KAAK,EAAE,MAAM,cAAc,OAAO,cAAc,SAAS,KAAK,CAAC;AACvE,iCAAuB,WAAW,IAAI;AAGtC,cAAI,CAAC,QAAQ;AACX,kBAAM,UAAUf,UAAQ,WAAW,GAAG,IAAI,MAAM;AAChD,YAAAO,eAAc,SAAS,OAAO,UAAU;AACxC,wBAAY,KAAK,OAAO;AAAA,UAC1B;AAGA,gBAAM,WAAWP,UAAQ,WAAW,GAAG,IAAI,OAAO;AAClD,gBAAM,aAAa,iBAAiB,MAAM,aAAa,MAAM;AAI7D,gBAAM,YAAY;AAClB,cAAI,UAAU,UAAU,YAAY;AAClC,uBAAW,aAAa,UAAU;AAClC,mBAAO,WAAW;AAAA,UACpB;AACA,UAAAO,eAAc,UAAU,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAC3D,sBAAY,KAAK,QAAQ;AAGzB,gBAAM,YAAY,OAAO,eAAe,4BAA4B,KAAK,CAAC;AAC1E,gBAAM,aAAa;AAAA,YACjB,QAAQ,CAAC;AAAA,YACT,SAAS,CAAC;AAAA,YACV,YAAY,CAAC;AAAA,YACb,SAAS,CAAC;AAAA,YACV,SAAS,CAAC;AAAA,UACZ;AACA,qBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,gBAAI,CAAC,OAAO,QAAQ,UAAU,QAAQ,GAAI;AAC1C,kBAAM,QAAQ,KAAK,YAAY;AAC/B,gBAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,GAAG;AAC3D,yBAAW,OAAO,IAAI,IAAI;AAAA,YAC5B,WACE,MAAM,SAAS,SAAS,KACxB,MAAM,SAAS,QAAQ,KACvB,MAAM,SAAS,KAAK,KACpB,MAAM,SAAS,OAAO,KACtB,MAAM,SAAS,QAAQ,GACvB;AACA,yBAAW,QAAQ,IAAI,IAAI;AAAA,YAC7B,WACE,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,YAAY,KAC3B,MAAM,SAAS,eAAe,KAC9B,MAAM,SAAS,eAAe,GAC9B;AACA,yBAAW,WAAW,IAAI,IAAI;AAAA,YAChC,WACE,MAAM,SAAS,QAAQ,KACvB,MAAM,SAAS,QAAQ,KACvB,MAAM,SAAS,SAAS,GACxB;AACA,yBAAW,QAAQ,IAAI,IAAI;AAAA,YAC7B,WAAW,MAAM,SAAS,QAAQ,GAAG;AACnC,yBAAW,QAAQ,IAAI,IAAI;AAAA,YAC7B;AAAA,UACF;AACA,8BAAoB,IAAI,IAAI;AAG5B,cAAI,cAAc,QAAQ,OAAO,KAAK,UAAU,SAAS,EAAE,UAAU,GAAG;AACtE,gBAAI;AACF,oBAAMY,mBAAkB,OAAO,QAAQ,UAAU,SAAS;AAC1D,oBAAM,eAA2B;AAAA,gBAC/B,MAAM;AAAA,gBACN,QAAQA,iBAAgB,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;AAAA,cACxC;AACA,oBAAM,mBAAmB,OAAO,YAAYA,gBAAe;AAC3D,oBAAM,iBAAiB;AAAA,gBACrB;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA,QAAQ,IAAI;AAAA,gBACZ;AAAA,cACF;AACA,oBAAM,kBACJ;AAAA,gBACE,SAAS,eAAe;AAAA,gBACxB,MAAM,WACJ,OACA,IACA;AACA,wBAAM,eAAe,MAAM;AAC3B,wBAAM,YACJ,iBAAiB,SACZ,iBAAiB,YAAY,KAAK,QACnC;AACN,yBAAO,eAAe,WAAW,WAAW,MAAM,QAAQ;AAAA,gBAC5D;AAAA,cACF;AACF,oBAAM,SAAS,IAAI,aAAa,iBAAiB,CAAC,YAAY,GAAG;AAAA,gBAC/D,aAAa;AAAA,cACf,CAAC;AACD,oBAAM,eAA6B,MAAM,OAAO,OAAO;AACvD,oBAAM,cAAc,aAAa,MAAM,IAAI,CAAC,SAAS;AACnD,sBAAM,eAAeA,iBAAgB,KAAK,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK;AACvE,sBAAM,mBAAmB,uBAAuB,MAAM,YAAY;AAClE,sBAAM,kBAAkBnB,UAAQ,WAAW,GAAG,gBAAgB,MAAM;AACpE,sBAAM,mBAAmBA,UAAQ,WAAW,GAAG,gBAAgB,OAAO;AACtE,oBAAI,CAAC,QAAQ;AACX,kBAAAO,eAAc,iBAAiB,KAAK,OAAO,UAAU;AACrD,8BAAY,KAAK,eAAe;AAAA,gBAClC;AACA,sBAAM,eAAe;AAAA,kBACnB,GAAG,IAAI,IAAI,YAAY;AAAA,kBACvB,iBAAiB,YAAY,KAAK,CAAC;AAAA,kBACnC,KAAK;AAAA,gBACP;AACA,gBAAAA,eAAc,kBAAkB,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AACrE,4BAAY,KAAK,gBAAgB;AACjC,uCAAuB,WAAW,MAAM,YAAY;AACpD,uBAAO;AAAA,kBACL,YAAY,CAAC,YAAY;AAAA,kBACzB,UAAU;AAAA,kBACV,YAAY;AAAA,kBACZ,gBAAgB,SAAS,SAAY;AAAA,kBACrC,YAAY,KAAK,OAAO,WAAW,SAAS,QAAQ;AAAA,kBACpD,OAAO,KAAK,OAAO;AAAA,kBACnB,QAAQ,KAAK,OAAO;AAAA,kBACpB,cAAc,KAAK,OAAO;AAAA,gBAC5B;AAAA,cACF,CAAC;AACD,oBAAM,eAAe,KAAK,MAAML,cAAa,UAAU,OAAO,CAAC;AAI/D,2BAAa,QAAQ;AACrB,2BAAa,aAAa,CAAC,aAAa,MAAM;AAC9C,cAAAK,eAAc,UAAU,KAAK,UAAU,cAAc,MAAM,CAAC,CAAC;AAAA,YAC/D,SAAS,WAAW;AAClB,oBAAM,UAAU,qBAAqB,QAAQ,UAAU,UAAU,OAAO,SAAS;AACjF,sBAAQ,OAAO,MAAM,8BAA8B,IAAI,YAAY,OAAO;AAAA,CAAI;AAC9E,uBAAS,KAAK;AAAA,gBACZ,WAAW;AAAA,gBACX,OAAO;AAAA,gBACP;AAAA,gBACA,YAAY;AAAA,cACd,CAAC;AAAA,YACH;AAAA,UACF;AAGA,cAAI,MAAM,GAAG;AACX,kBAAM,SAAS,SAAS,gBAAgB;AACxC,oBAAQ,OAAO;AAAA,cACb,UAAK,IAAI,WAAM,KAAK,SAAS,IAAI,IAAI,GAAG,SAAS,UAAU,MAAM,KAAK,OAAO,KAAK,OAAI,OAAO,MAAM,KAAK,OAAO,aAAa,QAAQ,CAAC,CAAC,MAAM,MAAM;AAAA;AAAA,YACpJ;AAAA,UACF;AAAA,QACF;AAGA,YAAI,UAAU;AACd,cAAM,SAAS,YAA2B;AACxC,iBAAO,UAAU,eAAe,QAAQ;AACtC,kBAAM,IAAI;AACV,kBAAM,OAAO,eAAe,CAAC;AAC7B,gBAAI,SAAS,QAAW;AACtB,oBAAM,UAAU,IAAI;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAA2B,CAAC;AAClC,iBAAS,IAAI,GAAG,IAAI,KAAK,IAAI,aAAa,KAAK,GAAG,KAAK;AACrD,kBAAQ,KAAK,OAAO,CAAC;AAAA,QACvB;AACA,cAAM,QAAQ,IAAI,OAAO;AAEzB,cAAMI,cAAa;AAGnB,cAAM,iBAAiBX;AAAA,UACrBA,UAAQ,QAAQ,IAAI,GAAG,KAAK,SAAS;AAAA,UACrC;AAAA,UACA;AAAA,QACF;AACA,QAAAO,eAAc,gBAAgB,KAAK,UAAU,qBAAqB,MAAM,CAAC,CAAC;AAC1E,oBAAY,KAAK,cAAc;AAC/B,gBAAQ,OAAO,MAAM;AAAA,CAAiD;AAEtE,gBAAQ,OAAO,MAAM,IAAI;AAIzB,cAAM,UAAU,kBAAkB,SAAS,SAAS;AACpD,gBAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAEnC,cAAM,cAAc,gBAAgB;AAAA,UAClC,SAAS;AAAA,UACT,QAAQ,SAAS,SAAS,IAAI,WAAW;AAAA,UACzC;AAAA,UACA;AAAA,QACF,CAAC;AACD,gBAAQ,OAAO,MAAM,yCAAyC,WAAW;AAAA,CAAI;AAE7E,YAAI,SAAS,SAAS,EAAG,SAAQ,KAAK,CAAC;AAAA,MACzC,SAAS,KAAc;AACrB,cAAMI,cAAa;AACnB,gBAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAcA,SAAS,oBAAoB,YAAyD;AACpF,MAAI,eAAe,QAAW;AAC5B,UAAM,QAAQ,WAAW,YAAY;AACrC,QAAI,UAAU,SAAS,UAAU,QAAQ;AACvC,YAAM,IAAI,MAAM,mBAAmB,UAAU,uBAAuB;AAAA,IACtE;AACA,WAAO;AAAA,EACT;AACA,SAAO,MAAM,IAAI,SAAS;AAC5B;AAUA,SAAS,oBACP,YACA,sBAC0C;AAC1C,MAAI,eAAe,QAAW;AAC5B,UAAM,QAAQ,WAAW,YAAY;AACrC,UAAM,UAAU,CAAC,QAAQ,OAAO,QAAQ,KAAK;AAC7C,QAAI,CAAE,QAA8B,SAAS,KAAK,GAAG;AACnD,YAAM,IAAI,MAAM,mBAAmB,UAAU,eAAe,QAAQ,KAAK,IAAI,CAAC,EAAE;AAAA,IAClF;AACA,WAAO;AAAA,EACT;AACA,MAAI,MAAM,KAAK,CAAC,sBAAsB;AACpC,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAYO,SAAS,sBAA+B;AAC7C,QAAM,YAAY,IAAIS,SAAQ,QAAQ,EAAE;AAAA,IACtC;AAAA,EAkBF;AAEA,uBAAqB,SAAS;AAC9B,uBAAqB,SAAS;AAC9B,oBAAkB,SAAS;AAE3B,SAAO;AACT;;;AGrgDA,SAAS,cAAAC,cAAY,aAAAC,YAAW,UAAAC,SAAQ,iBAAAC,sBAAqB;AAC7D,SAAS,WAAAC,iBAAe;AACxB,SAAS,oBAAAC,yBAAuC;AAChD,SAAS,eAAAC,cAAgC,cAAAC,mBAAkB;AAE3D,SAAS,oBAAAC,mBAAkB,iBAAAC,sBAAqB;AAWhD,IAAM,uBAAuB;AAM7B,IAAIC,SAA4B;AAEhC,eAAeC,SAAQ,eAAuB,gBAA8C;AAC1F,MAAID,WAAU,MAAM;AAClB,IAAAA,SAAQ,IAAIE,aAAY;AAAA,MACtB,MAAM,EAAE,UAAU,GAAG,iBAAiB,EAAE;AAAA,MACxC;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAMF,OAAM,KAAK;AAAA,EACnB;AACA,SAAOA;AACT;AAEA,eAAeG,gBAA8B;AAC3C,MAAIH,WAAU,MAAM;AAClB,UAAMA,OAAM,MAAM;AAClB,IAAAA,SAAQ;AAAA,EACV;AACF;AAUA,eAAeI,iBACb,UACA,eACA,OACA,eACA,gBACuB;AACvB,QAAM,MAAM;AACZ,QAAM,OAAO,MAAMH,SAAQ,eAAe,cAAc;AACxD,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,QAAM,EAAE,KAAK,IAAI;AAEjB,MAAI;AACF,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAExD,UAAM,KAAK;AAAA,MACT,MAAM;AACJ,cAAM,IAAI;AAIV,eAAO,EAAE,8BAA8B;AAAA,MACzC;AAAA,MACA,EAAE,SAAS,KAAO;AAAA,IACpB;AAEA,UAAM,cAAc,MAAM,KAAK,SAAS,MAAM;AAC5C,aAEI,OAGA,0BAA0B;AAAA,IAEhC,CAAC;AAED,QAAI,gBAAgB,MAAM;AACxB,YAAM,IAAI,MAAM,2BAA2B,WAAW,EAAE;AAAA,IAC1D;AAGA,UAAM,UAAU,QAAQ,IAAI;AAC5B,UAAM,UAAU,MAAM,KAAK,SAAS,MAAM;AACxC,YAAM,MAAM,oBAAI,IAAY;AAC5B,eAAS,iBAAiB,SAAS,EAAE,QAAQ,CAAC,OAAO;AACnD,mBAAW,KAAK,qBAAqB,EAAE,GAAG;AACxC,cAAI,IAAI,CAAC;AAAA,QACX;AAAA,MACF,CAAC;AACD,aAAO,CAAC,GAAG,GAAG;AAAA,IAChB,CAAC;AACD,UAAM,aAAa,MAAM,yBAAyB,SAAS,OAAO;AAClE,QAAI,cAAc,QAAQ,WAAW,SAAS,GAAG;AAC/C,YAAM,KAAK,YAAY,EAAE,SAAS,WAAW,CAAC;AAAA,IAChD;AAEA,UAAM,UAAU,YAAY,IAAI;AAEhC,UAAM,cAAc,KAAK,QAAQ,wBAAwB;AACzD,UAAM,cAAc,MAAM,YAAY,YAAY;AAElD,QAAI,gBAAgB,QAAQ,YAAY,UAAU,KAAK,YAAY,WAAW,GAAG;AAC/E,YAAM,IAAI;AAAA,QACR,cAAc,aAAa;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,QAAQ;AACd,UAAM,QAAQ;AAEd,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI,GAAG;AAC7C,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI,GAAG;AAC7C,UAAM,OAAO,YAAY,QAAQ,MAAM;AACvC,UAAM,OAAO,YAAY,SAAS,MAAM;AACxC,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;AAClC,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;AAClC,UAAM,QAAQ,KAAK,IAAI,OAAO,gBAAgB,KAAK;AACnD,UAAM,QAAQ,KAAK,IAAI,OAAO,iBAAiB,KAAK;AAEpD,UAAM,aAAa,MAAM,KAAK,WAAW;AAAA,MACvC,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,MACxD,MAAM;AAAA,IACR,CAAC;AAED,UAAM,oBAA4D,CAAC;AACnE,UAAM,SAAS,MAAM,KAAK,SAAS,CAAC,QAAgB;AAClD,YAAM,KAAK,SAAS,cAAc,GAAG;AACrC,UAAI,OAAO,KAAM,QAAO,CAAC;AACzB,YAAM,WAAW,OAAO,iBAAiB,EAAE;AAC3C,YAAM,MAA8B,CAAC;AACrC,iBAAW,QAAQ;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AACD,YAAI,IAAI,IAAI,SAAS,iBAAiB,IAAI;AAAA,MAC5C;AACA,aAAO;AAAA,IACT,GAAG,4BAA4B;AAC/B,sBAAkB,4BAA4B,IAAI;AAElD,UAAM,eAAe,YAAY,IAAI,IAAI;AAEzC,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,MAAM,KAAK;AAAA,MACvB,QAAQ,KAAK,MAAM,KAAK;AAAA,MACxB;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF,UAAE;AACA,SAAK,QAAQ,IAAI;AAAA,EACnB;AACF;AAWA,SAASI,uBACP,mBACgB;AAChB,QAAM,OAA+B,CAAC;AACtC,aAAW,UAAU,OAAO,OAAO,iBAAiB,GAAG;AACrD,WAAO,OAAO,MAAM,MAAM;AAAA,EAC5B;AAEA,QAAM,SAAiC,CAAC;AACxC,QAAM,UAAkC,CAAC;AACzC,QAAM,aAAqC,CAAC;AAC5C,QAAM,UAAkC,CAAC;AACzC,QAAM,UAAkC,CAAC;AAEzC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAChD,QAAI,SAAS,WAAW,SAAS,mBAAmB;AAClD,aAAO,IAAI,IAAI;AAAA,IACjB,WAAW,SAAS,aAAa,SAAS,UAAU;AAClD,cAAQ,IAAI,IAAI;AAAA,IAClB,WACE,SAAS,cACT,SAAS,gBACT,SAAS,gBACT,SAAS,cACT;AACA,iBAAW,IAAI,IAAI;AAAA,IACrB,WAAW,SAAS,kBAAkB,SAAS,eAAe;AAC5D,cAAQ,IAAI,IAAI;AAAA,IAClB,WAAW,SAAS,aAAa;AAC/B,cAAQ,IAAI,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,SAAS,YAAY,SAAS,QAAQ;AACzD;AAwCA,eAAsB,YAAY,UAA2B,CAAC,GAA4B;AACxF,QAAM;AAAA,IACJ,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,EACnB,IAAI;AAEJ,QAAM,YAAY,YAAY,IAAI;AAClC,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,cAAcC,UAAQ,SAAS,SAAS;AAC9C,QAAM,aAAaA,UAAQ,aAAa,SAAS;AAGjD,MAAIC,aAAW,WAAW,GAAG;AAC3B,IAAAC,QAAO,aAAa,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,EACtD;AACA,EAAAC,WAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAGzC,MAAI;AAEJ,MAAI,iBAAiB,QAAW;AAC9B,UAAM,EAAE,cAAAC,eAAa,IAAI,MAAM,OAAO,IAAS;AAC/C,UAAM,UAAUJ,UAAQ,SAAS,YAAY;AAC7C,QAAI,CAACC,aAAW,OAAO,GAAG;AACxB,YAAM,IAAI,MAAM,yBAAyB,OAAO,GAAG;AAAA,IACrD;AACA,eAAW,KAAK,MAAMG,eAAa,SAAS,OAAO,CAAC;AACpD,YAAQ,OAAO,MAAM,wBAAwB,YAAY;AAAA,CAAI;AAAA,EAC/D,OAAO;AACL,YAAQ,OAAO,MAAM,uCAAkC;AACvD,eAAW,MAAMC,kBAAiB,EAAE,QAAQ,CAAC;AAC7C,UAAM,QAAQ,OAAO,KAAK,SAAS,UAAU,EAAE;AAC/C,YAAQ,OAAO,MAAM,SAAS,KAAK;AAAA,CAAgB;AAAA,EACrD;AAGA,EAAAC,eAAcN,UAAQ,aAAa,eAAe,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AAG/F,MAAI,iBAAiB,OAAO,KAAK,SAAS,UAAU;AAEpD,MAAI,mBAAmB,QAAW;AAChC,qBAAiB,eAAe,OAAO,CAAC,SAAS,UAAU,gBAAgB,IAAI,CAAC;AAChF,YAAQ,OAAO;AAAA,MACb,eAAe,eAAe,MAAM,yBAAyB,cAAc;AAAA;AAAA,IAC7E;AAAA,EACF;AAEA,QAAM,QAAQ,eAAe;AAE7B,MAAI,UAAU,GAAG;AACf,YAAQ,OAAO,MAAM,8BAA8B;AACnD,UAAM,cAA2B;AAAA,MAC/B,YAAY,CAAC;AAAA,MACb,iBAAiB;AAAA,MACjB,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,IAAAM;AAAA,MACEN,UAAQ,aAAa,iBAAiB;AAAA,MACtC,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,MACnC;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,gBAAgB;AAAA,MAChB,cAAc;AAAA,MACd,aAAa,YAAY,IAAI,IAAI;AAAA,IACnC;AAAA,EACF;AAGA,UAAQ,OAAO,MAAM,aAAa,KAAK;AAAA,CAAgB;AAEvD,QAAM,oBAAoB,oBAAI,IAA4B;AAC1D,MAAI,YAAY;AAChB,MAAI,eAAe;AACnB,QAAM,cAAc;AACpB,MAAI,UAAU;AAEd,QAAM,YAAY,OAAO,SAAgC;AACvD,UAAM,aAAa,SAAS,WAAW,IAAI;AAC3C,QAAI,eAAe,OAAW;AAE9B,UAAM,WAAWA,UAAQ,SAAS,WAAW,QAAQ;AAErD,UAAM,UAAU,MAAMO;AAAA,MACpB,MAAMT,iBAAgB,UAAU,MAAM,CAAC,GAAG,eAAe,cAAc;AAAA,MACvE;AAAA,QACE,OAAO,CAAC;AAAA,QACR,gBAAgB;AAAA,UACd,MAAM,WAAW;AAAA,UACjB,MAAM,WAAW,IAAI;AAAA,UACrB,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA;AACA,UAAM,MAAM,KAAK,MAAO,YAAY,QAAS,GAAG;AAEhD,QAAI,MAAM,GAAG;AACX,cAAQ,OAAO,MAAM,GAAG,kBAAkB,WAAW,OAAO,MAAM,GAAG,CAAC,IAAI;AAAA,IAC5E;AAEA,QAAI,QAAQ,SAAS;AACnB;AACA,YAAM,UAAUE,UAAQ,YAAY,GAAG,IAAI,aAAa;AACxD,MAAAM;AAAA,QACE;AAAA,QACA,KAAK;AAAA,UACH;AAAA,YACE,WAAW;AAAA,YACX,cAAc,QAAQ,MAAM;AAAA,YAC5B,gBAAgB,QAAQ,MAAM;AAAA,YAC9B,cAAc,QAAQ,MAAM;AAAA,UAC9B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,MACF;AACA;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ;AAGvB,IAAAA,eAAcN,UAAQ,YAAY,GAAG,IAAI,MAAM,GAAG,OAAO,UAAU;AAGnE,UAAM,aAAa,iBAAiB,MAAM,CAAC,GAAG,MAAM;AACpD,IAAAM;AAAA,MACEN,UAAQ,YAAY,GAAG,IAAI,OAAO;AAAA,MAClC,KAAK,UAAU,YAAY,MAAM,CAAC;AAAA,MAClC;AAAA,IACF;AAGA,sBAAkB,IAAI,MAAMD,uBAAsB,OAAO,cAAc,CAAC;AAAA,EAC1E;AAEA,QAAM,SAAS,YAA2B;AACxC,WAAO,UAAU,eAAe,QAAQ;AACtC,YAAM,IAAI;AACV,YAAM,OAAO,eAAe,CAAC;AAC7B,UAAI,SAAS,QAAW;AACtB,cAAM,UAAU,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAA2B,CAAC;AAClC,WAAS,IAAI,GAAG,IAAI,KAAK,IAAI,aAAa,KAAK,GAAG,KAAK;AACrD,YAAQ,KAAK,OAAO,CAAC;AAAA,EACvB;AACA,QAAM,QAAQ,IAAI,OAAO;AACzB,QAAMF,cAAa;AAEnB,MAAI,MAAM,GAAG;AACX,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAMA,QAAM,WAAW,IAAIW,eAAc,CAAC,CAAC;AACrC,QAAM,SAAS,IAAIC,kBAAiB,QAAQ;AAC5C,QAAM,cAAc,OAAO,WAAW,iBAAiB;AAEvD,EAAAH;AAAA,IACEN,UAAQ,aAAa,iBAAiB;AAAA,IACtC,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,cAAc,YAAY,IAAI,IAAI;AAGxC,QAAM,eAAe,QAAQ;AAC7B,UAAQ,OAAO;AAAA,IACb;AAAA,qBAAwB,YAAY,IAAI,KAAK,0BAC1C,eAAe,IAAI,KAAK,YAAY,aAAa,MAClD,QAAQ,cAAc,KAAM,QAAQ,CAAC,CAAC;AAAA;AAAA,EAC1C;AACA,UAAQ,OAAO,MAAM,qBAAqB,WAAW;AAAA,CAAI;AAEzD,SAAO,EAAE,aAAa,gBAAgB,OAAO,cAAc,YAAY;AACzE;AAaO,SAAS,2BAA2B,WAA0B;AACnE,YACG,QAAQ,UAAU,EAClB,YAAY,iFAAiF,EAC7F;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,uBAAuB,iDAAiD,EAC/E,OAAO,qBAAqB,kEAAkE,EAC9F,OAAO,oBAAoB,gCAAgC,SAAS,EACpE;AAAA,IACC,OAAO,SAKD;AACJ,UAAI;AACF,cAAM,CAAC,MAAM,IAAI,IAAI,KAAK,SAAS,MAAM,GAAG;AAC5C,cAAM,gBAAgB,OAAO,SAAS,QAAQ,OAAO,EAAE;AACvD,cAAM,iBAAiB,OAAO,SAAS,QAAQ,OAAO,EAAE;AAExD,cAAM,YAAY;AAAA,UAChB,WAAW,KAAK;AAAA,UAChB,gBAAgB,KAAK;AAAA,UACrB,cAAc,KAAK;AAAA,UACnB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;;;AC9eA,SAAS,cAAAU,cAAY,gBAAAC,gBAAc,iBAAAC,sBAAqB;AACxD,SAAS,WAAAC,iBAAe;AACxB,SAAS,oBAAAC,yBAAuC;AAChD,SAAS,eAAAC,cAAgC,cAAAC,mBAAkB;AAE3D,SAAS,oBAAAC,mBAAkB,iBAAAC,sBAAqB;AAWhD,IAAMC,wBAAuB;AAqH7B,SAAS,uBAAuB,aAAgD;AAC9E,QAAM,iBAAiBC,UAAQ,aAAa,iBAAiB;AAC7D,MAAI,CAACC,aAAW,cAAc,EAAG,QAAO;AAExC,QAAM,MAAM,KAAK,MAAMC,eAAa,gBAAgB,OAAO,CAAC;AAK5D,SAAO;AACT;AAMA,SAASC,wBACP,aACA,eAC2B;AAC3B,QAAM,WAAWH,UAAQ,aAAa,WAAW,GAAG,aAAa,OAAO;AACxE,MAAI,CAACC,aAAW,QAAQ,EAAG,QAAO;AAClC,SAAO,KAAK,MAAMC,eAAa,UAAU,OAAO,CAAC;AACnD;AAMA,IAAIE,SAA4B;AAEhC,eAAeC,SAAQ,eAAuB,gBAA8C;AAC1F,MAAID,WAAU,MAAM;AAClB,IAAAA,SAAQ,IAAIE,aAAY;AAAA,MACtB,MAAM,EAAE,UAAU,GAAG,iBAAiB,EAAE;AAAA,MACxC;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAMF,OAAM,KAAK;AAAA,EACnB;AACA,SAAOA;AACT;AAEA,eAAeG,gBAA8B;AAC3C,MAAIH,WAAU,MAAM;AAClB,UAAMA,OAAM,MAAM;AAClB,IAAAA,SAAQ;AAAA,EACV;AACF;AAMA,eAAeI,iBACb,UACA,eACA,OACA,eACA,gBACuB;AACvB,QAAM,MAAM;AACZ,QAAM,OAAO,MAAMH,SAAQ,eAAe,cAAc;AACxD,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,QAAM,EAAE,KAAK,IAAI;AAEjB,MAAI;AACF,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAExD,UAAM,KAAK;AAAA,MACT,MAAM;AACJ,cAAM,IAAI;AAIV,eAAO,EAAE,8BAA8B;AAAA,MACzC;AAAA,MACA,EAAE,SAAS,KAAO;AAAA,IACpB;AAEA,UAAM,cAAc,MAAM,KAAK,SAAS,MAAM;AAC5C,aAEI,OAGA,0BAA0B;AAAA,IAEhC,CAAC;AAED,QAAI,gBAAgB,MAAM;AACxB,YAAM,IAAI,MAAM,2BAA2B,WAAW,EAAE;AAAA,IAC1D;AAEA,UAAM,UAAU,QAAQ,IAAI;AAC5B,UAAM,UAAU,MAAM,KAAK,SAAS,MAAM;AACxC,YAAM,MAAM,oBAAI,IAAY;AAC5B,eAAS,iBAAiB,SAAS,EAAE,QAAQ,CAAC,OAAO;AACnD,mBAAW,KAAK,qBAAqB,EAAE,GAAG;AACxC,cAAI,IAAI,CAAC;AAAA,QACX;AAAA,MACF,CAAC;AACD,aAAO,CAAC,GAAG,GAAG;AAAA,IAChB,CAAC;AACD,UAAM,aAAa,MAAM,yBAAyB,SAAS,OAAO;AAClE,QAAI,cAAc,QAAQ,WAAW,SAAS,GAAG;AAC/C,YAAM,KAAK,YAAY,EAAE,SAAS,WAAW,CAAC;AAAA,IAChD;AAEA,UAAM,UAAU,YAAY,IAAI;AAEhC,UAAM,cAAc,KAAK,QAAQ,wBAAwB;AACzD,UAAM,cAAc,MAAM,YAAY,YAAY;AAElD,QAAI,gBAAgB,QAAQ,YAAY,UAAU,KAAK,YAAY,WAAW,GAAG;AAC/E,YAAM,IAAI;AAAA,QACR,cAAc,aAAa;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,QAAQ;AACd,UAAM,QAAQ;AAEd,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI,GAAG;AAC7C,UAAM,QAAQ,KAAK,IAAI,GAAG,YAAY,IAAI,GAAG;AAC7C,UAAM,OAAO,YAAY,QAAQ,MAAM;AACvC,UAAM,OAAO,YAAY,SAAS,MAAM;AACxC,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;AAClC,UAAM,QAAQ,KAAK,IAAI,MAAM,KAAK;AAClC,UAAM,QAAQ,KAAK,IAAI,OAAO,gBAAgB,KAAK;AACnD,UAAM,QAAQ,KAAK,IAAI,OAAO,iBAAiB,KAAK;AAEpD,UAAM,aAAa,MAAM,KAAK,WAAW;AAAA,MACvC,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,MACxD,MAAM;AAAA,IACR,CAAC;AAED,UAAM,oBAA4D,CAAC;AACnE,UAAM,SAAS,MAAM,KAAK,SAAS,CAAC,QAAgB;AAClD,YAAM,KAAK,SAAS,cAAc,GAAG;AACrC,UAAI,OAAO,KAAM,QAAO,CAAC;AACzB,YAAM,WAAW,OAAO,iBAAiB,EAAE;AAC3C,YAAM,MAA8B,CAAC;AACrC,iBAAW,QAAQ;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAG;AACD,YAAI,IAAI,IAAI,SAAS,iBAAiB,IAAI;AAAA,MAC5C;AACA,aAAO;AAAA,IACT,GAAG,4BAA4B;AAC/B,sBAAkB,4BAA4B,IAAI;AAElD,UAAM,eAAe,YAAY,IAAI,IAAI;AAEzC,WAAO;AAAA,MACL;AAAA,MACA,OAAO,KAAK,MAAM,KAAK;AAAA,MACvB,QAAQ,KAAK,MAAM,KAAK;AAAA,MACxB;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF,UAAE;AACA,SAAK,QAAQ,IAAI;AAAA,EACnB;AACF;AAMA,SAASI,uBACP,mBAC8C;AAC9C,QAAM,OAA+B,CAAC;AACtC,aAAW,UAAU,OAAO,OAAO,iBAAiB,GAAG;AACrD,WAAO,OAAO,MAAM,MAAM;AAAA,EAC5B;AAEA,QAAM,SAAiC,CAAC;AACxC,QAAM,UAAkC,CAAC;AACzC,QAAM,aAAqC,CAAC;AAC5C,QAAM,UAAkC,CAAC;AACzC,QAAM,UAAkC,CAAC;AAEzC,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAChD,QAAI,SAAS,WAAW,SAAS,mBAAmB;AAClD,aAAO,IAAI,IAAI;AAAA,IACjB,WAAW,SAAS,aAAa,SAAS,UAAU;AAClD,cAAQ,IAAI,IAAI;AAAA,IAClB,WACE,SAAS,cACT,SAAS,gBACT,SAAS,gBACT,SAAS,cACT;AACA,iBAAW,IAAI,IAAI;AAAA,IACrB,WAAW,SAAS,kBAAkB,SAAS,eAAe;AAC5D,cAAQ,IAAI,IAAI;AAAA,IAClB,WAAW,SAAS,aAAa;AAC/B,cAAQ,IAAI,IAAI;AAAA,IAClB;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,SAAS,YAAY,SAAS,QAAQ;AACzD;AAUA,SAAS,kBACP,OACA,qBACqB;AACrB,MAAI,MAAM,aAAc,QAAO;AAE/B,MAAI,MAAM,uBAAuB,QAAQ,MAAM,sBAAsB,MAAM;AACzE,WAAO;AAAA,EACT;AACA,MAAI,MAAM,uBAAuB,QAAQ,MAAM,sBAAsB,MAAM;AACzE,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM;AAEpB,MAAI,UAAU,MAAM;AAClB,QAAI,SAAS,CAAC,oBAAqB,QAAO;AAC1C,QAAI,SAAS,oBAAqB,QAAO;AAAA,EAC3C;AAGA,MAAI,MAAM,uBAAuB,QAAQ,MAAM,sBAAsB,MAAM;AACzE,UAAM,KAAK,KAAK,IAAI,MAAM,kBAAkB,QAAQ,MAAM,mBAAmB,KAAK;AAClF,UAAM,KAAK,KAAK,IAAI,MAAM,kBAAkB,SAAS,MAAM,mBAAmB,MAAM;AACpF,QAAI,KAAK,MAAM,KAAK,GAAI,QAAO;AAAA,EACjC;AAEA,SAAO;AACT;AAgBA,eAAsB,QAAQ,UAAuB,CAAC,GAAwB;AAC5E,QAAM;AAAA,IACJ,aAAa,iBAAiBV;AAAA,IAC9B,mBAAmB,CAAC;AAAA,IACpB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,EACxB,IAAI;AAEJ,QAAM,YAAY,YAAY,IAAI;AAClC,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,cAAcC,UAAQ,SAAS,cAAc;AAGnD,MAAI,CAACC,aAAW,WAAW,GAAG;AAC5B,UAAM,IAAI;AAAA,MACR,oCAAoC,WAAW;AAAA,IAEjD;AAAA,EACF;AAEA,QAAM,uBAAuBD,UAAQ,aAAa,eAAe;AACjE,MAAI,CAACC,aAAW,oBAAoB,GAAG;AACrC,UAAM,IAAI;AAAA,MACR,wCAAwC,oBAAoB;AAAA,IAE9D;AAAA,EACF;AAGA,QAAM,mBAAmB,KAAK,MAAMC,eAAa,sBAAsB,OAAO,CAAC;AAE/E,QAAM,qBAAqB,uBAAuB,WAAW;AAC7D,QAAM,yBAAyB,IAAI,IAAI,OAAO,KAAK,iBAAiB,UAAU,CAAC;AAE/E,UAAQ,OAAO;AAAA,IACb,iCAAiC,WAAW,KACtC,uBAAuB,IAAI;AAAA;AAAA,EACnC;AAGA,MAAI;AAEJ,MAAI,iBAAiB,QAAW;AAC9B,UAAM,UAAUF,UAAQ,SAAS,YAAY;AAC7C,QAAI,CAACC,aAAW,OAAO,GAAG;AACxB,YAAM,IAAI,MAAM,0BAA0B,OAAO,IAAI;AAAA,IACvD;AACA,sBAAkB,KAAK,MAAMC,eAAa,SAAS,OAAO,CAAC;AAC3D,YAAQ,OAAO,MAAM,wBAAwB,YAAY;AAAA,CAAI;AAAA,EAC/D,OAAO;AACL,YAAQ,OAAO,MAAM,uCAAkC;AACvD,sBAAkB,MAAMQ,kBAAiB,EAAE,QAAQ,CAAC;AACpD,UAAM,QAAQ,OAAO,KAAK,gBAAgB,UAAU,EAAE;AACtD,YAAQ,OAAO,MAAM,SAAS,KAAK;AAAA,CAAgB;AAAA,EACrD;AAGA,MAAI,iBAAiB,OAAO,KAAK,gBAAgB,UAAU;AAE3D,MAAI,mBAAmB,QAAW;AAChC,qBAAiB,eAAe,OAAO,CAAC,SAAS,UAAU,gBAAgB,IAAI,CAAC;AAChF,YAAQ,OAAO;AAAA,MACb,eAAe,eAAe,MAAM,yBAAyB,cAAc;AAAA;AAAA,IAC7E;AAAA,EACF;AAGA,QAAM,eAAe,CAAC,GAAG,sBAAsB,EAAE;AAAA,IAC/C,CAAC,SACC,CAAC,gBAAgB,WAAW,IAAI,MAC/B,mBAAmB,UAAa,UAAU,gBAAgB,IAAI;AAAA,EACnE;AAEA,QAAM,QAAQ,eAAe;AAG7B,UAAQ,OAAO,MAAM,aAAa,KAAK;AAAA,CAAyB;AAEhE,QAAM,oBAAoB,oBAAI,IAA0D;AACxF,QAAM,oBAAoB,oBAAI,IAG5B;AACF,QAAM,iBAAiB,oBAAI,IAAY;AAEvC,MAAI,YAAY;AAChB,QAAM,cAAc;AACpB,MAAI,UAAU;AAEd,QAAM,YAAY,OAAO,SAAgC;AACvD,UAAM,aAAa,gBAAgB,WAAW,IAAI;AAClD,QAAI,eAAe,OAAW;AAE9B,UAAM,WAAWV,UAAQ,SAAS,WAAW,QAAQ;AAErD,UAAM,UAAU,MAAMW;AAAA,MACpB,MAAMH,iBAAgB,UAAU,MAAM,CAAC,GAAG,eAAe,cAAc;AAAA,MACvE;AAAA,QACE,OAAO,CAAC;AAAA,QACR,gBAAgB;AAAA,UACd,MAAM,WAAW;AAAA,UACjB,MAAM,WAAW,IAAI;AAAA,UACrB,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA;AACA,UAAM,MAAM,KAAK,MAAO,YAAY,QAAS,GAAG;AAEhD,QAAI,MAAM,GAAG;AACX,cAAQ,OAAO,MAAM,GAAG,kBAAkB,WAAW,OAAO,MAAM,GAAG,CAAC,IAAI;AAAA,IAC5E;AAEA,QAAI,QAAQ,SAAS;AACnB,qBAAe,IAAI,IAAI;AACvB;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ;AACvB,sBAAkB,IAAI,MAAM;AAAA,MAC1B,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,MACf,cAAc,OAAO;AAAA,IACvB,CAAC;AACD,sBAAkB,IAAI,MAAMC,uBAAsB,OAAO,cAAc,CAAC;AAAA,EAC1E;AAEA,MAAI,QAAQ,GAAG;AACb,UAAM,SAAS,YAA2B;AACxC,aAAO,UAAU,eAAe,QAAQ;AACtC,cAAM,IAAI;AACV,cAAM,OAAO,eAAe,CAAC;AAC7B,YAAI,SAAS,QAAW;AACtB,gBAAM,UAAU,IAAI;AAAA,QACtB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAA2B,CAAC;AAClC,aAAS,IAAI,GAAG,IAAI,KAAK,IAAI,aAAa,KAAK,GAAG,KAAK;AACrD,cAAQ,KAAK,OAAO,CAAC;AAAA,IACvB;AACA,UAAM,QAAQ,IAAI,OAAO;AAAA,EAC3B;AAEA,QAAMF,cAAa;AAEnB,MAAI,MAAM,KAAK,QAAQ,GAAG;AACxB,YAAQ,OAAO,MAAM,IAAI;AAAA,EAC3B;AAGA,QAAM,WAAW,IAAIK,eAAc,gBAAgB;AACnD,QAAM,SAAS,IAAIC,kBAAiB,QAAQ;AAC5C,QAAM,qBAAkC,OAAO,WAAW,iBAAiB;AAG3E,QAAM,UAAgC,CAAC;AAGvC,aAAW,QAAQ,gBAAgB;AACjC,UAAM,eAAe,oBAAoB,WAAW,IAAI,KAAK;AAC7D,UAAM,cAAc,mBAAmB,WAAW,IAAI,KAAK;AAC3D,UAAM,eAAeV,wBAAuB,aAAa,IAAI;AAC7D,UAAM,cAAc,kBAAkB,IAAI,IAAI,KAAK;AACnD,UAAM,SAAS,eAAe,IAAI,IAAI;AAEtC,UAAM,0BAA0B,cAAc,uBAAuB;AACrE,UAAM,yBAAyB,aAAa,cAAc;AAC1D,UAAM,QACJ,4BAA4B,QAAQ,2BAA2B,OAC3D,yBAAyB,0BACzB;AAEN,UAAM,UAA8C;AAAA,MAClD;AAAA,MACA,oBAAoB;AAAA,MACpB,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,oBACE,iBAAiB,OAAO,EAAE,OAAO,aAAa,OAAO,QAAQ,aAAa,OAAO,IAAI;AAAA,MACvF,mBACE,gBAAgB,OAAO,EAAE,OAAO,YAAY,OAAO,QAAQ,YAAY,OAAO,IAAI;AAAA,MACpF,cAAc,aAAa,gBAAgB;AAAA,MAC3C,cAAc;AAAA,IAChB;AAEA,YAAQ,KAAK,EAAE,GAAG,SAAS,QAAQ,kBAAkB,SAAS,mBAAmB,EAAE,CAAC;AAAA,EACtF;AAGA,aAAW,QAAQ,cAAc;AAC/B,UAAM,eAAe,oBAAoB,WAAW,IAAI,KAAK;AAC7D,UAAM,eAAeA,wBAAuB,aAAa,IAAI;AAE7D,YAAQ,KAAK;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,MACR,oBAAoB,cAAc,uBAAuB;AAAA,MACzD,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,oBACE,iBAAiB,OAAO,EAAE,OAAO,aAAa,OAAO,QAAQ,aAAa,OAAO,IAAI;AAAA,MACvF,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAGA,QAAM,UAAU;AAAA,IACd,OAAO,QAAQ;AAAA,IACf,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,EAAE;AAAA,IACnD,SAAS,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAAA,IACvD,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE;AAAA,IAC3D,qBAAqB,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,sBAAsB,EAAE;AAAA,IAChF,oBAAoB,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,qBAAqB,EAAE;AAAA,IAC9E,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,EAAE;AAAA,IAChE,cAAc,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE;AAAA,EACtD;AAEA,QAAM,iBACJ,QAAQ,sBAAsB,KAAK,QAAQ,UAAU,KAAK,QAAQ,eAAe;AAEnF,QAAM,cAAc,YAAY,IAAI,IAAI;AAExC,SAAO;AAAA,IACL,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,IACjC;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,6BAA6B,oBAAoB,uBAAuB;AAAA,IACxE,4BAA4B,mBAAmB;AAAA,IAC/C;AAAA,IACA;AAAA,EACF;AACF;AAMA,IAAM,cAAmD;AAAA,EACvD,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,cAAc;AAChB;AAEA,IAAM,eAAoD;AAAA,EACxD,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,cAAc;AAChB;AAKO,SAAS,iBAAiB,QAA4B;AAC3D,QAAM,QAAkB,CAAC;AAEzB,QAAM,QAAQ;AACd,QAAMW,QAAO,SAAI,OAAO,KAAK,IAAI,MAAM,QAAQ,EAAE,CAAC;AAClD,QAAM,KAAK,OAAOA,KAAI;AAGtB,QAAM,kBAAkB,OAAO,6BAA6B,OAAO;AACnE,QAAM,iBAAiB,mBAAmB,IAAI,MAAM;AACpD,QAAM;AAAA,IACJ,0BAA0B,OAAO,8BAA8B,KAAK,QAAQ,CAAC,CAAC;AAAA,IAC9E,0BAA0B,OAAO,6BAA6B,KAAK,QAAQ,CAAC,CAAC;AAAA,IAC7E,yBAAyB,cAAc,IAAI,kBAAkB,KAAK,QAAQ,CAAC,CAAC;AAAA,IAC5E;AAAA,EACF;AAGA,QAAM,IAAI,OAAO;AACjB,QAAM;AAAA,IACJ,eAAe,EAAE,KAAK,aACpB;AAAA,MACE,EAAE,QAAQ,IAAI,GAAG,EAAE,KAAK,WAAW;AAAA,MACnC,EAAE,UAAU,IAAI,GAAG,EAAE,OAAO,aAAa;AAAA,MACzC,EAAE,sBAAsB,IAAI,GAAG,EAAE,mBAAmB,eAAe;AAAA,MACnE,EAAE,qBAAqB,IAAI,GAAG,EAAE,kBAAkB,cAAc;AAAA,MAChE,EAAE,cAAc,IAAI,GAAG,EAAE,WAAW,kBAAkB;AAAA,MACtD,EAAE,eAAe,IAAI,GAAG,EAAE,YAAY,YAAY;AAAA,IACpD,EACG,OAAO,OAAO,EACd,KAAK,IAAI;AAAA,IACd;AAAA,EACF;AAGA,QAAM,UAAU,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW;AAExE,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,KAAK,wBAAwB;AAAA,EACrC,OAAO;AAEL,UAAM,YAAY,KAAK,IAAI,GAAG,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AAClE,UAAM,SACJ,GAAG,YAAY,OAAO,SAAS,CAAC,KAC7B,SAAS,OAAO,EAAE,CAAC,KACnB,oBAAe,OAAO,EAAE,CAAC;AAE9B,UAAM,UAAU,IAAI,OAAO,OAAO,MAAM;AAExC,UAAM,KAAK,QAAQ,OAAO;AAE1B,eAAW,SAAS,SAAS;AAC3B,YAAM,OAAO,YAAY,MAAM,MAAM;AACrC,YAAM,QAAQ,aAAa,MAAM,MAAM,EAAE,OAAO,EAAE;AAClD,YAAM,OAAO,MAAM,KAAK,OAAO,SAAS;AAExC,UAAI,gBAAgB,SAAI,OAAO,EAAE;AACjC,UAAI,MAAM,oBAAoB,MAAM;AAClC,cAAM,OAAO,MAAM,mBAAmB,IAAI,MAAM;AAChD,wBAAgB,GAAG,IAAI,IAAI,MAAM,kBAAkB,KAAK,QAAQ,CAAC,CAAC,IAAI,OAAO,EAAE;AAAA,MACjF;AAEA,UAAI,SAAS;AACb,UAAI,MAAM,uBAAuB,QAAQ,MAAM,sBAAsB,MAAM;AACzE,cAAM,IAAI,MAAM;AAChB,cAAM,IAAI,MAAM;AAChB,YAAI,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ;AAChD,mBAAS,GAAG,EAAE,KAAK,OAAI,EAAE,MAAM,WAAM,EAAE,KAAK,OAAI,EAAE,MAAM;AAAA,QAC1D,OAAO;AACL,mBAAS,GAAG,EAAE,KAAK,OAAI,EAAE,MAAM;AAAA,QACjC;AAAA,MACF,WAAW,MAAM,sBAAsB,MAAM;AAC3C,iBAAS,GAAG,MAAM,kBAAkB,KAAK,OAAI,MAAM,kBAAkB,MAAM;AAAA,MAC7E,WAAW,MAAM,uBAAuB,MAAM;AAC5C,iBAAS,GAAG,MAAM,mBAAmB,KAAK,OAAI,MAAM,mBAAmB,MAAM;AAAA,MAC/E;AAEA,UAAI,MAAM,cAAc;AACtB,iBAAS;AAAA,MACX;AAEA,YAAM,KAAK,GAAG,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,aAAa,KAAK,MAAM,EAAE;AAAA,IACrE;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACAA;AAAA,IACA,OAAO,iBACH,kBAAkB,OAAO,QAAQ,sBAAsB,OAAO,QAAQ,YAAY,+BAA+B,OAAO,cAAc,KAAM,QAAQ,CAAC,CAAC,MACtJ,qCAAqC,OAAO,cAAc,KAAM,QAAQ,CAAC,CAAC;AAAA,EAChF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAeO,SAAS,uBAAuB,WAA0B;AAC/D,YACG,QAAQ,MAAM,EACd,YAAY,yEAAyE,EACrF,OAAO,wBAAwB,yCAAyCf,qBAAoB,EAC5F,OAAO,uBAAuB,6CAA6C,EAC3E,OAAO,qBAAqB,kEAAkE,EAC9F,OAAO,oBAAoB,gCAAgC,SAAS,EACpE,OAAO,UAAU,sDAAsD,KAAK,EAC5E,OAAO,uBAAuB,+BAA+B,EAC7D;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,OAAO,SAQD;AACJ,UAAI;AACF,cAAM,CAAC,MAAM,IAAI,IAAI,KAAK,SAAS,MAAM,GAAG;AAC5C,cAAM,gBAAgB,OAAO,SAAS,QAAQ,OAAO,EAAE;AACvD,cAAM,iBAAiB,OAAO,SAAS,QAAQ,OAAO,EAAE;AACxD,cAAM,sBAAsB,OAAO,WAAW,KAAK,mBAAmB;AAEtE,cAAM,SAAS,MAAM,QAAQ;AAAA,UAC3B,aAAa,KAAK;AAAA,UAClB,gBAAgB,KAAK;AAAA,UACrB,cAAc,KAAK;AAAA,UACnB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAGD,YAAI,KAAK,WAAW,QAAW;AAC7B,UAAAgB,eAAc,KAAK,QAAQ,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACnE,kBAAQ,OAAO,MAAM,mBAAmB,KAAK,MAAM;AAAA,CAAI;AAAA,QACzD;AAGA,YAAI,KAAK,MAAM;AACb,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QAC7D,OAAO;AACL,kBAAQ,OAAO,MAAM,GAAG,iBAAiB,MAAM,CAAC;AAAA,CAAI;AAAA,QACtD;AAGA,gBAAQ,KAAK,OAAO,iBAAiB,IAAI,CAAC;AAAA,MAC5C,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;;;AC30BA,SAAS,cAAAC,cAAY,gBAAAC,gBAAc,iBAAAC,sBAAqB;AACxD,SAAS,WAAAC,iBAAe;AAQxB,IAAM,eAA6D;AAAA,EACjE,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,cAAc;AAChB;AAEA,SAAS,IAAI,GAAmB;AAC9B,SAAO,IAAI,IAAI,KAAK,QAAQ,CAAC,CAAC;AAChC;AAEA,SAAS,SAAS,OAA8B;AAC9C,MAAI,UAAU,KAAM,QAAO;AAC3B,QAAM,OAAO,SAAS,IAAI,MAAM;AAChC,SAAO,GAAG,IAAI,IAAI,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC3C;AAEA,SAAS,cAAc,GAAqD;AAC1E,MAAI,MAAM,KAAM,QAAO;AACvB,SAAO,GAAG,EAAE,KAAK,SAAM,EAAE,MAAM;AACjC;AAEA,SAAS,qBAAqB,MAA0B;AACtD,QAAM,QAAQ,KAAK,6BAA6B,KAAK;AACrD,MAAI,KAAK,IAAI,KAAK,IAAI,KAAQ,QAAO,UAAK,IAAI,KAAK,0BAA0B,CAAC;AAC9E,QAAM,QAAQ,QAAQ,IAAI,WAAM;AAChC,SAAO,GAAG,KAAK,IAAI,SAAS,KAAK,CAAC;AACpC;AASO,SAAS,gBAAgB,MAA0B;AACxD,QAAM,EAAE,SAAS,WAAW,IAAI;AAEhC,QAAM,QAAkB,CAAC;AAGzB,QAAM,iBAAiB,KAAK;AAC5B,QAAM,cAAc,iBAAiB,iBAAO;AAC5C,QAAM,KAAK,MAAM,WAAW,eAAe;AAC3C,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,2BAA2B,IAAI,KAAK,2BAA2B,CAAC,IAAI;AAC/E,QAAM,KAAK,0BAA0B,IAAI,KAAK,0BAA0B,CAAC,IAAI;AAC7E,QAAM,KAAK,aAAa,qBAAqB,IAAI,CAAC,IAAI;AACtD,QAAM;AAAA,IACJ,kBAAkB,QAAQ,KAAK,eAAY,QAAQ,KAAK,eAAY,QAAQ,OAAO,iBAAc,QAAQ,mBAAmB;AAAA,EAC9H;AACA,MAAI,QAAQ,eAAe,GAAG;AAC5B,UAAM,KAAK,uBAAuB,QAAQ,YAAY,IAAI;AAAA,EAC5D;AACA,QAAM,KAAK,EAAE;AAGb,QAAM,UAAU,WAAW,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW;AACjE,QAAM,YAAY,WAAW,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW;AAEnE,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,yDAAoD;AAC/D,UAAM,KAAK,mBAAmB;AAC9B,eAAW,KAAK,SAAS;AACvB,YAAM,QAAQ,aAAa,EAAE,MAAM;AACnC,YAAM,QAAQ,SAAS,EAAE,eAAe;AACxC,YAAM,OAAO,cAAc,EAAE,qBAAqB,EAAE,kBAAkB;AACtE,YAAM,KAAK,OAAO,EAAE,IAAI,QAAQ,KAAK,MAAM,KAAK,MAAM,IAAI,IAAI;AAAA,IAChE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM;AAAA,MACJ,qBAAqB,UAAU,MAAM,uBAAuB,UAAU,WAAW,IAAI,KAAK,GAAG;AAAA,IAC/F;AACA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,4BAA4B;AACvC,UAAM,KAAK,WAAW;AACtB,eAAW,KAAK,WAAW;AACzB,YAAM;AAAA,QACJ,OAAO,EAAE,IAAI,QAAQ,EAAE,sBAAsB,OAAO,IAAI,EAAE,iBAAiB,IAAI,QAAG;AAAA,MACpF;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,YAAY;AACvB,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM;AAAA,IACJ,8EAA2E,KAAK,QAAQ;AAAA,EAC1F;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAiBO,SAAS,eAAe,UAA8B;AAC3D,QAAM,MAAMA,UAAQ,QAAQ;AAC5B,MAAI,CAACH,aAAW,GAAG,GAAG;AACpB,UAAM,IAAI,MAAM,8BAA8B,GAAG,EAAE;AAAA,EACrD;AACA,MAAI;AACJ,MAAI;AACF,UAAMC,eAAa,KAAK,OAAO;AAAA,EACjC,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,mCAAmC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACrF;AAAA,EACF;AACA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,sCAAsC,GAAG,EAAE;AAAA,EAC7D;AAEA,MACE,OAAO,WAAW,YAClB,WAAW,QACX,EAAE,cAAc,WAChB,EAAE,gBAAgB,WAClB,EAAE,aAAa,SACf;AACA,UAAM,IAAI;AAAA,MACR,wFAAwF,GAAG;AAAA,IAC7F;AAAA,EACF;AACA,SAAO;AACT;AAMO,SAAS,4BAA4B,WAA0B;AACpE,YACG,QAAQ,YAAY,EACpB;AAAA,IACC;AAAA,EACF,EACC,eAAe,sBAAsB,yDAAyD,EAC9F,OAAO,uBAAuB,yCAAyC,EACvE,OAAO,OAAO,SAA2B;AACxC,QAAI;AACF,YAAM,OAAO,eAAe,KAAK,KAAK;AACtC,YAAM,UAAU,gBAAgB,IAAI;AAEpC,UAAI,KAAK,WAAW,QAAW;AAC7B,QAAAC,eAAcC,UAAQ,KAAK,MAAM,GAAG,SAAS,OAAO;AACpD,gBAAQ,OAAO,MAAM,yBAAyB,KAAK,MAAM;AAAA,CAAI;AAAA,MAC/D,OAAO;AACL,gBAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,MACrC;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AClMA,IAAMC,UAAS;AACf,IAAMC,eAAc;AACpB,IAAMC,YAAW;AACjB,IAAMC,SAAQ;AASd,SAAS,WAAW,MAAqB,SAAoC;AAC3E,QAAM,QAAkB,CAAC,KAAK,IAAI;AAGlC,MAAI,KAAK,SAAS,QAAQ;AACxB,UAAM,KAAK,QAAQ;AAAA,EACrB,WAAW,KAAK,SAAS,eAAe;AACtC,UAAM,KAAK,cAAc;AAAA,EAC3B,WAAW,KAAK,SAAS,SAAS;AAChC,UAAM,KAAK,SAAS;AAAA,EACtB;AAGA,MAAI,QAAQ,cAAc,MAAM;AAC9B,UAAM,QAAQ,KAAK;AACnB,QACE,MAAM,SAAS,YACf,aAAa,SACb,MAAM,QAAS,MAAkC,OAAO,GACxD;AACA,YAAM,UAAW,MAAoC;AAIrD,YAAM,YAAY,QACf,IAAI,CAAC,MAAM,EAAE,GAAG,EAChB,OAAO,CAAC,MAAM,MAAM,UAAU,EAC9B,MAAM,GAAG,CAAC;AACb,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,KAAK,IAAI,UAAU,KAAK,IAAI,CAAC,GAAG;AAAA,MACxC;AAAA,IACF,WAAW,MAAM,SAAS,eAAe,MAAM,SAAS,QAAQ;AAAA,IAEhE,OAAO;AAEL,YAAM,UAAU,MAAM;AACtB,UAAI,WAAW,YAAY,mBAAmB;AAC5C,cAAM,KAAK,OAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,cAAc,QAAQ,KAAK,MAAM,SAAS,GAAG;AACvD,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,iBAAW,IAAI,QAAQ,WAAW,IAAI,KAAK,KAAK,KAAK,CAAC;AAAA,IACxD;AACA,UAAM,UAAU,MAAM,KAAK,WAAW,QAAQ,CAAC,EAC5C,IAAI,CAAC,CAAC,GAAG,CAAC,MAAO,IAAI,IAAI,GAAG,CAAC,OAAI,CAAC,KAAK,CAAE,EACzC,KAAK,IAAI;AACZ,UAAM,KAAK,IAAI,OAAO,GAAG;AAAA,EAC3B;AAEA,SAAO,MAAM,KAAK,GAAG;AACvB;AAKA,SAAS,WACP,MACA,QACA,QACA,OACA,SACA,OACM;AAEN,MAAI,KAAK,SAAS,UAAU,QAAQ,aAAa,MAAM;AAErD,UAAMC,mBAAkB,mBAAmB,MAAM,OAAO;AACxD,aAAS,IAAI,GAAG,IAAIA,iBAAgB,QAAQ,KAAK;AAC/C,YAAM,QAAQA,iBAAgB,CAAC;AAC/B,UAAI,UAAU,QAAW;AACvB,mBAAW,OAAO,QAAQ,MAAMA,iBAAgB,SAAS,GAAG,OAAO,SAAS,KAAK;AAAA,MACnF;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,YAAY,SAASH,eAAcD;AACzC,QAAM,QAAQ,WAAW,MAAM,OAAO;AACtC,QAAM,KAAK,GAAG,MAAM,GAAG,SAAS,GAAG,KAAK,EAAE;AAG1C,MAAI,QAAQ,aAAa,UAAa,SAAS,QAAQ,UAAU;AAC/D,UAAM,aAAa,wBAAwB,MAAM,OAAO;AACxD,QAAI,aAAa,GAAG;AAClB,YAAMK,cAAa,UAAU,SAASF,SAAQD;AAC9C,YAAM,KAAK,GAAGG,WAAU,GAAGJ,YAAW,WAAM,UAAU,QAAQ;AAAA,IAChE;AACA;AAAA,EACF;AAEA,QAAM,kBAAkB,mBAAmB,MAAM,OAAO;AACxD,QAAM,aAAa,UAAU,SAASE,SAAQD;AAE9C,WAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,UAAM,QAAQ,gBAAgB,CAAC;AAC/B,QAAI,UAAU,QAAW;AACvB,iBAAW,OAAO,YAAY,MAAM,gBAAgB,SAAS,GAAG,QAAQ,GAAG,SAAS,KAAK;AAAA,IAC3F;AAAA,EACF;AACF;AAKA,SAAS,mBAAmB,MAAqB,SAA6C;AAC5F,MAAI,QAAQ,aAAa,MAAM;AAC7B,WAAO,KAAK;AAAA,EACd;AAGA,SAAO,oBAAoB,KAAK,UAAU,OAAO;AACnD;AAEA,SAAS,oBACP,UACA,SACiB;AACjB,QAAM,SAA0B,CAAC;AACjC,aAAW,SAAS,UAAU;AAC5B,QAAI,MAAM,SAAS,QAAQ;AACzB,aAAO,KAAK,GAAG,oBAAoB,MAAM,UAAU,OAAO,CAAC;AAAA,IAC7D,OAAO;AACL,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,wBAAwB,MAAqB,SAAoC;AACxF,MAAI,QAAQ;AACZ,aAAW,SAAS,KAAK,UAAU;AACjC,QAAI,MAAM,SAAS,UAAU,QAAQ,aAAa,MAAM;AACtD,eAAS;AAAA,IACX;AACA,aAAS,wBAAwB,OAAO,OAAO;AAAA,EACjD;AACA,SAAO;AACT;AAkBO,SAAS,WAAW,MAAqB,UAA6B,CAAC,GAAW;AACvF,QAAM,QAAkB,CAAC;AAGzB,MAAI,KAAK,SAAS,UAAU,QAAQ,aAAa,MAAM;AACrD,UAAM,KAAK,WAAW,MAAM,OAAO,CAAC;AAEpC,QAAI,QAAQ,aAAa,GAAG;AAC1B,YAAM,aAAa,wBAAwB,MAAM,OAAO;AACxD,UAAI,aAAa,GAAG;AAClB,cAAM,KAAK,GAAGD,YAAW,WAAM,UAAU,QAAQ;AAAA,MACnD;AAAA,IACF,OAAO;AACL,YAAM,kBAAkB,mBAAmB,MAAM,OAAO;AACxD,eAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,cAAM,QAAQ,gBAAgB,CAAC;AAC/B,YAAI,UAAU,QAAW;AACvB,qBAAW,OAAO,IAAI,MAAM,gBAAgB,SAAS,GAAG,GAAG,SAAS,KAAK;AAAA,QAC3E;AAAA,MACF;AAAA,IACF;AAAA,EACF,OAAO;AAEL,UAAM,kBAAkB,mBAAmB,MAAM,OAAO;AACxD,aAAS,IAAI,GAAG,IAAI,gBAAgB,QAAQ,KAAK;AAC/C,YAAM,QAAQ,gBAAgB,CAAC;AAC/B,UAAI,UAAU,QAAW;AACvB,mBAAW,OAAO,IAAI,MAAM,gBAAgB,SAAS,GAAG,GAAG,SAAS,KAAK;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAiBO,SAAS,UAAU,MAA6B;AACrD,MAAI,KAAK,SAAS,WAAW,EAAG,QAAO;AACvC,SAAO,IAAI,KAAK,IAAI,GAAG,KAAK,SAAS,IAAI,SAAS,CAAC;AACrD;;;ACvOA,SAAS,sBAAsB,MAAqC;AAClE,QAAM,SAAiC,CAAC;AAExC,WAAS,KAAK,MAA2B;AACvC,QAAI,KAAK,SAAS,QAAQ;AACxB,aAAO,KAAK,IAAI,KAAK,OAAO,KAAK,IAAI,KAAK,KAAK;AAAA,IACjD;AACA,eAAW,SAAS,KAAK,UAAU;AACjC,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAEA,OAAK,IAAI;AAET,QAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC7D,SAAO,EAAE,OAAO,OAAO;AACzB;AAGA,SAAS,iBAAiB,MAAgC;AACxD,QAAM,SAAiC,CAAC;AAExC,WAAS,KAAK,MAA2B;AACvC,eAAW,QAAQ,KAAK,OAAO;AAC7B,YAAM,QAAQ,KAAK,QAAQ,KAAK;AAChC,aAAO,KAAK,KAAK,OAAO,KAAK,KAAK,KAAK;AAAA,IACzC;AACA,eAAW,SAAS,KAAK,UAAU;AACjC,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAEA,OAAK,IAAI;AAET,QAAM,QAAQ,OAAO,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC7D,SAAO,EAAE,OAAO,OAAO;AACzB;AAMA,SAAS,qBAAqB,MAA6B;AACzD,MAAI,QAAQ;AAEZ,WAAS,KAAK,MAA2B;AACvC,QACE,KAAK,SAAS,YACb,KAAK,KAAK,YAAY,EAAE,SAAS,OAAO,KAAK,KAAK,KAAK,YAAY,EAAE,SAAS,UAAU,IACzF;AACA,eAAS;AAAA,IACX;AACA,eAAW,SAAS,KAAK,UAAU;AACjC,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAEA,OAAK,IAAI;AACT,SAAO;AACT;AAOA,SAASK,KAAI,GAAW,OAAuB;AAC7C,SAAO,EAAE,OAAO,OAAO,GAAG;AAC5B;AAGA,SAAS,IAAI,OAAe,OAAe,aAAa,IAAY;AAClE,SAAO,GAAGA,KAAI,OAAO,UAAU,CAAC,GAAG,KAAK;AAC1C;AAGA,SAAS,KAAK,OAAuB;AACnC,SAAO,SAAI,OAAO,KAAK;AACzB;AAGA,SAAS,gBAAgB,QAAgC,QAAQ,GAAW;AAC1E,QAAM,UAAU,OAAO,QAAQ,MAAM,EAClC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAC5B,MAAM,GAAG,KAAK;AAEjB,MAAI,QAAQ,WAAW,EAAG,QAAO;AACjC,SAAO,IAAI,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAC5D;AAcO,SAAS,aAAa,QAAoB,UAA+B,CAAC,GAAW;AAC1F,MAAI,QAAQ,SAAS,MAAM;AACzB,WAAO,KAAK,UAAU,QAAQ,MAAM,CAAC;AAAA,EACvC;AAEA,QAAM,MAAM,OAAO;AACnB,QAAM,QAAQ,oBAAoB,GAAG;AACrC,QAAM,YAAY,KAAK,IAAI,KAAK,IAAI,MAAM,QAAQ,EAAE,GAAG,EAAE;AAEzD,QAAM,iBAAiB,sBAAsB,OAAO,IAAI;AACxD,QAAM,YAAY,iBAAiB,OAAO,IAAI;AAC9C,QAAM,WAAW,UAAU,OAAO,IAAI;AAGtC,QAAM,kBAAkB,qBAAqB,OAAO,IAAI;AAGxD,QAAM,iBAAiB,OAAO,mBAAmB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE;AAC9E,QAAM,gBAAgB,OAAO,mBAAmB,SAAS;AAGzD,QAAM,gBAAwC,CAAC;AAC/C,aAAW,SAAS,OAAO,gBAAgB;AACzC,kBAAc,MAAM,KAAK,KAAK,cAAc,MAAM,KAAK,KAAK,KAAK;AAAA,EACnE;AAGA,QAAM,YAAoC;AAAA,IACxC,UAAU;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAEA,QAAM,qBAAqB,OAAO,QAAQ,eAAe,MAAM,EAC5D,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,EAC3C,KAAK,IAAI;AAEZ,QAAM,gBAAgB,gBAAgB,UAAU,QAAQ,CAAC;AAGzD,QAAM,wBAAwB,OAAO,QAAQ,aAAa,EACvD,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,EAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE;AAC9B,QAAM,mBACJ,sBAAsB,SAAS,IAAI,KAAK,sBAAsB,KAAK,IAAI,CAAC,MAAM;AAGhF,QAAM,kBACJ,OAAO,mBAAmB,SAAS,IAC/B,KAAK,cAAc,aAAa,aAAa,eAC7C;AAEN,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,KAAK,SAAS;AAAA,IACd;AAAA,MACE;AAAA,MACA,GAAG,eAAe,KAAK,SAAS,qBAAqB,KAAK,kBAAkB,MAAM,EAAE;AAAA,IACtF;AAAA,IACA,IAAI,cAAc,OAAO,QAAQ,CAAC;AAAA,IAClC,IAAI,UAAU,UAAU,QAAQ,IAAI,GAAG,UAAU,KAAK,UAAU,aAAa,KAAK,MAAM;AAAA,IACxF,IAAI,qBAAqB,OAAO,eAAe,CAAC;AAAA,IAChD,IAAI,wBAAwB,GAAG,OAAO,mBAAmB,MAAM,GAAG,eAAe,EAAE;AAAA,IACnF,IAAI,oBAAoB,GAAG,OAAO,eAAe,MAAM,GAAG,gBAAgB,EAAE;AAAA,IAC5E;AAAA,MACE;AAAA,MACA,OAAO,OAAO,SAAS,IAAI,GAAG,OAAO,OAAO,MAAM,mCAAmC;AAAA,IACvF;AAAA,IACA,IAAI,iBAAiB,GAAG,OAAO,UAAU,IAAI;AAAA,EAC/C;AAGA,MAAI,OAAO,UAAU,MAAM;AACzB,UAAM,KAAK,IAAI,UAAU,OAAO,MAAM,WAAW,OAAO,GAAG,CAAC;AAAA,EAC9D;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAmCO,SAAS,sBAAsB,QAAsC;AAC1E,QAAM,iBAAiB,sBAAsB,OAAO,IAAI;AACxD,QAAM,YAAY,iBAAiB,OAAO,IAAI;AAC9C,QAAM,WAAW,UAAU,OAAO,IAAI;AACtC,QAAM,kBAAkB,qBAAqB,OAAO,IAAI;AAExD,QAAM,iBAAiB,OAAO,mBAAmB,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE;AAE9E,QAAM,gBAAwC,CAAC;AAC/C,aAAW,SAAS,OAAO,gBAAgB;AACzC,kBAAc,MAAM,KAAK,KAAK,cAAc,MAAM,KAAK,KAAK,KAAK;AAAA,EACnE;AAEA,SAAO;AAAA,IACL,KAAK,OAAO;AAAA,IACZ,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,YAAY;AAAA,MACV,OAAO,eAAe;AAAA,MACtB,QAAQ,eAAe;AAAA,MACvB;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,OAAO,UAAU;AAAA,MACjB,QAAQ,UAAU;AAAA,IACpB;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,MAClB,OAAO,OAAO,mBAAmB;AAAA,MACjC,WAAW;AAAA,MACX,UAAU,OAAO,mBAAmB,SAAS;AAAA,IAC/C;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO,OAAO,eAAe;AAAA,MAC7B,SAAS;AAAA,IACX;AAAA,IACA,QAAQ,OAAO,OAAO;AAAA,IACtB,OAAO,OAAO,OAAO,WAAW;AAAA,EAClC;AACF;;;AC1RA;AAAA,EACE;AAAA,EACA,cAAAC;AAAA,EACA,SAAS;AAAA,EACT,gBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,OAAO,iBAAiB;AACjC,SAAS,oBAAyC;AAClD,SAAS,SAAS,QAAAC,OAAM,WAAAC,iBAAe;AACvC,SAAgC,oBAAAC,yBAAuC;AACvE,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,iBAAiB;AAC1B,SAAS,WAAAC,gBAAe;;;ACTxB,SAAS,WAAAC,gBAAe;AACxB,YAAYC,cAAa;AAUzB,eAAsB,uBACpB,UACA,eACA,YACA,eACiB;AACjB,QAAM,gBAAgB,MAAM,qBAAqB,UAAU,aAAa;AACxE,SAAO,mBAAmB,eAAe,YAAY,aAAa;AACpE;AAMA,eAAe,qBAAqB,UAAkB,eAAwC;AAC5F,QAAM;AAAA;AAAA,IAAuB;AAAA,8BACD,KAAK,UAAU,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAOrC,KAAK,UAAU,aAAa,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA4D5C,QAAM,SAAS,MAAc,eAAM;AAAA,IACjC,OAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAYD,SAAQ,QAAQ;AAAA,MAC5B,QAAQ;AAAA,MACR,YAAY;AAAA,IACd;AAAA,IACA,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,UAAU;AAAA,IACV,KAAK;AAAA,IACL,iBAAiB;AAAA,IACjB,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,IACX,QAAQ;AAAA,MACN,wBAAwB;AAAA,MACxB,QAAQ;AAAA,IACV;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,MACN,IAAI;AAAA,IACN;AAAA,IACA,QAAQ;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAAA,EACF,CAAC;AAED,MAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,UAAM,MAAM,OAAO,OAChB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,GAAG,EAAE,WAAW,KAAK,EAAE,SAAS,IAAI,IAAI,EAAE,SAAS,IAAI,MAAM,EAAE,EAAE,EACrF,KAAK,IAAI;AACZ,UAAM,IAAI,MAAM;AAAA,EAAmD,GAAG,EAAE;AAAA,EAC1E;AAEA,QAAM,aAAa,OAAO,cAAc,CAAC;AACzC,MAAI,eAAe,UAAa,WAAW,KAAK,WAAW,GAAG;AAC5D,UAAM,IAAI,MAAM,uCAAuC;AAAA,EACzD;AAEA,SAAO,WAAW;AACpB;AAMA,SAAS,mBACP,eACA,YACA,eACQ;AACR,QAAM,oBACJ,cAAc,QAAQ,WAAW,SAAS,IACtC;AAAA,EAAmC,WAAW,QAAQ,eAAe,YAAY,CAAC;AAAA,YAClF;AACN,QAAM,qBACJ,iBAAiB,QAAQ,cAAc,SAAS,IAC5C,qCAAqC,aAAa,cAClD;AAEN,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAgBL,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKjB,kBAAkB;AAAA,YACV,aAAa;AAAA;AAAA;AAGzB;;;ADvKA,IAAM,aAAqC;AAAA,EACzC,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AACV;AAMA,SAAS,QAAQ,MAAsB;AACrC,SAAO,KACJ,QAAQ,YAAY,CAAC,MAAM,IAAI,EAAE,YAAY,CAAC,EAAE,EAChD,QAAQ,MAAM,EAAE,EAChB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE;AACzB;AAaA,SAASE,8BAA6B,KAAuB;AAC3D,QAAM,aAAaC,UAAQ,KAAK,wBAAwB;AACxD,MAAI,CAACC,aAAW,UAAU,EAAG,QAAO,CAAC;AACrC,MAAI;AACF,UAAM,MAAMC,eAAa,YAAY,OAAO;AAC5C,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,WAAO,IAAI,YAAY,UAAU,aAAa,CAAC;AAAA,EACjD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAASC,4BAA2B,KAAuB;AACzD,QAAM,aAAaH,UAAQ,KAAK,wBAAwB;AACxD,MAAI,CAACC,aAAW,UAAU,EAAG,QAAO,CAAC;AACrC,MAAI;AACF,UAAM,MAAMC,eAAa,YAAY,OAAO;AAC5C,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,WAAO,IAAI,OAAO,YAAY,CAAC;AAAA,EACjC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAMA,IAAM,oBAAoB;AAE1B,SAAS,uBAAuB,MAAsB;AACpD,QAAM,MAAM,KAAK,YAAY,SAAS;AACtC,MAAI,OAAO,EAAG,QAAO,KAAK,MAAM,GAAG,GAAG,IAAI,oBAAoB,KAAK,MAAM,GAAG;AAC5E,SAAO,OAAO;AAChB;AAcA,SAAS,gBAAgB,SAAqC;AAC5D,QAAM,aAAaF,UAAQ,SAAS,wBAAwB;AAC5D,MAAI,CAACC,aAAW,UAAU,EAAG,QAAO;AACpC,MAAI;AACF,UAAM,MAAMC,eAAa,YAAY,OAAO;AAC5C,UAAM,MAAM,KAAK,MAAM,GAAG;AAC1B,UAAM,SAAsB,CAAC;AAC7B,UAAM,aAAa,IAAI;AACvB,QAAI,cAAc,OAAO,eAAe,UAAU;AAChD,UAAI,MAAM,QAAQ,WAAW,OAAO,EAAG,QAAO,UAAU,WAAW;AACnE,UAAI,MAAM,QAAQ,WAAW,OAAO,EAAG,QAAO,UAAU,WAAW;AAAA,IACrE;AACA,QAAI,MAAM,QAAQ,IAAI,gBAAgB;AACpC,aAAO,mBAAmB,IAAI;AAChC,QAAI,MAAM,QAAQ,IAAI,WAAW,EAAG,QAAO,cAAc,IAAI;AAC7D,UAAM,QAAQ,IAAI;AAClB,QAAI,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,QAAQ,GAAG;AACvE,aAAO,eAAe,MAAM;AAAA,IAC9B;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,SAAiB,UAA2B;AAC7D,QAAM,UAAU,QAAQ,QAAQ,qBAAqB,MAAM;AAC3D,QAAM,WAAW,QACd,QAAQ,SAAS,kBAAsB,EACvC,QAAQ,OAAO,OAAO,EACtB,QAAQ,yBAAyB,IAAI;AACxC,SAAO,IAAI,OAAO,IAAI,QAAQ,KAAK,GAAG,EAAE,KAAK,QAAQ;AACvD;AAEA,SAAS,qBAAqB,UAAkB,SAAmB,SAA4B;AAC7F,aAAW,WAAW,SAAS;AAC7B,QAAI,UAAU,SAAS,QAAQ,EAAG,QAAO;AAAA,EAC3C;AACA,aAAW,WAAW,SAAS;AAC7B,QAAI,UAAU,SAAS,QAAQ,EAAG,QAAO;AAAA,EAC3C;AACA,SAAO;AACT;AAMA,SAAS,uBACP,UACA,cACA,kBACU;AACV,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,aAAa,aAAa,IAAI,CAAC,MAAM,EAAE,QAAQ,OAAO,GAAG,CAAC;AAEhE,aAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AACpE,UAAM,gBAAgB,WAAW,SAAS,QAAQ,OAAO,GAAG;AAC5D,eAAW,WAAW,YAAY;AAChC,UAAI,kBAAkB,SAAS;AAC7B,iBAAS,IAAI,IAAI;AACjB;AAAA,MACF;AAEA,YAAM,YAAY,QAAQ,QAAQ,6BAA6B,EAAE;AACjE,YAAM,WAAW,cAAc,QAAQ,sBAAsB,EAAE;AAC/D,UAAI,cAAc,WAAW,aAAa,WAAW;AACnD,iBAAS,IAAI,IAAI;AACjB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB;AACpB,UAAM,WAAW,IAAI,IAAI,OAAO,KAAK,iBAAiB,UAAU,CAAC;AACjE,eAAW,QAAQ,OAAO,KAAK,SAAS,UAAU,GAAG;AACnD,UAAI,CAAC,SAAS,IAAI,IAAI,EAAG,UAAS,IAAI,IAAI;AAAA,IAC5C;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,QAAQ;AACrB;AAEA,eAAe,yBACb,UACA,gBACA,SACA,UACe;AACf,MAAI,eAAe,WAAW,EAAG;AAEjC,QAAM,aAAaE,MAAK,UAAU,SAAS;AAC3C,QAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAM,WAAWL,8BAA6B,OAAO;AACrD,QAAM,eAAeI,4BAA2B,OAAO;AAEvD,QAAM,uBAAuBC,MAAK,UAAU,wBAAwB;AACpE,MAAI,mBAA4C,CAAC;AACjD,MAAIH,aAAW,oBAAoB,GAAG;AACpC,QAAI;AACF,yBAAmB,KAAK,MAAMC,eAAa,sBAAsB,OAAO,CAAC;AAAA,IAI3E,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,aAAW,QAAQ,gBAAgB;AACjC,UAAM,aAAa,SAAS,WAAW,IAAI;AAC3C,QAAI,CAAC,WAAY;AAEjB,UAAM,WAAWF,UAAQ,SAAS,WAAW,QAAQ;AACrD,UAAM,SAAS,gBAAgB,WAAW,UAAU,MAAM,YAAY;AAEtE,QAAI,YAAmE;AACvE,QAAI;AACF,kBAAY,MAAM,0BAA0B,QAAQ;AAAA,IACtD,QAAQ;AAAA,IAER;AAEA,UAAM,kBAAkB,YAAY,OAAO,QAAQ,UAAU,SAAS,IAAI,CAAC;AAC3E,UAAM,eAAe,gBAAgB,KAAK,CAAC,CAAC,CAAC,MAAM,MAAM,SAAS,KAAK,gBAAgB,CAAC;AACxF,UAAM,cAAc,eAAe,CAAC,KAAK,CAAC;AAE1C,QAAI;AACJ,QAAI;AACF,sBAAgB,WAAW,aACvB,MAAM,mBAAmB,UAAU,QAAQ,IAC3C;AAAA,IACN,QAAQ;AAAA,IAER;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,UAAU,MAAMK;AAAA,MACpB,MAAM,SAAS,WAAW,aAAa,WAAW,eAAe;AAAA,MACjE;AAAA,QACE,OAAO;AAAA,QACP,gBAAgB,EAAE,MAAM,WAAW,UAAU,MAAM,WAAW,IAAI,OAAO,QAAQ,EAAE;AAAA,MACrF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS;AACnB,cAAQ,OAAO,MAAM,YAAY,IAAI,KAAK,QAAQ,MAAM,OAAO;AAAA,CAAI;AACnE;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ;AAEvB,QAAI,CAAC,QAAQ;AACX,MAAAC,gBAAcF,MAAK,YAAY,GAAG,IAAI,MAAM,GAAG,OAAO,UAAU;AAAA,IAClE;AAEA,UAAM,aAAa,iBAAiB,MAAM,aAAa,MAAM;AAI7D,UAAM,YAAY;AAClB,QAAI,UAAU,UAAU,YAAY;AAClC,iBAAW,aAAa,UAAU;AAClC,aAAO,WAAW;AAAA,IACpB;AACA,IAAAE,gBAAcF,MAAK,YAAY,GAAG,IAAI,OAAO,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAGnF,UAAM,YAAY,OAAO,eAAe,4BAA4B,KAAK,CAAC;AAC1E,UAAM,aAAa;AAAA,MACjB,QAAQ,CAAC;AAAA,MACT,SAAS,CAAC;AAAA,MACV,YAAY,CAAC;AAAA,MACb,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,IACZ;AACA,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,SAAS,GAAG;AACnD,UAAI,CAAC,OAAO,QAAQ,UAAU,QAAQ,GAAI;AAC1C,YAAM,QAAQ,KAAK,YAAY;AAC/B,UAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,GAAG;AAC3D,mBAAW,OAAO,IAAI,IAAI;AAAA,MAC5B,WACE,MAAM,SAAS,SAAS,KACxB,MAAM,SAAS,QAAQ,KACvB,MAAM,SAAS,KAAK,KACpB,MAAM,SAAS,OAAO,KACtB,MAAM,SAAS,QAAQ,GACvB;AACA,mBAAW,QAAQ,IAAI,IAAI;AAAA,MAC7B,WACE,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,YAAY,KAC3B,MAAM,SAAS,eAAe,KAC9B,MAAM,SAAS,eAAe,GAC9B;AACA,mBAAW,WAAW,IAAI,IAAI;AAAA,MAChC,WACE,MAAM,SAAS,QAAQ,KACvB,MAAM,SAAS,QAAQ,KACvB,MAAM,SAAS,SAAS,GACxB;AACA,mBAAW,QAAQ,IAAI,IAAI;AAAA,MAC7B,WAAW,MAAM,SAAS,QAAQ,GAAG;AACnC,mBAAW,QAAQ,IAAI,IAAI;AAAA,MAC7B;AAAA,IACF;AACA,qBAAiB,IAAI,IAAI;AAEzB,YAAQ,OAAO,MAAM,YAAY,IAAI,KAAK,OAAO,aAAa,QAAQ,CAAC,CAAC;AAAA,CAAO;AAAA,EACjF;AAEA,QAAMG,cAAa;AACnB,EAAAD,gBAAc,sBAAsB,KAAK,UAAU,kBAAkB,MAAM,CAAC,GAAG,OAAO;AACxF;AAEA,eAAe,iBACb,UACA,WACA,OACA,UACe;AACf,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,oBAAoB,UAAU,SAAS;AAE7C,QAAM,eAAeH,4BAA2B,OAAO;AAEvD,MAAI;AACJ,QAAM,WAAWH,UAAQ,SAAS,wBAAwB;AAC1D,MAAIC,aAAW,QAAQ,EAAG,iBAAgB;AAE1C,MAAI;AACJ,QAAM,SAASG,MAAK,UAAU,wBAAwB;AACtD,MAAIH,aAAW,MAAM,EAAG,kBAAiB;AAEzC,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,kBAAkB,EAAE,eAAe;AAAA,IACvC,GAAI,iBAAiB,EAAE,cAAc;AAAA,IACrC;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAUA,SAAS,oBACP,UACA,kBACA,YACU;AACV,QAAM,QAAkB,CAAC;AAEzB,aAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,SAAS,UAAU,GAAG;AACpE,UAAM,WAAWG,MAAK,YAAY,GAAG,IAAI,OAAO;AAChD,QAAI,CAACH,aAAW,QAAQ,GAAG;AACzB,YAAM,KAAK,IAAI;AACf;AAAA,IACF;AAEA,QAAI,CAAC,iBAAkB;AAEvB,UAAM,OAAO,iBAAiB,WAAW,IAAI;AAC7C,QAAI,CAAC,MAAM;AACT,YAAM,KAAK,IAAI;AACf;AAAA,IACF;AAEA,QAAI,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,UAAU,GAAG;AACvD,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,aACb,SACA,UACA,WACA,OACA,UACmB;AACnB,UAAQ,OAAO,MAAM,0BAA0B;AAE/C,QAAM,SAAS,gBAAgB,OAAO;AAGtC,QAAM,eAAeG,MAAK,UAAU,eAAe;AACnD,MAAI,mBAAoC;AACxC,MAAIH,aAAW,YAAY,GAAG;AAC5B,QAAI;AACF,yBAAmB,KAAK,MAAMC,eAAa,cAAc,OAAO,CAAC;AAAA,IACnE,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,UAAQ,OAAO,MAAM,qCAAqC;AAC1D,QAAM,WAAW,MAAMM,kBAAiB;AAAA,IACtC;AAAA,IACA,GAAI,QAAQ,WAAW,EAAE,SAAS,OAAO,QAAQ;AAAA,IACjD,GAAI,QAAQ,WAAW,EAAE,SAAS,OAAO,QAAQ;AAAA,IACjD,GAAI,QAAQ,oBAAoB,EAAE,kBAAkB,OAAO,iBAAiB;AAAA,IAC5E,GAAI,QAAQ,eAAe,EAAE,aAAa,OAAO,YAAY;AAAA,IAC7D,GAAI,QAAQ,gBAAgB,EAAE,cAAc,OAAO,aAAa;AAAA,EAClE,CAAC;AAED,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AACzC,EAAAF,gBAAcF,MAAK,UAAU,eAAe,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AACzF,QAAM,QAAQ,OAAO,KAAK,SAAS,UAAU,EAAE;AAC/C,UAAQ,OAAO,MAAM,iBAAiB,KAAK;AAAA,CAAe;AAE1D,QAAM,aAAaA,MAAK,UAAU,SAAS;AAC3C,QAAM,QAAQ,oBAAoB,UAAU,kBAAkB,UAAU;AAExE,MAAI,MAAM,SAAS,GAAG;AACpB,YAAQ,OAAO;AAAA,MACb,qBAAqB,MAAM,MAAM,kBAAkB,QAAQ,MAAM,MAAM;AAAA;AAAA,IACzE;AACA,UAAM,yBAAyB,UAAU,OAAO,SAAS,QAAQ;AAAA,EACnE,OAAO;AACL,YAAQ,OAAO,MAAM,wDAAwD;AAAA,EAC/E;AAEA,UAAQ,OAAO,MAAM,+BAA+B;AACpD,QAAM,iBAAiB,UAAU,WAAW,OAAO,QAAQ;AAE3D,UAAQ,OAAO,MAAM,iBAAiB;AACtC,SAAO;AACT;AAEA,SAAS,iBAAiB,MAQjB;AACP,QAAM,EAAE,SAAS,UAAU,WAAW,OAAO,UAAU,aAAa,IAAI;AACxE,MAAI,mBAAmB,KAAK;AAE5B,QAAM,SAAS,gBAAgB,OAAO;AACtC,QAAM,kBAAkB,QAAQ,WAAW,CAAC,gBAAgB,aAAa;AACzE,QAAM,kBAAkB,QAAQ,WAAW;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,gBAAsD;AAC1D,QAAM,eAAe,oBAAI,IAAY;AACrC,MAAI,YAAY;AAEhB,QAAM,kBAAkB,CAAC,iBAAiB,gBAAgB,SAAS,SAAS,UAAU,SAAS;AAE/F,QAAM,eAAe,YAA2B;AAC9C,QAAI,UAAW;AACf,gBAAY;AACZ,UAAM,eAAe,CAAC,GAAG,YAAY;AACrC,iBAAa,MAAM;AAEnB,QAAI;AACF,cAAQ,OAAO,MAAM;AAAA,UAAa,aAAa,MAAM;AAAA,CAAoB;AAEzE,cAAQ,OAAO,MAAM,uCAAuC;AAC5D,YAAM,cAAc,MAAMI,kBAAiB;AAAA,QACzC;AAAA,QACA,GAAI,QAAQ,WAAW,EAAE,SAAS,OAAO,QAAQ;AAAA,QACjD,GAAI,QAAQ,WAAW,EAAE,SAAS,OAAO,QAAQ;AAAA,QACjD,GAAI,QAAQ,oBAAoB,EAAE,kBAAkB,OAAO,iBAAiB;AAAA,QAC5E,GAAI,QAAQ,eAAe,EAAE,aAAa,OAAO,YAAY;AAAA,QAC7D,GAAI,QAAQ,gBAAgB,EAAE,cAAc,OAAO,aAAa;AAAA,MAClE,CAAC;AACD,MAAAF,gBAAcF,MAAK,UAAU,eAAe,GAAG,KAAK,UAAU,aAAa,MAAM,CAAC,GAAG,OAAO;AAE5F,YAAM,WAAW,uBAAuB,aAAa,cAAc,gBAAgB;AAEnF,UAAI,SAAS,SAAS,GAAG;AACvB,gBAAQ,OAAO,MAAM,yBAAyB,SAAS,KAAK,IAAI,CAAC;AAAA,CAAI;AACrE,cAAM,yBAAyB,aAAa,UAAU,SAAS,QAAQ;AAAA,MACzE,OAAO;AACL,gBAAQ,OAAO,MAAM,2CAA2C;AAAA,MAClE;AAEA,cAAQ,OAAO,MAAM,iCAAiC;AACtD,YAAM,iBAAiB,UAAU,WAAW,OAAO,QAAQ;AAE3D,yBAAmB;AACnB,cAAQ,OAAO,MAAM,gBAAgB;AACrC,mBAAa;AAAA,IACf,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,kBAAkB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AAAA,IAC7F,UAAE;AACA,kBAAY;AACZ,UAAI,aAAa,OAAO,GAAG;AACzB,qBAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,YAAoB,aAAkC;AAC1E,QAAI,CAAC,SAAU;AACf,UAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAC9C,eAAW,UAAU,iBAAiB;AACpC,UAAI,WAAW,WAAW,MAAM,EAAG;AAAA,IACrC;AACA,QAAI,CAAC,qBAAqB,YAAY,iBAAiB,eAAe,EAAG;AAEzE,iBAAa,IAAI,UAAU;AAC3B,QAAI,cAAe,cAAa,aAAa;AAC7C,oBAAgB,WAAW,MAAM;AAC/B,sBAAgB;AAChB,mBAAa;AAAA,IACf,GAAG,GAAG;AAAA,EACR;AAEA,MAAI;AACF,YAAQ,SAAS,EAAE,WAAW,KAAK,GAAG,YAAY;AAClD,YAAQ,OAAO,MAAM,iCAAiC,gBAAgB,KAAK,IAAI,CAAC;AAAA,CAAK;AAAA,EACvF,SAAS,KAAK;AACZ,YAAQ,OAAO;AAAA,MACb,6CAA6C,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA;AAAA,IAC/F;AAAA,EACF;AACF;AAEA,eAAe,oBACb,UACA,WAC8B;AAC9B,QAAM,eAAeA,MAAK,UAAU,eAAe;AACnD,QAAM,MAAMF,eAAa,cAAc,OAAO;AAC9C,QAAM,WAAW,KAAK,MAAM,GAAG;AAE/B,QAAM,UAAU,QAAQ,IAAI;AAC5B,QAAM,iBAAiB,OAAO,KAAK,SAAS,UAAU;AACtD,MAAI,eAAe,WAAW,EAAG,QAAO,CAAC;AAEzC,QAAM,gBAAgBE,MAAK,WAAW,YAAY;AAClD,QAAM,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAE9C,QAAM,WAAWL,8BAA6B,OAAO;AACrD,QAAM,aAAc,MAAM,cAAc,UAAU,OAAO,KAAM;AAE/D,MAAI,YAAY;AAChB,QAAM,WAAgC,CAAC;AACvC,QAAM,cAAuD,CAAC;AAE9D,aAAW,QAAQ,gBAAgB;AACjC,UAAM,aAAa,SAAS,WAAW,IAAI;AAC3C,QAAI,CAAC,WAAY;AAEjB,UAAM,WAAWC,UAAQ,SAAS,WAAW,QAAQ;AACrD,UAAM,OAAO,QAAQ,IAAI;AAGzB,QAAI;AACF,YAAM,YAAY,MAAM,0BAA0B,QAAQ;AAC1D,UAAI,WAAW;AACb,cAAM,kBACJ,UAAU,UAAU,WAAW,OAAO,OAAO,UAAU,SAAS,EAAE,CAAC;AACrE,YAAI,gBAAiB,aAAY,IAAI,IAAI;AAAA,MAC3C;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,YAAM,OAAO,MAAM,uBAAuB,UAAU,MAAM,UAAU;AACpE,YAAM,UAAUI,MAAK,eAAe,GAAG,IAAI,OAAO,GAAG,MAAM,OAAO;AAClE;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,OAAO;AAAA,QACb,0CAAqC,IAAI,WAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA;AAAA,MACjG;AACA,eAAS,KAAK;AAAA,QACZ,WAAW;AAAA,QACX,OAAO;AAAA,QACP,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,YAAYA,MAAK,eAAe,GAAG,IAAI,OAAO;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM;AAAA,IACJA,MAAK,UAAU,0BAA0B;AAAA,IACzC,KAAK,UAAU,aAAa,MAAM,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,UAAQ,OAAO;AAAA,IACb,6BAA6B,SAAS,SAAS,SAAS,SAAS,IAAI,KAAK,SAAS,MAAM,YAAY,EAAE;AAAA;AAAA,EACzG;AACA,SAAO;AACT;AAMA,SAAS,cAAc,SAAwB;AAC7C,UACG,QAAQ,OAAO,EACf;AAAA,IACC;AAAA,EAaF,EACC,OAAO,sBAAsB,uCAAuC,aAAa,EACjF,OAAO,uBAAuB,uCAAuC,kBAAkB,EACvF,OAAO,sBAAsB,oDAAoD,GAAG,EACpF,OAAO,uBAAuB,sCAAsC,EACpE,OAAO,mBAAmB,6DAA6D,EACvF,OAAO,kBAAkB,cAAc,gCAA2B,EAClE;AAAA,IACC,OAAO,SAOD;AACJ,UAAI;AACF,cAAM,WAAWJ,UAAQ,QAAQ,IAAI,GAAG,KAAK,KAAK;AAClD,cAAM,YAAYA,UAAQ,QAAQ,IAAI,GAAG,KAAK,MAAM;AAEpD,YAAI,CAACC,aAAW,QAAQ,GAAG;AACzB,gBAAM,IAAI;AAAA,YACR,8BAA8B,QAAQ;AAAA;AAAA,UACxC;AAAA,QACF;AAEA,cAAM,eAAeG,MAAK,UAAU,eAAe;AACnD,YAAI,CAACH,aAAW,YAAY,GAAG;AAC7B,gBAAM,IAAI;AAAA,YACR,yBAAyB,YAAY;AAAA;AAAA,UACvC;AAAA,QACF;AAEA,gBAAQ,OAAO,MAAM,sBAAsB,QAAQ;AAAA,CAAK;AAGxD,gBAAQ,OAAO,MAAM,8BAAyB;AAC9C,cAAM,WAAW,MAAM,oBAAoB,UAAU,SAAS;AAE9D,cAAM,eAAeE,4BAA2B,QAAQ,IAAI,CAAC;AAG7D,YAAI,gBAAgB,KAAK,SAASH,UAAQ,QAAQ,IAAI,GAAG,KAAK,MAAM,IAAI;AACxE,YAAI,kBAAkB,QAAW;AAC/B,gBAAM,WAAWA,UAAQ,QAAQ,IAAI,GAAG,wBAAwB;AAChE,cAAIC,aAAW,QAAQ,GAAG;AACxB,4BAAgB;AAAA,UAClB;AAAA,QACF;AAEA,cAAM,UAAU;AAAA,UACd;AAAA,UACA;AAAA,UACA,UAAU,KAAK;AAAA,UACf,GAAI,KAAK,eAAe,UAAa;AAAA,YACnC,gBAAgBD,UAAQ,QAAQ,IAAI,GAAG,KAAK,UAAU;AAAA,UACxD;AAAA,UACA,GAAI,kBAAkB,UAAa,EAAE,cAAc;AAAA,UACnD,OAAO,KAAK;AAAA,UACZ;AAAA,QACF,CAAC;AAED,cAAM,WAAW,KAAK,MAAME,eAAa,cAAc,OAAO,CAAC;AAC/D,cAAM,iBAAiB,OAAO,KAAK,SAAS,UAAU,EAAE;AACxD,cAAM,2BACJ,mBAAmB,IACf,IACAO,UAASL,MAAK,WAAW,YAAY,CAAC,EAAE,YAAY,IAClD,iBAAiB,SAAS,SAC1B;AACR,cAAM,eAAe,CAAC,GAAG,QAAQ;AACjC,YAAI,mBAAmB,GAAG;AACxB,uBAAa,KAAK;AAAA,YAChB,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SACE;AAAA,YACF,YAAY;AAAA,UACd,CAAC;AAAA,QACH,WAAW,6BAA6B,GAAG;AACzC,uBAAa,KAAK;AAAA,YAChB,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SACE;AAAA,YACF,YAAYA,MAAK,WAAW,YAAY;AAAA,UAC1C,CAAC;AAAA,QACH;AAEA,cAAM,cAAc,gBAAgB;AAAA,UAClC,SAAS;AAAA,UACT,QAAQ,aAAa,SAAS,IAAI,WAAW;AAAA,UAC7C,aAAa,CAAC,WAAWA,MAAK,WAAW,YAAY,CAAC;AAAA,UACtD,UAAU;AAAA,QACZ,CAAC;AACD,gBAAQ,OAAO,MAAM,mBAAmB,SAAS;AAAA,CAAI;AACrD,gBAAQ,OAAO,MAAM,uCAAuC,WAAW;AAAA,CAAI;AAC3E,gBAAQ,OAAO,MAAM,GAAG,SAAS;AAAA,CAAI;AACrC,YAAI,aAAa,SAAS,EAAG,SAAQ,KAAK,CAAC;AAAA,MAC7C,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAMA,SAAS,cAAc,SAAwB;AAC7C,UACG,QAAQ,OAAO,EACf;AAAA,IACC;AAAA,EAQF,EACC,OAAO,uBAAuB,qBAAqB,MAAM,EACzD,OAAO,oBAAoB,sBAAsB,kBAAkB,EACnE,OAAO,eAAe,2CAA2C,EACjE;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,EACF,EACC,OAAO,kBAAkB,2BAA2B,gCAAgC,EACpF,OAAO,sBAAsB,qCAAqC,GAAG,EACrE;AAAA,IACC,OAAO,SAOD;AACJ,UAAI;AAUF,YAASM,gBAAT,WAA8B;AAC5B,qBAAW,UAAU,YAAY;AAC/B,mBAAO,MAAM,kBAAkB;AAAA,UACjC;AAAA,QACF;AAJS,2BAAAA;AATT,cAAM,OAAO,OAAO,SAAS,KAAK,MAAM,EAAE;AAC1C,YAAI,OAAO,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO,OAAO;AAClD,gBAAM,IAAI,MAAM,iBAAiB,KAAK,IAAI,EAAE;AAAA,QAC9C;AAEA,cAAM,WAAWV,UAAQ,QAAQ,IAAI,GAAG,KAAK,GAAG;AAChD,cAAM,YAAY,KAAK,UAAU;AAEjC,cAAM,aAAa,oBAAI,IAAoB;AAO3C,YAAI,WAAW;AACb,gBAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,QAC3C;AAEA,YAAI,CAAC,aAAa,CAACC,aAAW,QAAQ,GAAG;AACvC,gBAAM,IAAI;AAAA,YACR,8BAA8B,QAAQ;AAAA;AAAA,UACxC;AAAA,QACF;AAEA,cAAM,SAAS,aAAa,CAAC,KAAK,QAAQ;AACxC,gBAAM,SAAS,IAAI,OAAO;AAC1B,gBAAM,UAAU,mBAAmB,OAAO,MAAM,GAAG,EAAE,CAAC,KAAK,GAAG;AAG9D,cAAI,aAAa,YAAY,iBAAiB;AAC5C,gBAAI,UAAU,KAAK;AAAA,cACjB,gBAAgB;AAAA,cAChB,iBAAiB;AAAA,cACjB,YAAY;AAAA,cACZ,+BAA+B;AAAA,YACjC,CAAC;AACD,gBAAI,MAAM,qBAAqB;AAC/B,uBAAW,IAAI,GAAG;AAClB,gBAAI,GAAG,SAAS,MAAM,WAAW,OAAO,GAAG,CAAC;AAC5C;AAAA,UACF;AAEA,gBAAM,WAAWG;AAAA,YACf;AAAA,YACA,QAAQ,SAAS,GAAG,IAAI,GAAG,OAAO,eAAe;AAAA,UACnD;AAEA,cAAI,CAAC,SAAS,WAAW,QAAQ,GAAG;AAClC,gBAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,gBAAI,IAAI,WAAW;AACnB;AAAA,UACF;AAEA,cAAIH,aAAW,QAAQ,KAAKQ,UAAS,QAAQ,EAAE,OAAO,GAAG;AACvD,kBAAM,MAAM,QAAQ,QAAQ,EAAE,YAAY;AAC1C,kBAAM,cAAc,WAAW,GAAG,KAAK;AAEvC,gBAAI,aAAa,QAAQ,SAAS;AAChC,oBAAM,OAAO,uBAAuBP,eAAa,UAAU,OAAO,CAAC;AACnE,kBAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,kBAAI,IAAI,IAAI;AACZ;AAAA,YACF;AAEA,gBAAI,UAAU,KAAK,EAAE,gBAAgB,YAAY,CAAC;AAClD,6BAAiB,QAAQ,EAAE,KAAK,GAAG;AACnC;AAAA,UACF;AAEA,gBAAM,WAAW,GAAG,QAAQ;AAC5B,cAAID,aAAW,QAAQ,KAAKQ,UAAS,QAAQ,EAAE,OAAO,GAAG;AACvD,gBAAI,WAAW;AACb,oBAAM,OAAO,uBAAuBP,eAAa,UAAU,OAAO,CAAC;AACnE,kBAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,kBAAI,IAAI,IAAI;AACZ;AAAA,YACF;AACA,gBAAI,UAAU,KAAK,EAAE,gBAAgB,2BAA2B,CAAC;AACjE,6BAAiB,QAAQ,EAAE,KAAK,GAAG;AACnC;AAAA,UACF;AAEA,cAAI,UAAU,KAAK,EAAE,gBAAgB,aAAa,CAAC;AACnD,cAAI,IAAI,cAAc,OAAO,EAAE;AAAA,QACjC,CAAC;AAED,eAAO,OAAO,MAAM,MAAM;AACxB,kBAAQ,OAAO,MAAM,0CAA0C,IAAI;AAAA,CAAI;AACvE,kBAAQ,OAAO,MAAM,WAAW,QAAQ;AAAA,CAAI;AAC5C,cAAI,WAAW;AACb,oBAAQ,OAAO;AAAA,cACb;AAAA,YACF;AAAA,UACF;AACA,kBAAQ,OAAO,MAAM,yBAAyB;AAAA,QAChD,CAAC;AAED,eAAO,GAAG,SAAS,CAAC,QAA+B;AACjD,cAAI,IAAI,SAAS,cAAc;AAC7B,oBAAQ,OAAO,MAAM,eAAe,IAAI;AAAA,CAAuB;AAAA,UACjE,OAAO;AACL,oBAAQ,OAAO,MAAM,iBAAiB,IAAI,OAAO;AAAA,CAAI;AAAA,UACvD;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB,CAAC;AAED,YAAI,WAAW;AACb,gBAAM,UAAU,QAAQ,IAAI;AAC5B,gBAAM,WAAWF,UAAQ,SAAS,KAAK,KAAK;AAE5C,gBAAM,kBAAkB,MAAM;AAAA,YAC5B;AAAA,YACA;AAAA,YACA;AAAA,YACA,KAAK;AAAA,YACL,KAAK;AAAA,UACP;AAEA,UAAAU,cAAa;AAEb,2BAAiB;AAAA,YACf;AAAA,YACA;AAAA,YACA,WAAW;AAAA,YACX,OAAO,KAAK;AAAA,YACZ,UAAU,KAAK;AAAA,YACf,kBAAkB;AAAA,YAClB,cAAAA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,GAAG,sBAAsB,GAAG,CAAC;AAAA,CAAI;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAUO,SAAS,oBAA6B;AAC3C,QAAM,UAAU,IAAIC,SAAQ,MAAM,EAAE;AAAA,IAClC;AAAA,EAWF;AAEA,gBAAc,OAAO;AACrB,gBAAc,OAAO;AAErB,SAAO;AACT;;;AEz7BA,SAAS,cAAAC,cAAY,gBAAAC,sBAAoB;AACzC,SAAS,WAAAC,iBAAe;AACxB;AAAA,EACE,sBAAAC;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,EAEA;AAAA,EACA;AAAA,OACK;AACP,SAAS,WAAAC,iBAAe;;;ACSxB,SAAS,cAAAC,cAAY,gBAAAC,gBAAc,iBAAAC,uBAAqB;AACxD,SAAS,WAAAC,iBAAe;AACxB;AAAA,EAEE,oBAAAC;AAAA,EAEA,iBAAAC;AAAA,OACK;AAUP,IAAM,sBAAsB;AAgCrB,SAAS,eAAe,YAAgC;AAC7D,QAAM,UAAUC,UAAQ,QAAQ,IAAI,GAAG,UAAU;AACjD,MAAI,CAACC,aAAW,OAAO,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,uCAAuC,OAAO;AAAA;AAAA;AAAA,IAGhD;AAAA,EACF;AACA,QAAM,MAAMC,eAAa,SAAS,OAAO;AACzC,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,mDAAmD,OAAO,GAAG,CAAC,EAAE;AAAA,EAClF;AACA,MAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAC1E,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAUA,SAAS,oBACP,UAC0D;AAC1D,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,MAAM,SAAS,QAAQ,EAAG,QAAO;AACrC,MAAI,MAAM,SAAS,OAAO,KAAK,UAAU,gBAAgB,UAAU,UAAU,UAAU;AACrF,WAAO;AACT,MACE,MAAM,SAAS,SAAS,KACxB,MAAM,SAAS,QAAQ,KACvB,UAAU,SACV,UAAU,WACV,UAAU,YACV,UAAU,SACV,UAAU,WACV,UAAU,YACV,UAAU;AAEV,WAAO;AACT,MAAI,MAAM,SAAS,QAAQ,EAAG,QAAO;AACrC,MACE,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,QAAQ,KACvB,UAAU,mBACV,UAAU;AAEV,WAAO;AACT,SAAO;AACT;AAYA,SAAS,qBACP,OACmF;AACnF,QAAM,OAAwC;AAAA,IAC5C,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,EAAE;AAAA,IAC5D,SAAS,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,EAAE;AAAA,IAC9D,YAAY,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,EAAE;AAAA,IACjE,QAAQ,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,EAAE;AAAA,IAC7D,QAAQ,EAAE,OAAO,GAAG,UAAU,GAAG,WAAW,GAAG,YAAY,EAAE;AAAA,EAC/D;AAEA,aAAW,UAAU,OAAO,OAAO,MAAM,UAAU,GAAG;AACpD,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAClE,YAAM,MAAM,oBAAoB,QAAQ;AACxC,YAAM,UAAU,KAAK,GAAG;AACxB,UAAI,YAAY,OAAW;AAC3B,cAAQ;AACR,UAAI,OAAO,WAAW,aAAa;AACjC,gBAAQ;AAAA,MACV,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAGA,aAAW,WAAW,OAAO,OAAO,IAAI,GAAG;AACzC,YAAQ,aAAa,QAAQ,UAAU,IAAI,IAAI,QAAQ,WAAW,QAAQ;AAAA,EAC5E;AAEA,SAAO;AACT;AAMA,SAAS,iBAAiB,OAAoB,QAAQ,IAAgB;AACpE,QAAM,YAAwB,CAAC;AAG/B,QAAM,mBAAmB,OAAO,QAAQ,MAAM,UAAU,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,IACjF;AAAA,IACA;AAAA,IACA,gBAAgB,OAAO;AAAA,EACzB,EAAE;AACF,mBAAiB,KAAK,CAAC,GAAG,MAAM,EAAE,iBAAiB,EAAE,cAAc;AAEnE,aAAW,EAAE,MAAM,QAAQ,eAAe,KAAK,kBAAkB;AAC/D,QAAI,mBAAmB,EAAG;AAE1B,eAAW,CAAC,UAAU,MAAM,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAClE,UAAI,OAAO,WAAW,aAAc;AAEpC,gBAAU,KAAK;AAAA,QACb,WAAW;AAAA,QACX;AAAA,QACA,OAAO,OAAO;AAAA,QACd,cAAc,OAAO,SAAS,SAAS;AAAA,QACvC,cAAc,OAAO,SAAS,SAAS;AAAA,QACvC;AAAA,MACF,CAAC;AAED,UAAI,UAAU,UAAU,MAAO;AAAA,IACjC;AAEA,QAAI,UAAU,UAAU,MAAO;AAAA,EACjC;AAEA,SAAO;AACT;AAMA,SAAS,UAAU,GAAmB;AACpC,SAAO,GAAG,KAAK,MAAM,IAAI,GAAG,CAAC;AAC/B;AAEA,SAAS,SAAS,GAAW,KAAqB;AAChD,SAAO,EAAE,SAAS,MAAM,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AACtD;AAKO,SAAS,uBAAuB,OAAoB,WAA4B;AACrF,QAAM,MAAM,KAAK,MAAM,MAAM,sBAAsB,GAAG;AACtD,QAAM,QAAkB,CAAC;AAEzB,QAAM,iBACJ,cAAc,SACV,OAAO,YACL,mBACA,4BAAuB,SAAS,OAClC;AAEN,QAAM,KAAK,6BAA6B,GAAG,IAAI,cAAc,EAAE;AAC/D,MAAI,MAAM,oBAAoB,GAAG;AAC/B,UAAM;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACA,QAAM,KAAK,EAAE;AAGb,QAAM,OAAO,qBAAqB,KAAK;AACvC,QAAM,aAAa,OAAO,QAAQ,IAAI,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC;AAErE,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK,cAAc;AACzB,UAAM,WAAW,KAAK,IAAI,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;AAC9D,eAAW,CAAC,KAAK,OAAO,KAAK,YAAY;AACvC,YAAM,QAAQ,IAAI,OAAO,QAAQ;AACjC,YAAM;AAAA,QACJ,KAAK,KAAK,KAAK,UAAU,QAAQ,UAAU,EAAE,SAAS,CAAC,CAAC,KAAK,QAAQ,SAAS,oBAAoB,QAAQ,cAAc,IAAI,MAAM,EAAE;AAAA,MACtI;AAAA,IACF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAGA,QAAM,YAAY,iBAAiB,KAAK;AACxC,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,KAAK,6CAA6C;AAGxD,UAAM,YAAY,KAAK,IAAI,GAAG,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,UAAU,MAAM,CAAC;AACzE,UAAM,YAAY,KAAK,IAAI,GAAG,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC;AACxE,UAAM,WAAW,KAAK,IAAI,GAAG,GAAG,UAAU,IAAI,CAAC,MAAM,SAAS,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC;AAElF,eAAW,YAAY,WAAW;AAChC,YAAM,OAAO,SAAS,UAAU,OAAO,SAAS;AAChD,YAAM,OAAO,SAAS,SAAS,OAAO,SAAS;AAC/C,YAAM,MAAM,SAAS,SAAS,OAAO,EAAE,EAAE,OAAO,QAAQ;AACxD,YAAM,UAAU,GAAG,SAAS,YAAY,KAAK,SAAS,SAAS,cAAc,EAAE,CAAC;AAChF,YAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAK,GAAG,qBAAgB,OAAO,EAAE;AAAA,IAChE;AAAA,EACF,OAAO;AACL,UAAM,KAAK,0CAAmC;AAAA,EAChD;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AASO,SAAS,mBAAmB,WAA0B;AAC3D,YACG,QAAQ,YAAY,EACpB;AAAA,IACC;AAAA,EAkBF,EACC,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,mBAAmB,4CAA4C,mBAAmB,GAAG,EAC5F;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC,OAAO,mBAAmB,kEAAkE,EAC5F,OAAO,kBAAkB,oDAAoD,EAC7E;AAAA,IACC,CAAC,SAMK;AACJ,UAAI;AACF,cAAM,gBAAgB,qBAAqB,KAAK,IAAI;AACpD,cAAM,EAAE,OAAO,IAAI,WAAW,aAAa;AAC3C,cAAM,WAAW,IAAIC,eAAc,MAAM;AACzC,cAAM,SAAS,IAAIC,kBAAiB,QAAQ;AAE5C,cAAM,aAAa,KAAK,UAAU;AAClC,cAAM,aAAa,eAAe,UAAU;AAG5C,cAAM,eAAe,oBAAI,IAA4B;AACrD,mBAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,UAAU,GAAG;AACvD,uBAAa,IAAI,MAAM,MAAM;AAAA,QAC/B;AAEA,YAAI,aAAa,SAAS,GAAG;AAC3B,kBAAQ,OAAO,MAAM,kDAAkD,UAAU;AAAA,CAAI;AAAA,QACvF;AAEA,cAAM,QAAQ,OAAO,WAAW,YAAY;AAC5C,cAAM,YACJ,KAAK,cAAc,SAAY,OAAO,SAAS,KAAK,WAAW,EAAE,IAAI;AACvE,cAAM,WAAgC,CAAC;AACvC,YAAI,MAAM,oBAAoB,GAAG;AAC/B,mBAAS,KAAK;AAAA,YACZ,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,uCAAuC,UAAU;AAAA,YAC1D,YAAY;AAAA,UACd,CAAC;AAAA,QACH,WACE,cAAc,UACd,KAAK,MAAM,MAAM,sBAAsB,GAAG,IAAI,WAC9C;AACA,mBAAS,KAAK;AAAA,YACZ,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,cAAc,KAAK,MAAM,MAAM,sBAAsB,GAAG,CAAC,wBAAwB,SAAS;AAAA,YACnG,YAAY,KAAK,OAAO;AAAA,UAC1B,CAAC;AAAA,QACH;AAGA,YAAI,KAAK,QAAQ,QAAW;AAC1B,gBAAM,UAAUJ,UAAQ,QAAQ,IAAI,GAAG,KAAK,GAAG;AAC/C,UAAAK,gBAAc,SAAS,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAC9D,kBAAQ,OAAO,MAAM,gCAAgC,OAAO;AAAA,CAAI;AAAA,QAClE;AAEA,cAAM,UAAU,KAAK,WAAW,UAAW,KAAK,WAAW,UAAU,CAAC,MAAM;AAE5E,YAAI,SAAS;AACX,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QAC5D,OAAO;AACL,kBAAQ,OAAO,MAAM,GAAG,uBAAuB,OAAO,SAAS,CAAC;AAAA,CAAI;AAAA,QACtE;AAEA,cAAM,cAAc,gBAAgB;AAAA,UAClC,SAAS;AAAA,UACT,QAAQ,SAAS,SAAS,IAAI,WAAW;AAAA,UACzC,aAAa,CAAC,KAAK,OAAO,sCAAsC,UAAU;AAAA,UAC1E,YAAY;AAAA,YACV,mBAAmB,MAAM;AAAA,YACzB,oBAAoB,MAAM;AAAA,YAC1B,qBAAqB,MAAM;AAAA,YAC3B,OAAO,KAAK,MAAM,MAAM,sBAAsB,GAAG;AAAA,YACjD;AAAA,UACF;AAAA,UACA;AAAA,QACF,CAAC;AACD,gBAAQ,OAAO,MAAM,yCAAyC,WAAW;AAAA,CAAI;AAE7E,YAAI,SAAS,SAAS,GAAG;AACvB,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;;;ACrZA,SAAS,cAAAC,cAAY,gBAAAC,gBAAc,iBAAAC,uBAAqB;AACxD,SAAS,WAAAC,iBAAe;AACxB;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAAC;AAAA,OACK;AACP,SAAS,WAAAC,iBAAe;AAMxB,IAAM,qBAAqB;AAC3B,IAAM,cAAc;AAEpB,IAAM,oBAAoC,CAAC,OAAO,MAAM,QAAQ,YAAY,aAAa,OAAO;AAczF,SAASC,sBAAqB,UAA2B;AAC9D,MAAI,aAAa,QAAW;AAC1B,WAAOH,UAAQ,QAAQ,IAAI,GAAG,QAAQ;AAAA,EACxC;AAEA,QAAM,aAAaA,UAAQ,QAAQ,IAAI,GAAG,WAAW;AACrD,MAAIH,aAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,MAAMC,eAAa,YAAY,OAAO;AAC5C,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UACE,OAAO,WAAW,YAClB,WAAW,QACX,YAAY,UACZ,OAAQ,OAAgC,WAAW,YAClD,OAA2C,WAAW,QACvD,OAAQ,OAA2C,QAAQ,SAAS,UACpE;AACA,cAAM,OAAQ,OAAwC,OAAO;AAC7D,eAAOE,UAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,MACpC;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAOA,UAAQ,QAAQ,IAAI,GAAG,kBAAkB;AAClD;AAcO,SAAS,4BAAqC;AACnD,SAAO,IAAIE,UAAQ,QAAQ,EACxB;AAAA,IACC;AAAA,EAcF,EACC,eAAe,kBAAkB,kBAAkB,kBAAkB,KAAK,IAAI,CAAC,EAAE,EACjF,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,gBAAgB,wCAAwC,EAC/D,OAAO,qBAAqB,oDAAoD,EAChF,OAAO,yBAAyB,8CAA8C,EAC9E;AAAA,IACC;AAAA,IACA;AAAA,EACF,EACC;AAAA,IACC,CAAC,SAOK;AAEJ,UAAI,CAAC,kBAAkB,SAAS,KAAK,MAAsB,GAAG;AAE5D,cAAM,iBAAyC;AAAA,UAC7C,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,UACZ,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,IAAI;AAAA,QACN;AACA,cAAM,OAAO,eAAe,KAAK,OAAO,YAAY,CAAC;AACrD,gBAAQ,OAAO;AAAA,UACb,8BAA8B,KAAK,MAAM;AAAA,qBACjB,kBAAkB,KAAK,IAAI,CAAC;AAAA,KACjD,OAAO,iBAAiB,IAAI;AAAA,IAAS;AAAA,QAC1C;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,SAAS,KAAK;AAEpB,UAAI;AACF,cAAM,WAAWC,sBAAqB,KAAK,IAAI;AAE/C,YAAI,CAACN,aAAW,QAAQ,GAAG;AACzB,gBAAM,IAAI;AAAA,YACR,2BAA2B,QAAQ;AAAA;AAAA,UAErC;AAAA,QACF;AAEA,cAAM,MAAMC,eAAa,UAAU,OAAO;AAC1C,cAAM,EAAE,QAAQ,QAAQ,IAAI,mBAAmB,GAAG;AAGlD,YAAI;AAEJ,YAAI,KAAK,UAAU,QAAW;AAE5B,cAAI,CAAC,QAAQ,UAAU,EAAE,KAAK,SAAS,QAAQ,SAAS;AACtD,kBAAM,YAAY,QAAQ,SAAS,OAAO,KAAK,QAAQ,MAAM,EAAE,KAAK,IAAI,IAAI;AAC5E,kBAAM,IAAI;AAAA,cACR,UAAU,KAAK,KAAK;AAAA,oBACG,SAAS;AAAA,YAClC;AAAA,UACF;AAGA,gBAAM,eAAe,IAAIG,eAAc,MAAM;AAC7C,gBAAM,gBAAgB,cAAc;AAAA,YAClC;AAAA,YACA;AAAA,UACF;AACA,gBAAM,aAAa,cAAc,WAAW;AAE5C,cAAI,CAAC,WAAW,SAAS,KAAK,KAAK,GAAG;AACpC,kBAAM,IAAI;AAAA,cACR,UAAU,KAAK,KAAK;AAAA,oBACG,WAAW,KAAK,IAAI,CAAC;AAAA,YAC9C;AAAA,UACF;AAIA,gBAAM,eAAe,cAAc,kBAAkB,KAAK,KAAK;AAC/D,gBAAM,cAAc,oBAAI,IAAoB;AAC5C,qBAAW,eAAe,cAAc;AACtC,kBAAM,YAAY,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,YAAY,IAAI;AAChE,gBACE,cAAc,UACd,YAAY,kBAAkB,UAAU,eACxC;AACA,0BAAY,IAAI,YAAY,MAAM,YAAY,aAAa;AAAA,YAC7D;AAAA,UACF;AAEA,sBAAY,oBAAI,IAAI,CAAC,CAAC,KAAK,OAAO,WAAW,CAAC,CAAC;AAAA,QACjD;AAEA,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAAA,UAC1C,QAAQ,KAAK;AAAA,UACb,cAAc,KAAK;AAAA,UACnB,QAAQ;AAAA,QACV,CAAC;AAED,YAAI,KAAK,QAAQ,QAAW;AAC1B,gBAAM,UAAUD,UAAQ,QAAQ,IAAI,GAAG,KAAK,GAAG;AAC/C,UAAAD,gBAAc,SAAS,QAAQ,OAAO;AACtC,kBAAQ,OAAO,MAAM,YAAY,OAAO,MAAM,cAAc,OAAO;AAAA,CAAI;AAAA,QACzE,OAAO;AACL,kBAAQ,OAAO,MAAM,MAAM;AAE3B,cAAI,CAAC,OAAO,SAAS,IAAI,GAAG;AAC1B,oBAAQ,OAAO,MAAM,IAAI;AAAA,UAC3B;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;;;ACrNA;AAAA,EACE,oBAAAK;AAAA,EACA;AAAA,EAEA,iBAAAC;AAAA,OACK;AAUP,IAAMC,uBAAsB;AAM5B,IAAM,iBAAyC;AAAA,EAC7C,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,aAAa;AACf;AAcO,SAAS,mBAAmB,QAA8B;AAC/D,QAAM,QAAkB,CAAC;AAEzB,QAAM,iBAAiB,OAAO,aAAa,OAAO,WAAW,aAAQ,OAAO,QAAQ,KAAK;AACzF,QAAM,KAAK,UAAU,OAAO,SAAS,MAAM,OAAO,QAAQ,IAAI,cAAc,EAAE;AAE9E,MAAI,OAAO,WAAW,WAAW,GAAG;AAClC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,qCAAqC;AAChD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,QAAM,KAAK,EAAE;AAEb,QAAM,YAAY,KAAK,IAAI,GAAG,GAAG,OAAO,WAAW,IAAI,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC;AAC5E,QAAM,YAAY,KAAK;AAAA,IACrB;AAAA,IACA,GAAG,OAAO,WAAW,QAAQ,CAAC,MAAM,EAAE,mBAAmB,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAAA,EAC/E;AAEA,aAAW,QAAQ,OAAO,YAAY;AACpC,eAAW,YAAY,KAAK,oBAAoB;AAC9C,YAAM,OAAO,KAAK,KAAK,OAAO,SAAS;AACvC,YAAM,OAAO,SAAS,OAAO,SAAS;AACtC,YAAMC,gBAAe,eAAe,KAAK,QAAQ,KAAK;AACtD,YAAM,KAAK,KAAK,IAAI,KAAK,IAAI,KAAKA,aAAY,IAAI,KAAK,QAAQ,EAAE;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AAEb,QAAM,aAAa,GAAG,OAAO,sBAAsB,aAAa,OAAO,2BAA2B,IAAI,MAAM,EAAE;AAC9G,QAAM,eAAe,eAAe,OAAO,eAAe,KAAK;AAE/D,QAAM;AAAA,IACJ,GAAG,UAAU,sCAAiC,YAAY,IAAI,OAAO,eAAe;AAAA,EACtF;AAEA,MAAI,OAAO,eAAe,QAAW;AACnC,UAAM,KAAK,wBAAmB,OAAO,WAAW,QAAQ,CAAC,CAAC,EAAE;AAAA,EAC9D;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAMO,SAAS,oBAAoB,QAA8B;AAChE,MAAI,OAAO,WAAW,WAAW,GAAG;AAClC,WAAO,kCAAkC,OAAO,SAAS;AAAA,EAC3D;AACA,QAAM,QAAQ,OAAO,WAAW;AAAA,IAC9B,CAAC,MACC,GAAG,EAAE,IAAI,KAAK,EAAE,mBAAmB,MAAM,WAAW,EAAE,mBAAmB,WAAW,IAAI,MAAM,EAAE;AAAA,EACpG;AACA,SAAO,UAAK,MAAM,KAAK,IAAI,CAAC;AAC9B;AASO,SAAS,eAAe,WAA0B;AACvD,YACG,QAAQ,eAAe,EACvB;AAAA,IACC;AAAA,EAOF,EACC,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,mBAAmB,4CAA4CD,oBAAmB,GAAG,EAC5F,OAAO,uBAAuB,gEAA2D,EACzF,OAAO,kBAAkB,oDAAoD,EAC7E;AAAA,IACC,CACE,WACA,SAMG;AACH,UAAI;AACF,cAAM,gBAAgB,qBAAqB,KAAK,IAAI;AACpD,cAAM,EAAE,OAAO,IAAI,WAAW,aAAa;AAC3C,cAAM,WAAW,IAAIE,eAAc,MAAM;AACzC,cAAM,SAAS,IAAIC,kBAAiB,QAAQ;AAE5C,cAAM,aAAa,KAAK,UAAUH;AAClC,cAAM,aAAa,eAAe,UAAU;AAG5C,cAAM,eAAe,IAAI,IAAI,OAAO,QAAQ,UAAU,CAAC;AACvD,cAAM,cAAc,OAAO,WAAW,YAAY;AAClD,cAAM,oBAAoB,IAAI,IAAI,OAAO,QAAQ,YAAY,UAAU,CAAC;AAExE,cAAM,WAAW,IAAI,eAAe,UAAU,iBAAiB;AAG/D,cAAM,eAAe,SAAS,QAAQ,SAAS;AAC/C,cAAM,WAAW,KAAK,YAAY;AAElC,cAAM,SAAS,SAAS,SAAS,WAAW,QAAQ;AAEpD,cAAM,UAAU,KAAK,WAAW,UAAW,KAAK,WAAW,UAAU,CAAC,MAAM;AAE5E,YAAI,SAAS;AACX,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QAC7D,OAAO;AAEL,kBAAQ,OAAO,MAAM,GAAG,mBAAmB,MAAM,CAAC;AAAA,CAAI;AACtD,cAAI,MAAM,GAAG;AACX,oBAAQ,OAAO,MAAM;AAAA,EAAK,oBAAoB,MAAM,CAAC;AAAA,CAAI;AAAA,UAC3D;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;;;ACvLA,SAAS,cAAAI,cAAY,gBAAAC,gBAAc,iBAAAC,uBAAqB;AACxD,SAAS,WAAAC,iBAAe;AAUxB,IAAMC,sBAAqB;AAC3B,IAAMC,eAAc;AAcpB,SAAS,kBAAkB,UAA2B;AACpD,MAAI,aAAa,QAAW;AAC1B,WAAOC,UAAQ,QAAQ,IAAI,GAAG,QAAQ;AAAA,EACxC;AAEA,QAAM,aAAaA,UAAQ,QAAQ,IAAI,GAAGD,YAAW;AACrD,MAAIE,aAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,MAAMC,eAAa,YAAY,OAAO;AAC5C,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UACE,OAAO,WAAW,YAClB,WAAW,QACX,YAAY,UACZ,OAAQ,OAAgC,WAAW,YAClD,OAA2C,WAAW,QACvD,OAAQ,OAA2C,QAAQ,SAAS,UACpE;AACA,cAAM,OAAQ,OAAwC,OAAO;AAC7D,eAAOF,UAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,MACpC;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAOA,UAAQ,QAAQ,IAAI,GAAGF,mBAAkB;AAClD;AAMA,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,iBAAiB;AACvB,IAAM,YAAY;AAClB,IAAM,kBAAkB;AACxB,IAAM,YAAY;AAElB,SAAS,eAAe,OAAuB;AAC7C,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,aAAa,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,EAAG,QAAO;AACxD,MAAI,YAAY,KAAK,CAAC,EAAG,QAAO;AAChC,MAAI,aAAa,KAAK,CAAC,EAAG,QAAO;AACjC,MAAI,eAAe,KAAK,CAAC,EAAG,QAAO;AACnC,MAAI,gBAAgB,KAAK,CAAC,EAAG,QAAO;AACpC,MAAI,UAAU,KAAK,CAAC,EAAG,QAAO;AAC9B,MAAI,UAAU,KAAK,CAAC,EAAG,QAAO;AAC9B,SAAO;AACT;AAMA,SAAS,eACP,MACA,UACA,OACA,MACM;AACN,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK;AAC5C,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,QAAQ,OAAW;AACvB,QAAI,EAAE,OAAO,SAAS,OAAO,KAAK,GAAG,MAAM,YAAY,KAAK,GAAG,MAAM,MAAM;AACzE,WAAK,GAAG,IAAI,CAAC;AAAA,IACf;AACA,WAAO,KAAK,GAAG;AAAA,EACjB;AACA,QAAM,OAAO,SAAS,SAAS,SAAS,CAAC;AACzC,MAAI,SAAS,OAAW;AACxB,OAAK,IAAI,IAAI,EAAE,OAAO,KAAK;AAC7B;AAMA,SAAS,iBAAiB,KAAa,WAA2B;AAChE,MAAI,QAAQ;AACZ,MAAI,MAAM;AACV,WAAS,IAAI,WAAW,IAAI,IAAI,QAAQ,KAAK;AAC3C,QAAI,IAAI,CAAC,MAAM,IAAK;AAAA,aACX,IAAI,CAAC,MAAM,KAAK;AACvB;AACA,UAAI,UAAU,GAAG;AACf,cAAM;AACN;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO,IAAI,MAAM,YAAY,GAAG,GAAG;AACrC;AAYA,SAAS,kBAAkB,KAAyB;AAClD,QAAM,SAAqB,CAAC;AAC5B,QAAM,UAAU;AAEhB,MAAI,QAAgC,QAAQ,KAAK,GAAG;AACpD,SAAO,UAAU,MAAM;AACrB,UAAM,WAAW,MAAM,CAAC;AACxB,UAAM,WAAW,IAAI,QAAQ,KAAK,MAAM,KAAK;AAC7C,QAAI,aAAa,IAAI;AACnB,cAAQ,QAAQ,KAAK,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,OAAO,iBAAiB,KAAK,QAAQ;AAE3C,QAAI;AACJ,QAAI,SAAS,SAAS,qBAAqB,EAAG,SAAQ;AAAA,aAC7C,SAAS,SAAS,OAAO,EAAG,SAAQ;AAAA,aACpC,SAAS,SAAS,QAAQ,EAAG,SAAQ;AAAA,QACzC,SAAQ;AAEb,WAAO,KAAK,EAAE,OAAO,KAAK,CAAC;AAC3B,YAAQ,QAAQ,KAAK,GAAG;AAAA,EAC1B;AAEA,SAAO;AACT;AAMA,SAAS,oBAAoB,MAAsD;AACjF,QAAM,UAAkD,CAAC;AACzD,aAAW,KAAK,KAAK,SAAS,UAAU,GAAG;AACzC,UAAM,OAAO,EAAE,CAAC;AAChB,UAAM,QAAQ,EAAE,CAAC,GAAG,KAAK;AACzB,QAAI,SAAS,UAAa,UAAU,UAAa,MAAM,WAAW,EAAG;AACrE,QAAI,MAAM,WAAW,MAAM,KAAK,MAAM,WAAW,OAAO,EAAG;AAC3D,YAAQ,KAAK,EAAE,MAAM,MAAM,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAaA,SAAS,2BAA2B,cAAyD;AAC3F,QAAM,aAAa,aAAa;AAAA,IAC9B,CAAC,MAAM,EAAE,SAAS,2BAA2B,EAAE,SAAS;AAAA,EAC1D;AACA,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,QAAM,SAAkC,CAAC;AACzC,QAAM,SAAiD,CAAC;AACxD,MAAI,QAAQ;AAEZ,aAAW,UAAU,YAAY;AAC/B,QAAI;AACF,UAAI,OAAO,KAAK,SAAS,UAAU,KAAK,OAAO,KAAK,SAAS,OAAO,EAAG;AAEvE,YAAM,MAAMI,eAAa,OAAO,MAAM,OAAO;AAC7C,YAAM,SAAS,kBAAkB,GAAG;AAEpC,iBAAW,SAAS,QAAQ;AAC1B,cAAM,OAAO,oBAAoB,MAAM,IAAI;AAE3C,mBAAW,EAAE,MAAM,MAAM,KAAK,MAAM;AAClC,gBAAM,WAAW,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC/C,cAAI,SAAS,WAAW,EAAG;AAE3B,cAAI,MAAM,UAAU,UAAU,MAAM,UAAU,SAAS;AACrD,kBAAM,OAAO,eAAe,KAAK;AACjC,2BAAe,QAAQ,UAAU,OAAO,IAAI;AAC5C,oBAAQ;AAAA,UACV,OAAO;AACL,kBAAM,YAAY,MAAM;AACxB,gBAAI,CAAC,OAAO,SAAS,EAAG,QAAO,SAAS,IAAI,CAAC;AAC7C,kBAAM,OAAO,SAAS,KAAK,GAAG;AAC9B,mBAAO,SAAS,EAAE,IAAI,IAAI;AAC1B,oBAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,QAAQ,EAAE,QAAQ,OAAO,IAAI;AACtC;AAMO,SAAS,mBAAmB,WAA0B;AAC3D,YACG,QAAQ,MAAM,EACd;AAAA,IACC;AAAA,EAcF,EACC,OAAO,iBAAiB,mDAAmD,EAC3E,OAAO,WAAW,iCAAiC,KAAK,EACxD,OAAO,CAAC,SAA4C;AACnD,QAAI;AACF,YAAM,UAAU,kBAAkB,KAAK,IAAI;AAE3C,UAAID,aAAW,OAAO,KAAK,CAAC,KAAK,OAAO;AACtC,gBAAQ,OAAO;AAAA,UACb,gCAAgC,OAAO;AAAA;AAAA;AAAA,QACzC;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,UAAU,QAAQ,IAAI;AAC5B,YAAM,WAAW,cAAc,OAAO;AAEtC,YAAM,iBAAiB,sBAAsB,SAAS,YAAY;AAClE,YAAM,YAAY,2BAA2B,SAAS,YAAY;AAElE,YAAM,eAAwC,CAAC;AAC/C,YAAM,eAAuD,CAAC;AAE9D,UAAI,mBAAmB,MAAM;AAC3B,eAAO,OAAO,cAAc,cAAc;AAAA,MAC5C;AACA,UAAI,cAAc,MAAM;AACtB,mBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,MAAM,GAAG;AAC3D,cAAI,EAAE,OAAO,eAAe;AAC1B,yBAAa,GAAG,IAAI;AAAA,UACtB;AAAA,QACF;AACA,mBAAW,CAAC,WAAW,SAAS,KAAK,OAAO,QAAQ,UAAU,MAAM,GAAG;AACrE,cAAI,CAAC,aAAa,SAAS,EAAG,cAAa,SAAS,IAAI,CAAC;AACzD,iBAAO,OAAO,aAAa,SAAS,GAAG,SAAS;AAAA,QAClD;AAAA,MACF;AAEA,YAAM,YAAqC;AAAA,QACzC,SACE;AAAA,QACF,SAAS;AAAA,QACT,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,cAAa,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,QACpD;AAAA,QACA,QAAQ;AAAA,MACV;AAEA,UAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACxC,kBAAU,SAAS;AAAA,MACrB;AAEA,MAAAE,gBAAc,SAAS,GAAG,KAAK,UAAU,WAAW,MAAM,CAAC,CAAC;AAAA,CAAI;AAGhE,YAAM,kBAAkB,OAAO,KAAK,YAAY,EAAE;AAClD,YAAM,aAAa,OAAO,KAAK,YAAY;AAE3C,UAAI,SAAS,aAAa,SAAS,GAAG;AACpC,gBAAQ,OAAO,MAAM,2BAA2B;AAChD,mBAAW,UAAU,SAAS,cAAc;AAC1C,kBAAQ,OAAO,MAAM,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI;AAAA,CAAI;AAAA,QAC3D;AACA,gBAAQ,OAAO,MAAM,IAAI;AAAA,MAC3B;AAEA,UAAI,kBAAkB,GAAG;AACvB,gBAAQ,OAAO,MAAM,aAAa,eAAe,0BAAqB,OAAO;AAAA,CAAI;AACjF,YAAI,WAAW,SAAS,GAAG;AACzB,qBAAW,QAAQ,YAAY;AAC7B,kBAAM,QAAQ,OAAO,KAAK,aAAa,IAAI,KAAK,CAAC,CAAC,EAAE;AACpD,oBAAQ,OAAO,MAAM,YAAY,IAAI,MAAM,KAAK;AAAA,CAAgB;AAAA,UAClE;AAAA,QACF;AAAA,MACF,OAAO;AACL,gBAAQ,OAAO;AAAA,UACb,8DAAyD,OAAO;AAAA;AAAA;AAAA,QAElE;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;;;AChUA,SAAS,aAAAC,YAAW,iBAAAC,uBAAqB;AACzC,SAAS,WAAAC,iBAAe;AACxB,SAAS,eAAAC,cAAa,4BAA4B;AAClD,SAAS,oBAAAC,mBAAkB,kBAAAC,iBAAgB,iBAAAC,sBAAqB;AAYhE,IAAMC,uBAAsB;AAC5B,IAAM,wBAAwB;AAC9B,IAAMC,sBAAqB;AAM3B,eAAe,+BACb,UACA,eACA,aACA,SACA,UACA,WACgE;AAChE,QAAM,MAAM;AAEZ,QAAM,cAAc,MAAM;AAAA,IACxB;AAAA,IACA;AAAA,IACA,CAAC;AAAA;AAAA,IACD;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,QAAM,OAAO,IAAIC,aAAY;AAAA,IAC3B,MAAM,EAAE,UAAU,GAAG,iBAAiB,EAAE;AAAA,IACxC,eAAe;AAAA,IACf,gBAAgB;AAAA,EAClB,CAAC;AACD,QAAM,KAAK,KAAK;AAEhB,QAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,QAAM,EAAE,KAAK,IAAI;AAEjB,MAAI;AACF,UAAM,KAAK,WAAW,aAAa,EAAE,WAAW,OAAO,CAAC;AAExD,UAAM,KAAK;AAAA,MACT,MAAM;AACJ,cAAM,IAAI;AAIV,eAAO,EAAE,8BAA8B;AAAA,MACzC;AAAA,MACA,EAAE,SAAS,UAAU;AAAA,IACvB;AAEA,UAAM,cAAc,KAAK,QAAQ,wBAAwB;AACzD,UAAM,KAAK,MAAM,YAAY,YAAY;AAEzC,UAAM,QAAQ;AACd,UAAM,QAAQ;AAEd,UAAM,QAAQ,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AAC5C,UAAM,QAAQ,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG;AAC5C,UAAM,QAAQ,IAAI,SAAS,SAAS,MAAM;AAC1C,UAAM,QAAQ,IAAI,UAAU,SAAS,MAAM;AAC3C,UAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,GAAG,UAAU,KAAK;AAC7D,UAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAM,KAAK,GAAG,WAAW,KAAK;AAE9D,UAAM,aAAa,MAAM,KAAK,WAAW;AAAA,MACvC,MAAM,EAAE,GAAG,OAAO,GAAG,OAAO,OAAO,OAAO,QAAQ,MAAM;AAAA,MACxD,MAAM;AAAA,IACR,CAAC;AAED,WAAO,EAAE,YAAY,OAAO,KAAK,MAAM,KAAK,GAAG,QAAQ,KAAK,MAAM,KAAK,EAAE;AAAA,EAC3E,UAAE;AACA,SAAK,QAAQ,IAAI;AACjB,UAAM,KAAK,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,EAC1C;AACF;AASO,SAAS,gBAAgB,WAA0B;AACxD,YACG,QAAQ,gBAAgB,EACxB;AAAA,IACC;AAAA,EAMF,EACC,eAAe,uBAAuB,+CAA+C,EACrF,OAAO,YAAY,gDAAgD,KAAK,EACxE,OAAO,uBAAuB,6DAA6D,EAC3F,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,mBAAmB,4CAA4CF,oBAAmB,GAAG,EAC5F,OAAO,qBAAqB,yBAAyB,qBAAqB,EAC1E,OAAO,kBAAkB,oDAAoD,EAC7E,OAAO,kBAAkB,mCAAmC,OAAO,EACnE,OAAO,yBAAyB,4BAA4B,MAAM,EAClE,OAAO,0BAA0B,6BAA6B,KAAK,EACnE;AAAA,IACC,OACE,WACA,SAYG;AACH,UAAI;AACF,cAAM,gBAAgB,qBAAqB,KAAK,IAAI;AACpD,cAAM,EAAE,OAAO,IAAI,WAAW,aAAa;AAC3C,cAAM,WAAW,IAAIG,eAAc,MAAM;AACzC,cAAM,SAAS,IAAIC,kBAAiB,QAAQ;AAE5C,cAAM,aAAa,KAAK,UAAUJ;AAClC,cAAM,aAAa,eAAe,UAAU;AAE5C,cAAM,eAAe,IAAI,IAAI,OAAO,QAAQ,UAAU,CAAC;AACvD,cAAM,cAAc,OAAO,WAAW,YAAY;AAClD,cAAM,oBAAoB,IAAI,IAAI,OAAO,QAAQ,YAAY,UAAU,CAAC;AAExE,cAAM,WAAW,IAAIK,gBAAe,UAAU,iBAAiB;AAC/D,cAAM,eAAe,SAAS,QAAQ,SAAS;AAC/C,cAAM,eAAe,SAAS,SAAS,WAAW,KAAK,QAAQ;AAE/D,YAAI,aAAa,WAAW,WAAW,GAAG;AACxC,kBAAQ,OAAO;AAAA,YACb,kCAAkC,SAAS;AAAA;AAAA,UAC7C;AACA;AAAA,QACF;AAEA,cAAM,gBAAgB,aAAa,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI;AAC/D,gBAAQ,OAAO;AAAA,UACb,aAAa,cAAc,MAAM,kBAAkB,cAAc,KAAK,IAAI,CAAC;AAAA;AAAA,QAC7E;AAEA,cAAM,WAAW,aAAa,KAAK,QAAQ;AAC3C,cAAM,UAAU,OAAO,SAAS,KAAK,eAAe,EAAE;AACtD,cAAM,WAAW,OAAO,SAAS,KAAK,gBAAgB,EAAE;AACxD,cAAM,UAAU,OAAO,SAAS,KAAK,SAAS,EAAE;AAEhD,cAAM,cAAc,WAAW,UAAU,QAAQ,OAAO,GAAG,CAAC;AAC5D,cAAM,YAAY,WAAW,WAAW,KAAK,YAAY;AACzD,cAAM,WAAW,WAAW,WAAW,KAAK,KAAK,QAAQ;AAGzD,cAAM,UAID,CAAC;AAEN,mBAAW,iBAAiB,eAAe;AACzC,gBAAM,aAAa,SAAS,WAAW,aAAa;AACpD,cAAI,eAAe,QAAW;AAC5B,oBAAQ,OAAO;AAAA,cACb,aAAa,aAAa;AAAA;AAAA,YAC5B;AACA;AAAA,UACF;AAEA,kBAAQ,OAAO,MAAM,eAAe,aAAa;AAAA,CAAgB;AACjE,gBAAM,SAAS,MAAM;AAAA,YACnB,WAAW;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,kBAAQ,OAAO,MAAM,eAAe,aAAa;AAAA,CAAe;AAChE,gBAAM,QAAQ,MAAM;AAAA,YAClB,WAAW;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAEA,kBAAQ,KAAK,EAAE,MAAM,eAAe,QAAQ,MAAM,CAAC;AAAA,QACrD;AAEA,YAAI,QAAQ,WAAW,GAAG;AACxB,kBAAQ,OAAO;AAAA,YACb;AAAA,UACF;AACA;AAAA,QACF;AAGA,cAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC;AACjF,cAAM,QAAQ,KAAK,IAAI,GAAG,QAAQ,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,QAAQ,EAAE,MAAM,MAAM,CAAC,CAAC;AAGnF,cAAM,QAAQ,QAAQ,QAAQ,CAAC,GAAG,WAAW;AAAA,UAC3C;AAAA,YACE,OAAO,EAAE,SAAS,UAAU,WAAW,EAAE,KAAK;AAAA,YAC9C,QAAQ;AAAA,cACN,YAAY,EAAE,OAAO;AAAA,cACrB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,gBAAgB,CAAC;AAAA,YACnB;AAAA,YACA,OAAO,SAAS;AAAA,YAChB,aAAa,CAAC,GAAG,MAAM;AAAA,UACzB;AAAA,UACA;AAAA,YACE,OAAO,EAAE,SAAS,SAAS,WAAW,EAAE,KAAK;AAAA,YAC7C,QAAQ;AAAA,cACN,YAAY,EAAE,MAAM;AAAA,cACpB,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,cAAc;AAAA,cACd,gBAAgB,CAAC;AAAA,YACnB;AAAA,YACA,OAAO,SAAS,IAAI;AAAA,YACpB,aAAa,CAAC,GAAG,MAAM;AAAA,UACzB;AAAA,QACF,CAAC;AAED,cAAM,eAAe;AAAA,UACnB;AAAA,UACA,MAAM;AAAA,YACJ,EAAE,MAAM,aAAa,QAAQ,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;AAAA,YACxD,EAAE,MAAM,WAAW,QAAQ,CAAC,UAAU,OAAO,EAAE;AAAA,UACjD;AAAA,UACA,YAAY,CAAC,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,UAAU,OAAO,CAAC;AAAA,UAC5D,MAAM;AAAA,UACN,MAAM,QAAQ;AAAA,UACd,OAAO;AAAA,YACL,YAAY,MAAM;AAAA,YAClB,mBAAmB;AAAA,YACnB,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,UACnB;AAAA,QACF;AAEA,cAAM,YAAY,IAAI,qBAAqB;AAAA,UACzC,aAAa;AAAA,UACb,aAAa;AAAA,UACb,aAAa;AAAA,UACb,YAAY;AAAA,QACd,CAAC;AAED,cAAM,eAAe,MAAM,UAAU,SAAS,YAAY;AAG1D,cAAM,aAAa,UAAU,QAAQ,OAAO,GAAG;AAC/C,cAAM,aACJ,KAAK,UAAUC,UAAQ,QAAQ,IAAI,GAAGL,qBAAoB,WAAW,UAAU,MAAM;AAEvF,cAAM,YAAYK,UAAQ,YAAY,IAAI;AAC1C,QAAAC,WAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,QAAAC,gBAAc,YAAY,aAAa,GAAG;AAE1C,cAAM,UAAU,KAAK,WAAW,UAAW,KAAK,WAAW,UAAU,CAAC,MAAM;AAE5E,YAAI,SAAS;AACX,kBAAQ,OAAO;AAAA,YACb,GAAG,KAAK;AAAA,cACN;AAAA,gBACE;AAAA,gBACA,UAAU;AAAA,gBACV,UAAU,KAAK;AAAA,gBACf;AAAA,gBACA,OAAO,aAAa;AAAA,gBACpB,QAAQ,aAAa;AAAA,gBACrB,YAAY,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,gBACrC,OAAO,aAAa,YAAY;AAAA,cAClC;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA;AAAA,UACH;AAAA,QACF,OAAO;AACL,kBAAQ,OAAO;AAAA,YACb,sBAAsB,UAAU,KAAK,aAAa,KAAK,OAAI,aAAa,MAAM;AAAA;AAAA,UAChF;AACA,kBAAQ,OAAO,MAAM,eAAe,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,CAAI;AAAA,QAC/E;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;;;ALhUA,IAAMC,sBAAqB;AAC3B,IAAMC,eAAc;AAMpB,SAASC,SAAiB;AACxB,SAAO,QAAQ,OAAO,UAAU;AAClC;AAMA,SAASC,KAAI,OAAe,OAAuB;AACjD,SAAO,MAAM,UAAU,QAAQ,MAAM,MAAM,GAAG,KAAK,IAAI,QAAQ,IAAI,OAAO,QAAQ,MAAM,MAAM;AAChG;AAEA,SAASC,YAAW,SAAmB,MAA0B;AAC/D,QAAM,YAAY,QAAQ;AAAA,IAAI,CAAC,GAAG,MAChC,KAAK,IAAI,EAAE,QAAQ,GAAG,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,MAAM,CAAC;AAAA,EAC5D;AAEA,QAAM,UAAU,UAAU,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI;AAC7D,QAAM,YAAY,QAAQ,IAAI,CAAC,GAAG,MAAMD,KAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAC5E,QAAM,WAAW,KAAK;AAAA,IAAI,CAACE,SACzBA,KAAI,IAAI,CAAC,MAAM,MAAMF,KAAI,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EACpE;AAEA,SAAO,CAAC,WAAW,SAAS,GAAG,QAAQ,EAAE,KAAK,IAAI;AACpD;AAcO,SAAS,qBAAqB,UAA2B;AAC9D,MAAI,aAAa,QAAW;AAC1B,WAAOG,UAAQ,QAAQ,IAAI,GAAG,QAAQ;AAAA,EACxC;AAEA,QAAM,aAAaA,UAAQ,QAAQ,IAAI,GAAGL,YAAW;AACrD,MAAIM,aAAW,UAAU,GAAG;AAC1B,QAAI;AACF,YAAM,MAAMC,eAAa,YAAY,OAAO;AAC5C,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UACE,OAAO,WAAW,YAClB,WAAW,QACX,YAAY,UACZ,OAAQ,OAAgC,WAAW,YAClD,OAA2C,WAAW,QACvD,OAAQ,OAA2C,QAAQ,SAAS,UACpE;AACA,cAAM,OAAQ,OAAwC,OAAO;AAC7D,eAAOF,UAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,MACpC;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAOA,UAAQ,QAAQ,IAAI,GAAGN,mBAAkB;AAClD;AAMO,SAAS,WAAW,SAAiB;AAC1C,MAAI,CAACO,aAAW,OAAO,GAAG;AACxB,UAAM,IAAI;AAAA,MACR,2BAA2B,OAAO;AAAA;AAAA,IACpC;AAAA,EACF;AACA,QAAM,MAAMC,eAAa,SAAS,OAAO;AACzC,SAAOC,oBAAmB,GAAG;AAC/B;AAUA,SAAS,YAAY,MAA+B,UAA4C;AAC9F,QAAM,CAAC,MAAM,GAAG,IAAI,IAAI;AACxB,MAAI,SAAS,OAAW,QAAO;AAE/B,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAElD,MAAI,KAAK,WAAW,GAAG;AAErB,QAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,KAAK,WAAY,OAAkB;AACtF,YAAM,IAAK,MAA6B;AACxC,aAAO,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW,IAAI;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AACtD,WAAO,YAAY,OAAkC,IAAI;AAAA,EAC3D;AAEA,SAAO;AACT;AAMA,SAAS,qBACP,WACA,WAC2C;AAC3C,QAAM,QAAmD,CAAC;AAC1D,QAAM,OAAO,oBAAI,IAAY;AAE7B,MAAI,UAAU;AACd,SAAO,CAAC,KAAK,IAAI,OAAO,GAAG;AACzB,SAAK,IAAI,OAAO;AAChB,UAAM,WAAW,YAAY,WAAW,QAAQ,MAAM,GAAG,CAAC;AAC1D,QAAI,aAAa,KAAM;AAEvB,UAAM,KAAK,EAAE,MAAM,SAAS,UAAU,OAAO,QAAQ,EAAE,CAAC;AAGxD,UAAM,WAAW,gBAAgB,KAAK,OAAO,QAAQ,CAAC;AACtD,QAAI,aAAa,KAAM;AAEvB,cAAU,SAAS,CAAC,KAAK;AAAA,EAC3B;AAEA,SAAO;AACT;AAMA,SAASC,aAAY,WAA0B;AAC7C,YACG,QAAQ,YAAY,EACpB;AAAA,IACC;AAAA,EAMF,EACC,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,kBAAkB,oDAAoD,EAC7E,OAAO,CAAC,WAAmB,SAA6C;AACvE,QAAI;AACF,YAAM,WAAW,qBAAqB,KAAK,IAAI;AAC/C,YAAM,EAAE,OAAO,IAAI,WAAW,QAAQ;AACtC,YAAM,WAAW,IAAIC,eAAc,MAAM;AAEzC,YAAM,gBAAgB,SAAS,QAAQ,SAAS;AAEhD,YAAM,UAAU,KAAK,WAAW,UAAW,KAAK,WAAW,UAAU,CAACT,OAAM;AAE5E,UAAI,SAAS;AACX,cAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AACrD,gBAAQ,OAAO;AAAA,UACb,GAAG,KAAK,UAAU,EAAE,MAAM,WAAW,OAAO,OAAO,OAAO,eAAe,MAAM,OAAO,KAAK,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,QACxG;AAAA,MACF,OAAO;AACL,gBAAQ,OAAO,MAAM,GAAG,aAAa;AAAA,CAAI;AAAA,MAC3C;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAMA,SAASU,cAAa,WAA0B;AAC9C,YACG,QAAQ,iBAAiB,EACzB;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQF,EACC,OAAO,iBAAiB,2DAA2D,EACnF,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,kBAAkB,qDAAqD,EAC9E;AAAA,IACC,CAAC,UAA8B,SAA4D;AACzF,UAAI;AACF,cAAM,WAAW,qBAAqB,KAAK,IAAI;AAC/C,cAAM,EAAE,OAAO,IAAI,WAAW,QAAQ;AACtC,cAAM,WAAW,IAAID,eAAc,MAAM;AAEzC,cAAM,WAAW,SAAS,KAAK,KAAK,MAA+B,QAAQ;AAE3E,cAAM,UAAU,KAAK,WAAW,UAAW,KAAK,WAAW,WAAW,CAACT,OAAM;AAE7E,YAAI,SAAS;AACX,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QAC/D,OAAO;AACL,cAAI,SAAS,WAAW,GAAG;AACzB,oBAAQ,OAAO,MAAM,oBAAoB;AACzC;AAAA,UACF;AACA,gBAAM,UAAU,CAAC,QAAQ,SAAS,YAAY,MAAM;AACpD,gBAAM,OAAO,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,EAAE,KAAK,GAAG,EAAE,eAAe,EAAE,IAAI,CAAC;AACnF,kBAAQ,OAAO,MAAM,GAAGE,YAAW,SAAS,IAAI,CAAC;AAAA,CAAI;AAAA,QACvD;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAMA,SAAS,eAAe,WAA0B;AAChD,YACG,QAAQ,gBAAgB,EACxB;AAAA,IACC;AAAA,EAMF,EACC,OAAO,iBAAiB,0CAA0C,EAClE,OAAO,WAAW,sDAAsD,KAAK,EAC7E,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,kBAAkB,qDAAqD,EAC9E;AAAA,IACC,CAAC,OAAe,SAA4E;AAC1F,UAAI;AACF,cAAM,WAAW,qBAAqB,KAAK,IAAI;AAC/C,cAAM,EAAE,OAAO,IAAI,WAAW,QAAQ;AACtC,cAAM,WAAW,IAAIO,eAAc,MAAM;AAEzC,cAAM,UAAU,KAAK,WAAW,UAAW,KAAK,WAAW,WAAW,CAACT,OAAM;AAG7E,cAAM,gBAA6B,KAAK,OACpC,CAAC,KAAK,IAAiB,IACvB;AAAA,UACE;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEJ,cAAM,eAMD,CAAC;AACN,cAAM,iBAMD,CAAC;AAEN,mBAAW,QAAQ,eAAe;AAChC,gBAAM,QAAQ,SAAS,MAAM,OAAO,IAAI;AACxC,cAAI,UAAU,MAAM;AAClB,yBAAa,KAAK;AAAA,cAChB,MAAM,MAAM,MAAM;AAAA,cAClB,eAAe,MAAM,MAAM;AAAA,cAC3B,MAAM,MAAM,MAAM;AAAA,cAClB,OAAO;AAAA,cACP,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAGA,YAAI,aAAa,WAAW,KAAK,KAAK,OAAO;AAC3C,qBAAW,QAAQ,eAAe;AAChC,kBAAM,aAAa,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AACvD,gBAAI,WAAW,WAAW,EAAG;AAC7B,gBAAI;AACF,oBAAM,OAAO,SAAS,QAAQ,OAAO,IAAI;AACzC,6BAAe,KAAK;AAAA,gBAClB,MAAM,KAAK,MAAM;AAAA,gBACjB,eAAe,KAAK,MAAM;AAAA,gBAC1B,MAAM,KAAK,MAAM;AAAA,gBACjB,OAAO,KAAK;AAAA,gBACZ,UAAU,KAAK;AAAA,cACjB,CAAC;AAAA,YACH,QAAQ;AAAA,YAER;AAAA,UACF;AAEA,yBAAe,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AACrD,yBAAe,OAAO,CAAC;AAAA,QACzB;AAEA,cAAM,UAAU,aAAa,SAAS,IAAI,eAAe;AAEzD,YAAI,SAAS;AACX,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QAC9D,OAAO;AACL,cAAI,QAAQ,WAAW,GAAG;AACxB,oBAAQ,OAAO;AAAA,cACb,6BAA6B,KAAK;AAAA;AAAA;AAAA,YACpC;AACA;AAAA,UACF;AACA,gBAAM,UAAU,CAAC,QAAQ,kBAAkB,QAAQ,SAAS,UAAU;AACtE,gBAAM,OAAO,QAAQ,IAAI,CAAC,MAAM;AAAA,YAC9B,EAAE;AAAA,YACF,EAAE;AAAA,YACF,EAAE;AAAA,YACF,EAAE,QAAQ,UAAU;AAAA,YACpB,EAAE,QAAQ,WAAM,EAAE,SAAS,QAAQ,CAAC;AAAA,UACtC,CAAC;AACD,kBAAQ,OAAO,MAAM,GAAGE,YAAW,SAAS,IAAI,CAAC;AAAA,CAAI;AAAA,QACvD;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACJ;AAMA,SAAS,gBAAgB,WAA0B;AACjD,YACG,QAAQ,gBAAgB,EACxB;AAAA,IACC;AAAA,EAKF,EACC,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,kBAAkB,oDAAoD,EAC7E,OAAO,CAAC,WAAmB,SAA6C;AACvE,QAAI;AACF,YAAM,WAAW,qBAAqB,KAAK,IAAI;AAC/C,YAAM,cAAc;AACpB,YAAM,EAAE,QAAQ,QAAQ,IAAI,WAAW,WAAW;AAClD,YAAM,WAAW,IAAIO,eAAc,MAAM;AAGzC,eAAS,QAAQ,SAAS;AAE1B,YAAM,QAAQ,qBAAqB,WAAW,QAAQ,MAAiC;AAEvF,YAAM,UAAU,KAAK,WAAW,UAAW,KAAK,WAAW,UAAU,CAACT,OAAM;AAE5E,UAAI,SAAS;AACX,gBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,MAAM,WAAW,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,MACjF,OAAO;AACL,YAAI,MAAM,WAAW,GAAG;AACtB,kBAAQ,OAAO,MAAM,UAAU,SAAS;AAAA,CAAgB;AACxD;AAAA,QACF;AAEA,cAAM,QAAQ,MAAM,IAAI,CAAC,MAAM,MAAM;AACnC,cAAI,IAAI,MAAM,SAAS,GAAG;AACxB,mBAAO,GAAG,KAAK,IAAI,WAAM,KAAK,QAAQ;AAAA,UACxC;AACA,iBAAO,KAAK;AAAA,QACd,CAAC;AACD,gBAAQ,OAAO,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC;AAAA,CAAI;AAAA,MAChD;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAMA,SAAS,iBAAiB,WAA0B;AAClD,YACG,QAAQ,UAAU,EAClB;AAAA,IACC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUF,EACC,OAAO,iBAAiB,uCAAuC,EAC/D,OAAO,kBAAkB,oDAAoD,EAC7E,OAAO,CAAC,SAA6C;AACpD,QAAI;AACF,YAAM,WAAW,qBAAqB,KAAK,IAAI;AAE/C,UAAI,CAACK,aAAW,QAAQ,GAAG;AACzB,cAAM,IAAI;AAAA,UACR,2BAA2B,QAAQ;AAAA;AAAA,QACrC;AAAA,MACF;AAEA,YAAM,MAAMC,eAAa,UAAU,OAAO;AAC1C,YAAM,UAAU,KAAK,WAAW,UAAW,KAAK,WAAW,UAAU,CAACN,OAAM;AAE5E,YAAM,SAAkE,CAAC;AAGzE,UAAI;AACJ,UAAI;AACF,iBAAS,KAAK,MAAM,GAAG;AAAA,MACzB,SAAS,KAAK;AACZ,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS,uCAAuC,OAAO,GAAG,CAAC;AAAA,QAC7D,CAAC;AACD,+BAAuB,UAAU,QAAQ,OAAO;AAChD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,UAAI;AACF,0BAAkB,MAAM;AAAA,MAC1B,SAAS,KAAK;AACZ,YAAI,eAAe,sBAAsB;AACvC,qBAAW,KAAK,IAAI,QAAQ;AAC1B,mBAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,SAAS,EAAE,QAAQ,CAAC;AAAA,UAChE;AACA,iCAAuB,UAAU,QAAQ,OAAO;AAChD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM;AAAA,MACR;AAGA,UAAI;AACF,QAAAO,oBAAmB,GAAG;AAAA,MACxB,SAAS,KAAK;AACZ,YAAI,eAAe,iBAAiB;AAClC,iBAAO,KAAK,EAAE,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,SAAS,IAAI,QAAQ,CAAC;AAAA,QACtE,OAAO;AACL,iBAAO,KAAK,EAAE,MAAM,WAAW,SAAS,OAAO,GAAG,EAAE,CAAC;AAAA,QACvD;AACA,+BAAuB,UAAU,QAAQ,OAAO;AAChD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAGA,6BAAuB,UAAU,QAAQ,OAAO;AAAA,IAClD,SAAS,KAAK;AACZ,cAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,uBACP,UACA,QACA,SACM;AACN,QAAM,QAAQ,OAAO,WAAW;AAEhC,MAAI,SAAS;AACX,YAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,EAAE,OAAO,MAAM,UAAU,OAAO,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EACxF,OAAO;AACL,QAAI,OAAO;AACT,cAAQ,OAAO,MAAM,+BAA0B,QAAQ;AAAA,CAAI;AAAA,IAC7D,OAAO;AACL,cAAQ,OAAO,MAAM,yBAAoB,OAAO,MAAM,cAAc,QAAQ;AAAA;AAAA,CAAM;AAClF,iBAAW,KAAK,QAAQ;AACtB,cAAM,aAAa,EAAE,OAAO,KAAK,EAAE,IAAI,MAAM;AAC7C,gBAAQ,OAAO,MAAM,KAAK,EAAE,IAAI,GAAG,UAAU,KAAK,EAAE,OAAO;AAAA,CAAI;AAAA,MACjE;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AASO,SAAS,sBAA+B;AAC7C,QAAM,YAAY,IAAII,UAAQ,QAAQ,EAAE;AAAA,IACtC;AAAA,EAiBF;AAEA,qBAAmB,SAAS;AAC5B,EAAAH,aAAY,SAAS;AACrB,EAAAE,cAAa,SAAS;AACtB,iBAAe,SAAS;AACxB,kBAAgB,SAAS;AACzB,mBAAiB,SAAS;AAC1B,YAAU,WAAW,0BAA0B,CAAC;AAGhD,qBAAmB,SAAS;AAC5B,iBAAe,SAAS;AACxB,kBAAgB,SAAS;AAEzB,SAAO;AACT;;;A5B3jBO,SAAS,cAAc,UAA2B,CAAC,GAAY;AACpE,QAAME,WAAU,IAAIC,UAAQ,OAAO,EAChC,QAAQ,QAAQ,WAAW,OAAO,EAClC;AAAA,IACC;AAAA,EA0BF;AAGF,EAAAD,SACG,QAAQ,eAAe,EACvB;AAAA,IACC;AAAA,EAMF,EACC,OAAO,uBAAuB,sCAAsC,EACpE,OAAO,YAAY,gDAAgD,KAAK,EACxE,OAAO,kBAAkB,yCAAyC,OAAO,EACzE,OAAO,eAAe,uDAAuD,GAAG,EAChF;AAAA,IACC,OACE,KACA,SAMG;AACH,UAAI;AACF,cAAM,EAAE,OAAO,IAAI,MAAM,eAAe;AAAA,UACtC;AAAA,UACA,SAAS,OAAO,SAAS,KAAK,SAAS,EAAE;AAAA,UACzC,MAAM,OAAO,SAAS,KAAK,MAAM,EAAE;AAAA,QACrC,CAAC;AAED,YAAI,KAAK,WAAW,QAAW;AAC7B,4BAAkB,QAAQ,KAAK,QAAQ,KAAK,MAAM;AAClD,kBAAQ,OAAO,MAAM,eAAe,KAAK,MAAM;AAAA,CAAI;AAAA,QACrD,OAAO;AACL,gBAAM,OAAO,KAAK,SAAS,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,KAAK,UAAU,MAAM;AAClF,kBAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,QAClC;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGF,EAAAA,SACG,QAAQ,YAAY,EACpB;AAAA,IACC;AAAA,EAMF,EACC,OAAO,eAAe,2CAA2C,EACjE,OAAO,gBAAgB,yCAAyC,KAAK,EACrE,OAAO,gBAAgB,kCAAkC,KAAK,EAC9D,OAAO,kBAAkB,yCAAyC,OAAO,EACzE,OAAO,eAAe,uDAAuD,GAAG,EAChF;AAAA,IACC,OACE,KACA,SAOG;AACH,UAAI;AACF,cAAM,EAAE,OAAO,IAAI,MAAM,eAAe;AAAA,UACtC;AAAA,UACA,SAAS,OAAO,SAAS,KAAK,SAAS,EAAE;AAAA,UACzC,MAAM,OAAO,SAAS,KAAK,MAAM,EAAE;AAAA,QACrC,CAAC;AAED,cAAM,WAAW,KAAK,UAAU,SAAY,OAAO,SAAS,KAAK,OAAO,EAAE,IAAI;AAE9E,cAAM,OAAO,WAAW,OAAO,MAAM;AAAA,UACnC;AAAA,UACA,WAAW,KAAK;AAAA,UAChB,WAAW,KAAK;AAAA,QAClB,CAAC;AAED,gBAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,MAClC,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGF,EAAAA,SACG,QAAQ,cAAc,EACtB;AAAA,IACC;AAAA,EAMF,EACC,OAAO,UAAU,4DAA4D,KAAK,EAClF,OAAO,kBAAkB,yCAAyC,OAAO,EACzE,OAAO,eAAe,uDAAuD,GAAG,EAChF;AAAA,IACC,OACE,KACA,SAKG;AACH,UAAI;AACF,cAAM,EAAE,OAAO,IAAI,MAAM,eAAe;AAAA,UACtC;AAAA,UACA,SAAS,OAAO,SAAS,KAAK,SAAS,EAAE;AAAA,UACzC,MAAM,OAAO,SAAS,KAAK,MAAM,EAAE;AAAA,QACrC,CAAC;AAED,YAAI,KAAK,MAAM;AACb,gBAAM,aAAa,sBAAsB,MAAM;AAC/C,kBAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,QACjE,OAAO;AACL,gBAAM,UAAU,aAAa,MAAM;AACnC,kBAAQ,OAAO,MAAM,GAAG,OAAO;AAAA,CAAI;AAAA,QACrC;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,CAAI;AACnF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGF,EAAAA,SACG,QAAQ,UAAU,EAClB;AAAA,IACC;AAAA,EAKF,EACC,SAAS,WAAW,0CAA0C,EAC9D,OAAO,uBAAuB,oBAAoB,eAAe,EACjE,OAAO,4BAA4B,kBAAkB,EACrD,OAAO,CAAC,WAAmB,SAAmD;AAC7E,UAAM,MAAME,eAAa,WAAW,OAAO;AAC3C,UAAM,QAAQ,UAAU,GAAG;AAC3B,UAAM,SAAS,aAAa,OAAO;AAAA,MACjC,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK;AAAA,IACnB,CAAC;AACD,YAAQ,OAAO,MAAM,GAAG,MAAM;AAAA,CAAI;AAAA,EACpC,CAAC;AAGH,EAAAF,SAAQ,WAAW,sBAAsB,CAAC;AAG1C,EAAAA,SAAQ,WAAW,oBAAoB,CAAC;AAGxC,EAAAA,SAAQ,WAAW,oBAAoB,CAAC;AAGxC,EAAAA,SAAQ,WAAW,wBAAwB,CAAC;AAG5C,EAAAA,SAAQ,WAAW,kBAAkB,CAAC;AAGtC,EAAAA,SAAQ,WAAW,gBAAgB,CAAC;AAGpC,EAAAA,SAAQ,WAAW,oBAAoB,CAAC;AACxC,EAAAA,SAAQ,WAAW,sBAAsB,CAAC;AAK1C,QAAM,oBAAoBA,SAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,QAAQ;AAC5E,MAAI,sBAAsB,QAAW;AACnC,+BAA2B,iBAAiB;AAC5C,2BAAuB,iBAAiB;AACxC,gCAA4B,iBAAiB;AAAA,EAC/C;AAGA,EAAAA,SAAQ,WAAW,kBAAkB,CAAC;AAEtC,SAAOA;AACT;;;AkC9PA,IAAM,UAAU,cAAc;AAC9B,QAAQ,WAAW,QAAQ,IAAI,EAAE,MAAM,CAAC,QAAiB;AACvD,UAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["readFileSync","Command","existsSync","readFileSync","writeFileSync","resolve","row","require","build","existsSync","readFileSync","createRequire","resolve","existsSync","readFileSync","rule","writeFileSync","existsSync","readFileSync","join","resolve","Command","existsSync","readFileSync","dirname","existsSync","readFileSync","chromium","existsSync","dirname","existsSync","join","resolve","readFileSync","Command","Command","Command","existsSync","readFileSync","writeFileSync","join","existsSync","readdirSync","readFileSync","join","detectPackageManager","generateManifest","Command","resolve","join","existsSync","readFileSync","writeFileSync","parseBlock","resolve","getBrowserEntryScript","BrowserPool","Command","existsSync","mkdirSync","readFileSync","writeFileSync","resolve","generateManifest","Command","resolve","existsSync","readFileSync","generateManifest","mkdirSync","writeFileSync","Command","resolve","getBrowserEntryScript","chromium","MANIFEST_PATH","chromium","getBrowserEntryScript","resolve","resolve","getBrowserEntryScript","Cmd","chromium","MANIFEST_PATH","chromium","getBrowserEntryScript","Cmd","resolve","resolve","getBrowserEntryScript","Command","chromium","MANIFEST_PATH","chromium","getBrowserEntryScript","Command","MANIFEST_PATH","resolve","fmt","resolveFormat","MANIFEST_PATH","replayInteraction","_pool","getPool","BrowserPool","shutdownPool","resolve","getBrowserEntryScript","Command","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","resolve","BrowserPool","safeRender","Command","mkdirSync","readFileSync","writeFileSync","dirname","resolve","existsSync","mkdirSync","createRequire","dirname","join","resolve","esbuild","resolve","existsSync","readFileSync","TAILWIND_CONFIG_FILES","matchGlob","MANIFEST_PATH","rmSync","writeFileSync","_pool","getPool","BrowserPool","shutdownPool","projectCss","fmt","props","safeRender","mkdirSync","SpriteSheetGenerator","summaryPath","scenarioEntries","Command","existsSync","mkdirSync","rmSync","writeFileSync","resolve","generateManifest","BrowserPool","safeRender","ComplianceEngine","TokenResolver","_pool","getPool","BrowserPool","shutdownPool","renderComponent","extractComputedStyles","resolve","existsSync","rmSync","mkdirSync","readFileSync","generateManifest","writeFileSync","safeRender","TokenResolver","ComplianceEngine","existsSync","readFileSync","writeFileSync","resolve","generateManifest","BrowserPool","safeRender","ComplianceEngine","TokenResolver","DEFAULT_BASELINE_DIR","resolve","existsSync","readFileSync","loadBaselineRenderJson","_pool","getPool","BrowserPool","shutdownPool","renderComponent","extractComputedStyles","generateManifest","safeRender","TokenResolver","ComplianceEngine","rule","writeFileSync","existsSync","readFileSync","writeFileSync","resolve","BRANCH","LAST_BRANCH","VERTICAL","EMPTY","visibleChildren","nextPrefix","pad","existsSync","readFileSync","statSync","writeFileSync","join","resolve","generateManifest","safeRender","Command","dirname","esbuild","loadGlobalCssFilesFromConfig","resolve","existsSync","readFileSync","loadIconPatternsFromConfig","join","safeRender","writeFileSync","shutdownPool","generateManifest","statSync","notifyReload","Command","existsSync","readFileSync","resolve","parseTokenFileSync","TokenResolver","Command","existsSync","readFileSync","writeFileSync","resolve","ComplianceEngine","TokenResolver","resolve","existsSync","readFileSync","TokenResolver","ComplianceEngine","writeFileSync","existsSync","readFileSync","writeFileSync","resolve","TokenResolver","Command","resolveTokenFilePath","ComplianceEngine","TokenResolver","DEFAULT_STYLES_PATH","severityIcon","TokenResolver","ComplianceEngine","existsSync","readFileSync","writeFileSync","resolve","DEFAULT_TOKEN_FILE","CONFIG_FILE","resolve","existsSync","readFileSync","writeFileSync","mkdirSync","writeFileSync","resolve","BrowserPool","ComplianceEngine","ImpactAnalyzer","TokenResolver","DEFAULT_STYLES_PATH","DEFAULT_OUTPUT_DIR","BrowserPool","TokenResolver","ComplianceEngine","ImpactAnalyzer","resolve","mkdirSync","writeFileSync","DEFAULT_TOKEN_FILE","CONFIG_FILE","isTTY","pad","buildTable","row","resolve","existsSync","readFileSync","parseTokenFileSync","registerGet","TokenResolver","registerList","Command","program","Command","readFileSync"]}
1
+ {"version":3,"sources":["../src/program.ts","../src/browser.ts","../src/ci/commands.ts","../src/component-bundler.ts","../src/manifest-formatter.ts","../src/render-formatter.ts","../src/tailwind-css.ts","../src/doctor-commands.ts","../src/diagnostics.ts","../src/get-skill-command.ts","../src/skill-content.ts","../src/init/index.ts","../src/init/detect.ts","../src/instrument/renders.ts","../src/manifest-commands.ts","../src/instrument/hooks.ts","../src/instrument/profile.ts","../src/instrument/tree.ts","../src/render-commands.ts","../src/run-summary.ts","../src/scope-file.ts","../src/report/baseline.ts","../src/report/diff.ts","../src/report/pr-comment.ts","../src/tree-formatter.ts","../src/report-formatter.ts","../src/site-commands.ts","../src/playground-bundler.ts","../src/tokens/commands.ts","../src/tokens/compliance.ts","../src/tokens/export.ts","../src/tokens/impact.ts","../src/tokens/init.ts","../src/tokens/preview.ts","../src/cli.ts"],"sourcesContent":["/**\n * @agent-scope/cli — program factory\n *\n * Builds the Commander.js program tree without executing it.\n * This separation allows the library to be tested without side effects.\n */\n\nimport { readFileSync } from \"node:fs\";\nimport { generateTest, loadTrace } from \"@agent-scope/playwright\";\nimport { Command } from \"commander\";\nimport { browserCapture, writeReportToFile } from \"./browser.js\";\nimport { createCiCommand } from \"./ci/commands.js\";\nimport { createDoctorCommand } from \"./doctor-commands.js\";\nimport { createGetSkillCommand } from \"./get-skill-command.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 { registerDiffSubCommand } from \"./report/diff.js\";\nimport { registerPrCommentSubCommand } from \"./report/pr-comment.js\";\nimport { buildStructuredReport, formatReport } from \"./report-formatter.js\";\nimport { createSiteCommand } from \"./site-commands.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(\n \"Scope — static analysis + visual rendering toolkit for React component libraries.\\n\\n\" +\n \"Scope answers questions about React codebases — structure, props, visual output,\\n\" +\n \"design token compliance — without running the full application.\\n\\n\" +\n \"AGENT QUICKSTART:\\n\" +\n \" scope get-skill > /tmp/scope-skill.md\\n\" +\n \" scope init --yes\\n\" +\n \" scope doctor --json\\n\" +\n \" scope manifest list --format json\\n\" +\n \" scope render all --format json --output-dir .reactscope/renders\\n\" +\n \" scope site build --output .reactscope/site\\n\" +\n \" scope instrument profile http://localhost:5173\\n\\n\" +\n \"CI QUICKSTART:\\n\" +\n \" scope ci --json --output .reactscope/ci-result.json\\n\\n\" +\n \"CONFIG FILE: reactscope.config.json (created by `scope init`)\\n\" +\n ' components.include glob patterns for component files (e.g. \"src/**/*.tsx\")\\n' +\n \" components.wrappers providers and globalCSS to wrap every render\\n\" +\n \" render.viewport default viewport width×height in px\\n\" +\n \" tokens.file path to reactscope.tokens.json (default)\\n\" +\n \" output.dir output root (default: .reactscope/)\\n\" +\n \" ci.complianceThreshold fail threshold for `scope ci` (default: 0.90)\\n\\n\" +\n \"OUTPUT DIRECTORY: .reactscope/\\n\" +\n \" manifest.json component registry — updated by `scope manifest generate`\\n\" +\n \" renders/<Name>/ PNGs + render.json per component\\n\" +\n \" compliance-styles.json computed-style map for token matching\\n\" +\n \" site/ static HTML gallery (built by `scope site build`)\\n\\n\" +\n \"Run `scope <command> --help` for detailed flags and examples.\",\n );\n\n // ── capture ─────────────────────────────────────────────────────────────\n program\n .command(\"capture <url>\")\n .description(\n \"Capture the live React component tree from a running app and emit it as JSON.\\n\" +\n \"Requires a running dev server at the given URL (e.g. http://localhost:5173).\\n\\n\" +\n \"Examples:\\n\" +\n \" scope capture http://localhost:5173\\n\" +\n \" scope capture http://localhost:5173 -o report.json --pretty\\n\" +\n \" scope capture http://localhost:5173 --timeout 15000 --wait 500\",\n )\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(\n \"Print a formatted React component tree from a running app.\\n\" +\n \"Useful for quickly understanding component hierarchy without full capture.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tree http://localhost:5173\\n\" +\n \" scope tree http://localhost:5173 --show-props --show-hooks\\n\" +\n \" scope tree http://localhost:5173 --depth 4\",\n )\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(\n \"Capture a React app and print a human-readable analysis summary.\\n\" +\n \"Includes component count, hook usage, side-effect summary, and more.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope report http://localhost:5173\\n\" +\n \" scope report http://localhost:5173 --json\\n\" +\n \" scope report http://localhost:5173 --json -o report.json\",\n )\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(\n \"Generate a Playwright test file from a Scope trace (.json).\\n\" +\n \"Traces are produced by scope instrument renders or scope capture.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope generate trace.json\\n\" +\n ' scope generate trace.json -o tests/scope.spec.ts -d \"User login flow\"',\n )\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 // ── ci ───────────────────────────────────────────────────────────────────\n program.addCommand(createCiCommand());\n\n // Health check\n program.addCommand(createDoctorCommand());\n program.addCommand(createGetSkillCommand());\n\n // ── report baseline + diff sub-commands ────────────────────────────────\n // Registers 'scope report baseline' and 'scope report diff' on the existing\n // report command.\n const existingReportCmd = program.commands.find((c) => c.name() === \"report\");\n if (existingReportCmd !== undefined) {\n registerBaselineSubCommand(existingReportCmd);\n registerDiffSubCommand(existingReportCmd);\n registerPrCommentSubCommand(existingReportCmd);\n }\n\n // ── site ─────────────────────────────────────────────────────────────────\n program.addCommand(createSiteCommand());\n\n return program;\n}\n","/**\n * browser.ts\n *\n * Shared browser launch + capture logic used by capture/tree/report commands.\n * Uses Playwright directly to launch headless Chromium, inject the Scope\n * runtime IIFE bundle, wait for React to mount, and call capture().\n *\n * The browser-entry bundle is provided by @agent-scope/playwright, which handles:\n * - Vite react-refresh compatibility (renderers proxy Map)\n * - Async first-commit awaiting (React 18 scheduler)\n */\n\nimport { writeFileSync } from \"node:fs\";\nimport type { PageReport } from \"@agent-scope/core\";\nimport { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport { chromium } from \"playwright\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface BrowserCaptureOptions {\n /** URL to navigate to */\n url: string;\n /** Max time (ms) to wait for React to mount. Default: 10000 */\n timeout?: number;\n /** Additional wait (ms) after page load before capturing. Default: 0 */\n wait?: number;\n}\n\nexport interface BrowserCaptureResult {\n report: PageReport;\n}\n\n// ---------------------------------------------------------------------------\n// Main capture function\n// ---------------------------------------------------------------------------\n\n/**\n * Launch a headless browser, navigate to the given URL, inject the Scope\n * runtime, wait for React to mount, call capture(), and return the PageReport.\n */\nexport async function browserCapture(\n options: BrowserCaptureOptions,\n): Promise<BrowserCaptureResult> {\n const { url, timeout = 10_000, wait = 0 } = options;\n\n const browser = await chromium.launch({ headless: true });\n\n try {\n const context = await browser.newContext();\n const page = await context.newPage();\n\n // Inject the @agent-scope/playwright browser-entry bundle before any page scripts run.\n // This bundle correctly handles:\n // 1. Vite react-refresh preamble (renderers proxy Map)\n // 2. React 18 async first-commit awaiting\n await page.addInitScript({ content: getBrowserEntryScript() });\n\n // Navigate and wait for network idle\n await page.goto(url, {\n waitUntil: \"networkidle\",\n timeout: timeout + 5_000,\n });\n\n // Wait for the capture function to be available (bundle injects it synchronously)\n await page.waitForFunction(\n () => {\n return (\n typeof (window as Window & { __SCOPE_CAPTURE__?: unknown }).__SCOPE_CAPTURE__ ===\n \"function\" &&\n (document.readyState === \"complete\" || document.readyState === \"interactive\")\n );\n },\n { timeout },\n );\n\n // Additional wait if requested\n if (wait > 0) {\n await page.waitForTimeout(wait);\n }\n\n // Call the injected capture function — awaits first React commit internally\n const raw = await page.evaluate(async () => {\n const win = window as Window & { __SCOPE_CAPTURE__?: () => Promise<unknown> };\n if (typeof win.__SCOPE_CAPTURE__ !== \"function\") {\n throw new Error(\"Scope runtime not injected\");\n }\n return win.__SCOPE_CAPTURE__();\n });\n\n if (\n raw !== null &&\n typeof raw === \"object\" &&\n \"error\" in raw &&\n typeof (raw as Record<string, unknown>).error === \"string\"\n ) {\n throw new Error(`Scope capture failed: ${(raw as Record<string, unknown>).error as string}`);\n }\n\n const report = { ...(raw as Omit<PageReport, \"route\">), route: null } as PageReport;\n return { report };\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Write a PageReport to a file as JSON.\n */\nexport function writeReportToFile(report: PageReport, outputPath: string, pretty: boolean): void {\n const json = pretty ? JSON.stringify(report, null, 2) : JSON.stringify(report);\n writeFileSync(outputPath, json, \"utf-8\");\n}\n","/**\n * @agent-scope/cli — `scope ci` command\n *\n * Runs a non-interactive CI pipeline over the component library and exits\n * with a structured exit code so the result can be consumed by CI systems.\n *\n * ## Pipeline steps (in order)\n *\n * 1. Generate the component manifest (discover all components)\n * 2. Render all discovered components\n * 3. Run token-compliance checks\n * 4. Compare against baseline snapshot (if `--baseline` provided)\n *\n * ## Exit codes\n *\n * 0 — All checks passed\n * 1 — Compliance below threshold\n * 2 — Accessibility violations found (reserved; currently surfaced as info)\n * 3 — Console errors during render\n * 4 — Visual regression detected (pixel diff above threshold)\n * 5 — Component render failures\n *\n * ## Usage\n *\n * ```bash\n * scope ci\n * scope ci --baseline .reactscope/baseline\n * scope ci --checks compliance,console-errors\n * scope ci --threshold 0.90 --json\n * ```\n */\n\nimport { existsSync, readFileSync, 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 { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { isTTY } from \"../manifest-formatter.js\";\nimport { renderProgressBar } from \"../render-formatter.js\";\nimport { getCompiledCssForClasses, getElementClassNames } from \"../tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Exit codes — must match the spec in Human Interface & CLI Spec §1.9\n// ---------------------------------------------------------------------------\n\nexport const CI_EXIT = {\n /** All checks passed */\n OK: 0,\n /** Compliance score below threshold */\n COMPLIANCE_BELOW_THRESHOLD: 1,\n /** Accessibility violations found */\n A11Y_VIOLATIONS: 2,\n /** Console errors detected during render */\n CONSOLE_ERRORS: 3,\n /** Visual regression detected against baseline */\n VISUAL_REGRESSION: 4,\n /** One or more components failed to render */\n RENDER_FAILURES: 5,\n} as const;\n\nexport type CiExitCode = (typeof CI_EXIT)[keyof typeof CI_EXIT];\n\n// ---------------------------------------------------------------------------\n// Check names\n// ---------------------------------------------------------------------------\n\nexport type CiCheckName = \"compliance\" | \"a11y\" | \"console-errors\" | \"visual-regression\";\n\nconst ALL_CHECKS: CiCheckName[] = [\"compliance\", \"a11y\", \"console-errors\", \"visual-regression\"];\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\nexport interface CiCheckResult {\n /** Which check this is */\n check: CiCheckName;\n /** Whether the check passed */\n passed: boolean;\n /** Human-readable summary */\n message: string;\n /** Numeric value for threshold-based checks */\n value?: number;\n /** Threshold that was applied */\n threshold?: number;\n}\n\nexport interface CiResult {\n /** ISO timestamp */\n ranAt: string;\n /** Whether the overall CI run passed (exit code 0) */\n passed: boolean;\n /** The resolved exit code */\n exitCode: CiExitCode;\n /** Per-check results */\n checks: CiCheckResult[];\n /** Component counts */\n components: {\n total: number;\n rendered: number;\n failed: number;\n };\n /** Aggregate compliance score (0–1) */\n complianceScore: number;\n /** Compliance threshold that was applied */\n complianceThreshold: number;\n /** Whether baseline comparison was performed */\n baselineCompared: boolean;\n /** Wall-clock duration in ms */\n wallClockMs: number;\n}\n\n// ---------------------------------------------------------------------------\n// Options\n// ---------------------------------------------------------------------------\n\nexport interface CiOptions {\n /** Baseline directory to compare against. Omit to skip visual regression check. */\n baselineDir?: string;\n /** Which checks to run. Default: all */\n checks?: CiCheckName[];\n /** Compliance pass threshold (0–1). Default: 0.90 */\n complianceThreshold?: number;\n /** Viewport width. Default: 375 */\n viewportWidth?: number;\n /** Viewport height. Default: 812 */\n viewportHeight?: number;\n}\n\n// ---------------------------------------------------------------------------\n// BrowserPool — lazy singleton\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 (shared pattern — identical to baseline/diff)\n// ---------------------------------------------------------------------------\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 PAD = 24;\n const pool = await getPool(viewportWidth, viewportHeight);\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n undefined,\n undefined,\n PAD,\n );\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 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 getElementClassNames(el)) {\n 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 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// Computed-style extractor (shared pattern)\n// ---------------------------------------------------------------------------\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 comparison helpers\n// ---------------------------------------------------------------------------\n\ninterface BaselineRenderJson {\n component: string;\n width: number;\n height: number;\n}\n\nfunction loadBaselineRenderJson(\n baselineDir: string,\n componentName: string,\n): BaselineRenderJson | null {\n const jsonPath = resolve(baselineDir, \"renders\", `${componentName}.json`);\n if (!existsSync(jsonPath)) return null;\n return JSON.parse(readFileSync(jsonPath, \"utf-8\")) as BaselineRenderJson;\n}\n\n// ---------------------------------------------------------------------------\n// CI runner\n// ---------------------------------------------------------------------------\n\n/**\n * Run the full CI pipeline and return a structured CiResult.\n *\n * Does not call `process.exit` — callers are responsible for that so the\n * function remains testable without side effects.\n */\nexport async function runCi(options: CiOptions = {}): Promise<CiResult> {\n const {\n baselineDir: baselineDirRaw,\n checks = ALL_CHECKS,\n complianceThreshold = 0.9,\n viewportWidth = 375,\n viewportHeight = 812,\n } = options;\n\n const startTime = performance.now();\n const rootDir = process.cwd();\n const checksSet = new Set<CiCheckName>(checks);\n const baselineDir = baselineDirRaw !== undefined ? resolve(rootDir, baselineDirRaw) : undefined;\n\n // ── 1. Generate manifest ─────────────────────────────────────────────────\n process.stderr.write(\"Scanning for React components…\\n\");\n const manifest: Manifest = await generateManifest({ rootDir });\n const componentNames = Object.keys(manifest.components);\n const total = componentNames.length;\n process.stderr.write(`Found ${total} components.\\n`);\n\n // ── 2. Render all components ─────────────────────────────────────────────\n process.stderr.write(`Rendering ${total} components…\\n`);\n\n const computedStylesMap = new Map<string, ComputedStyles>();\n const currentRenderMeta = new Map<string, { width: number; height: number }>();\n const renderFailures = new Set<string>();\n\n let completed = 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 renderFailures.add(name);\n return;\n }\n\n const result = outcome.result;\n currentRenderMeta.set(name, { width: result.width, height: result.height });\n computedStylesMap.set(name, extractComputedStyles(result.computedStyles));\n };\n\n if (total > 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\n await shutdownPool();\n\n if (isTTY() && total > 0) {\n process.stderr.write(\"\\n\");\n }\n\n // ── 3. Compliance audit ──────────────────────────────────────────────────\n const resolver = new TokenResolver([]);\n const engine = new ComplianceEngine(resolver);\n const batchReport: BatchReport = engine.auditBatch(computedStylesMap);\n const complianceScore = batchReport.aggregateCompliance;\n\n // ── 4. Evaluate checks ───────────────────────────────────────────────────\n const checkResults: CiCheckResult[] = [];\n\n // ── 4a. Render failures (always evaluated) ───────────────────────────────\n const renderFailureCount = renderFailures.size;\n const rendersPassed = renderFailureCount === 0;\n\n // ── 4b. Compliance check ─────────────────────────────────────────────────\n if (checksSet.has(\"compliance\")) {\n const compliancePassed = complianceScore >= complianceThreshold;\n checkResults.push({\n check: \"compliance\",\n passed: compliancePassed,\n message: compliancePassed\n ? `Compliance ${(complianceScore * 100).toFixed(1)}% >= threshold ${(complianceThreshold * 100).toFixed(1)}%`\n : `Compliance ${(complianceScore * 100).toFixed(1)}% < threshold ${(complianceThreshold * 100).toFixed(1)}%`,\n value: complianceScore,\n threshold: complianceThreshold,\n });\n }\n\n // ── 4c. A11y check (reserved — informational in v1) ─────────────────────\n if (checksSet.has(\"a11y\")) {\n // A11y violations require axe-core integration (future work).\n // Exit-code slot 2 is reserved; currently passes unconditionally.\n checkResults.push({\n check: \"a11y\",\n passed: true,\n message: \"Accessibility audit not yet implemented — skipped\",\n });\n }\n\n // ── 4d. Console errors check ─────────────────────────────────────────────\n if (checksSet.has(\"console-errors\")) {\n // Console error capture requires page-level hooks (future work).\n // Exit-code slot 3 is reserved; currently passes when all components render.\n const consoleErrorsPassed = rendersPassed;\n checkResults.push({\n check: \"console-errors\",\n passed: consoleErrorsPassed,\n message: consoleErrorsPassed\n ? \"No console errors detected\"\n : `Console errors likely — ${renderFailureCount} component(s) failed to render`,\n });\n }\n\n // ── 4e. Visual regression check ─────────────────────────────────────────\n let hasVisualRegression = false;\n\n if (checksSet.has(\"visual-regression\") && baselineDir !== undefined) {\n if (!existsSync(baselineDir)) {\n process.stderr.write(\n `Warning: baseline directory not found at \"${baselineDir}\" — skipping visual regression check.\\n`,\n );\n checkResults.push({\n check: \"visual-regression\",\n passed: true,\n message: `Baseline not found at ${baselineDir} — skipped`,\n });\n } else {\n // Dimension-based regression detection (pixel diff reserved for v2).\n // Flag components whose rendered dimensions changed by > 10px on either axis.\n const regressions: string[] = [];\n\n for (const name of componentNames) {\n const baselineMeta = loadBaselineRenderJson(baselineDir, name);\n const currentMeta = currentRenderMeta.get(name);\n\n if (baselineMeta !== null && currentMeta !== undefined) {\n const dw = Math.abs(currentMeta.width - baselineMeta.width);\n const dh = Math.abs(currentMeta.height - baselineMeta.height);\n if (dw > 10 || dh > 10) {\n regressions.push(name);\n }\n }\n }\n\n hasVisualRegression = regressions.length > 0;\n checkResults.push({\n check: \"visual-regression\",\n passed: !hasVisualRegression,\n message: hasVisualRegression\n ? `Visual regression detected in ${regressions.length} component(s): ${regressions.slice(0, 5).join(\", \")}${regressions.length > 5 ? \"...\" : \"\"}`\n : \"No visual regressions detected\",\n });\n }\n }\n\n // ── 5. Resolve exit code ─────────────────────────────────────────────────\n // First failing check wins. Render failures are checked last so that\n // compliance/a11y/console/visual codes take precedence when checks are enabled.\n let exitCode: CiExitCode = CI_EXIT.OK;\n\n const complianceResult = checkResults.find((r) => r.check === \"compliance\");\n const a11yResult = checkResults.find((r) => r.check === \"a11y\");\n const consoleResult = checkResults.find((r) => r.check === \"console-errors\");\n const visualResult = checkResults.find((r) => r.check === \"visual-regression\");\n\n if (complianceResult !== undefined && !complianceResult.passed) {\n exitCode = CI_EXIT.COMPLIANCE_BELOW_THRESHOLD;\n } else if (a11yResult !== undefined && !a11yResult.passed) {\n exitCode = CI_EXIT.A11Y_VIOLATIONS;\n } else if (consoleResult !== undefined && !consoleResult.passed) {\n exitCode = CI_EXIT.CONSOLE_ERRORS;\n } else if (visualResult !== undefined && !visualResult.passed) {\n exitCode = CI_EXIT.VISUAL_REGRESSION;\n } else if (!rendersPassed) {\n exitCode = CI_EXIT.RENDER_FAILURES;\n }\n\n const passed = exitCode === CI_EXIT.OK;\n const wallClockMs = performance.now() - startTime;\n\n return {\n ranAt: new Date().toISOString(),\n passed,\n exitCode,\n checks: checkResults,\n components: {\n total,\n rendered: total - renderFailureCount,\n failed: renderFailureCount,\n },\n complianceScore,\n complianceThreshold,\n baselineCompared: baselineDir !== undefined && existsSync(baselineDir),\n wallClockMs,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Human-readable formatter\n// ---------------------------------------------------------------------------\n\n/**\n * Format a CiResult as the CI stdout summary (spec §4.2).\n */\nexport function formatCiReport(result: CiResult): string {\n const lines: string[] = [];\n\n const title = \"Scope CI Report\";\n const rule = \"=\".repeat(Math.max(title.length, 40));\n lines.push(title, rule);\n\n // Component stats\n const { total, rendered, failed } = result.components;\n lines.push(\n `Components: ${total} total ${rendered} rendered${failed > 0 ? ` ${failed} failed` : \"\"}`,\n );\n\n // Per-check summary\n lines.push(\"\");\n for (const check of result.checks) {\n const icon = check.passed ? \"pass\" : \"FAIL\";\n lines.push(` [${icon}] ${check.message}`);\n }\n\n // Render failures (always shown when present)\n if (result.components.failed > 0) {\n lines.push(` [FAIL] ${result.components.failed} component(s) failed to render`);\n }\n\n lines.push(\"\");\n lines.push(rule);\n\n if (result.passed) {\n lines.push(\n `CI passed in ${(result.wallClockMs / 1000).toFixed(1)}s (exit code ${result.exitCode})`,\n );\n } else {\n lines.push(\n `CI failed in ${(result.wallClockMs / 1000).toFixed(1)}s (exit code ${result.exitCode})`,\n );\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a comma-separated list of check names, validating each entry.\n * Returns undefined when the list is empty or invalid, falling back to all checks.\n */\nfunction parseChecks(raw: string | undefined): CiCheckName[] | undefined {\n if (raw === undefined) return undefined;\n\n const parts = raw\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n\n if (parts.length === 0) return undefined;\n\n const valid = new Set<string>(ALL_CHECKS);\n const parsed: CiCheckName[] = [];\n\n for (const part of parts) {\n if (!valid.has(part)) {\n process.stderr.write(\n `Warning: unknown check \"${part}\" — valid checks are: ${ALL_CHECKS.join(\", \")}\\n`,\n );\n continue;\n }\n parsed.push(part as CiCheckName);\n }\n\n return parsed.length > 0 ? parsed : undefined;\n}\n\n/**\n * Build and return the `scope ci` command.\n *\n * The command runs the full pipeline, writes output,\n * and calls `process.exit` with the appropriate exit code.\n */\nexport function createCiCommand(): Command {\n return new Command(\"ci\")\n .description(\n \"Run the full Scope pipeline non-interactively and exit with a structured code.\\n\\n\" +\n \"PIPELINE STEPS (in order):\\n\" +\n \" 1. manifest generate scan source, build .reactscope/manifest.json\\n\" +\n \" 2. render all screenshot every component\\n\" +\n \" 3. tokens compliance score on-token CSS coverage\\n\" +\n \" 4. visual regression pixel diff against --baseline (if provided)\\n\\n\" +\n \"CHECKS (--checks flag, comma-separated):\\n\" +\n \" compliance token coverage below --threshold → exit 1\\n\" +\n \" a11y accessibility violations → exit 2\\n\" +\n \" console-errors console.error during render → exit 3\\n\" +\n \" visual-regression pixel diff against baseline → exit 4\\n\" +\n \" (render failures always → exit 5 regardless of --checks)\\n\\n\" +\n \"EXIT CODES:\\n\" +\n \" 0 all checks passed\\n\" +\n \" 1 compliance below threshold\\n\" +\n \" 2 accessibility violations\\n\" +\n \" 3 console errors during render\\n\" +\n \" 4 visual regression detected\\n\" +\n \" 5 component render failures\\n\\n\" +\n \"Examples:\\n\" +\n \" scope ci\\n\" +\n \" scope ci --baseline .reactscope/baseline --threshold 0.95\\n\" +\n \" scope ci --checks compliance,a11y --json -o ci-result.json\\n\" +\n \" scope ci --viewport 1280x720\",\n )\n .option(\n \"-b, --baseline <dir>\",\n \"Baseline directory for visual regression comparison (omit to skip)\",\n )\n .option(\n \"--checks <list>\",\n `Comma-separated checks to run (default: all). Valid: ${ALL_CHECKS.join(\", \")}`,\n )\n .option(\"--threshold <n>\", \"Compliance pass threshold (0-1, default: 0.90)\", \"0.90\")\n .option(\"--viewport <WxH>\", \"Viewport size, e.g. 1280x720\", \"375x812\")\n .option(\"--json\", \"Emit structured JSON to stdout in addition to the summary\", false)\n .option(\"-o, --output <path>\", \"Write the CI result JSON to a file\")\n .action(\n async (opts: {\n baseline?: string;\n checks?: string;\n threshold: string;\n viewport: string;\n json: boolean;\n output?: 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 const complianceThreshold = Number.parseFloat(opts.threshold);\n const checks = parseChecks(opts.checks);\n\n const result = await runCi({\n baselineDir: opts.baseline,\n checks,\n complianceThreshold,\n viewportWidth,\n viewportHeight,\n });\n\n // Write JSON output file if requested\n if (opts.output !== undefined) {\n const outPath = resolve(process.cwd(), opts.output);\n writeFileSync(outPath, JSON.stringify(result, null, 2), \"utf-8\");\n process.stderr.write(`CI result written to ${opts.output}\\n`);\n }\n\n // Emit human-readable summary\n process.stdout.write(`${formatCiReport(result)}\\n`);\n\n // Emit JSON to stdout when requested\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n }\n\n process.exit(result.exitCode);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(CI_EXIT.RENDER_FAILURES);\n }\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 * @param preScript - Optional JS to inject before the component bundle\n * (e.g. Scope browser-entry for DevTools hook installation).\n * Runs in a separate <script> tag so it executes before React.\n */\nexport async function buildComponentHarness(\n filePath: string,\n componentName: string,\n props: Record<string, unknown>,\n viewportWidth: number,\n projectCss?: string,\n /** Optional pre-built wrapper IIFE script from a .scope.ts(x) file. */\n wrapperScript?: string,\n /** Padding (px) around the component for screenshot clipping. Applied as margin on #scope-root. */\n screenshotPadding = 0,\n): Promise<string> {\n const bundledScript = await bundleComponentToIIFE(filePath, componentName, props);\n return wrapInHtml(bundledScript, viewportWidth, projectCss, wrapperScript, screenshotPadding);\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 // If a scope file wrapper was injected, use it to wrap the component\n var Wrapper = (window).__SCOPE_WRAPPER__;\n var element = Wrapper\n ? createElement(Wrapper, null, createElement(Component, props))\n : createElement(Component, props);\n createRoot(rootEl).render(element);\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 // CSS imports (e.g. `import './styles.css'`) are handled at the page level via\n // globalCSS injection. Tell esbuild to treat CSS files as empty modules so\n // components that import CSS directly (e.g. App.tsx) don't error during bundling.\n loader: {\n \".css\": \"empty\",\n \".svg\": \"dataurl\",\n \".png\": \"dataurl\",\n \".jpg\": \"dataurl\",\n \".jpeg\": \"dataurl\",\n \".gif\": \"dataurl\",\n \".webp\": \"dataurl\",\n \".ttf\": \"dataurl\",\n \".woff\": \"dataurl\",\n \".woff2\": \"dataurl\",\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(\n bundledScript: string,\n viewportWidth: number,\n projectCss?: string,\n wrapperScript?: string,\n screenshotPadding = 0,\n): 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 const wrapperScriptBlock =\n wrapperScript != null && wrapperScript.length > 0\n ? `<script id=\"scope-wrapper-script\">${wrapperScript}</script>`\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 <script>\n // Reset globals that persist on window across page.setContent() calls\n // (document.open/write/close clears the DOM but NOT the JS global scope)\n window.__SCOPE_WRAPPER__ = null;\n window.__SCOPE_RENDER_COMPLETE__ = false;\n window.__SCOPE_RENDER_ERROR__ = null;\n </script>\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; margin: ${screenshotPadding}px; }\n </style>\n ${projectStyleBlock}\n</head>\n<body>\n <div id=\"scope-root\" data-reactscope-root></div>\n ${wrapperScriptBlock}\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 collection?: string;\n internal: boolean;\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\", \"COLLECTION\", \"INTERNAL\"];\n const tableRows = rows.map((r) => [\n r.name,\n r.file,\n r.complexityClass,\n String(r.hookCount),\n String(r.contextCount),\n r.collection ?? \"—\",\n r.internal ? \"yes\" : \"no\",\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 ` Collection: ${descriptor.collection ?? \"—\"}`,\n ` Internal: ${descriptor.internal}`,\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 collection?: string;\n internal: boolean;\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\", \"COLLECTION\", \"INTERNAL\"];\n const tableRows = rows.map((r) => [\n r.name,\n r.file,\n r.complexityClass,\n r.hooks,\n r.contexts,\n r.collection ?? \"—\",\n r.internal ? \"yes\" : \"no\",\n ]);\n\n return `Query: ${queryDesc}\\n\\n${buildTable(headers, tableRows)}`;\n}\n\nexport function formatQueryJson(rows: QueryRow[]): string {\n return JSON.stringify(rows, null, 2);\n}\n\n// ---------------------------------------------------------------------------\n// Glob matching\n// ---------------------------------------------------------------------------\n\n/**\n * Minimal glob matcher supporting `*` (any chars except `/`) and `**` (any chars).\n * Only used for `--filter` on component names.\n */\nexport function matchGlob(pattern: string, value: string): boolean {\n // Escape regex special chars except *\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"§GLOBSTAR§\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/§GLOBSTAR§/g, \".*\");\n const regex = new RegExp(`^${regexStr}$`, \"i\");\n return regex.test(value);\n}\n","/**\n * @agent-scope/cli — render output formatters\n *\n * Formats RenderResult, MatrixResult, and batch render summaries in:\n * - JSON (full structured data)\n * - PNG (raw Buffer or file write)\n * - HTML (visual grid with embedded base64 images)\n * - CSV (flat table: component, axis values, render time, compliance %)\n *\n * Also provides:\n * - progress bar rendering for `scope render all`\n * - viewport string parsing (e.g. \"1280x720\")\n */\n\nimport type { MatrixCell, MatrixResult, RenderResult } from \"@agent-scope/render\";\n\n// ---------------------------------------------------------------------------\n// Re-export TTY helper (reused from manifest-formatter)\n// ---------------------------------------------------------------------------\n\nexport { isTTY } from \"./manifest-formatter.js\";\n\n// ---------------------------------------------------------------------------\n// Viewport parsing\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a viewport string such as \"1280x720\" into `{ width, height }`.\n * Throws if the format is invalid or values are non-positive.\n */\nexport function parseViewport(spec: string): { width: number; height: number } {\n const lower = spec.toLowerCase();\n const match = /^(\\d+)[x×](\\d+)$/.exec(lower);\n if (!match) {\n throw new Error(`Invalid viewport \"${spec}\". Expected format: WIDTHxHEIGHT (e.g. 1280x720)`);\n }\n const width = parseInt(match[1] ?? \"0\", 10);\n const height = parseInt(match[2] ?? \"0\", 10);\n if (width <= 0 || height <= 0) {\n throw new Error(`Viewport dimensions must be positive integers, got: ${spec}`);\n }\n return { width, height };\n}\n\n// ---------------------------------------------------------------------------\n// Single render JSON\n// ---------------------------------------------------------------------------\n\nexport interface RenderJsonOutput {\n component: string;\n props: Record<string, unknown>;\n width: number;\n height: number;\n renderTimeMs: number;\n computedStyles: Record<string, Record<string, string>>;\n screenshot?: string; // base64-encoded PNG\n dom?: RenderResult[\"dom\"];\n console?: RenderResult[\"console\"];\n accessibility?: RenderResult[\"accessibility\"];\n}\n\n/**\n * Format a single `RenderResult` as a structured JSON-serialisable object.\n * The screenshot is base64-encoded for portability.\n */\nexport function formatRenderJson(\n componentName: string,\n props: Record<string, unknown>,\n result: RenderResult,\n): RenderJsonOutput {\n return {\n component: componentName,\n props,\n width: result.width,\n height: result.height,\n renderTimeMs: result.renderTimeMs,\n computedStyles: result.computedStyles,\n screenshot: result.screenshot.toString(\"base64\"),\n dom: result.dom,\n console: result.console,\n accessibility: result.accessibility,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix JSON\n// ---------------------------------------------------------------------------\n\nexport interface MatrixJsonOutput {\n axes: Array<{ name: string; values: string[] }>;\n stats: {\n totalCells: number;\n totalRenderTimeMs: number;\n avgRenderTimeMs: number;\n minRenderTimeMs: number;\n maxRenderTimeMs: number;\n wallClockTimeMs: number;\n };\n cells: Array<{\n index: number;\n axisIndices: number[];\n props: Record<string, unknown>;\n renderTimeMs: number;\n width: number;\n height: number;\n screenshot: string; // base64\n }>;\n}\n\n/**\n * Format a `MatrixResult` as a structured JSON-serialisable object.\n */\nexport function formatMatrixJson(result: MatrixResult): MatrixJsonOutput {\n return {\n axes: result.axes.map((axis) => ({\n name: axis.name,\n values: axis.values.map((v) => String(v)),\n })),\n stats: { ...result.stats },\n cells: result.cells.map((cell: MatrixCell) => ({\n index: cell.index,\n axisIndices: cell.axisIndices,\n props: cell.props,\n renderTimeMs: cell.result.renderTimeMs,\n width: cell.result.width,\n height: cell.result.height,\n screenshot: cell.result.screenshot.toString(\"base64\"),\n })),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Matrix HTML\n// ---------------------------------------------------------------------------\n\n/**\n * Format a `MatrixResult` as an HTML visual grid with embedded images.\n *\n * Each cell is rendered as an `<img>` tag with the screenshot embedded\n * as a data URI, with prop labels displayed beneath each cell.\n */\nexport function formatMatrixHtml(componentName: string, result: MatrixResult): string {\n const cellsHtml = result.cells\n .map((cell: MatrixCell) => {\n const b64 = cell.result.screenshot.toString(\"base64\");\n const propLabel = escapeHtml(\n Object.entries(cell.props)\n .map(([k, v]) => `${k}: ${String(v)}`)\n .join(\", \"),\n );\n return ` <div class=\"cell\">\n <img src=\"data:image/png;base64,${b64}\" alt=\"${propLabel}\" width=\"${cell.result.width}\" height=\"${cell.result.height}\" />\n <div class=\"label\">${propLabel}</div>\n <div class=\"meta\">${cell.result.renderTimeMs.toFixed(1)}ms</div>\n </div>`;\n })\n .join(\"\\n\");\n\n const axesDesc = result.axes\n .map((a) => `${a.name}: ${a.values.map((v) => String(v)).join(\", \")}`)\n .join(\" | \");\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${escapeHtml(componentName)} — Render Matrix</title>\n <style>\n body { font-family: system-ui, sans-serif; background: #f8fafc; margin: 0; padding: 24px; }\n h1 { font-size: 1.25rem; color: #1e293b; margin-bottom: 8px; }\n .axes { font-size: 0.8rem; color: #64748b; margin-bottom: 20px; }\n .grid { display: flex; flex-wrap: wrap; gap: 16px; }\n .cell { background: #fff; border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden; }\n .cell img { display: block; }\n .label { padding: 6px 8px; font-size: 0.75rem; color: #374151; border-top: 1px solid #f1f5f9; }\n .meta { padding: 2px 8px 6px; font-size: 0.7rem; color: #94a3b8; }\n .stats { margin-top: 24px; font-size: 0.8rem; color: #64748b; }\n </style>\n</head>\n<body>\n <h1>${escapeHtml(componentName)} — Render Matrix</h1>\n <div class=\"axes\">Axes: ${escapeHtml(axesDesc)}</div>\n <div class=\"grid\">\n${cellsHtml}\n </div>\n <div class=\"stats\">\n ${result.stats.totalCells} cells ·\n avg ${result.stats.avgRenderTimeMs.toFixed(1)}ms ·\n min ${result.stats.minRenderTimeMs.toFixed(1)}ms ·\n max ${result.stats.maxRenderTimeMs.toFixed(1)}ms ·\n wall ${result.stats.wallClockTimeMs.toFixed(0)}ms\n </div>\n</body>\n</html>\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Matrix CSV\n// ---------------------------------------------------------------------------\n\n/**\n * Format a `MatrixResult` as a flat CSV table.\n *\n * Columns: component, [axis name columns...], renderTimeMs\n */\nexport function formatMatrixCsv(componentName: string, result: MatrixResult): string {\n const axisNames = result.axes.map((a) => a.name);\n const headers = [\"component\", ...axisNames, \"renderTimeMs\", \"width\", \"height\"];\n\n const rows = result.cells.map((cell: MatrixCell) => {\n const axisVals = result.axes.map((_, i) => {\n const axisIdx = cell.axisIndices[i];\n const axis = result.axes[i];\n if (axisIdx === undefined || axis === undefined) return \"\";\n const val = axis.values[axisIdx];\n return val !== undefined ? csvEscape(String(val)) : \"\";\n });\n return [\n csvEscape(componentName),\n ...axisVals,\n cell.result.renderTimeMs.toFixed(3),\n String(cell.result.width),\n String(cell.result.height),\n ].join(\",\");\n });\n\n return `${[headers.join(\",\"), ...rows].join(\"\\n\")}\\n`;\n}\n\n// ---------------------------------------------------------------------------\n// Progress bar\n// ---------------------------------------------------------------------------\n\n/**\n * Render an ASCII progress bar suitable for terminal output.\n *\n * Output format:\n * Rendering 42/128 components... [=====> ] 33%\n */\nexport function renderProgressBar(\n completed: number,\n total: number,\n currentName: string,\n pct: number,\n barWidth = 20,\n): string {\n const filled = Math.round((pct / 100) * barWidth);\n const empty = barWidth - filled;\n const bar = \"=\".repeat(Math.max(0, filled - 1)) + (filled > 0 ? \">\" : \"\") + \" \".repeat(empty);\n const nameSlice = currentName.slice(0, 25).padEnd(25);\n return `Rendering ${completed}/${total} ${nameSlice} [${bar}] ${pct}%`;\n}\n\n// ---------------------------------------------------------------------------\n// Batch summary\n// ---------------------------------------------------------------------------\n\nexport interface BatchRenderSummaryItem {\n name: string;\n renderTimeMs: number;\n success: boolean;\n errorMessage?: string;\n}\n\n/**\n * Format a human-readable summary of a `scope render all` run.\n */\nexport function formatSummaryText(results: BatchRenderSummaryItem[], outputDir: string): string {\n const total = results.length;\n const passed = results.filter((r) => r.success).length;\n const failed = total - passed;\n const successTimes = results.filter((r) => r.success).map((r) => r.renderTimeMs);\n const avgMs =\n successTimes.length > 0 ? successTimes.reduce((a, b) => a + b, 0) / successTimes.length : 0;\n\n const lines: string[] = [\n \"─\".repeat(60),\n `Render Summary`,\n \"─\".repeat(60),\n ` Total components : ${total}`,\n ` Passed : ${passed}`,\n ` Failed : ${failed}`,\n ` Avg render time : ${avgMs.toFixed(1)}ms`,\n ` Output dir : ${outputDir}`,\n ];\n\n if (failed > 0) {\n lines.push(\"\", \" Failed components:\");\n for (const r of results) {\n if (!r.success) {\n lines.push(` ✗ ${r.name}: ${r.errorMessage ?? \"unknown error\"}`);\n }\n }\n }\n\n lines.push(\"─\".repeat(60));\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\nfunction csvEscape(value: string): string {\n if (value.includes(\",\") || value.includes('\"') || value.includes(\"\\n\")) {\n return `\"${value.replace(/\"/g, '\"\"')}\"`;\n }\n return value;\n}\n","/**\n * tailwind-css.ts\n *\n * Resolves and compiles Tailwind v4 project CSS for use in the render harness.\n * Assumes the CLI is run from a Tailwind v4 project root (e.g. design system).\n *\n * Flow:\n * 1. Find the project's styles entry (config or conventional paths).\n * 2. Compile it with tailwindcss's compile() and loadStylesheet for @import \"tailwindcss\".\n * 3. Call compiler.build(classes) with the list of class names used in the rendered DOM\n * so only those utilities are included.\n *\n * Caching: compiler is created once per cwd and reused; build(classes) is called per render.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { resolve } from \"node:path\";\n\nconst CONFIG_FILENAMES = [\n \".reactscope/config.json\",\n \".reactscope/config.js\",\n \".reactscope/config.mjs\",\n];\nconst STYLE_ENTRY_CANDIDATES = [\n \"src/index.css\",\n \"src/globals.css\",\n \"app/globals.css\",\n \"app/index.css\",\n \"styles/index.css\",\n \"index.css\",\n];\n\nconst TAILWIND_IMPORT = /@import\\s+[\"']tailwindcss[\"']\\s*;?/;\n\nexport function getElementClassNames(el: Element): string[] {\n const className = el.className;\n const raw =\n typeof className === \"string\"\n ? className\n : typeof (className as SVGAnimatedString | undefined)?.baseVal === \"string\"\n ? (className as SVGAnimatedString).baseVal\n : (el.getAttribute(\"class\") ?? \"\");\n return raw.split(/\\s+/).filter(Boolean);\n}\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// Tailwind v3 / PostCSS compilation (globalCSS files)\n// ---------------------------------------------------------------------------\n\n/**\n * Compile a CSS file using the project's local PostCSS + Tailwind v3 setup.\n * Falls back to reading the file as raw CSS if PostCSS/Tailwind are unavailable.\n *\n * This handles `components.wrappers.globalCSS` entries from reactscope.config.json.\n */\nexport async function compileGlobalCssFile(\n cssFilePath: string,\n cwd: string,\n): Promise<string | null> {\n const { existsSync, readFileSync } = await import(\"node:fs\");\n const { createRequire } = await import(\"node:module\");\n\n if (!existsSync(cssFilePath)) return null;\n\n const raw = readFileSync(cssFilePath, \"utf-8\");\n\n // If the file has @tailwind directives it needs PostCSS compilation\n const needsCompile = /@tailwind|@import\\s+['\"]tailwindcss/.test(raw);\n if (!needsCompile) {\n // Plain CSS — return as-is\n return raw;\n }\n\n try {\n const require = createRequire(resolve(cwd, \"package.json\"));\n\n // Try Tailwind v3 PostCSS path first\n let postcss: (plugins: unknown[]) => {\n process: (css: string, opts: unknown) => Promise<{ css: string }>;\n };\n let twPlugin: unknown;\n\n try {\n postcss = require(\"postcss\") as typeof postcss;\n twPlugin = require(\"tailwindcss\") as unknown;\n } catch {\n // PostCSS or tailwindcss not available — return raw\n return raw;\n }\n\n let autoprefixerPlugin: unknown;\n try {\n autoprefixerPlugin = require(\"autoprefixer\") as unknown;\n } catch {\n autoprefixerPlugin = null;\n }\n\n const plugins = autoprefixerPlugin ? [twPlugin, autoprefixerPlugin] : [twPlugin];\n const result = await postcss(plugins).process(raw, {\n from: cssFilePath,\n to: cssFilePath,\n });\n return result.css;\n } catch (err) {\n // Compilation failed — log and return raw so render still proceeds\n process.stderr.write(\n `[scope/render] Warning: CSS compilation failed for ${cssFilePath}: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return raw;\n }\n}\n\n/**\n * Load and compile all globalCSS files listed in the reactscope config,\n * returning a single concatenated CSS string (or null if none).\n */\nexport async function loadGlobalCss(globalCssFiles: string[], cwd: string): Promise<string | null> {\n if (globalCssFiles.length === 0) return null;\n const parts: string[] = [];\n for (const relPath of globalCssFiles) {\n const absPath = resolve(cwd, relPath);\n const css = await compileGlobalCssFile(absPath, cwd);\n if (css !== null && css.trim().length > 0) {\n parts.push(css);\n }\n }\n return parts.length > 0 ? parts.join(\"\\n\") : null;\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 * doctor-commands.ts\n *\n * `scope doctor` — health check that validates the current project's Scope\n * setup and reports issues with config, tokens, globalCSS, and manifest staleness.\n */\n\nimport { existsSync, readdirSync, readFileSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n detectPackageManager,\n getMissingHarnessDependencies,\n getPlaywrightBrowserStatus,\n hasLikelyInstalledDependencies,\n} from \"./diagnostics.js\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface DoctorCheck {\n name: string;\n status: \"ok\" | \"warn\" | \"error\";\n message: string;\n remediationCode?: string;\n fixCommand?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n/** Recursively collect .ts/.tsx/.js/.jsx files under a directory. */\nfunction collectSourceFiles(dir: string): string[] {\n if (!existsSync(dir)) return [];\n const results: string[] = [];\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name);\n if (entry.isDirectory() && entry.name !== \"node_modules\" && entry.name !== \".reactscope\") {\n results.push(...collectSourceFiles(full));\n } else if (entry.isFile() && /\\.(tsx?|jsx?)$/.test(entry.name)) {\n results.push(full);\n }\n }\n return results;\n}\n\nconst TAILWIND_CONFIG_FILES = [\n \"tailwind.config.js\",\n \"tailwind.config.cjs\",\n \"tailwind.config.mjs\",\n \"tailwind.config.ts\",\n \"postcss.config.js\",\n \"postcss.config.cjs\",\n \"postcss.config.mjs\",\n \"postcss.config.ts\",\n];\n\nfunction hasTailwindSetup(cwd: string): boolean {\n if (TAILWIND_CONFIG_FILES.some((file) => existsSync(resolve(cwd, file)))) {\n return true;\n }\n\n const packageJsonPath = resolve(cwd, \"package.json\");\n if (!existsSync(packageJsonPath)) return false;\n\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n };\n return [pkg.dependencies, pkg.devDependencies].some(\n (deps) =>\n deps &&\n Object.keys(deps).some(\n (name) => name === \"tailwindcss\" || name.startsWith(\"@tailwindcss/\"),\n ),\n );\n } catch {\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// Individual checks\n// ---------------------------------------------------------------------------\nfunction getPlaywrightInstallCommand(effectiveBrowserPath: string | null): string {\n return effectiveBrowserPath === null\n ? \"bunx playwright install chromium\"\n : `PLAYWRIGHT_BROWSERS_PATH=${effectiveBrowserPath} bunx playwright install chromium`;\n}\n\nfunction checkConfig(cwd: string): DoctorCheck {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) {\n return {\n name: \"config\",\n status: \"error\",\n message: \"reactscope.config.json not found — run `scope init` in the target project root\",\n };\n }\n try {\n JSON.parse(readFileSync(configPath, \"utf-8\"));\n return { name: \"config\", status: \"ok\", message: \"reactscope.config.json valid\" };\n } catch {\n return { name: \"config\", status: \"error\", message: \"reactscope.config.json is not valid JSON\" };\n }\n}\n\nfunction checkTokens(cwd: string): DoctorCheck {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n let tokensPath = resolve(cwd, \"reactscope.tokens.json\");\n if (existsSync(configPath)) {\n try {\n const cfg = JSON.parse(readFileSync(configPath, \"utf-8\")) as { tokens?: { file?: string } };\n if (cfg.tokens?.file) tokensPath = resolve(cwd, cfg.tokens.file);\n } catch {\n /* use default */\n }\n }\n if (!existsSync(tokensPath)) {\n return {\n name: \"tokens\",\n status: \"warn\",\n message: `Token file not found at ${tokensPath} — run \\`scope init\\``,\n };\n }\n try {\n const raw = JSON.parse(readFileSync(tokensPath, \"utf-8\")) as { version?: unknown };\n if (!raw.version) {\n return { name: \"tokens\", status: \"warn\", message: \"Token file is missing a `version` field\" };\n }\n return { name: \"tokens\", status: \"ok\", message: \"Token file valid\" };\n } catch {\n return { name: \"tokens\", status: \"error\", message: \"Token file is not valid JSON\" };\n }\n}\n\nfunction checkGlobalCss(cwd: string): DoctorCheck {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n let globalCss: string[] = [];\n if (existsSync(configPath)) {\n try {\n const cfg = JSON.parse(readFileSync(configPath, \"utf-8\")) as {\n components?: { wrappers?: { globalCSS?: string[] } };\n };\n globalCss = cfg.components?.wrappers?.globalCSS ?? [];\n } catch {\n /* empty */\n }\n }\n if (globalCss.length === 0) {\n if (!hasTailwindSetup(cwd)) {\n return {\n name: \"globalCSS\",\n status: \"ok\",\n message: \"No globalCSS configured — skipping CSS injection for this non-Tailwind project\",\n };\n }\n\n return {\n name: \"globalCSS\",\n status: \"warn\",\n message:\n \"No globalCSS configured — Tailwind styles won't apply to renders. \" +\n \"Add `components.wrappers.globalCSS` to reactscope.config.json\",\n };\n }\n const missing = globalCss.filter((f) => !existsSync(resolve(cwd, f)));\n if (missing.length > 0) {\n return {\n name: \"globalCSS\",\n status: \"error\",\n message: `globalCSS file(s) not found: ${missing.join(\", \")}`,\n };\n }\n return {\n name: \"globalCSS\",\n status: \"ok\",\n message: `${globalCss.length} globalCSS file(s) present`,\n };\n}\n\nfunction checkManifest(cwd: string): DoctorCheck {\n const manifestPath = resolve(cwd, \".reactscope\", \"manifest.json\");\n if (!existsSync(manifestPath)) {\n return {\n name: \"manifest\",\n status: \"warn\",\n message: \"Manifest not found — run `scope manifest generate` in the target project root\",\n };\n }\n\n const manifestMtime = statSync(manifestPath).mtimeMs;\n const sourceDir = resolve(cwd, \"src\");\n const sourceFiles = collectSourceFiles(sourceDir);\n const stale = sourceFiles.filter((f) => statSync(f).mtimeMs > manifestMtime);\n\n if (stale.length > 0) {\n return {\n name: \"manifest\",\n status: \"warn\",\n message: `Manifest may be stale — ${stale.length} source file(s) modified since last generate. Run \\`scope manifest generate\\``,\n };\n }\n return { name: \"manifest\", status: \"ok\", message: \"Manifest present and up to date\" };\n}\n\n// ---------------------------------------------------------------------------\n// Formatting\n// ---------------------------------------------------------------------------\n\nconst ICONS = { ok: \"✓\", warn: \"!\", error: \"✗\" } as const;\n\nfunction checkDependencies(cwd: string): DoctorCheck {\n const packageManager = detectPackageManager(cwd);\n\n if (!hasLikelyInstalledDependencies(cwd)) {\n return {\n name: \"dependencies\",\n status: \"error\",\n remediationCode: \"TARGET_PROJECT_DEPENDENCIES_MISSING\",\n fixCommand: `${packageManager} install`,\n message: `node_modules not found — run \\`${packageManager} install\\` in ${cwd} before render/site/instrument`,\n };\n }\n\n const missingHarnessDependencies = getMissingHarnessDependencies(cwd);\n if (missingHarnessDependencies.length > 0) {\n return {\n name: \"dependencies\",\n status: \"error\",\n remediationCode: \"TARGET_PROJECT_HARNESS_DEPENDENCIES_MISSING\",\n fixCommand: `${packageManager} install`,\n message:\n `Missing React harness dependencies: ${missingHarnessDependencies.join(\", \")}. ` +\n `Run \\`${packageManager} install\\` in ${cwd}, then retry render/site/instrument.`,\n };\n }\n\n return {\n name: \"dependencies\",\n status: \"ok\",\n message: \"node_modules and React harness dependencies present\",\n };\n}\n\nasync function checkPlaywright(cwd: string): Promise<DoctorCheck> {\n const status = await getPlaywrightBrowserStatus(cwd);\n const pathDetails =\n status.effectiveBrowserPath === null\n ? \"PLAYWRIGHT_BROWSERS_PATH is unset\"\n : `PLAYWRIGHT_BROWSERS_PATH=${status.effectiveBrowserPath}; exists=${status.browserPathExists}; writable=${status.browserPathWritable}`;\n\n if (status.available) {\n return {\n name: \"playwright\",\n status: \"ok\",\n message: `Playwright package available (${pathDetails})`,\n };\n }\n\n return {\n name: \"playwright\",\n status: \"error\",\n remediationCode: \"PLAYWRIGHT_BROWSERS_MISSING\",\n fixCommand: getPlaywrightInstallCommand(status.effectiveBrowserPath),\n message: `Playwright Chromium unavailable (${pathDetails}) — ${status.remediation}`,\n };\n}\n\nfunction collectFixCommands(checks: DoctorCheck[]): string[] {\n return checks\n .filter((check) => check.status === \"error\" && check.fixCommand !== undefined)\n .map((check) => check.fixCommand as string)\n .filter((command, index, commands) => commands.indexOf(command) === index);\n}\n\nfunction formatCheck(check: DoctorCheck): string {\n return ` [${ICONS[check.status]}] ${check.name.padEnd(12)} ${check.message}`;\n}\n\n// ---------------------------------------------------------------------------\n// Command\n// ---------------------------------------------------------------------------\n\nexport function createDoctorCommand(): Command {\n return new Command(\"doctor\")\n .description(\n \"Verify your Scope project setup before running other commands.\\n\\n\" +\n \"CHECKS PERFORMED:\\n\" +\n \" config reactscope.config.json exists and is valid JSON\\n\" +\n \" tokens reactscope.tokens.json exists and passes validation\\n\" +\n \" css globalCSS files referenced in config actually exist\\n\" +\n \" manifest .reactscope/manifest.json exists and is not stale\\n\" +\n \" dependencies node_modules exists in the target project root\\n\" +\n \" playwright Playwright browser runtime is available\\n\" +\n \" (stale = source files modified after last generate)\\n\\n\" +\n \"STATUS LEVELS: ok | warn | error\\n\\n\" +\n \"Run this first whenever renders fail or produce unexpected output.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope doctor\\n\" +\n \" scope doctor --json\\n\" +\n \" scope doctor --print-fix-commands\\n\" +\n \" scope doctor --json | jq '.checks[] | select(.status == \\\"error\\\")'\",\n )\n .option(\"--json\", \"Emit structured JSON output\", false)\n .option(\n \"--print-fix-commands\",\n \"Print deduplicated shell remediation commands for failing checks\",\n false,\n )\n .action(async (opts: { json: boolean; printFixCommands: boolean }) => {\n const cwd = process.cwd();\n const checks: DoctorCheck[] = [\n checkConfig(cwd),\n checkTokens(cwd),\n checkGlobalCss(cwd),\n checkManifest(cwd),\n checkDependencies(cwd),\n await checkPlaywright(cwd),\n ];\n\n const errors = checks.filter((c) => c.status === \"error\").length;\n const warnings = checks.filter((c) => c.status === \"warn\").length;\n\n const fixCommands = collectFixCommands(checks);\n\n if (opts.printFixCommands) {\n process.stdout.write(`${JSON.stringify({ cwd, fixCommands }, null, 2)}\\n`);\n if (errors > 0) process.exit(1);\n return;\n }\n\n if (opts.json) {\n process.stdout.write(\n `${JSON.stringify({ passed: checks.length - errors - warnings, warnings, errors, fixCommands, checks }, null, 2)}\\n`,\n );\n if (errors > 0) process.exit(1);\n return;\n }\n\n process.stdout.write(\"\\nScope Doctor\\n\");\n process.stdout.write(\"────────────────────────────────────────\\n\");\n for (const check of checks) process.stdout.write(`${formatCheck(check)}\\n`);\n process.stdout.write(\"────────────────────────────────────────\\n\");\n\n if (errors > 0) {\n process.stdout.write(` ${errors} error(s), ${warnings} warning(s)\\n\\n`);\n process.exit(1);\n } else if (warnings > 0) {\n process.stdout.write(` ${warnings} warning(s) — everything works but could be better\\n\\n`);\n } else {\n process.stdout.write(\" All checks passed!\\n\\n\");\n }\n });\n}\n","import { constants, existsSync, readFileSync } from \"node:fs\";\nimport { access } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\n\nexport interface ScopeDiagnostic {\n code: string;\n message: string;\n recovery: string;\n}\n\nexport interface PlaywrightBrowserStatus {\n effectiveBrowserPath: string | null;\n executablePath: string | null;\n available: boolean;\n browserPathWritable: boolean | null;\n browserPathExists: boolean | null;\n remediation: string;\n}\n\nconst PLAYWRIGHT_BROWSER_HINTS = [\n \"executable doesn't exist\",\n \"browserType.launch\",\n \"looks like playwright was just installed or updated\",\n \"please run the following command to download new browsers\",\n \"could not find chromium\",\n];\n\nconst MISSING_DEPENDENCY_HINTS = [\"could not resolve\", \"cannot find module\", \"module not found\"];\n\nconst REQUIRED_HARNESS_DEPENDENCIES = [\"react\", \"react-dom\", \"react/jsx-runtime\"] as const;\n\nexport function getEffectivePlaywrightBrowsersPath(): string | null {\n const value = process.env.PLAYWRIGHT_BROWSERS_PATH;\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function getPlaywrightBrowserRemediation(\n status?: Pick<\n PlaywrightBrowserStatus,\n \"effectiveBrowserPath\" | \"browserPathWritable\" | \"browserPathExists\"\n >,\n): string {\n const effectivePath = status?.effectiveBrowserPath ?? getEffectivePlaywrightBrowsersPath();\n if (effectivePath !== null) {\n const pathProblem =\n status?.browserPathExists === false\n ? \"missing\"\n : status?.browserPathWritable === false\n ? \"unwritable\"\n : \"unavailable\";\n return `PLAYWRIGHT_BROWSERS_PATH is set to ${effectivePath}, but that browser cache is ${pathProblem}. Unset PLAYWRIGHT_BROWSERS_PATH and run \\`bunx playwright install chromium\\`, or install and run with the same writable path: \\`PLAYWRIGHT_BROWSERS_PATH=${effectivePath} bunx playwright install chromium\\`.`;\n }\n return \"Run `bunx playwright install chromium` in this sandbox, then retry the Scope command.\";\n}\n\nexport function diagnoseScopeError(error: unknown, cwd = process.cwd()): ScopeDiagnostic | null {\n const message = error instanceof Error ? error.message : String(error);\n const normalized = message.toLowerCase();\n\n if (PLAYWRIGHT_BROWSER_HINTS.some((hint) => normalized.includes(hint))) {\n const browserPath = extractPlaywrightBrowserPath(message);\n const browserPathHint =\n browserPath === null ? \"\" : ` Scope tried to launch Chromium from ${browserPath}.`;\n\n return {\n code: \"PLAYWRIGHT_BROWSERS_MISSING\",\n message: \"Playwright Chromium is unavailable for Scope browser rendering.\",\n recovery:\n getPlaywrightBrowserRemediation() +\n browserPathHint +\n \" Use `scope doctor --json` to verify the browser check passes before rerunning render/site/instrument.\",\n };\n }\n\n if (MISSING_DEPENDENCY_HINTS.some((hint) => normalized.includes(hint))) {\n const packageManager = detectPackageManager(cwd);\n return {\n code: \"TARGET_PROJECT_DEPENDENCIES_MISSING\",\n message: \"The target project's dependencies appear to be missing or incomplete.\",\n recovery: `Run \\`${packageManager} install\\` in ${cwd}, then rerun \\`scope doctor\\` and retry the Scope command.`,\n };\n }\n\n return null;\n}\n\nexport function formatScopeDiagnostic(error: unknown, cwd = process.cwd()): string {\n const message = error instanceof Error ? error.message : String(error);\n const diagnostic = diagnoseScopeError(error, cwd);\n if (diagnostic === null) return `Error: ${message}`;\n return `Error [${diagnostic.code}]: ${diagnostic.message}\\nRecovery: ${diagnostic.recovery}\\nCause: ${message}`;\n}\n\nexport async function getPlaywrightBrowserStatus(\n cwd = process.cwd(),\n): Promise<PlaywrightBrowserStatus> {\n const effectiveBrowserPath = getEffectivePlaywrightBrowsersPath();\n const executablePath = getPlaywrightChromiumExecutablePath(cwd);\n const available = executablePath !== null && existsSync(executablePath);\n const browserPathExists = effectiveBrowserPath === null ? null : existsSync(effectiveBrowserPath);\n const browserPathWritable =\n effectiveBrowserPath === null ? null : await isWritableBrowserPath(effectiveBrowserPath);\n\n return {\n effectiveBrowserPath,\n executablePath,\n available,\n browserPathExists,\n browserPathWritable,\n remediation: getPlaywrightBrowserRemediation({\n effectiveBrowserPath,\n browserPathExists,\n browserPathWritable,\n }),\n };\n}\n\nexport function hasPlaywrightChromium(cwd = process.cwd()): boolean {\n const executablePath = getPlaywrightChromiumExecutablePath(cwd);\n return executablePath !== null && existsSync(executablePath);\n}\n\nfunction getPlaywrightChromiumExecutablePath(cwd = process.cwd()): string | null {\n try {\n const packageJsonPath = require.resolve(\"playwright/package.json\", { paths: [cwd] });\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as { version?: string };\n if (!packageJson.version) return null;\n\n const playwrightPath = require.resolve(\"playwright\", { paths: [cwd] });\n const { chromium } = require(playwrightPath) as {\n chromium?: { executablePath?: () => string };\n };\n const executablePath = chromium?.executablePath?.();\n if (typeof executablePath !== \"string\" || executablePath.length === 0) return null;\n\n return executablePath;\n } catch {\n return null;\n }\n}\n\nasync function isWritableBrowserPath(browserPath: string): Promise<boolean> {\n const candidate = existsSync(browserPath) ? browserPath : dirname(browserPath);\n try {\n await access(candidate, constants.W_OK);\n return true;\n } catch {\n return false;\n }\n}\nexport function detectPackageManager(cwd = process.cwd()): \"bun\" | \"pnpm\" | \"yarn\" | \"npm\" {\n if (existsSync(join(cwd, \"bun.lock\")) || existsSync(join(cwd, \"bun.lockb\"))) return \"bun\";\n if (existsSync(join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(cwd, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\nexport function hasLikelyInstalledDependencies(cwd = process.cwd()): boolean {\n return existsSync(join(cwd, \"node_modules\"));\n}\n\nexport function getMissingHarnessDependencies(cwd = process.cwd()): string[] {\n return REQUIRED_HARNESS_DEPENDENCIES.filter((dependencyName) => {\n try {\n require.resolve(dependencyName, { paths: [cwd] });\n return false;\n } catch {\n return true;\n }\n });\n}\n\nfunction extractPlaywrightBrowserPath(message: string): string | null {\n const match = message.match(/Executable doesn't exist at\\s+([^\\n]+)/i);\n return match?.[1]?.trim() ?? null;\n}\n","/**\n * get-skill-command.ts\n *\n * `scope get-skill` — print the Scope SKILL.md to stdout so an agent can\n * load it directly into its context without knowing the file path.\n *\n * The skill content is embedded at build time by scripts/generate-skill-content.mjs\n * so this works correctly in any install context (global npm, local node_modules, etc.)\n *\n * Usage:\n * scope get-skill # print raw markdown to stdout\n * scope get-skill --json # wrap in JSON { \"skill\": \"<content>\" }\n */\n\nimport { Command } from \"commander\";\nimport { SKILL_CONTENT } from \"./skill-content.js\";\n\nexport function createGetSkillCommand(): Command {\n return new Command(\"get-skill\")\n .description(\n \"Print the embedded Scope SKILL.md to stdout.\\n\\n\" +\n \"Agents: load this first, then follow the canonical workflow in the skill:\\n\" +\n \" init --yes → doctor --json → manifest --format json → render all --format json → site build\\n\" +\n \"The skill documents .scope.tsx discovery/exports, config paths, profiler usage,\\n\" +\n \"and failure recovery.\\n\\n\" +\n \"EMBEDDED AT BUILD TIME — works in any install context (global npm, npx, local).\\n\\n\" +\n \"Examples:\\n\" +\n \" scope get-skill # raw markdown to stdout\\n\" +\n ' scope get-skill --json # { \"skill\": \"...\" } for structured ingestion\\n' +\n \" scope get-skill | head -50 # preview the skill\\n\" +\n \" scope get-skill > /tmp/SKILL.md # save locally\",\n )\n .option(\"--json\", \"Wrap output in JSON { skill: string } instead of raw markdown\")\n .action((opts: { json?: boolean }) => {\n if (opts.json) {\n process.stdout.write(`${JSON.stringify({ skill: SKILL_CONTENT }, null, 2)}\n`);\n } else {\n process.stdout.write(SKILL_CONTENT);\n }\n });\n}\n","// AUTO-GENERATED by scripts/generate-skill-content.mjs — do not edit manually\n// Re-run `bun run prebuild` or `bun run build` to regenerate.\nexport const SKILL_CONTENT =\n '# Scope — Agent Skill\\n\\n## TLDR\\nScope is a React codebase introspection toolkit. Use it to answer questions about component structure, props, context dependencies, side effects, and visual output — without running the app.\\n\\n**When to reach for it:** Any task requiring \"which components use X\", \"what props does Y accept\", \"render Z for visual verification\", \"does this component depend on a provider\", or \"what design tokens are in use\".\\n\\n**Canonical agent workflow:**\\n```\\nscope get-skill > /tmp/scope-skill.md # bootstrap command semantics into agent context\\nscope init --yes # scaffold config + auto-generate manifest\\nscope doctor --json # validate config, tokens, globalCSS, manifest freshness, deps, Playwright\\nscope manifest query --context ThemeContext --format json\\nscope render all --format json --output-dir .reactscope/renders\\nscope site build --output .reactscope/site\\n```\\n\\n---\\n\\n---\\n\\n## Mental Model\\n\\nUnderstanding how Scope\\'s data flows is the key to using it effectively as an agent.\\n\\n```\\nSource TypeScript files\\n ↓ (ts-morph AST parse)\\n manifest.json ← structural facts: props, hooks, contexts, complexity\\n ↓ (esbuild + Playwright)\\n renders/*.json ← visual facts: screenshot, computedStyles, dom, a11y\\n ↓ (token engine)\\n compliance-styles.json ← audit facts: which CSS values match tokens, which don\\'t\\n ↓ (site generator)\\n site/ ← human-readable docs combining all of the above\\n```\\n\\nEach layer depends on the previous. If you\\'re getting unexpected results, check whether the earlier layers are stale (run `scope doctor` to diagnose).\\n\\n---\\n\\n## The Four Subsystems\\n\\n### 1. Manifest (`scope manifest *`)\\nThe manifest is a static analysis snapshot of your TypeScript source. It tells you:\\n- What components exist, where they live, and how they\\'re exported\\n- What props each component accepts (types, defaults, required/optional)\\n- What React hooks they call (`detectedHooks`)\\n- What contexts they consume (`requiredContexts`) — must be provided for a render to succeed\\n- Whether they compose other components (`composes` / `composedBy`)\\n- Their **complexity class** — `\"simple\"` or `\"complex\"` — which determines the render engine\\n\\nThe manifest never runs your code. It only reads TypeScript. This means it\\'s fast and safe, but it can\\'t know about runtime values.\\n\\n### 2. Render Engine (`scope render *`)\\nThe render engine compiles components with esbuild and renders them in Chromium (Playwright). Two paths exist:\\n\\n| Path | When | Speed | Capability |\\n|------|------|-------|------------|\\n| **Satori** | `complexityClass: \"simple\"` | ~8ms | Flexbox only, no JS, no CSS-in-JS |\\n| **BrowserPool** | `complexityClass: \"complex\"` | ~200–800ms | Full DOM, CSS, Tailwind, animations |\\n\\nMost real-world components route through BrowserPool. Scope defaults to `\"complex\"` when uncertain (safe fallback).\\n\\nEach render produces:\\n- `screenshot` — retina-quality PNG (2× `deviceScaleFactor`; display at CSS px dimensions)\\n- `width` / `height` — CSS pixel dimensions of the component root\\n- `computedStyles` — per-node computed CSS keyed by `#node-0`, `#node-1`, etc.\\n- `dom` — full DOM tree with bounding boxes (BrowserPool only)\\n- `accessibility` — role, aria-name, violation list (BrowserPool only)\\n- `renderTimeMs` — wall-clock render duration\\n\\n### 3. Scope Files (`.scope.tsx` / `.scope.ts`)\\nScope files define **named rendering scenarios** and optional provider wrappers next to a component. They are the primary way to ensure `render all` produces meaningful screenshots.\\n\\nDiscovery is deterministic: for `Button.tsx`, Scope checks `Button.scope.tsx`, then `.scope.ts`, `.scope.jsx`, `.scope.js` in the same directory and uses the first file that exists.\\n\\n```tsx\\n// Button.scope.tsx\\nexport const scenarios = {\\n default: { variant: \\'primary\\', children: \\'Click me\\' },\\n ghost: { variant: \\'ghost\\', children: \\'Cancel\\' },\\n danger: { variant: \\'danger\\', children: \\'Delete\\' },\\n disabled: { variant: \\'primary\\', children: \\'Disabled\\', disabled: true },\\n} satisfies Record<string, Record<string, unknown>>;\\n```\\n\\nOptional wrapper:\\n\\n```tsx\\nimport type { ReactNode } from \\'react\\';\\nimport { ThemeProvider } from \\'../providers/ThemeProvider\\';\\n\\nexport function wrapper({ children }: { children: ReactNode }) {\\n return <ThemeProvider theme=\"dark\">{children}</ThemeProvider>;\\n}\\n```\\n\\nContract:\\n- Export `scenarios` as a plain object of scenario-name → props-object, either as a named export or under `default.scenarios`\\n- Export `wrapper` as a function, either as a named export or under `default.wrapper`\\n- Non-object scenario values are skipped with a warning\\n- If no scope file or no valid scenarios exist, Scope falls back to one bare render and inferred required-prop defaults\\n- If 2+ scenarios exist, `render all` automatically runs a matrix and merges cells into each component JSON\\n\\nWhen a component renders blank with `{}` props, **the fix is usually to create a `.scope.tsx` file** with real props.\\n\\n### 4. Token Compliance\\nThe compliance pipeline:\\n1. `scope render all` captures `computedStyles` for every element in every component\\n2. These are written to `.reactscope/compliance-styles.json`\\n3. The token engine compares each computed CSS value against your `reactscope.tokens.json`\\n4. `scope tokens compliance` reports the aggregate on-system percentage\\n5. `scope ci` fails if the percentage is below `complianceThreshold` (default 90%)\\n\\n**On-system** means the value exactly matches a resolved token value. Off-system means it\\'s a hardcoded value with no token backing it.\\n\\n---\\n\\n## Complexity Classes — Practical Guide\\n\\nThe `complexityClass` field determines which render engine runs. Scope auto-detects it, but agents should understand it:\\n\\n**`\"simple\"` components:**\\n- Pure presentational, flexbox layout only\\n- No CSS grid, no absolute/fixed/sticky positioning\\n- No CSS animations, transitions, or transforms\\n- No `className` values Scope can\\'t statically trace (e.g. dynamic Tailwind classes)\\n- Renders in ~8ms via Satori (SVG-based, no browser needed)\\n\\n**`\"complex\"` components:**\\n- Anything using Tailwind (CSS injection required)\\n- CSS grid, positioned elements, overflow, z-index\\n- Components that read from context at render time\\n- Any component Scope isn\\'t sure about (conservative default)\\n- Renders in ~200–800ms via Playwright BrowserPool\\n\\nWhen in doubt: complex is always safe. Simple is an optimization.\\n\\n---\\n\\n## Required Contexts — Why Renders Fail\\n\\nIf `requiredContexts` is non-empty, the component calls `useContext` on one or more contexts. Without a provider, it will either render broken or throw entirely.\\n\\nTwo ways to fix:\\n1. **Provider presets in config** (recommended): add provider names to `reactscope.config.json → components.wrappers.providers`\\n2. **Scope file with wrapper**: wrap the component in a provider in the scenario itself\\n\\nBuilt-in mocks (always provided): `ThemeContext → { theme: \\'light\\' }`, `LocaleContext → { locale: \\'en-US\\' }`.\\n\\n---\\n\\n## `scope doctor` — Always Run This First\\n\\nBefore debugging any render issue, run:\\n```bash\\nscope doctor --json\\n```\\n\\nIt checks:\\n- `reactscope.config.json` is valid JSON\\n- Token file exists and has a `version` field\\n- Every path in `globalCSS` resolves on disk\\n- Manifest is present and up to date (not stale relative to source)\\n- Target-project dependencies are installed (`node_modules` exists)\\n- Playwright Chromium is available for render/site/instrument commands\\n\\n**If `globalCSS` is empty or missing**: Tailwind styles won\\'t apply to renders. Every component will look unstyled. This is the most common footgun. Fix: add your CSS entry file (the one with `@tailwind base; @tailwind components; @tailwind utilities;`) to `globalCSS` in config.\\n\\n---\\n\\n## Agent Decision Tree\\n\\n**\"I want to know what props Component X accepts\"**\\n→ `scope manifest get X --format json | jq \\'.props\\'`\\n\\n**\"I want to know which components will break if I change a context\"**\\n→ `scope manifest query --context MyContext --format json`\\n\\n**\"I want to render a component to verify visual output\"**\\n→ Create a `.scope.tsx` file with real props first, then `scope render component X --format json`\\n\\n**\"I want to render all variants of a component\"**\\n→ Define all variants in `.scope.tsx`, then `scope render all --format json --output-dir .reactscope/renders` (auto-matrix)\\n→ Or: `scope render matrix X --axes \\'variant:primary,secondary,danger\\' --format json`\\n\\n**\"I want to audit token compliance\"**\\n→ `scope render all` first (populates computedStyles), then `scope tokens compliance`\\n\\n**\"Renders look unstyled / blank\"**\\n→ Run `scope doctor` — likely missing `globalCSS`\\n→ If props are the issue: create/update the `.scope.tsx` file\\n\\n**\"I want to understand blast radius of a token change\"**\\n→ `scope tokens impact color.primary.500 --new-value \\'#0077dd\\'`\\n→ `scope tokens preview color.primary.500 --new-value \\'#0077dd\\'` for visual diff\\n\\n**\"I need to set up Scope in a new project\"**\\n→ `scope init --yes` (auto-detects Tailwind + CSS, generates manifest automatically)\\n→ `scope doctor` to validate\\n→ Create `.scope.tsx` files for key components\\n→ `scope render all`\\n\\n**\"I want to profile a live SPA\"**\\n→ Generate a manifest, then `scope instrument profile SearchPage --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'`\\n→ For auth/timing-heavy apps, follow `docs/profiling-production-spas.md`\\n\\n**\"I want to run Scope in CI\"**\\n→ `scope ci --json --output ci-result.json`\\n→ Exit code 0 = pass, non-zero = specific failure type\\n\\n---\\n\\n\\n## Installation\\n\\nPublished package:\\n\\n```bash\\nnpm install -g @agent-scope/cli # global\\nnpm install --save-dev @agent-scope/cli # per-project\\n```\\n\\nLocal-from-source quickstart for this repo:\\n\\n```bash\\nbun install\\nbun run build\\nbunx playwright install chromium\\ncd fixtures/tailwind-showcase\\nbun install\\n../../packages/cli/dist/cli.js init --yes\\n../../packages/cli/dist/cli.js doctor --json\\n../../packages/cli/dist/cli.js render all --format json --output-dir .reactscope/renders\\n../../packages/cli/dist/cli.js site build --output .reactscope/site\\n```\\n\\nBinary: `scope` (published install) or `packages/cli/dist/cli.js` (local build)\\n\\n---\\n\\n## Core Workflow\\n\\n```\\nget-skill → init --yes → doctor --json → manifest query/get/list --format json → render all --format json → site build → instrument profile → ci\\n```\\n\\n- **init**: Scaffold `reactscope.config.json` + token stub, auto-detect framework/globalCSS, **immediately runs `manifest generate`** so you see results right away.\\n- **doctor**: Health-check command — validates config, token file, globalCSS presence, manifest staleness, target-project dependencies, and Playwright Chromium availability.\\n- **generate**: Parse TypeScript AST and emit `.reactscope/manifest.json`. Run once per codebase change (or automatically via `scope init`).\\n- **query / get / list**: Ask structural questions. No network required. Works from manifest alone. Supports filtering by `--collection` and `--internal`.\\n- **render**: Produce PNGs of components via esbuild + Playwright (BrowserPool). Requires manifest for file paths. Auto-injects required prop defaults and globalCSS.\\n- **token audit**: Validate design tokens via `@scope/tokens` CLI commands (`tokens list`, `tokens compliance`, `tokens impact`, `tokens preview`, `tokens export`).\\n- **ci**: Run compliance checks and exit with code 0/1 for CI pipelines. `report pr-comment` posts results to GitHub PRs.\\n\\n---\\n\\n## Full CLI Reference\\n\\n### `scope init`\\nScaffold config, detect framework, extract Tailwind tokens, detect globalCSS files, and **automatically run `scope manifest generate`**.\\n\\n```bash\\nscope init\\nscope init --force # overwrite existing config\\n```\\n\\nAfter init completes, the manifest is already written — no manual `scope manifest generate` step needed.\\n\\n**Tailwind token extraction**: reads `tailwind.config.js`, extracts colors (with nested scale support), spacing, fontFamily, borderRadius. Stored in `reactscope.tokens.json`.\\n\\n**globalCSS detection**: checks 9 common patterns (`src/styles.css`, `src/index.css`, `app/globals.css`, etc.). Stored in `components.wrappers.globalCSS` in config.\\n\\n---\\n\\n### `scope doctor`\\nValidate the Scope setup. Exits non-zero on errors, zero on warnings-only.\\n\\n```bash\\nscope doctor --json\\nscope doctor --json\\n```\\n\\nChecks:\\n- `config` — `reactscope.config.json` is valid JSON with required fields\\n- `tokens` — token file is present and has a valid `version` field\\n- `globalCSS` — globalCSS files listed in config exist on disk\\n- `manifest` — manifest exists and is not stale (compares source file mtimes)\\n- `dependencies` — `node_modules` exists in the target project root\\n- `playwright` — Playwright Chromium is available before render/site/instrument\\n\\nIf `dependencies` fails, run `bun install` (or the package manager detected by your lockfile) in the target project root, then rerun `scope doctor --json`.\\n\\nIf `playwright` fails, run `bunx playwright install chromium`, then rerun `scope doctor --json` before retrying `scope render component`, `scope render all`, `scope site build`, or `scope instrument ...`.\\n\\n```\\n$ scope doctor --json\\nScope Doctor\\n────────────────────────────────────────\\n [✓] config reactscope.config.json valid\\n [✓] tokens Token file valid\\n [✓] globalCSS 1 globalCSS file(s) present\\n [!] manifest Manifest may be stale — 5 source file(s) modified since last generate\\n────────────────────────────────────────\\n 1 warning(s) — everything works but could be better\\n```\\n\\n---\\n\\n### `scope capture <url>`\\nCapture a live React component tree from a running app URL.\\n\\n```bash\\nscope capture http://localhost:3000\\nscope capture http://localhost:3000 --output report.json --pretty\\nscope capture http://localhost:3000 --timeout 15000 --wait 2000\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `-o, --output <path>` | string | stdout | Write JSON to file |\\n| `--pretty` | bool | false | Pretty-print JSON |\\n| `--timeout <ms>` | number | 10000 | Max wait for React to mount |\\n| `--wait <ms>` | number | 0 | Additional wait after page load |\\n\\nOutput (stdout): serialized PageReport JSON (or path when `--output` is set)\\n\\n---\\n\\n### `scope tree <url>`\\nPrint the React component tree from a live URL.\\n\\n```bash\\nscope tree http://localhost:3000\\nscope tree http://localhost:3000 --depth 3 --show-props --show-hooks\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--depth <n>` | number | unlimited | Max depth to display |\\n| `--show-props` | bool | false | Include prop names next to components |\\n| `--show-hooks` | bool | false | Show hook counts per component |\\n| `--timeout <ms>` | number | 10000 | Max wait for React to mount |\\n| `--wait <ms>` | number | 0 | Additional wait after page load |\\n\\n---\\n\\n### `scope report <url>`\\nCapture and print a human-readable summary of a React app.\\n\\n```bash\\nscope report http://localhost:3000\\nscope report http://localhost:3000 --json\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--json` | bool | false | Emit structured JSON instead of text |\\n| `--timeout <ms>` | number | 10000 | Max wait for React to mount |\\n| `--wait <ms>` | number | 0 | Additional wait after page load |\\n\\n---\\n\\n### `scope report baseline`\\nSave a baseline snapshot for future diff comparisons.\\n\\n```bash\\nscope report baseline\\nscope report baseline --output baselines/my-baseline.json\\n```\\n\\n---\\n\\n### `scope report diff`\\nDiff the current app state against a saved baseline.\\n\\n```bash\\nscope report diff\\nscope report diff --baseline baselines/my-baseline.json\\nscope report diff --json\\n```\\n\\n---\\n\\n### `scope report pr-comment`\\nPost a Scope CI report as a GitHub PR comment. Used in CI pipelines via the reusable `scope-ci` workflow.\\n\\n```bash\\nscope report pr-comment --report-path scope-ci-report.json\\n```\\n\\nRequires `GITHUB_TOKEN`, `GITHUB_REPOSITORY`, and `GITHUB_PR_NUMBER` in environment.\\n\\n---\\n\\n### `scope manifest generate`\\nScan source files and write `.reactscope/manifest.json`.\\n\\n```bash\\nscope manifest generate\\nscope manifest generate --root ./packages/ui\\nscope manifest generate --include \"src/**/*.tsx\" --exclude \"**/*.test.tsx\"\\nscope manifest generate --output custom/manifest.json\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--root <path>` | string | cwd | Project root directory |\\n| `--output <path>` | string | `.reactscope/manifest.json` | Output path |\\n| `--include <globs>` | string | `src/**/*.tsx,src/**/*.ts` | Comma-separated include globs |\\n| `--exclude <globs>` | string | `**/node_modules/**,...` | Comma-separated exclude globs |\\n\\n---\\n\\n### `scope manifest list`\\nList all components in the manifest.\\n\\n```bash\\nscope manifest list\\nscope manifest list --filter \"Button*\"\\nscope manifest list --format json\\nscope manifest list --collection Forms # filter to named collection\\nscope manifest list --internal # only internal components\\nscope manifest list --no-internal # hide internal components\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--format <fmt>` | `json\\\\|table` | auto (TTY→table, pipe→json) | Output format |\\n| `--filter <glob>` | string | — | Filter component names by glob |\\n| `--collection <name>` | string | — | Filter to named collection |\\n| `--internal` | bool | false | Show only internal components |\\n| `--no-internal` | bool | false | Hide internal components |\\n| `--manifest <path>` | string | `.reactscope/manifest.json` | Manifest path |\\n\\nTTY table output (includes COLLECTION and INTERNAL columns):\\n```\\nNAME FILE COMPLEXITY HOOKS CONTEXTS COLLECTION INTERNAL\\n------------ --------------------------- ---------- ----- -------- ---------- --------\\nButton src/components/Button.tsx simple 1 0 — no\\nThemeToggle src/components/Toggle.tsx complex 3 1 Forms no\\n```\\n\\n---\\n\\n### `scope manifest get <name>`\\nGet full details of a single component.\\n\\n```bash\\nscope manifest get Button\\nscope manifest get Button --format json\\n```\\n\\nJSON output includes `collection` and `internal` fields:\\n```json\\n{\\n \"name\": \"Button\",\\n \"filePath\": \"src/components/Button.tsx\",\\n \"collection\": \"Primitives\",\\n \"internal\": false,\\n ...\\n}\\n```\\n\\n---\\n\\n### `scope manifest query`\\nQuery components by attributes.\\n\\n```bash\\nscope manifest query --context ThemeContext\\nscope manifest query --hook useEffect\\nscope manifest query --complexity complex\\nscope manifest query --side-effects\\nscope manifest query --has-fetch\\nscope manifest query --has-prop <propName>\\nscope manifest query --composed-by <ComponentName>\\nscope manifest query --internal\\nscope manifest query --collection Forms\\nscope manifest query --context ThemeContext --format json\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--context <name>` | string | — | Find components consuming a context by name |\\n| `--hook <name>` | string | — | Find components using a specific hook |\\n| `--complexity <class>` | `simple\\\\|complex` | — | Filter by complexity class |\\n| `--side-effects` | bool | false | Any side effects detected |\\n| `--has-fetch` | bool | false | Components with fetch calls specifically |\\n| `--has-prop <name>` | string | — | Components that accept a specific prop |\\n| `--composed-by <name>` | string | — | Components rendered inside a specific parent |\\n| `--internal` | bool | false | Only internal components |\\n| `--collection <name>` | string | — | Filter to named collection |\\n| `--format <fmt>` | `json\\\\|table` | auto | Output format |\\n| `--manifest <path>` | string | `.reactscope/manifest.json` | Manifest path |\\n\\n---\\n\\n### `scope render <component>`\\nRender a single component to PNG (TTY) or JSON (pipe).\\n\\n**Auto prop defaults**: if `--props` is omitted, Scope injects sensible defaults so required props don\\'t produce blank renders: strings/nodes → component name, unions → first value, booleans → `false`, numbers → `0`.\\n\\n**globalCSS auto-injection**: reads `components.wrappers.globalCSS` from config and compiles/injects CSS (supports Tailwind v3 via PostCSS) into the render harness. A warning is printed to stderr if no globalCSS is configured (common cause of unstyled renders).\\n\\n```bash\\nscope render component Button\\nscope render component Button --props \\'{\"variant\":\"primary\",\"children\":\"Click me\"}\\'\\nscope render component Button --viewport 375x812\\nscope render component Button --output button.png\\nscope render component Button --format json\\n```\\n\\nFlags:\\n| Flag | Type | Default | Description |\\n|------|------|---------|-------------|\\n| `--props <json>` | string | `{}` | Inline props as JSON string |\\n| `--viewport <WxH>` | string | `375x812` | Viewport size |\\n| `--theme <name>` | string | — | Theme name from token system |\\n| `-o, --output <path>` | string | — | Write PNG to specific path |\\n| `--format <fmt>` | `png\\\\|json` | auto (TTY→file, pipe→json) | Output format |\\n| `--manifest <path>` | string | `.reactscope/manifest.json` | Manifest path |\\n\\n---\\n\\n### `scope render matrix <component>`\\nRender across a Cartesian product of prop axes. Accepts both `key:v1,v2` and `{\"key\":[\"v1\",\"v2\"]}` JSON format for `--axes`.\\n\\n```bash\\nscope render matrix Button --axes \\'variant:primary,secondary,danger\\'\\nscope render matrix Button --axes \\'{\"variant\":[\"primary\",\"secondary\"]}\\'\\nscope render matrix Button --axes \\'variant:primary,secondary size:sm,md,lg\\'\\nscope render matrix Button --sprite button-matrix.png --format json\\n```\\n\\n---\\n\\n### `scope render all`\\nRender every component in the manifest.\\n\\n```bash\\nscope render all\\nscope render all --concurrency 4 --output-dir renders/\\n```\\n\\nHandles imports of CSS files in components (maps to empty loader so styles are injected at page level). SVG and font imports are handled via dataurl loaders.\\n\\n---\\n\\n### `scope instrument tree`\\nCapture the live React component tree with instrumentation metadata.\\n\\n```bash\\nscope instrument tree http://localhost:3000\\nscope instrument tree http://localhost:3000 --depth 5 --show-props\\n```\\n\\n**Implementation note**: uses a fresh `chromium.launch()` + `newContext()` + `newPage()` per call (not BrowserPool), with `addInitScript` called before `setContent` to ensure the Scope runtime is injected at document-start before React loads.\\n\\n---\\n\\n### `scope instrument hooks`\\nProfile hook execution in live components.\\n\\n```bash\\nscope instrument hooks http://localhost:3000\\nscope instrument hooks http://localhost:3000 --component Button\\n```\\n\\n**Implementation note**: requires `addInitScript({ content: getBrowserEntryScript() })` before `setContent` so `__REACT_DEVTOOLS_GLOBAL_HOOK__` is present when React loads its renderer.\\n\\n---\\n\\n### `scope instrument profile`\\nProfile render performance of live components.\\n\\n```bash\\nscope instrument profile SearchPage --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'\\n```\\n\\n---\\n\\n### `scope instrument renders`\\nRe-render causality analysis — what triggered each render.\\n\\n```bash\\nscope instrument renders http://localhost:3000\\n```\\n\\n---\\n\\n### `scope tokens get <name>`\\nGet details of a single design token.\\n\\n### `scope tokens list`\\nList all tokens. Token file must have a `version` field (written by `scope init`).\\n\\n```bash\\nscope tokens list\\nscope tokens list --type color\\nscope tokens list --format json\\n```\\n\\n### `scope tokens search <query>`\\nFull-text search across token names/values.\\n\\n### `scope tokens resolve <value>`\\nResolve a CSS value or alias back to its token name.\\n\\n### `scope tokens validate`\\nValidate token file schema.\\n\\n### `scope tokens compliance`\\nCheck rendered components for design token compliance.\\n\\n```bash\\nscope tokens compliance\\nscope tokens compliance --threshold 95\\n```\\n\\n### `scope tokens impact <token>`\\nAnalyze impact of changing a token — which components use it.\\n\\n```bash\\nscope tokens impact --token color.primary.500\\n```\\n\\n### `scope tokens preview <token>`\\nPreview a token value change visually before committing.\\n\\n### `scope tokens export`\\nExport tokens in multiple formats.\\n\\n```bash\\nscope tokens export --format flat-json\\nscope tokens export --format css\\nscope tokens export --format scss\\nscope tokens export --format ts\\nscope tokens export --format tailwind\\nscope tokens export --format style-dictionary\\n```\\n\\n**Format aliases** (auto-corrected with \"Did you mean?\" hint):\\n- `json` → `flat-json`\\n- `js` → `ts`\\n- `sass` → `scss`\\n- `tw` → `tailwind`\\n\\n---\\n\\n### `scope ci`\\nRun all CI checks (compliance, accessibility, console errors) and exit 0/1.\\n\\n```bash\\nscope ci\\nscope ci --json\\nscope ci --threshold 90 # compliance threshold (default: 90)\\n```\\n\\n```\\n$ scope ci --json\\n→ CI passed in 3.2s\\n→ Compliance 100.0% >= threshold 90.0% ✅\\n→ Accessibility audit not yet implemented — skipped ✅\\n→ No console errors detected ✅\\n→ Exit code 0\\n```\\n\\nThe `scope-ci` **reusable GitHub Actions workflow** is available at `.github/workflows/scope-ci.yml` and can be included in any repo\\'s CI to run `scope ci` and post results as a PR comment via `scope report pr-comment`.\\n\\n---\\n\\n### `scope site build`\\nGenerate a static HTML component gallery site from the manifest.\\n\\n```bash\\nscope site build\\nscope site build --output ./dist/site\\n```\\n\\n**Collections support**: components are grouped under named collection sections in the sidebar and index grid. Internal components are hidden from the sidebar and card grid but appear in composition detail sections with an `internal` badge.\\n\\n**Collection display rules**:\\n- Sidebar: one section divider per collection + an \"Ungrouped\" section; internal components excluded\\n- Index page: named sections with heading + optional description; internal components excluded\\n- Component detail page: Composes/Composed By lists ALL components including internal ones (with subtle badge)\\n- Falls back to flat list when no collections configured (backwards-compatible)\\n\\n### `scope site serve`\\nServe the generated site locally.\\n\\n```bash\\nscope site serve\\nscope site serve --port 4000\\n```\\n\\n---\\n\\n## Collections & Internal Components\\n\\nComponents can be organized into named **collections** and flagged as **internal** (library implementation details not shown in the public gallery).\\n\\n### Defining collections\\n\\n**1. TSDoc tag** (highest precedence):\\n```tsx\\n/**\\n * @collection Forms\\n */\\nexport function Input() { ... }\\n```\\n\\n**2. `.scope.ts` co-located file**:\\n```ts\\n// Input.scope.ts\\nexport const collection = \"Forms\"\\n```\\n\\n**3. Config-level glob patterns**:\\n```json\\n// reactscope.config.json\\n{\\n \"collections\": [\\n { \"name\": \"Forms\", \"description\": \"Form inputs and controls\", \"patterns\": [\"src/forms/**\"] },\\n { \"name\": \"Primitives\", \"patterns\": [\"src/primitives/**\"] }\\n ]\\n}\\n```\\n\\nResolution precedence: TSDoc `@collection` > `.scope.ts` export > config pattern.\\n\\n### Flagging internal components\\n\\n**TSDoc tag**:\\n```tsx\\n/**\\n * @internal\\n */\\nexport function InternalHelperButton() { ... }\\n```\\n\\n**Config glob patterns**:\\n```json\\n{\\n \"internalPatterns\": [\"src/internal/**\", \"src/**/*Internal*\"]\\n}\\n```\\n\\n---\\n\\n## Manifest Output Schema\\n\\nFile: `.reactscope/manifest.json`\\n\\n```typescript\\n{\\n version: \"0.1\",\\n generatedAt: string, // ISO 8601\\n collections: CollectionConfig[], // echoes config.collections, [] when not set\\n components: Record<string, ComponentDescriptor>,\\n tree: Record<string, { children: string[], parents: string[] }>\\n}\\n```\\n\\n### `ComponentDescriptor` fields\\n\\n| Field | Type | Description |\\n|-------|------|-------------|\\n| `filePath` | `string` | Relative path from project root to source file |\\n| `exportType` | `\"named\" \\\\| \"default\" \\\\| \"none\"` | How the component is exported |\\n| `displayName` | `string` | `displayName` if set, else function/class name |\\n| `collection` | `string?` | Resolved collection name (`undefined` = ungrouped) |\\n| `internal` | `boolean` | `true` if flagged as internal (default: `false`) |\\n| `props` | `Record<string, PropDescriptor>` | Extracted prop types keyed by prop name |\\n| `composes` | `string[]` | Components this one renders in its JSX |\\n| `composedBy` | `string[]` | Components that render this one in their JSX |\\n| `complexityClass` | `\"simple\" \\\\| \"complex\"` | Render path: simple = Satori-safe, complex = requires BrowserPool |\\n| `requiredContexts` | `string[]` | React context names consumed |\\n| `detectedHooks` | `string[]` | All hooks called, sorted alphabetically |\\n| `sideEffects` | `SideEffects` | Side effect categories detected |\\n| `memoized` | `boolean` | Wrapped with `React.memo` |\\n| `forwardedRef` | `boolean` | Wrapped with `React.forwardRef` |\\n| `hocWrappers` | `string[]` | HOC wrapper names (excluding memo/forwardRef) |\\n| `loc` | `{ start: number, end: number }` | Line numbers in source file |\\n\\n---\\n\\n## Common Agent Workflows\\n\\n### Structural queries\\n\\n```bash\\n# Which components use ThemeContext?\\nscope manifest query --context ThemeContext\\n\\n# What props does Button accept?\\nscope manifest get Button --format json | jq \\'.props\\'\\n\\n# Which components are safe to render without a provider?\\nscope manifest query --complexity simple # + check requiredContexts === []\\n\\n# Show all components with side effects\\nscope manifest query --side-effects\\n\\n# Which components make fetch calls?\\nscope manifest query --has-fetch\\n\\n# Which components use useEffect?\\nscope manifest query --hook useEffect\\n\\n# Which components accept a disabled prop?\\nscope manifest query --has-prop disabled\\n\\n# Which components are composed inside Modal?\\nscope manifest query --composed-by Modal\\n\\n# All components in the Forms collection\\nscope manifest list --collection Forms\\n\\n# All internal components (library implementation details)\\nscope manifest list --internal\\n\\n# Public components only (hide internals)\\nscope manifest list --no-internal\\n```\\n\\n### Render workflows\\n\\n```bash\\n# Render Button in all variants (auto-defaults props if not provided)\\nscope render matrix Button --axes \\'variant:primary,secondary,danger\\'\\n\\n# Render with JSON axes format\\nscope render matrix Button --axes \\'{\"variant\":[\"primary\",\"secondary\"]}\\'\\n\\n# Render with explicit props\\nscope render component Button --props \\'{\"variant\":\"primary\",\"disabled\":true}\\'\\n\\n# Render all components (handles CSS/SVG/font imports automatically)\\nscope render all --concurrency 8\\n\\n# Get render as JSON\\nscope render component Button --format json | jq \\'.screenshot\\' | base64 -d > button.png\\n```\\n\\n### Token workflows\\n\\n```bash\\n# List all tokens\\nscope tokens list\\n\\n# Check compliance\\nscope tokens compliance --threshold 95\\n\\n# See what a token change impacts\\nscope tokens impact --token color.primary.500\\n\\n# Export for Tailwind\\nscope tokens export --format tailwind\\n```\\n\\n### CI workflow\\n\\n```bash\\n# Full compliance check\\nscope ci --json\\n\\n# In GitHub Actions — use the reusable workflow\\n# .github/workflows/ci.yml:\\n# uses: FlatFilers/Scope/.github/workflows/scope-ci.yml@main\\n```\\n\\n---\\n\\n## Error Patterns\\n\\n| Error | Cause | Fix |\\n|-------|-------|-----|\\n| `\"React root not found\"` | App not running, wrong URL, or Vite HMR interfering | Use `scope capture --wait 2000` |\\n| `\"Component not in manifest\"` | Manifest is stale | Run `scope manifest generate` first |\\n| `\"Manifest not found\"` | Missing manifest | Run `scope init` or `scope manifest generate` |\\n| `\"requiredContexts missing\"` | Component needs a provider | Add provider presets to `reactscope.config.json` |\\n| Blank PNG / 16×6px renders | No globalCSS injected (common with Tailwind) | Set `components.wrappers.globalCSS` in config; run `scope doctor` to verify |\\n| `PLAYWRIGHT_BROWSERS_MISSING` / `browserType.launch: Executable doesn\\'t exist` | Playwright Chromium is not installed in this sandbox | Run `bunx playwright install chromium`, then `scope doctor --json`, then retry render/site/instrument |\\n| `TARGET_PROJECT_DEPENDENCIES_MISSING` / `Could not resolve \"react\"` | Target project dependencies are missing | Run `bun install` (or the detected package manager) in the target project root, then `scope doctor --json` |\\n| `\"Invalid props JSON\"` | Malformed JSON in `--props` | Use single outer quotes: `--props \\'{\"key\":\"val\"}\\'` |\\n| `\"SCOPE_CAPTURE_JSON not available\"` | Scope runtime not injected before React loaded | Fixed in PR #83 — update CLI |\\n| `\"No React DevTools hook found\"` | Hook instrumentation init order bug | Fixed in PR #83 — update CLI |\\n| `\"ERR_MODULE_NOT_FOUND\"` after tokens commands | Old Node shebang in CLI binary | Fixed in PR #90 — CLI now uses `#!/usr/bin/env bun` |\\n| `\"version\" field missing in tokens` | Token stub written by old `scope init` | Re-run `scope init --force` or add `\"version\": \"1\"` to token file |\\n| `\"unknown option --has-prop\"` | Old CLI version | Fixed in PR #90 — update CLI |\\n| Format alias error (`json`, `js`, `sass`, `tw`) | Wrong format name for `tokens export` | Use `flat-json`, `ts`, `scss`, `tailwind`; CLI shows \"Did you mean?\" hint |\\n\\n---\\n\\n## `reactscope.config.json`\\n\\n```json\\n{\\n \"components\": {\\n \"wrappers\": {\\n \"globalCSS\": [\"src/styles.css\"]\\n }\\n },\\n \"tokens\": {\\n \"file\": \"reactscope.tokens.json\"\\n },\\n \"collections\": [\\n { \"name\": \"Forms\", \"description\": \"Form inputs and controls\", \"patterns\": [\"src/forms/**\"] },\\n { \"name\": \"Primitives\", \"patterns\": [\"src/primitives/**\"] }\\n ],\\n \"internalPatterns\": [\"src/internal/**\"],\\n \"providers\": {\\n \"theme\": { \"component\": \"ThemeProvider\", \"props\": { \"theme\": \"light\" } },\\n \"router\": { \"component\": \"MemoryRouter\", \"props\": { \"initialEntries\": [\"/\"] } }\\n }\\n}\\n```\\n\\n**Built-in mock providers** (always available, no config needed):\\n- `ThemeContext` → `{ theme: \\'light\\' }` (or `--theme <name>`)\\n- `LocaleContext` → `{ locale: \\'en-US\\' }`\\n\\n---\\n\\n## What Scope Cannot Do\\n\\n- **Runtime state**: `useState` values after user interaction\\n- **Network requests**: `fetch`, `XHR`, `WebSocket`\\n- **User interactions**: click, type, hover, drag\\n- **Auth/session-gated components**: components that redirect or throw without a session\\n- **Server components (RSC)**: React Server Components\\n- **Dynamic CSS**: CSS-in-JS styles computed at runtime from props Scope can\\'t infer\\n\\n---\\n\\n## Version History\\n\\n| Version | Date | Summary |\\n|---------|------|---------|\\n| v1.0 | 2026-03-11 | Initial SKILL.md (PR #36) — manifest, render, capture, tree, report, tokens, ci commands |\\n| v1.1 | 2026-03-11 | Updated through PR #82 — Phase 2 CLI commands complete |\\n| v1.2 | 2026-03-13 | PRs #83–#95: runtime injection fix, dogfooding fixes (12 bugs), `scope doctor`, `scope init` auto-manifest, globalCSS render warning, collections & internal components feature |\\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 icons?: {\n patterns: 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: detected.globalCSSFiles ?? [] },\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// Tailwind token extractor\n// ---------------------------------------------------------------------------\n\n/**\n * Attempt to extract design tokens from a tailwind.config.js/ts file.\n * Returns a nested token object compatible with the TokenFile schema, or null.\n */\nexport function extractTailwindTokens(\n tokenSources: import(\"./detect.js\").TokenSource[],\n): Record<string, unknown> | null {\n const tailwindSource = tokenSources.find((s) => s.kind === \"tailwind-config\");\n if (!tailwindSource) return null;\n\n try {\n const raw = readFileSync(tailwindSource.path, \"utf-8\");\n\n const tokens: Record<string, unknown> = {};\n\n // Helper: parse a JS/TS object literal block into key-value pairs\n // Helper: parse a JS object literal block into key-value pairs.\n // Handles both quoted keys ('key': 'value') and unquoted numeric keys (500: '#fff').\n function parseBlock(block: string): Record<string, string> {\n const result: Record<string, string> = {};\n // Match optional-quote KEY optional-quote : optional-quote VALUE optional-quote\n // KEY can be: word identifier OR bare number (e.g. 50, 100, 500 for color scales)\n const lineRe =\n /['\"]?(\\w[\\w.-]*|\\d+)['\"]?\\s*:\\s*['\"]?(#[0-9a-fA-F]{3,8}|\\d+(?:px|rem|em|%)|[\\w-]+(?:\\/[\\w]+)?)['\"]?/g;\n for (const m of block.matchAll(lineRe)) {\n if (m[1] !== undefined && m[2] !== undefined) {\n result[m[1]] = m[2];\n }\n }\n return result;\n }\n\n // Colors — use bracket counting to handle multi-level nesting correctly\n // The greedy regex approach fails when there are multiple nested color scale objects\n const colorsKeyIdx = raw.indexOf(\"colors:\");\n if (colorsKeyIdx !== -1) {\n const colorsBraceStart = raw.indexOf(\"{\", colorsKeyIdx);\n if (colorsBraceStart !== -1) {\n let colorDepth = 0;\n let colorsBraceEnd = -1;\n for (let ci = colorsBraceStart; ci < raw.length; ci++) {\n if (raw[ci] === \"{\") colorDepth++;\n else if (raw[ci] === \"}\") {\n colorDepth--;\n if (colorDepth === 0) {\n colorsBraceEnd = ci;\n break;\n }\n }\n }\n if (colorsBraceEnd > colorsBraceStart) {\n const colorSection = raw.slice(colorsBraceStart + 1, colorsBraceEnd);\n const scaleRe = /(\\w+)\\s*:\\s*\\{([^}]+)\\}/g;\n const colorTokens: Record<string, unknown> = {};\n for (const sm of colorSection.matchAll(scaleRe)) {\n if (sm[1] === undefined || sm[2] === undefined) continue;\n const scaleName = sm[1];\n const scaleValues = parseBlock(sm[2]);\n if (Object.keys(scaleValues).length > 0) {\n const scaleTokens: Record<string, unknown> = {};\n for (const [step, hex] of Object.entries(scaleValues)) {\n scaleTokens[step] = { value: hex, type: \"color\" };\n }\n colorTokens[scaleName] = scaleTokens;\n }\n }\n if (Object.keys(colorTokens).length > 0) {\n tokens.color = colorTokens;\n }\n }\n }\n }\n\n // Spacing\n const spacingMatch = raw.match(/spacing\\s*:\\s*\\{([\\s\\S]*?)\\n\\s*\\}/);\n if (spacingMatch?.[1] !== undefined) {\n const spacingValues = parseBlock(spacingMatch[1]);\n if (Object.keys(spacingValues).length > 0) {\n const spacingTokens: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(spacingValues)) {\n spacingTokens[key] = { value: val, type: \"dimension\" };\n }\n tokens.spacing = spacingTokens;\n }\n }\n\n // Font families\n const fontFamilyMatch = raw.match(/fontFamily\\s*:\\s*\\{([\\s\\S]*?)\\n\\s*\\}/);\n if (fontFamilyMatch?.[1] !== undefined) {\n const fontFamilyRe = /(\\w+)\\s*:\\s*\\[\\s*['\"]([^'\"]+)['\"]/g;\n const fontTokens: Record<string, unknown> = {};\n for (const fm of fontFamilyMatch[1].matchAll(fontFamilyRe)) {\n if (fm[1] !== undefined && fm[2] !== undefined) {\n fontTokens[fm[1]] = { value: fm[2], type: \"fontFamily\" };\n }\n }\n if (Object.keys(fontTokens).length > 0) {\n tokens.font = fontTokens;\n }\n }\n\n // Border radii\n const borderRadiusMatch = raw.match(/borderRadius\\s*:\\s*\\{([\\s\\S]*?)\\n\\s*\\}/);\n if (borderRadiusMatch?.[1] !== undefined) {\n const radiusValues = parseBlock(borderRadiusMatch[1]);\n if (Object.keys(radiusValues).length > 0) {\n const radiusTokens: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(radiusValues)) {\n radiusTokens[key] = { value: val, type: \"dimension\" };\n }\n tokens.radius = radiusTokens;\n }\n }\n\n return Object.keys(tokens).length > 0 ? tokens : null;\n } catch {\n return null;\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(\n rootDir: string,\n tokenFile: string,\n extractedTokens?: Record<string, unknown>,\n): 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 version: \"1.0.0\",\n meta: {\n name: \"Design Tokens\",\n lastUpdated: new Date().toISOString().split(\"T\")[0],\n },\n tokens: extractedTokens ?? {},\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 — extract tokens from Tailwind config if found\n const extractedTokens = extractTailwindTokens(detected.tokenSources);\n if (extractedTokens !== null) {\n const tokenGroupCount = Object.keys(extractedTokens).length;\n process.stdout.write(` Extracted ${tokenGroupCount} token group(s) from Tailwind config\\n`);\n }\n const tokPath = scaffoldTokenFile(rootDir, config.tokens.file, extractedTokens ?? undefined);\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 // Auto-run manifest generate so users get immediate feedback\n process.stdout.write(\"\\n Scanning components...\\n\");\n try {\n const manifestConfig = {\n include: config.components.include,\n rootDir,\n };\n const manifest = await generateManifest(manifestConfig);\n const manifestCount = Object.keys(manifest.components).length;\n const manifestOutPath = join(rootDir, config.output.dir, \"manifest.json\");\n mkdirSync(join(rootDir, config.output.dir), { recursive: true });\n writeFileSync(manifestOutPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n process.stdout.write(\n ` Found ${manifestCount} component(s) — manifest written to ${manifestOutPath}\\n`,\n );\n } catch {\n process.stdout.write(\n \" (manifest generate skipped — run `scope manifest generate` manually)\\n\",\n );\n }\n process.stdout.write(\"\\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 { generateManifest } from \"@agent-scope/manifest\";\nimport { Command } from \"commander\";\n\nexport function createInitCommand(): Command {\n return new Command(\"init\")\n .description(\n \"Auto-detect your project layout and scaffold reactscope.config.json.\\n\\n\" +\n \"WHAT IT DOES:\\n\" +\n \" - Detects component glob patterns from tsconfig / package.json / directory scan\\n\" +\n \" - Detects globalCSS files (Tailwind, PostCSS)\\n\" +\n \" - Writes reactscope.config.json with all detected values\\n\" +\n \" - Adds .reactscope/ to .gitignore\\n\" +\n \" - Creates .reactscope/ output directory\\n\\n\" +\n \"CONFIG FIELDS GENERATED:\\n\" +\n \" components.include glob patterns for component discovery\\n\" +\n \" components.wrappers providers + globalCSS to inject on every render\\n\" +\n \" render.viewport default viewport (1280×800)\\n\" +\n \" tokens.file path to reactscope.tokens.json\\n\" +\n \" output.dir .reactscope/ (all outputs go here)\\n\" +\n \" ci.complianceThreshold 0.90 (90% on-token required to pass CI)\\n\\n\" +\n \"Safe to re-run — will not overwrite existing config unless --force.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope init\\n\" +\n \" scope init --yes # accept all detected defaults, no prompts\\n\" +\n \" scope init --force # overwrite existing config\",\n )\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 — 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\" | \"tailwind-v4-theme\" | \"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 /** Detected global CSS entry files (relative paths, e.g. [\"src/styles.css\"]). */\n globalCSSFiles: string[];\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// Global CSS file detection\n// ---------------------------------------------------------------------------\n\n/** Common CSS entry file patterns to look for. */\nconst GLOBAL_CSS_CANDIDATES = [\n \"src/styles.css\",\n \"src/index.css\",\n \"src/global.css\",\n \"src/globals.css\",\n \"src/app.css\",\n \"src/main.css\",\n \"styles/globals.css\",\n \"styles/global.css\",\n \"styles/index.css\",\n];\n\n/** Returns relative paths to global CSS entry files found in rootDir. */\nfunction detectGlobalCSSFiles(rootDir: string): string[] {\n return GLOBAL_CSS_CANDIDATES.filter((rel) => existsSync(join(rootDir, rel)));\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\n/** Regex that matches a Tailwind v4 @theme block containing custom properties. */\nconst TAILWIND_V4_THEME_RE = /@theme\\s*(?:inline\\s*)?\\{[^}]*--[a-zA-Z]/;\n\n/** Max recursion depth when scanning for CSS/theme files under src/. */\nconst MAX_SCAN_DEPTH = 4;\n\n/** Filenames to skip during CSS scanning (generated/compiled output). */\nconst SKIP_CSS_NAMES = [\"compiled\", \".min.\"];\n\n/**\n * Recursively collect CSS files from a directory up to `maxDepth` levels.\n * Skips generated/compiled output files.\n */\nfunction collectCSSFiles(dir: string, depth: number): string[] {\n if (depth > MAX_SCAN_DEPTH) return [];\n const results: string[] = [];\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === \"node_modules\" || entry.name === \"dist\" || entry.name === \".next\") {\n continue;\n }\n const full = join(dir, entry.name);\n if (entry.isFile() && CSS_EXTS.some((x) => entry.name.endsWith(x))) {\n if (!SKIP_CSS_NAMES.some((skip) => entry.name.includes(skip))) {\n results.push(full);\n }\n } else if (entry.isDirectory()) {\n results.push(...collectCSSFiles(full, depth + 1));\n }\n }\n } catch {\n // ignore unreadable dirs\n }\n return results;\n}\n\nfunction detectTokenSources(rootDir: string): TokenSource[] {\n const sources: TokenSource[] = [];\n\n // 1. Tailwind config files (project root) — Tailwind v3 and earlier\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 — scan src/ recursively for :root custom properties and\n // Tailwind v4 @theme blocks\n const srcDir = join(rootDir, \"src\");\n if (existsSync(srcDir)) {\n const cssFiles = collectCSSFiles(srcDir, 0);\n const seen = new Set<string>();\n\n for (const filePath of cssFiles) {\n const content = readSafe(filePath);\n if (content === null) continue;\n\n if (TAILWIND_V4_THEME_RE.test(content) && !seen.has(filePath)) {\n sources.push({ kind: \"tailwind-v4-theme\", path: filePath });\n seen.add(filePath);\n }\n if (CSS_CUSTOM_PROPS_RE.test(content) && !seen.has(filePath)) {\n sources.push({ kind: \"css-custom-properties\", path: filePath });\n seen.add(filePath);\n }\n }\n }\n\n // Also check common token directories at project root (tokens/, styles/, theme/)\n for (const tokenDir of [\"tokens\", \"styles\", \"theme\"]) {\n const dir = join(rootDir, tokenDir);\n if (!existsSync(dir)) continue;\n const cssFiles = collectCSSFiles(dir, 0);\n for (const filePath of cssFiles) {\n const content = readSafe(filePath);\n if (content === null) continue;\n\n if (TAILWIND_V4_THEME_RE.test(content)) {\n sources.push({ kind: \"tailwind-v4-theme\", path: filePath });\n } else if (CSS_CUSTOM_PROPS_RE.test(content)) {\n sources.push({ kind: \"css-custom-properties\", path: filePath });\n }\n }\n }\n\n // 3. Theme files (*.theme.ts / .theme.js / .theme.tsx) — scan src/ recursively\n if (existsSync(srcDir)) {\n const scanThemeFiles = (dir: string, depth: number): void => {\n if (depth > MAX_SCAN_DEPTH) return;\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.name === \"node_modules\" || entry.name === \"dist\") continue;\n if (entry.isFile() && THEME_SUFFIXES.some((s) => entry.name.endsWith(s))) {\n sources.push({ kind: \"theme-file\", path: join(dir, entry.name) });\n } else if (entry.isDirectory()) {\n scanThemeFiles(join(dir, entry.name), depth + 1);\n }\n }\n } catch {\n // ignore\n }\n };\n scanThemeFiles(srcDir, 0);\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 const globalCSSFiles = detectGlobalCSSFiles(rootDir);\n\n return {\n framework,\n typescript,\n tsconfigPath,\n componentPatterns,\n tokenSources,\n packageManager,\n globalCSSFiles,\n };\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 { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport { BrowserPool } from \"@agent-scope/render\";\nimport { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { formatScopeDiagnostic } from \"../diagnostics.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 with both the Scope browser-entry (installs\n // __REACT_DEVTOOLS_GLOBAL_HOOK__) and the render-instrumentation script\n // (hooks into onCommitFiberRoot for causality tracking) injected as inline\n // <script> tags before the React bundle. We embed them directly because\n // addInitScript does NOT fire for page.setContent() (it uses\n // document.open/write/close, not a real navigation).\n const preScript = `${getBrowserEntryScript()}\n${buildInstrumentationScript()}`;\n const htmlHarness = await buildComponentHarness(\n filePath,\n options.componentName,\n {},\n 1280,\n undefined,\n preScript,\n );\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 // Load the harness (pre-scripts are already embedded)\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(\n \"Trace every re-render triggered by an interaction and identify root causes.\\n\\n\" +\n \"OUTPUT INCLUDES per render event:\\n\" +\n \" component which component re-rendered\\n\" +\n \" trigger why it re-rendered: state_change | props_change | context_change |\\n\" +\n \" parent_rerender | force_update | hook_dependency\\n\" +\n \" wasted true if re-rendered with no changed inputs and not memoized\\n\" +\n \" chain full causality chain from root cause to this render\\n\\n\" +\n \"WASTED RENDERS: propsChanged=false AND stateChanged=false AND contextChanged=false\\n\" +\n \"AND memoized=false — these are optimisation opportunities.\\n\\n\" +\n \"Examples:\\n\" +\n ' scope instrument renders SearchPage --interaction \\'[{\"action\":\"type\",\"target\":\"input\",\"text\":\"hello\"}]\\'\\n' +\n ' scope instrument renders Button --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\' --json\\n' +\n \" scope instrument renders Form --json | jq '.events[] | select(.wasted == true)'\",\n )\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(`${formatScopeDiagnostic(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 \"Runtime instrumentation for React component behaviour analysis.\\n\\n\" +\n \"All instrument commands:\\n\" +\n \" 1. Build an esbuild harness for the component\\n\" +\n \" 2. Load it in a Playwright browser\\n\" +\n \" 3. Inject instrumentation hooks into React DevTools fiber\\n\" +\n \" 4. Execute interactions and collect events\\n\\n\" +\n \"PREREQUISITES:\\n\" +\n \" scope manifest generate (component must be in manifest)\\n\" +\n \" reactscope.config.json (for wrappers/globalCSS)\\n\\n\" +\n \"INTERACTION FORMAT:\\n\" +\n \" JSON array of step objects: [{action, target, text?}]\" +\n \"\\n\" +\n \" Actions: click | type | focus | blur | hover | key\" +\n \"\\n\" +\n \" Target: CSS selector for the element to interact with\" +\n \"\\n\\n\" +\n \"Examples:\\n\" +\n ' scope instrument renders Button --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'\\n' +\n ' scope instrument hooks SearchInput --props \\'{\"value\":\"hello\"}\\'\\n' +\n ' scope instrument profile Modal --interaction \\'[{\"action\":\"click\",\"target\":\".open-btn\"}]\\'\\n' +\n \" scope instrument tree Card\",\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 * @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 { type CollectionConfig, 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(\n \"List all components in the manifest as a table (TTY) or JSON (piped).\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest list\\n\" +\n \" scope manifest list --format json | jq '.[].name'\\n\" +\n ' scope manifest list --filter \"Button*\"',\n )\n .option(\"--format <fmt>\", \"Output format: json or table (default: auto-detect)\")\n .option(\"--filter <glob>\", \"Filter components by name glob pattern\")\n .option(\"--collection <name>\", \"Filter to only components in the named collection\")\n .option(\"--internal\", \"Show only internal components\")\n .option(\"--no-internal\", \"Hide internal components from output\")\n .option(\"--manifest <path>\", \"Path to manifest.json\", MANIFEST_PATH)\n .action(\n (opts: {\n format?: string;\n filter?: string;\n collection?: string;\n internal: boolean;\n manifest: string;\n }) => {\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 // Apply --collection filter\n if (opts.collection !== undefined) {\n const col = opts.collection;\n entries = entries.filter(([, d]) => d.collection === col);\n }\n\n // Apply --internal / --no-internal filters\n // Commander sets opts.internal = true for --internal, false for --no-internal\n if (opts.internal === true) {\n entries = entries.filter(([, d]) => d.internal);\n } else if (opts.internal === false) {\n entries = entries.filter(([, d]) => !d.internal);\n }\n // opts.internal undefined means neither flag was passed — show all\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 collection: descriptor.collection,\n internal: descriptor.internal,\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// ---------------------------------------------------------------------------\n// manifest get\n// ---------------------------------------------------------------------------\n\nfunction registerGet(manifestCmd: Command): void {\n manifestCmd\n .command(\"get <name>\")\n .description(\n \"Get full details of a single component: props, hooks, complexity class, file path.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest get Button\\n\" +\n \" scope manifest get Button --format json\\n\" +\n \" scope manifest get Button --format json | jq '.complexity'\",\n )\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(\n \"Filter components by structural attributes. All flags are AND-combined.\\n\\n\" +\n \"COMPLEXITY CLASSES:\\n\" +\n \" simple — pure/presentational, no side effects, Satori-renderable\\n\" +\n \" complex — uses context/hooks/effects, requires BrowserPool to render\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest query --complexity simple\\n\" +\n \" scope manifest query --has-fetch\\n\" +\n \" scope manifest query --hook useContext --side-effects\\n\" +\n ' scope manifest query --has-prop \"variant:union\" --format json\\n' +\n \" scope manifest query --composed-by Layout\",\n )\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(\n \"--has-prop <spec>\",\n \"Find components with a prop matching name or name:type (e.g. 'loading' or 'variant:union')\",\n )\n .option(\"--composed-by <name>\", \"Find components that compose the named component\")\n .option(\"--internal\", \"Find only internal components\", false)\n .option(\"--collection <name>\", \"Filter to only components in the named collection\")\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 hasProp?: string;\n composedBy?: string;\n internal: boolean;\n collection?: string;\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 if (opts.hasProp !== undefined) queryParts.push(`has-prop=${opts.hasProp}`);\n if (opts.composedBy !== undefined) queryParts.push(`composed-by=${opts.composedBy}`);\n if (opts.internal) queryParts.push(\"internal\");\n if (opts.collection !== undefined) queryParts.push(`collection=${opts.collection}`);\n\n if (queryParts.length === 0) {\n process.stderr.write(\n \"No query flags specified. Use --context, --hook, --complexity, --side-effects, --has-fetch, --has-prop, --composed-by, --internal, or --collection.\\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 if (opts.hasProp !== undefined) {\n const spec = opts.hasProp;\n const colonIdx = spec.indexOf(\":\");\n const propName = colonIdx >= 0 ? spec.slice(0, colonIdx) : spec;\n const propType = colonIdx >= 0 ? spec.slice(colonIdx + 1) : undefined;\n entries = entries.filter(([, d]) => {\n const props = (d as unknown as Record<string, unknown>).props as\n | Record<string, { type?: string }>\n | undefined;\n if (!props || !(propName in props)) return false;\n if (propType !== undefined) {\n return props[propName]?.type === propType;\n }\n return true;\n });\n }\n\n if (opts.composedBy !== undefined) {\n const targetName = opts.composedBy;\n entries = entries.filter(([, d]) => {\n const composedBy = (d as unknown as Record<string, unknown>).composedBy as\n | string[]\n | undefined;\n return composedBy?.includes(targetName);\n });\n }\n\n if (opts.internal) {\n entries = entries.filter(([, d]) => d.internal);\n }\n\n if (opts.collection !== undefined) {\n const col = opts.collection;\n entries = entries.filter(([, d]) => d.collection === col);\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 collection: d.collection,\n internal: d.internal,\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\n/**\n * Load `reactscope.config.json` from `rootDir` and extract manifest-relevant\n * fields: `components.include`, `components.exclude`, `internalPatterns`,\n * `collections`, and `icons.patterns`.\n * Returns `null` when the file doesn't exist or is malformed.\n */\nfunction loadReactScopeConfig(rootDir: string): {\n include?: string[];\n exclude?: string[];\n internalPatterns?: string[];\n collections?: CollectionConfig[];\n iconPatterns?: string[];\n} | null {\n const configPath = resolve(rootDir, \"reactscope.config.json\");\n if (!existsSync(configPath)) return null;\n\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as Record<string, unknown>;\n\n const result: {\n include?: string[];\n exclude?: string[];\n internalPatterns?: string[];\n collections?: CollectionConfig[];\n iconPatterns?: string[];\n } = {};\n\n const components = cfg.components as Record<string, unknown> | undefined;\n if (components !== undefined && typeof components === \"object\" && components !== null) {\n if (Array.isArray(components.include)) {\n result.include = components.include as string[];\n }\n if (Array.isArray(components.exclude)) {\n result.exclude = components.exclude as string[];\n }\n }\n\n if (Array.isArray(cfg.internalPatterns)) {\n result.internalPatterns = cfg.internalPatterns as string[];\n }\n if (Array.isArray(cfg.collections)) {\n result.collections = cfg.collections as CollectionConfig[];\n }\n\n const icons = cfg.icons as Record<string, unknown> | undefined;\n if (icons !== undefined && typeof icons === \"object\" && icons !== null) {\n if (Array.isArray(icons.patterns)) {\n result.iconPatterns = icons.patterns as string[];\n }\n }\n\n return result;\n } catch {\n return null;\n }\n}\n\nfunction registerGenerate(manifestCmd: Command): void {\n manifestCmd\n .command(\"generate\")\n .description(\n \"Scan source files and generate .reactscope/manifest.json.\\n\\n\" +\n \"Uses Babel static analysis — no runtime or bundler required.\\n\" +\n \"Re-run whenever components are added, removed, or significantly changed.\\n\\n\" +\n \"Reads reactscope.config.json for:\\n\" +\n \" components.include glob patterns for source files\\n\" +\n \" components.exclude glob patterns to skip\\n\" +\n \" internalPatterns globs to flag components as internal\\n\" +\n \" collections named groups of components\\n\\n\" +\n \"CLI flags (--include, --exclude) override config-file values.\\n\\n\" +\n \"WHAT IT CAPTURES per component:\\n\" +\n \" - File path and export name\\n\" +\n \" - All props with types and default values\\n\" +\n \" - Hook usage (useState, useEffect, useContext, custom hooks)\\n\" +\n \" - Side effects (fetch, timers, subscriptions)\\n\" +\n \" - Complexity class: simple | complex\\n\" +\n \" - Context dependencies and composed child components\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest generate\\n\" +\n \" scope manifest generate --root ./packages/ui\\n\" +\n ' scope manifest generate --include \"src/components/**/*.tsx\" --exclude \"**/*.stories.tsx\"\\n' +\n \" scope manifest generate --output ./custom-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 configValues = loadReactScopeConfig(rootDir);\n\n // CLI flags override config-file values\n const include = opts.include?.split(\",\").map((s) => s.trim()) ?? configValues?.include;\n const exclude = opts.exclude?.split(\",\").map((s) => s.trim()) ?? configValues?.exclude;\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 ...(configValues?.internalPatterns !== undefined && {\n internalPatterns: configValues.internalPatterns,\n }),\n ...(configValues?.collections !== undefined && {\n collections: configValues.collections,\n }),\n ...(configValues?.iconPatterns !== undefined && {\n iconPatterns: configValues.iconPatterns,\n }),\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 (.reactscope/manifest.json).\\n\\n\" +\n \"The manifest is the source-of-truth registry of every React component\\n\" +\n \"in your codebase — generated by static analysis (no runtime needed).\\n\\n\" +\n \"Run `scope manifest generate` first, then use list/get/query to explore.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope manifest generate\\n\" +\n \" scope manifest list\\n\" +\n \" scope manifest get Button\\n\" +\n \" scope manifest query --complexity complex --has-fetch\",\n );\n\n registerList(manifestCmd);\n registerGet(manifestCmd);\n registerQuery(manifestCmd);\n registerGenerate(manifestCmd);\n\n return manifestCmd;\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 { serialize } from \"@agent-scope/core\";\nimport { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport type { Command } from \"commander\";\nimport { Command as Cmd } from \"commander\";\nimport { chromium } from \"playwright\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { formatScopeDiagnostic } from \"../diagnostics.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 var serializeValue = __SCOPE_SERIALIZE_VALUE__;\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 // Inject the Scope browser-entry bundle as an inline <script> in the HTML\n // harness, BEFORE the React bundle. This installs\n // __REACT_DEVTOOLS_GLOBAL_HOOK__ so React registers its renderer into the\n // hook when it loads. We embed it directly rather than using addInitScript\n // because setContent does not trigger Playwright init scripts (it uses\n // document.open/write/close, not a real navigation).\n const scopeRuntime = getBrowserEntryScript();\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n 1280,\n undefined,\n scopeRuntime,\n );\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().replace(\n \"__SCOPE_SERIALIZE_VALUE__\",\n serialize.toString(),\n );\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.\\n\\n\" +\n \"METRICS CAPTURED per hook instance:\\n\" +\n \" useState update count, current value\\n\" +\n \" useCallback cache hit rate (stable reference %)\\n\" +\n \" useMemo cache hit rate (recompute %)\\n\" +\n \" useEffect execution count\\n\" +\n \" useRef current value snapshot\\n\\n\" +\n \"Examples:\\n\" +\n \" scope instrument hooks SearchInput\\n\" +\n ' scope instrument hooks SearchInput --props \\'{\"value\":\"hello\"}\\' --json\\n' +\n \" scope instrument hooks Dropdown --json | jq '.hooks[] | select(.type == \\\"useMemo\\\")' \",\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(`${formatScopeDiagnostic(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 — deprecated heuristic, always null in JSON output\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 { getBrowserEntryScript } from \"@agent-scope/playwright\";\nimport type { Command } from \"commander\";\nimport { Command as Cmd } from \"commander\";\nimport { chromium } from \"playwright\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { formatScopeDiagnostic } from \"../diagnostics.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\nexport type ProfileValidity = \"interaction\" | \"setup_only\" | \"no_interaction_requested\";\n\nexport interface SkippedInteraction {\n index: number;\n action: InteractionStep[\"action\"];\n target?: string;\n reason: \"not_found\" | \"missing_target\" | \"missing_value\" | \"unsupported\";\n}\n\nexport interface InteractionExecutionSummary {\n attempted: number;\n executed: number;\n skipped: number;\n}\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 /** Deprecated heuristic field retained for compatibility; always null because it is not directly measured. */\n wastedRenders: number | null;\n /** Explicit machine-readable note that wasted render counts are not directly measured. */\n wastedRendersHeuristic: {\n measured: false;\n value: null;\n note: string;\n };\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 /** Interaction execution counts for validity-aware profiling. */\n interactionSteps: InteractionExecutionSummary;\n /** Backwards-compatible attempted interaction count. */\n interactionStepsAttempted: number;\n /** Backwards-compatible executed interaction count. */\n interactionStepsExecuted: number;\n /** Backwards-compatible skipped interaction count. */\n interactionStepsSkipped: number;\n /** Details for each skipped interaction step. */\n skippedInteractions: SkippedInteraction[];\n /** Whether timing/flags reflect a real interaction or setup-only work. */\n profileValidity: ProfileValidity;\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 return {\n commitCount: totalCommits,\n uniqueComponents: uniqueNames.length,\n componentNames: uniqueNames,\n wastedRenders: null,\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<{ executed: number; skippedInteractions: SkippedInteraction[] }> {\n let executed = 0;\n const skippedInteractions: SkippedInteraction[] = [];\n\n const skip = (\n index: number,\n step: InteractionStep,\n reason: SkippedInteraction[\"reason\"],\n ): void => {\n skippedInteractions.push({ index, action: step.action, target: step.target, reason });\n };\n\n for (const [index, step] of steps.entries()) {\n switch (step.action) {\n case \"click\":\n if (!step.target) {\n skip(index, step, \"missing_target\");\n break;\n }\n try {\n await page.click(step.target, { timeout: 5_000 });\n executed++;\n } catch {\n process.stderr.write(` ⚠ click target \"${step.target}\" not found, skipping\\n`);\n skip(index, step, \"not_found\");\n }\n break;\n case \"fill\":\n if (!step.target) {\n skip(index, step, \"missing_target\");\n break;\n }\n if (step.value === undefined) {\n skip(index, step, \"missing_value\");\n break;\n }\n try {\n await page.fill(step.target, step.value, { timeout: 5_000 });\n executed++;\n } catch {\n process.stderr.write(` ⚠ fill target \"${step.target}\" not found, skipping\\n`);\n skip(index, step, \"not_found\");\n }\n break;\n case \"hover\":\n if (!step.target) {\n skip(index, step, \"missing_target\");\n break;\n }\n try {\n await page.hover(step.target, { timeout: 5_000 });\n executed++;\n } catch {\n process.stderr.write(` ⚠ hover target \"${step.target}\" not found, skipping\\n`);\n skip(index, step, \"not_found\");\n }\n break;\n case \"press\":\n if (!step.value) {\n skip(index, step, \"missing_value\");\n break;\n }\n await page.keyboard.press(step.value);\n executed++;\n break;\n case \"wait\":\n await page.waitForTimeout(step.delay ?? 500);\n executed++;\n break;\n default:\n skip(index, step, \"unsupported\");\n break;\n }\n }\n\n return { executed, skippedInteractions };\n}\n\n// ---------------------------------------------------------------------------\n// Heuristic flag analysis for interaction profiles (§6.1)\n// ---------------------------------------------------------------------------\n\nfunction analyzeProfileFlags(\n totalRenders: number,\n wastedRenders: number | null,\n timing: InteractionTiming,\n layoutShifts: LayoutShiftData,\n profileValidity: ProfileValidity,\n): ProfileHeuristicFlag[] {\n const flags = new Set<ProfileHeuristicFlag>();\n\n // WASTED_RENDER: significant portion of renders were likely wasted\n if (\n wastedRenders !== null &&\n wastedRenders > 0 &&\n wastedRenders / Math.max(1, totalRenders) > 0.3\n ) {\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 // Only emit this when at least one intended interaction actually ran.\n if (profileValidity === \"interaction\" && 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 the component harness with the Scope browser-entry embedded as\n // an inline <script> before the React bundle. This installs\n // __REACT_DEVTOOLS_GLOBAL_HOOK__ so the profiling setup script can\n // attach commit-counting listeners.\n const scopeRuntime = getBrowserEntryScript();\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n 1280,\n undefined,\n scopeRuntime,\n );\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 let executedInteractions = 0;\n let skippedInteractions: SkippedInteraction[] = [];\n if (interaction.length > 0) {\n process.stderr.write(` Replaying ${interaction.length} interaction step(s)…\\n`);\n const replayResult = await replayInteraction(page, interaction);\n executedInteractions = replayResult.executed;\n skippedInteractions = replayResult.skippedInteractions;\n\n // Brief settle window to capture async state updates\n await page.waitForTimeout(300);\n }\n\n const jsDuration = Date.now() - jsStart;\n const profileValidity: ProfileValidity =\n interaction.length === 0\n ? \"no_interaction_requested\"\n : executedInteractions === 0\n ? \"setup_only\"\n : \"interaction\";\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 | null;\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 ?? null;\n\n const flags = analyzeProfileFlags(\n totalRenders,\n wastedRenders,\n timing,\n layoutShifts,\n profileValidity,\n );\n\n return {\n component: componentName,\n totalRenders,\n uniqueComponents,\n wastedRenders,\n wastedRendersHeuristic: {\n measured: false,\n value: null,\n note: \"profile.wastedRenders is retained for compatibility but set to null because Scope does not directly measure wasted renders yet.\",\n },\n timing,\n layoutShifts,\n flags,\n interaction,\n interactionSteps: {\n attempted: interaction.length,\n executed: executedInteractions,\n skipped: skippedInteractions.length,\n },\n interactionStepsAttempted: interaction.length,\n interactionStepsExecuted: executedInteractions,\n interactionStepsSkipped: skippedInteractions.length,\n skippedInteractions,\n profileValidity,\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 performance profile for an interaction sequence.\\n\\n\" +\n \"PROFILE INCLUDES:\\n\" +\n \" renders total re-renders triggered by the interaction\\n\" +\n \" timing interaction start → paint time (ms)\\n\" +\n \" layoutShifts cumulative layout shift (CLS) score\\n\" +\n \" scriptTime JS execution time (ms)\\n\" +\n \" longTasks count of tasks >50ms\\n\\n\" +\n \"Examples:\\n\" +\n ' scope instrument profile Button --interaction \\'[{\"action\":\"click\",\"target\":\"button\"}]\\'\\n' +\n ' scope instrument profile Modal --interaction \\'[{\"action\":\"click\",\"target\":\".open-btn\"}]\\' --json\\n' +\n \" scope instrument profile Form --json | jq '.summary.renderCount'\",\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(`${formatScopeDiagnostic(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 { Command } from \"commander\";\nimport { chromium } from \"playwright\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { formatScopeDiagnostic } from \"../diagnostics.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 removed — instrument tree uses a fresh browser context per call\n// so that addInitScript takes effect before any page content executes.)\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 case \"date\":\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 // Use a fresh browser context per call so that addInitScript() installs the\n // Scope runtime BEFORE any page content executes. Persistent BrowserPool\n // pages have already navigated, so addInitScript on them only takes effect\n // on the NEXT navigation — meaning the hook would never be present.\n const browser = await chromium.launch({ headless: true });\n\n try {\n const context = await browser.newContext({\n viewport: { width: DEFAULT_VIEWPORT_WIDTH, height: DEFAULT_VIEWPORT_HEIGHT },\n });\n const page = await context.newPage();\n\n // 1. Build the component HTML harness with the Scope browser-entry script\n // injected as an inline <script> BEFORE the React bundle. This ensures\n // the DevTools hook is installed before React initialises, regardless of\n // how Playwright implements setContent (addInitScript does NOT fire for\n // setContent because it uses document.open/write/close, not a navigation).\n const scopeRuntime = getBrowserEntryScript();\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n {},\n DEFAULT_VIEWPORT_WIDTH,\n undefined,\n scopeRuntime,\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 await browser.close();\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(\n \"Render a component and output the full instrumentation tree:\\n\" +\n \"DOM structure, computed styles per node, a11y roles, and React fibers.\\n\\n\" +\n \"OUTPUT STRUCTURE per node:\\n\" +\n \" tag / id / className DOM identity\\n\" +\n \" computedStyles resolved CSS properties\\n\" +\n \" a11y role, name, focusable\\n\" +\n \" children nested child nodes\\n\\n\" +\n \"Examples:\\n\" +\n \" scope instrument tree Card\\n\" +\n ' scope instrument tree Button --props \\'{\"variant\":\"primary\"}\\' --json\\n' +\n \" scope instrument tree Input --json | jq '.tree.computedStyles'\",\n )\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 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 process.stderr.write(`${formatScopeDiagnostic(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 — 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 { existsSync, mkdirSync, readFileSync, rmSync, 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 { formatScopeDiagnostic } from \"./diagnostics.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 { type RunSummaryFailure, writeRunSummary } from \"./run-summary.js\";\nimport { buildWrapperScript, loadScopeFileForComponent } from \"./scope-file.js\";\nimport { getCompiledCssForClasses, getElementClassNames, loadGlobalCss } from \"./tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Config loader for globalCSS\n// ---------------------------------------------------------------------------\n\ninterface RenderConfig {\n components?: {\n wrappers?: {\n globalCSS?: string[];\n };\n };\n icons?: {\n patterns?: string[];\n };\n}\n\nexport function loadGlobalCssFilesFromConfig(cwd: string): string[] {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) return [];\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as RenderConfig;\n return cfg.components?.wrappers?.globalCSS ?? [];\n } catch {\n return [];\n }\n}\n\nconst TAILWIND_CONFIG_FILES = [\n \"tailwind.config.js\",\n \"tailwind.config.cjs\",\n \"tailwind.config.mjs\",\n \"tailwind.config.ts\",\n \"postcss.config.js\",\n \"postcss.config.cjs\",\n \"postcss.config.mjs\",\n \"postcss.config.ts\",\n];\n\nexport function shouldWarnForMissingGlobalCss(cwd: string): boolean {\n if (TAILWIND_CONFIG_FILES.some((file) => existsSync(resolve(cwd, file)))) {\n return true;\n }\n\n const packageJsonPath = resolve(cwd, \"package.json\");\n if (!existsSync(packageJsonPath)) return false;\n\n try {\n const pkg = JSON.parse(readFileSync(packageJsonPath, \"utf-8\")) as {\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n };\n return [pkg.dependencies, pkg.devDependencies].some(\n (deps) =>\n deps &&\n Object.keys(deps).some(\n (name) => name === \"tailwindcss\" || name.startsWith(\"@tailwindcss/\"),\n ),\n );\n } catch {\n return false;\n }\n}\n\nexport function loadIconPatternsFromConfig(cwd: string): string[] {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) return [];\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as RenderConfig;\n return cfg.icons?.patterns ?? [];\n } catch {\n return [];\n }\n}\n\nfunction matchGlob(pattern: string, value: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"§GLOBSTAR§\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/§GLOBSTAR§/g, \".*\");\n return new RegExp(`^${regexStr}$`, \"i\").test(value);\n}\n\nexport function isIconComponent(\n filePath: string,\n displayName: string,\n patterns: string[],\n): boolean {\n return (\n patterns.length > 0 && patterns.some((p) => matchGlob(p, filePath) || matchGlob(p, displayName))\n );\n}\n\ninterface AggregateRenderFailureJson {\n command: string;\n status: \"failed\";\n component: string;\n scenarioCount: number;\n failureCount: number;\n failures: RunSummaryFailure[];\n runSummaryPath: string;\n}\n\nfunction formatAggregateRenderFailureJson(\n componentName: string,\n failures: RunSummaryFailure[],\n scenarioCount: number,\n runSummaryPath: string,\n): AggregateRenderFailureJson {\n return {\n command: `scope render component ${componentName}`,\n status: \"failed\",\n component: componentName,\n scenarioCount,\n failureCount: failures.length,\n failures,\n runSummaryPath,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MANIFEST_PATH = \".reactscope/manifest.json\";\nconst DEFAULT_OUTPUT_DIR = \".reactscope/renders\";\n\nfunction renderArtifactBaseName(componentName: string, scenarioName?: string): string {\n return scenarioName === undefined ? componentName : `${componentName}-${scenarioName}`;\n}\n\nfunction removeStaleRenderError(\n outputDir: string,\n componentName: string,\n scenarioName?: string,\n): void {\n const errorPath = resolve(\n outputDir,\n `${renderArtifactBaseName(componentName, scenarioName)}.error.json`,\n );\n if (existsSync(errorPath)) {\n rmSync(errorPath, { force: true });\n }\n}\n\nfunction writeRenderErrorArtifact(\n outputDir: string,\n failure: {\n component: string;\n scenario?: string;\n errorMessage: string;\n heuristicFlags: string[];\n propsAtCrash: unknown;\n },\n): string {\n const errPath = resolve(\n outputDir,\n `${renderArtifactBaseName(failure.component, failure.scenario)}.error.json`,\n );\n writeFileSync(\n errPath,\n JSON.stringify(\n {\n component: failure.component,\n scenario: failure.scenario,\n errorMessage: failure.errorMessage,\n heuristicFlags: failure.heuristicFlags,\n propsAtCrash: failure.propsAtCrash,\n },\n null,\n 2,\n ),\n );\n return errPath;\n}\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\nexport async 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 */\nexport function buildRenderer(\n filePath: string,\n componentName: string,\n viewportWidth: number,\n viewportHeight: number,\n globalCssFiles: string[] = [],\n projectCwd: string = process.cwd(),\n wrapperScript?: string,\n iconMode = false,\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 // Compile globalCSS (e.g. Tailwind) so styles are applied in the render\n const projectCss = await loadGlobalCss(globalCssFiles, projectCwd);\n const PAD = 8;\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n projectCss ?? undefined,\n wrapperScript,\n PAD,\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 =\n ((await page.evaluate(() => {\n const set = new Set<string>();\n document.querySelectorAll(\"[class]\").forEach((el) => {\n for (const c of getElementClassNames(el)) {\n set.add(c);\n }\n });\n return [...set];\n })) as string[] | null) ?? [];\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 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\n // Clamp to viewport dimensions to avoid Playwright out-of-bounds errors.\n const safeW = Math.min(rawW, viewportWidth - clipX);\n const safeH = Math.min(rawH, viewportHeight - clipY);\n\n // For icon components, extract SVG innerHTML instead of taking a screenshot\n let svgContent: string | undefined;\n let screenshot: Buffer;\n\n if (iconMode) {\n svgContent =\n ((await page.evaluate((sel: string) => {\n const root = document.querySelector(sel);\n const el = root?.firstElementChild;\n if (!el) return undefined;\n return el.outerHTML;\n }, \"[data-reactscope-root]\")) as string | undefined) ?? undefined;\n screenshot = Buffer.alloc(0);\n } else {\n screenshot = await page.screenshot({\n clip: { x: clipX, y: clipY, width: safeW, height: safeH },\n type: \"png\",\n });\n }\n\n // ----- DOM extraction + per-node computed styles -----\n const STYLE_PROPS = [\n \"display\",\n \"width\",\n \"height\",\n \"color\",\n \"backgroundColor\",\n \"fontSize\",\n \"fontFamily\",\n \"fontWeight\",\n \"lineHeight\",\n \"padding\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"margin\",\n \"marginTop\",\n \"marginRight\",\n \"marginBottom\",\n \"marginLeft\",\n \"gap\",\n \"borderRadius\",\n \"borderWidth\",\n \"borderColor\",\n \"borderStyle\",\n \"boxShadow\",\n \"opacity\",\n \"position\",\n \"flexDirection\",\n \"alignItems\",\n \"justifyContent\",\n \"overflow\",\n ];\n\n const _domResult = (await page.evaluate(\n (args: { sel: string; props: string[] }) => {\n let count = 0;\n const styles: Record<number, Record<string, string>> = {};\n\n function captureStyles(el: Element, id: number, propList: string[]) {\n const computed = window.getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of propList) {\n const val = (computed as unknown as Record<string, string>)[prop] ?? \"\";\n if (val && val !== \"none\" && val !== \"normal\" && val !== \"auto\") out[prop] = val;\n }\n styles[id] = out;\n }\n\n function walk(node: Element | ChildNode): {\n tag: string;\n attrs: Record<string, string>;\n text?: string;\n nodeId?: number;\n children: ReturnType<typeof walk>[];\n } {\n if (node.nodeType === Node.TEXT_NODE) {\n return {\n tag: \"#text\",\n attrs: {},\n text: node.textContent?.trim() ?? \"\",\n children: [],\n };\n }\n const el = node as Element;\n const id = count++;\n captureStyles(el, id, args.props);\n const attrs: Record<string, string> = {};\n for (const attr of Array.from(el.attributes)) {\n attrs[attr.name] = attr.value;\n }\n const children = Array.from(el.childNodes)\n .filter(\n (n) =>\n n.nodeType === Node.ELEMENT_NODE ||\n (n.nodeType === Node.TEXT_NODE && (n.textContent?.trim() ?? \"\").length > 0),\n )\n .map(walk);\n return { tag: el.tagName.toLowerCase(), attrs, nodeId: id, children };\n }\n\n const root = document.querySelector(args.sel);\n if (!root)\n return {\n tree: { tag: \"div\", attrs: {}, children: [] },\n elementCount: 0,\n nodeStyles: {},\n };\n return { tree: walk(root), elementCount: count, nodeStyles: styles };\n },\n { sel: \"[data-reactscope-root] > *\", props: STYLE_PROPS },\n )) as {\n tree: {\n tag: string;\n attrs: Record<string, string>;\n nodeId?: number;\n children: unknown[];\n text?: string;\n };\n elementCount: number;\n nodeStyles: Record<number, Record<string, string>>;\n } | null;\n\n const domTree = _domResult?.tree ?? { tag: \"div\", attrs: {}, children: [] };\n const elementCount = _domResult?.elementCount ?? 0;\n const nodeStyles = _domResult?.nodeStyles ?? {};\n\n // Build computedStyles map keyed by node path for the render JSON\n // Also keep the legacy root-child key for compliance engine compatibility\n const computedStyles: Record<string, Record<string, string>> = {};\n if (nodeStyles[0]) computedStyles[\"[data-reactscope-root] > *\"] = nodeStyles[0];\n // Embed all node styles keyed by nodeId for x-ray display\n for (const [nodeId, styles] of Object.entries(nodeStyles)) {\n computedStyles[`#node-${nodeId}`] = styles;\n }\n\n const dom: import(\"@agent-scope/render\").RenderResult[\"dom\"] = {\n tree: domTree as import(\"@agent-scope/render\").RenderResult[\"dom\"] extends {\n tree: infer T;\n }\n ? T\n : never,\n elementCount,\n boundingBox: {\n x: boundingBox.x,\n y: boundingBox.y,\n width: boundingBox.width,\n height: boundingBox.height,\n },\n };\n\n // ----- Accessibility snapshot -----\n const a11yInfo = ((await page.evaluate((sel: string) => {\n // Use firstElementChild to skip the reactscope wrapper and target the component root\n const wrapper = document.querySelector(sel);\n const el = wrapper?.firstElementChild ?? wrapper;\n if (!el) return { role: \"generic\", name: \"\" };\n return {\n role: el.getAttribute(\"role\") ?? el.tagName.toLowerCase() ?? \"generic\",\n name:\n el.getAttribute(\"aria-label\") ??\n el.getAttribute(\"aria-labelledby\") ??\n el.textContent?.trim().slice(0, 100) ??\n \"\",\n };\n }, \"[data-reactscope-root]\")) as { role: string; name: string } | null) ?? {\n role: \"generic\",\n name: \"\",\n };\n\n const imgViolations =\n ((await page.evaluate((sel: string) => {\n const container = document.querySelector(sel);\n if (!container) return [] as string[];\n const issues: string[] = [];\n container.querySelectorAll(\"img\").forEach((img) => {\n if (!img.alt) issues.push(\"Image missing accessible name\");\n });\n return issues;\n }, \"[data-reactscope-root]\")) as string[] | null) ?? [];\n\n const accessibility: import(\"@agent-scope/render\").RenderResult[\"accessibility\"] = {\n role: a11yInfo.role,\n name: a11yInfo.name,\n violations: imgViolations,\n };\n\n const renderResult: RenderResult & { svgContent?: string } = {\n screenshot,\n width: Math.round(safeW),\n height: Math.round(safeH),\n renderTimeMs,\n computedStyles,\n dom,\n accessibility,\n };\n if (iconMode && svgContent) {\n renderResult.svgContent = svgContent;\n }\n return renderResult;\n } finally {\n pool.release(slot);\n }\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Scenario map builder\n// ---------------------------------------------------------------------------\n\n/**\n * Build the ordered map of { scenarioName → props } to render.\n *\n * Priority:\n * 1. `--scenario <name>` — render exactly one named scenario from scope file\n * 2. `--props <json>` — render once with those props (no scope file needed)\n * 3. scope file has named scenarios — render all of them\n * 4. No scope file / no scenarios — render once with empty props {}\n */\nfunction buildScenarioMap(\n opts: { props?: string; scenario?: string },\n scopeData: import(\"./scope-file.js\").ScopeFileData | null,\n): Record<string, Record<string, unknown>> {\n // --scenario: single named scenario\n if (opts.scenario !== undefined) {\n if (scopeData === null) {\n throw new Error(`--scenario \"${opts.scenario}\" requires a .scope file next to the component`);\n }\n const props = scopeData.scenarios[opts.scenario];\n if (props === undefined) {\n const available = Object.keys(scopeData.scenarios).join(\", \") || \"(none)\";\n throw new Error(\n `Scenario \"${opts.scenario}\" not found in scope file.\\nAvailable: ${available}`,\n );\n }\n return { [opts.scenario]: props };\n }\n\n // --props: explicit one-off render\n if (opts.props !== undefined) {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(opts.props) as Record<string, unknown>;\n } catch {\n throw new Error(`Invalid props JSON: ${opts.props}`);\n }\n return { __default__: parsed };\n }\n\n // Scope file with named scenarios → render all\n if (scopeData !== null && Object.keys(scopeData.scenarios).length > 0) {\n return scopeData.scenarios;\n }\n\n // Fallback: bare render with no props\n return { __default__: {} };\n}\n\n// ---------------------------------------------------------------------------\n// scope render <component>\n// ---------------------------------------------------------------------------\n\nfunction registerRenderSingle(renderCmd: Command): void {\n renderCmd\n .command(\"component <component>\", { isDefault: true })\n .description(\n \"Render one component to a PNG screenshot or JSON data object.\\n\\n\" +\n \"PROP SOURCES (in priority order):\\n\" +\n \" --scenario <name> named scenario from <ComponentName>.scope file\\n\" +\n \" --props <json> inline props JSON string\\n\" +\n \" (no flag) component rendered with all-default props\\n\\n\" +\n \"FORMAT DETECTION:\\n\" +\n \" --format png always write PNG\\n\" +\n \" --format json always write JSON render data\\n\" +\n \" auto (default) PNG when -o has .png extension or stdout is file;\\n\" +\n \" JSON when stdout is a pipe\\n\\n\" +\n \"Examples:\\n\" +\n \" scope render component Button\\n\" +\n ' scope render component Button --props \\'{\"variant\":\"primary\",\"size\":\"lg\"}\\'\\n' +\n \" scope render component Button --scenario hover-state -o button-hover.png\\n\" +\n \" scope render component Card --viewport 375x812 --theme dark\\n\" +\n \" scope render component Badge --format json | jq '.a11y'\",\n )\n .option(\"--props <json>\", 'Inline props JSON, e.g. \\'{\"variant\":\"primary\"}\\'')\n .option(\"--scenario <name>\", \"Run a named scenario from the component's .scope file\")\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 scenario?: 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 // Auto-inject sensible defaults for required props that were not supplied.\n // This prevents renders returning a tiny/empty component when required props\n // like `children` are omitted on the command line.\n if (descriptor.props !== undefined) {\n const propDefs = descriptor.props as Record<\n string,\n {\n type?: string;\n required?: boolean;\n values?: string[];\n default?: string;\n }\n >;\n for (const [propName, propDef] of Object.entries(propDefs)) {\n if (propName in props) continue; // already supplied\n if (!propDef.required && propDef.default !== undefined) continue; // has default\n // Inject placeholder for required props\n if (propDef.type === \"node\" || propDef.type === \"string\") {\n props[propName] = propName === \"children\" ? componentName : propName;\n } else if (propDef.type === \"union\" && propDef.values && propDef.values.length > 0) {\n props[propName] = propDef.values[0];\n } else if (propDef.type === \"boolean\") {\n props[propName] = false;\n } else if (propDef.type === \"number\") {\n props[propName] = 0;\n }\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 // Load scope file if present (provides scenarios + optional wrapper)\n const scopeData = await loadScopeFileForComponent(filePath);\n const wrapperScript =\n scopeData?.hasWrapper === true\n ? await buildWrapperScript(scopeData.filePath)\n : undefined;\n\n // Build the prop scenarios to render\n // Priority: --scenario flag > --props flag > scope file scenarios > bare render\n const scenarios = buildScenarioMap(opts, scopeData);\n\n // Build renderer\n const globalCssFiles = loadGlobalCssFilesFromConfig(rootDir);\n if (globalCssFiles.length === 0 && shouldWarnForMissingGlobalCss(rootDir)) {\n process.stderr.write(\n \"warning: No globalCSS files configured. Tailwind/CSS styles will not be applied to renders.\\n\" +\n \" Add `components.wrappers.globalCSS` to reactscope.config.json\\n\",\n );\n }\n const renderer = buildRenderer(\n filePath,\n componentName,\n width,\n height,\n globalCssFiles,\n rootDir,\n wrapperScript,\n );\n\n process.stderr.write(\n `Rendering ${componentName} [${descriptor.complexityClass}] at ${width}×${height}…\\n`,\n );\n\n const fmt = resolveSingleFormat(opts.format);\n const failures: RunSummaryFailure[] = [];\n const outputPaths: string[] = [];\n\n for (const [scenarioName, props] of Object.entries(scenarios)) {\n const isNamed = scenarioName !== \"__default__\";\n const label = isNamed ? `${componentName}:${scenarioName}` : componentName;\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 if (outcome.crashed) {\n process.stderr.write(`✗ ${label} 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 failures.push({\n component: componentName,\n scenario: isNamed ? scenarioName : undefined,\n stage: \"render\",\n message: outcome.error.message,\n outputPath: `${DEFAULT_OUTPUT_DIR}/${isNamed ? `${componentName}-${scenarioName}.error.json` : `${componentName}.error.json`}`,\n hints: outcome.error.heuristicFlags,\n });\n continue;\n }\n\n const result = outcome.result;\n const outFileName = isNamed\n ? `${componentName}-${scenarioName}.png`\n : `${componentName}.png`;\n\n if (opts.output !== undefined && !isNamed) {\n // Explicit --output only applies to single (non-scenario) renders\n const outPath = resolve(process.cwd(), opts.output);\n writeFileSync(outPath, result.screenshot);\n outputPaths.push(outPath);\n process.stdout.write(\n `✓ ${label} → ${opts.output} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n } else if (fmt === \"json\") {\n const json = formatRenderJson(label, props, result);\n process.stdout.write(`${JSON.stringify(json, null, 2)}\\n`);\n } else {\n // file / png / default: write to .reactscope/renders/\n const dir = resolve(process.cwd(), DEFAULT_OUTPUT_DIR);\n mkdirSync(dir, { recursive: true });\n const outPath = resolve(dir, outFileName);\n writeFileSync(outPath, result.screenshot);\n const relPath = `${DEFAULT_OUTPUT_DIR}/${outFileName}`;\n outputPaths.push(relPath);\n process.stdout.write(\n `✓ ${label} → ${relPath} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)\\n`,\n );\n }\n }\n\n const summaryPath = writeRunSummary({\n command: `scope render ${componentName}`,\n status: failures.length > 0 ? \"failed\" : \"success\",\n outputPaths,\n failures,\n });\n process.stderr.write(`[scope/render] Run summary written to ${summaryPath}\\n`);\n\n if (fmt === \"json\" && failures.length > 0) {\n const aggregateFailure = formatAggregateRenderFailureJson(\n componentName,\n failures,\n Object.keys(scenarios).length,\n summaryPath,\n );\n process.stderr.write(`${JSON.stringify(aggregateFailure, null, 2)}\\n`);\n }\n\n await shutdownPool();\n if (failures.length > 0) process.exit(1);\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`${formatScopeDiagnostic(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(\n \"Render every combination of values across one or more prop axes.\\n\" +\n \"Produces a matrix of screenshots — one cell per combination.\\n\\n\" +\n \"AXES FORMAT (two equivalent forms):\\n\" +\n ' Short: --axes \"variant:primary,ghost size:sm,md,lg\"\\n' +\n ' JSON: --axes {\"variant\":[\"primary\",\"ghost\"],\"size\":[\"sm\",\"md\",\"lg\"]}\\n\\n' +\n \"COMPOSITION CONTEXTS (--contexts):\\n\" +\n \" Test component in different layout environments.\\n\" +\n \" Available IDs: centered, rtl, sidebar, dark-bg, light-bg\\n\" +\n \" (Define custom contexts in reactscope.config.json)\\n\\n\" +\n \"STRESS PRESETS (--stress):\\n\" +\n \" Inject adversarial content to test edge cases.\\n\" +\n \" Available IDs: text.long, text.unicode, text.empty\\n\\n\" +\n \"Examples:\\n\" +\n ' scope render matrix Button --axes \"variant:primary,ghost,destructive\"\\n' +\n ' scope render matrix Button --axes \"variant:primary,ghost size:sm,lg\" --sprite matrix.png\\n' +\n ' scope render matrix Badge --axes \"type:info,warn,error\" --contexts centered,rtl\\n' +\n \" scope render matrix Input --stress text.long,text.unicode --format json\",\n )\n .option(\n \"--axes <spec>\",\n 'Axis definitions: key:v1,v2 space-separated OR JSON object e.g. \\'variant:primary,ghost size:sm,lg\\' or \\'{\"variant\":[\"primary\",\"ghost\"],\"size\":[\"sm\",\"lg\"]}\\'',\n )\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 matrixCssFiles = loadGlobalCssFilesFromConfig(rootDir);\n const renderer = buildRenderer(\n filePath,\n componentName,\n width,\n height,\n matrixCssFiles,\n rootDir,\n );\n\n // Build axes\n const axes: MatrixAxis[] = [];\n\n if (opts.axes !== undefined) {\n const axesRaw = opts.axes.trim();\n // Support two formats:\n // 1. JSON object: {\"variant\":[\"primary\",\"ghost\"],\"size\":[\"sm\",\"lg\"]}\n // 2. Space-separated key:v1,v2 pairs: variant:primary,ghost size:sm,lg\n if (axesRaw.startsWith(\"{\")) {\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(axesRaw) as Record<string, unknown>;\n } catch {\n throw new Error(`Invalid JSON in --axes: ${axesRaw}`);\n }\n for (const [name, vals] of Object.entries(parsed)) {\n if (!Array.isArray(vals)) {\n throw new Error(`Axis \"${name}\" must be an array of values in JSON format`);\n }\n axes.push({ name, values: (vals as unknown[]).map(String) });\n }\n } else {\n // Parse \"variant:primary,secondary size:sm,md,lg\"\n const axisSpecs = axesRaw.split(/\\s+/);\n for (const spec of axisSpecs) {\n const colonIdx = spec.indexOf(\":\");\n if (colonIdx < 0) {\n throw new Error(\n `Invalid axis spec \"${spec}\". Expected format: name:val1,val2,...`,\n );\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\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(`${formatScopeDiagnostic(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(\n \"Render every component in the manifest and write to .reactscope/renders/.\\n\\n\" +\n \"Also emits .reactscope/compliance-styles.json (computed CSS class→value map)\\n\" +\n \"which is required by `scope tokens compliance`.\\n\\n\" +\n \"SCENARIO SELECTION:\\n\" +\n \" Each component is rendered using its default scenario from its .scope file\\n\" +\n \" if one exists, otherwise with all-default props.\\n\\n\" +\n \"MATRIX AUTO-DETECTION:\\n\" +\n \" If a component has a .scope file with a matrix block, render all\\n\" +\n \" will render the matrix cells in addition to the default screenshot.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope render all\\n\" +\n \" scope render all --concurrency 8\\n\" +\n \" scope render all --format json --output-dir .reactscope/renders\\n\" +\n \" scope render all --manifest ./custom/manifest.json\",\n )\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 const summaryPath = writeRunSummary({\n command: \"scope render all\",\n status: \"failed\",\n outputPaths: [],\n failures: [\n {\n component: \"*\",\n stage: \"render\",\n message:\n \"No components found in manifest; refusing to report a false-green batch render.\",\n },\n ],\n });\n process.stderr.write(`[scope/render] Run summary written to ${summaryPath}\\n`);\n process.exit(1);\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 const failures: RunSummaryFailure[] = [];\n const outputPaths: string[] = [];\n\n // Accumulate compliance styles (component → categorized CSS)\n const complianceStylesMap: Record<\n string,\n {\n colors: Record<string, string>;\n spacing: Record<string, string>;\n typography: Record<string, string>;\n borders: Record<string, string>;\n shadows: Record<string, string>;\n }\n > = {};\n\n let completed = 0;\n const iconPatterns = loadIconPatternsFromConfig(process.cwd());\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 allCssFiles = loadGlobalCssFilesFromConfig(process.cwd());\n const isIcon = isIconComponent(descriptor.filePath, name, iconPatterns);\n\n // Load scope file to get realistic props — prefer 'default' scenario,\n // otherwise use the first defined scenario. Fall back to {} if no scope file.\n const scopeData = await loadScopeFileForComponent(filePath);\n const scenarioEntries = scopeData !== null ? Object.entries(scopeData.scenarios) : [];\n const defaultEntry =\n scenarioEntries.find(([k]) => k === \"default\") ?? scenarioEntries[0];\n const renderProps = defaultEntry !== undefined ? defaultEntry[1] : {};\n const wrapperScript =\n scopeData?.hasWrapper === true\n ? await buildWrapperScript(scopeData.filePath)\n : undefined;\n\n const renderer = buildRenderer(\n filePath,\n name,\n 375,\n 812,\n allCssFiles,\n process.cwd(),\n wrapperScript,\n isIcon,\n );\n\n const outcome = await safeRender(\n () => renderer.renderCell(renderProps, descriptor.complexityClass),\n {\n props: renderProps,\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 = writeRenderErrorArtifact(outputDir, {\n component: name,\n errorMessage: outcome.error.message,\n heuristicFlags: outcome.error.heuristicFlags,\n propsAtCrash: outcome.error.propsAtCrash,\n });\n failures.push({\n component: name,\n stage: \"render\",\n message: outcome.error.message,\n outputPath: errPath,\n hints: outcome.error.heuristicFlags,\n });\n outputPaths.push(errPath);\n return;\n }\n\n const result = outcome.result;\n results.push({ name, renderTimeMs: result.renderTimeMs, success: true });\n removeStaleRenderError(outputDir, name);\n\n // Write PNG (skip for icon components — they use inline SVG)\n if (!isIcon) {\n const pngPath = resolve(outputDir, `${name}.png`);\n writeFileSync(pngPath, result.screenshot);\n outputPaths.push(pngPath);\n }\n\n // Write JSON — for icons, inject svgContent from the extended result\n const jsonPath = resolve(outputDir, `${name}.json`);\n const renderJson = formatRenderJson(name, renderProps, result) as unknown as Record<\n string,\n unknown\n >;\n const extResult = result as RenderResult & { svgContent?: string };\n if (isIcon && extResult.svgContent) {\n renderJson.svgContent = extResult.svgContent;\n delete renderJson.screenshot;\n }\n writeFileSync(jsonPath, JSON.stringify(renderJson, null, 2));\n outputPaths.push(jsonPath);\n\n // Extract computed styles into compliance-styles format\n const rawStyles = result.computedStyles[\"[data-reactscope-root] > *\"] ?? {};\n const compStyles = {\n colors: {} as Record<string, string>,\n spacing: {} as Record<string, string>,\n typography: {} as Record<string, string>,\n borders: {} as Record<string, string>,\n shadows: {} as Record<string, string>,\n };\n for (const [prop, val] of Object.entries(rawStyles)) {\n if (!val || val === \"none\" || val === \"\") continue;\n const lower = prop.toLowerCase();\n if (lower.includes(\"color\") || lower.includes(\"background\")) {\n compStyles.colors[prop] = val;\n } else if (\n lower.includes(\"padding\") ||\n lower.includes(\"margin\") ||\n lower.includes(\"gap\") ||\n lower.includes(\"width\") ||\n lower.includes(\"height\")\n ) {\n compStyles.spacing[prop] = val;\n } else if (\n lower.includes(\"font\") ||\n lower.includes(\"lineheight\") ||\n lower.includes(\"letterspacing\") ||\n lower.includes(\"texttransform\")\n ) {\n compStyles.typography[prop] = val;\n } else if (\n lower.includes(\"border\") ||\n lower.includes(\"radius\") ||\n lower.includes(\"outline\")\n ) {\n compStyles.borders[prop] = val;\n } else if (lower.includes(\"shadow\")) {\n compStyles.shadows[prop] = val;\n }\n }\n complianceStylesMap[name] = compStyles;\n\n // If scope file has 2+ scenarios, run matrix render and merge cells into JSON\n if (scopeData !== null && Object.keys(scopeData.scenarios).length >= 2) {\n try {\n const scenarioEntries = Object.entries(scopeData.scenarios);\n const scenarioAxis: MatrixAxis = {\n name: \"scenario\",\n values: scenarioEntries.map(([k]) => k),\n };\n const scenarioPropsMap = Object.fromEntries(scenarioEntries);\n const matrixRenderer = buildRenderer(\n filePath,\n name,\n 375,\n 812,\n allCssFiles,\n process.cwd(),\n wrapperScript,\n );\n const wrappedRenderer: MatrixRenderer & { _satori: typeof matrixRenderer._satori } =\n {\n _satori: matrixRenderer._satori,\n async renderCell(\n props: Record<string, unknown>,\n cc?: import(\"@agent-scope/manifest\").ComplexityClass,\n ) {\n const scenarioName = props.scenario as string | undefined;\n const realProps =\n scenarioName !== undefined\n ? (scenarioPropsMap[scenarioName] ?? props)\n : props;\n return matrixRenderer.renderCell(realProps, cc ?? \"simple\");\n },\n };\n const matrix = new RenderMatrix(wrappedRenderer, [scenarioAxis], {\n concurrency: 2,\n });\n const matrixResult: MatrixResult = await matrix.render();\n const matrixCells = matrixResult.cells.map((cell) => {\n const scenarioName = scenarioEntries[cell.axisIndices[0] ?? 0]?.[0] ?? \"\";\n const artifactBaseName = renderArtifactBaseName(name, scenarioName);\n const scenarioPngPath = resolve(outputDir, `${artifactBaseName}.png`);\n const scenarioJsonPath = resolve(outputDir, `${artifactBaseName}.json`);\n if (!isIcon) {\n writeFileSync(scenarioPngPath, cell.result.screenshot);\n outputPaths.push(scenarioPngPath);\n }\n const scenarioJson = formatRenderJson(\n `${name}:${scenarioName}`,\n scenarioPropsMap[scenarioName] ?? {},\n cell.result,\n ) as unknown as Record<string, unknown>;\n writeFileSync(scenarioJsonPath, JSON.stringify(scenarioJson, null, 2));\n outputPaths.push(scenarioJsonPath);\n removeStaleRenderError(outputDir, name, scenarioName);\n return {\n axisValues: [scenarioName],\n scenario: scenarioName,\n outputPath: scenarioJsonPath,\n screenshotPath: isIcon ? undefined : scenarioPngPath,\n screenshot: cell.result.screenshot.toString(\"base64\"),\n width: cell.result.width,\n height: cell.result.height,\n renderTimeMs: cell.result.renderTimeMs,\n };\n });\n const existingJson = JSON.parse(readFileSync(jsonPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n existingJson.cells = matrixCells;\n existingJson.axisLabels = [scenarioAxis.values];\n writeFileSync(jsonPath, JSON.stringify(existingJson, null, 2));\n } catch (matrixErr) {\n const message = matrixErr instanceof Error ? matrixErr.message : String(matrixErr);\n process.stderr.write(` [warn] Matrix render for ${name} failed: ${message}\\n`);\n failures.push({\n component: name,\n stage: \"matrix\",\n message,\n outputPath: jsonPath,\n });\n }\n }\n\n // On TTY, print a per-component one-liner to stdout\n if (isTTY()) {\n const suffix = isIcon ? \" [icon/svg]\" : \"\";\n process.stdout.write(\n `✓ ${name} → ${opts.outputDir}/${name}${isIcon ? \".json\" : \".png\"} (${result.width}×${result.height}, ${result.renderTimeMs.toFixed(0)}ms)${suffix}\\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 // Write compliance-styles.json for use by `scope tokens compliance`\n const compStylesPath = resolve(\n resolve(process.cwd(), opts.outputDir),\n \"..\",\n \"compliance-styles.json\",\n );\n writeFileSync(compStylesPath, JSON.stringify(complianceStylesMap, null, 2));\n outputPaths.push(compStylesPath);\n process.stderr.write(`[scope/render] ✓ Wrote compliance-styles.json\\n`);\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\n const summaryPath = writeRunSummary({\n command: \"scope render all\",\n status: failures.length > 0 ? \"failed\" : \"success\",\n outputPaths,\n failures,\n });\n process.stderr.write(`[scope/render] Run summary written to ${summaryPath}\\n`);\n\n if (failures.length > 0) process.exit(1);\n } catch (err: unknown) {\n await shutdownPool();\n process.stderr.write(`${formatScopeDiagnostic(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 React components to PNG screenshots or JSON render data.\\n\\n\" +\n \"Scope uses two render engines depending on component complexity:\\n\" +\n \" Satori — fast SVG→PNG renderer for simple/presentational components\\n\" +\n \" BrowserPool — Playwright headless browser for complex components\\n\" +\n \" (context providers, hooks, async, global CSS)\\n\\n\" +\n \"PREREQUISITES:\\n\" +\n \" 1. reactscope.config.json exists (scope init)\\n\" +\n \" 2. manifest.json is up to date (scope manifest generate)\\n\" +\n \" 3. If using globalCSS: Tailwind/PostCSS is configured in the project\\n\\n\" +\n \"OUTPUTS (written to .reactscope/renders/<ComponentName>/):\\n\" +\n \" screenshot.png retina-quality PNG (2× physical pixels, displayed at 1×)\\n\" +\n \" render.json props, dimensions, DOM snapshot, a11y, computed styles\\n\" +\n \" compliance-styles.json (render all only) — token matching input\\n\\n\" +\n \"Examples:\\n\" +\n \" scope render component Button\\n\" +\n ' scope render matrix Button --axes \"variant:primary,ghost size:sm,md,lg\"\\n' +\n \" scope render all\\n\" +\n \" scope render all --format json --output-dir ./out\",\n );\n\n registerRenderSingle(renderCmd);\n registerRenderMatrix(renderCmd);\n registerRenderAll(renderCmd);\n\n return renderCmd;\n}\n","import { mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nexport type RunSummaryStatus = \"success\" | \"failed\";\n\nexport interface RunSummaryFailure {\n component: string;\n scenario?: string;\n stage: \"render\" | \"matrix\" | \"playground\" | \"compliance\" | \"site\";\n message: string;\n outputPath?: string;\n hints?: string[];\n}\n\nexport interface RunSummary {\n command: string;\n status: RunSummaryStatus;\n generatedAt: string;\n outputPaths: string[];\n compliance?: {\n auditedProperties: number;\n onSystemProperties: number;\n offSystemProperties: number;\n score: number;\n threshold?: number;\n };\n failures: RunSummaryFailure[];\n nextActions: string[];\n}\n\nexport const RUN_SUMMARY_PATH = \".reactscope/run-summary.json\";\n\nexport function buildNextActions(summary: Pick<RunSummary, \"failures\" | \"compliance\">): string[] {\n const actions = new Set<string>();\n\n for (const failure of summary.failures) {\n if (failure.stage === \"render\" || failure.stage === \"matrix\") {\n actions.add(\n `Inspect ${failure.outputPath ?? \".reactscope/renders\"} and add/fix ${failure.component}.scope.tsx scenarios or wrappers.`,\n );\n } else if (failure.stage === \"playground\") {\n actions.add(\n `Open the generated component page and inspect the playground bundling error for ${failure.component}.`,\n );\n } else if (failure.stage === \"compliance\") {\n actions.add(\n \"Run `scope render all` first, then inspect .reactscope/compliance-styles.json and reactscope.tokens.json.\",\n );\n } else if (failure.stage === \"site\") {\n actions.add(\n \"Inspect .reactscope/site output and rerun `scope site build` after fixing render/playground failures.\",\n );\n }\n }\n\n if (summary.compliance && summary.compliance.auditedProperties === 0) {\n actions.add(\n \"No CSS properties were audited. Verify renders produced computed styles and your token file contains matching token categories.\",\n );\n } else if (\n summary.compliance &&\n summary.compliance.threshold !== undefined &&\n summary.compliance.score < summary.compliance.threshold\n ) {\n actions.add(\n \"Inspect .reactscope/compliance-report.json for off-system values and update tokens or component styles.\",\n );\n }\n\n if (actions.size === 0) {\n actions.add(\"No follow-up needed. Outputs are ready for inspection.\");\n }\n\n return [...actions];\n}\n\nexport function writeRunSummary(\n summary: Omit<RunSummary, \"generatedAt\" | \"nextActions\"> & {\n generatedAt?: string;\n nextActions?: string[];\n },\n summaryPath = RUN_SUMMARY_PATH,\n): string {\n const outputPath = resolve(process.cwd(), summaryPath);\n mkdirSync(dirname(outputPath), { recursive: true });\n const payload: RunSummary = {\n ...summary,\n generatedAt: summary.generatedAt ?? new Date().toISOString(),\n nextActions: summary.nextActions ?? buildNextActions(summary),\n };\n writeFileSync(outputPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf-8\");\n return outputPath;\n}\n\nexport function readRunSummary(summaryPath = RUN_SUMMARY_PATH): RunSummary | null {\n try {\n return JSON.parse(readFileSync(resolve(process.cwd(), summaryPath), \"utf-8\")) as RunSummary;\n } catch {\n return null;\n }\n}\n","/**\n * scope-file.ts\n *\n * Discovers, bundles, and extracts data from `.scope.ts(x)` / `.scope.js(x)` files.\n *\n * A scope file lives next to its component and exports:\n *\n * - `scenarios` — Record<string, Record<string, unknown>>\n * Named prop sets for the component. Each key becomes a named scenario\n * that can be passed to `scope render <Component> --scenario <name>`.\n * Export either `export const scenarios = { ... }` or\n * `export default { scenarios: { ... } }`.\n *\n * - `wrapper` (optional) — React functional component ({ children }) => JSX\n * A component-specific provider wrapper injected around the rendered\n * component. Takes priority over any global provider config. Export either\n * `export const wrapper = ...` or `export default { wrapper, scenarios }`.\n *\n * Example (Button.scope.tsx):\n *\n * import { ThemeProvider } from '../providers/ThemeProvider'\n *\n * export const wrapper = ({ children }) => (\n * <ThemeProvider theme=\"dark\">{children}</ThemeProvider>\n * )\n *\n * export const scenarios = {\n * default: { variant: 'primary', children: 'Submit' },\n * danger: { variant: 'danger', children: 'Delete' },\n * disabled: { variant: 'primary', children: 'Submit', disabled: true },\n * }\n *\n * Design\n * ------\n * 1. Discovery: look for `<stem>.scope.tsx|ts|jsx|js` next to `<stem>.tsx|ts|jsx|js`.\n * 2. Bundling: esbuild bundles the scope file to a CJS bundle (no externals),\n * written to a temp file, then `require()`d at runtime to extract exports.\n * 3. Extraction: pull `scenarios` (plain object) and `hasWrapper` flag.\n * The wrapper itself is only meaningful inside the browser harness — we\n * don't need the actual function in Node, just its source so we can\n * re-bundle it into the harness.\n */\n\nimport { existsSync, mkdirSync, rmSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { dirname, join, resolve } from \"node:path\";\nimport * as esbuild from \"esbuild\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * The extracted data from a `.scope.ts(x)` file.\n */\nexport interface ScopeFileData {\n /** Absolute path to the discovered scope file. */\n filePath: string;\n /**\n * Named scenarios — Record<name, props>.\n * Empty object if the scope file does not export `scenarios`.\n */\n scenarios: Record<string, Record<string, unknown>>;\n /**\n * Whether the scope file exports a `wrapper` component.\n * When true, the wrapper is re-bundled into the render harness.\n */\n hasWrapper: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Discovery\n// ---------------------------------------------------------------------------\n\n/** Candidate scope file extensions in priority order. */\nconst SCOPE_EXTENSIONS = [\".scope.tsx\", \".scope.ts\", \".scope.jsx\", \".scope.js\"];\n\n/**\n * Find the scope file for a given component file path.\n * Returns the absolute path if found, otherwise null.\n *\n * @param componentFilePath - Absolute path to the component source file.\n */\nexport function findScopeFile(componentFilePath: string): string | null {\n const dir = dirname(componentFilePath);\n // Strip the component's own extension to get the stem\n const stem = componentFilePath.replace(/\\.(tsx?|jsx?)$/, \"\");\n const baseName = stem.slice(dir.length + 1); // e.g. \"Button\"\n\n for (const ext of SCOPE_EXTENSIONS) {\n const candidate = join(dir, `${baseName}${ext}`);\n if (existsSync(candidate)) return candidate;\n }\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Load + extract\n// ---------------------------------------------------------------------------\n\n/**\n * Load a scope file by path, bundle it with esbuild (CJS), require() it,\n * and return the extracted data.\n *\n * @param scopeFilePath - Absolute path to the `.scope.ts(x)` file.\n */\nexport async function loadScopeFile(scopeFilePath: string): Promise<ScopeFileData> {\n const tmpDir = join(tmpdir(), `scope-file-${Date.now()}-${Math.random().toString(36).slice(2)}`);\n mkdirSync(tmpDir, { recursive: true });\n const outFile = join(tmpDir, \"scope-file.cjs\");\n\n try {\n // Bundle to CJS so we can require() it in Node\n const result = await esbuild.build({\n entryPoints: [scopeFilePath],\n bundle: true,\n format: \"cjs\",\n platform: \"node\",\n target: \"node18\",\n outfile: outFile,\n write: true,\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n // Externalize React — we don't need to execute JSX, just extract plain data\n external: [\"react\", \"react-dom\", \"react/jsx-runtime\"],\n define: {\n \"process.env.NODE_ENV\": '\"development\"',\n },\n logLevel: \"silent\",\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(`Failed to bundle scope file ${scopeFilePath}:\\n${msg}`);\n }\n\n // require() the CJS bundle\n const req = createRequire(import.meta.url);\n // Clear require cache to avoid stale data across calls\n delete req.cache[resolve(outFile)];\n // biome-ignore lint/suspicious/noExplicitAny: dynamic require\n const mod = req(outFile) as any;\n\n // Extract scenarios — must be a plain object mapping string keys to prop objects\n const scenarios = extractScenarios(mod, scopeFilePath);\n const hasWrapper =\n typeof mod.wrapper === \"function\" || typeof mod.default?.wrapper === \"function\";\n\n return { filePath: scopeFilePath, scenarios, hasWrapper };\n } finally {\n // Clean up temp bundle\n try {\n rmSync(tmpDir, { recursive: true, force: true });\n } catch {\n // best-effort cleanup\n }\n }\n}\n\n/**\n * Convenience: find + load the scope file for a component.\n * Returns null if no scope file exists.\n */\nexport async function loadScopeFileForComponent(\n componentFilePath: string,\n): Promise<ScopeFileData | null> {\n const scopeFilePath = findScopeFile(componentFilePath);\n if (scopeFilePath === null) return null;\n return loadScopeFile(scopeFilePath);\n}\n\n// ---------------------------------------------------------------------------\n// Scenario extraction helpers\n// ---------------------------------------------------------------------------\n\nfunction extractScenarios(\n mod: Record<string, unknown>,\n filePath: string,\n): Record<string, Record<string, unknown>> {\n // Support both named export `scenarios` and default export `{ scenarios }`\n const raw = mod.scenarios ?? (mod.default as Record<string, unknown> | undefined)?.scenarios;\n\n if (raw === undefined) return {};\n\n if (typeof raw !== \"object\" || raw === null || Array.isArray(raw)) {\n console.warn(`[scope] ${filePath}: \"scenarios\" export is not a plain object — ignoring.`);\n return {};\n }\n\n const result: Record<string, Record<string, unknown>> = {};\n for (const [name, props] of Object.entries(raw as Record<string, unknown>)) {\n if (typeof props !== \"object\" || props === null || Array.isArray(props)) {\n console.warn(`[scope] ${filePath}: scenario \"${name}\" is not a plain object — skipping.`);\n continue;\n }\n result[name] = props as Record<string, unknown>;\n }\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Wrapper source extraction (for harness injection)\n// ---------------------------------------------------------------------------\n\n/**\n * Build the scope file's wrapper export as a self-contained IIFE-compatible\n * script chunk that exposes `window.__SCOPE_WRAPPER__`.\n *\n * Called by component-bundler when the scope file has `hasWrapper: true`,\n * so the render harness can wrap the component before mounting.\n *\n * @param scopeFilePath - Absolute path to the `.scope.ts(x)` file.\n */\nexport async function buildWrapperScript(scopeFilePath: string): Promise<string> {\n const wrapperEntry = /* ts */ `\nimport * as __scopeMod from ${JSON.stringify(scopeFilePath)};\n// Expose the wrapper on window so the harness can access it\nvar wrapper =\n __scopeMod.wrapper ??\n (__scopeMod.default && __scopeMod.default.wrapper) ??\n null;\nwindow.__SCOPE_WRAPPER__ = wrapper;\n`;\n\n const result = await esbuild.build({\n stdin: {\n contents: wrapperEntry,\n resolveDir: dirname(scopeFilePath),\n loader: \"tsx\",\n sourcefile: \"__scope_wrapper_entry__.tsx\",\n },\n bundle: true,\n format: \"iife\",\n platform: \"browser\",\n target: \"es2020\",\n write: false,\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n external: [],\n define: {\n \"process.env.NODE_ENV\": '\"development\"',\n global: \"globalThis\",\n },\n logLevel: \"silent\",\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(`Failed to build wrapper script from ${scopeFilePath}:\\n${msg}`);\n }\n\n return result.outputFiles?.[0]?.text ?? \"\";\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, getElementClassNames } 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 PAD = 24;\n const pool = await getPool(viewportWidth, viewportHeight);\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n undefined,\n undefined,\n PAD,\n );\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 getElementClassNames(el)) {\n 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 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 * @agent-scope/cli — report diff command\n *\n * Implements `scope report diff`, which compares the current component library\n * state against a previously captured baseline snapshot.\n *\n * Diff analysis covers three dimensions:\n * 1. **Components** — added, removed, renamed (by displayName)\n * 2. **Compliance** — per-component token compliance delta (aggregateCompliance %)\n * 3. **Renders** — visual diff metadata (size changes, render time delta)\n *\n * The command re-renders all components using the same pipeline as\n * `scope report baseline`, then compares against the persisted baseline.\n *\n * Output (stdout):\n * - Human-readable summary table (TTY) or JSON (`--json`)\n *\n * Exit codes:\n * 0 — diff clean (no regressions beyond threshold)\n * 1 — regressions detected (use `--fail-on-regression` to trigger; default: 1 when any found)\n * 2 — operational error (missing baseline, render failure, etc.)\n *\n * Diff result file (optional):\n * Written to `--output <path>` when provided (JSON, always).\n *\n * Snapshot layout (baseline):\n * ```\n * .reactscope/baseline/\n * ├── manifest.json # component registry at baseline time\n * ├── renders/\n * │ ├── Button.json # structured render output\n * │ └── Button.png # screenshot\n * └── compliance.json # BatchReport\n * ```\n */\n\nimport { existsSync, readFileSync, 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 } 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 { renderProgressBar } from \"../render-formatter.js\";\nimport { getCompiledCssForClasses, getElementClassNames } from \"../tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_BASELINE_DIR = \".reactscope/baseline\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Status of a single component in the diff */\nexport type ComponentDiffStatus =\n | \"added\" // present in current, absent from baseline\n | \"removed\" // present in baseline, absent from current\n | \"unchanged\" // present in both, no meaningful change\n | \"compliance_regressed\" // compliance score dropped below threshold\n | \"compliance_improved\" // compliance score improved\n | \"size_changed\"; // render dimensions changed materially\n\n/** Per-component diff entry */\nexport interface ComponentDiffEntry {\n /** Component display name */\n name: string;\n /** Diff classification */\n status: ComponentDiffStatus;\n /** Compliance score in baseline (0–1). null when component was not in baseline */\n baselineCompliance: number | null;\n /** Compliance score in current run (0–1). null when component failed to render */\n currentCompliance: number | null;\n /** Compliance delta (current − baseline). null when either side is missing */\n complianceDelta: number | null;\n /** Baseline render dimensions */\n baselineDimensions: { width: number; height: number } | null;\n /** Current render dimensions */\n currentDimensions: { width: number; height: number } | null;\n /** Render time in ms for the current run. null on failure */\n renderTimeMs: number | null;\n /** true when the component failed to render in the current run */\n renderFailed: boolean;\n}\n\n/** Top-level diff result */\nexport interface DiffResult {\n /** ISO timestamp of when this diff was computed */\n diffedAt: string;\n /** Absolute path to the baseline that was compared against */\n baselineDir: string;\n /** Overall summary counts */\n summary: {\n total: number;\n added: number;\n removed: number;\n unchanged: number;\n complianceRegressed: number;\n complianceImproved: number;\n sizeChanged: number;\n renderFailed: number;\n };\n /** Per-component details */\n components: ComponentDiffEntry[];\n /** Aggregate compliance in baseline (0–1) */\n baselineAggregateCompliance: number;\n /** Aggregate compliance in current run (0–1) */\n currentAggregateCompliance: number;\n /** Whether any regressions were detected */\n hasRegressions: boolean;\n /** Wall-clock time for the diff run in ms */\n wallClockMs: number;\n}\n\n/** Options for runDiff() */\nexport interface DiffOptions {\n /** Baseline directory to compare against. Default: .reactscope/baseline */\n baselineDir?: string;\n /** Tokens to use for current compliance audit. Default: none */\n complianceTokens?: ConstructorParameters<typeof TokenResolver>[0];\n /** Glob to filter which components to diff. Default: all */\n componentsGlob?: string;\n /** Path to manifest.json to use instead of regenerating. Default: regenerate */\n manifestPath?: string;\n /** Viewport width. Default: 375 */\n viewportWidth?: number;\n /** Viewport height. Default: 812 */\n viewportHeight?: number;\n /**\n * Minimum compliance delta to classify a component as \"regressed\".\n * E.g. 0.05 = 5 percentage points drop triggers a regression flag.\n * Default: 0.01\n */\n regressionThreshold?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Baseline loaders\n// ---------------------------------------------------------------------------\n\ninterface BaselineCompliance {\n components: Record<\n string,\n {\n aggregateCompliance: number;\n totalProperties: number;\n totalOnSystem: number;\n totalOffSystem: number;\n auditedAt: string;\n }\n >;\n aggregateCompliance: number;\n}\n\ninterface BaselineRenderJson {\n component: string;\n width: number;\n height: number;\n renderTimeMs: number;\n}\n\n/**\n * Load the baseline compliance.json from the baseline directory.\n * Returns null when missing (e.g. baseline was created without compliance).\n */\nfunction loadBaselineCompliance(baselineDir: string): BaselineCompliance | null {\n const compliancePath = resolve(baselineDir, \"compliance.json\");\n if (!existsSync(compliancePath)) return null;\n\n const raw = JSON.parse(readFileSync(compliancePath, \"utf-8\")) as {\n components: BaselineCompliance[\"components\"];\n aggregateCompliance: number;\n };\n\n return raw as BaselineCompliance;\n}\n\n/**\n * Load baseline render metadata for a component.\n * Returns null when the component's .json file is absent (crashed or not in baseline).\n */\nfunction loadBaselineRenderJson(\n baselineDir: string,\n componentName: string,\n): BaselineRenderJson | null {\n const jsonPath = resolve(baselineDir, \"renders\", `${componentName}.json`);\n if (!existsSync(jsonPath)) return null;\n return JSON.parse(readFileSync(jsonPath, \"utf-8\")) as BaselineRenderJson;\n}\n\n// ---------------------------------------------------------------------------\n// Browser pool — lazy singleton\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 (shared with baseline — same pipeline)\n// ---------------------------------------------------------------------------\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 PAD = 24;\n const pool = await getPool(viewportWidth, viewportHeight);\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n props,\n viewportWidth,\n undefined,\n undefined,\n PAD,\n );\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 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 getElementClassNames(el)) {\n 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 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 extraction (matches baseline.ts)\n// ---------------------------------------------------------------------------\n\nfunction extractComputedStyles(\n computedStylesRaw: Record<string, Record<string, string>>,\n): import(\"@agent-scope/tokens\").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// Diff classification\n// ---------------------------------------------------------------------------\n\n/**\n * Determine the ComponentDiffStatus for a single component based on its\n * compliance scores and dimension changes.\n */\nfunction classifyComponent(\n entry: Omit<ComponentDiffEntry, \"status\">,\n regressionThreshold: number,\n): ComponentDiffStatus {\n if (entry.renderFailed) return \"unchanged\"; // failed render — no useful classification\n\n if (entry.baselineCompliance === null && entry.currentCompliance !== null) {\n return \"added\";\n }\n if (entry.baselineCompliance !== null && entry.currentCompliance === null) {\n return \"removed\";\n }\n\n const delta = entry.complianceDelta;\n\n if (delta !== null) {\n if (delta <= -regressionThreshold) return \"compliance_regressed\";\n if (delta >= regressionThreshold) return \"compliance_improved\";\n }\n\n // Check for material dimension change (>10px on either axis)\n if (entry.baselineDimensions !== null && entry.currentDimensions !== null) {\n const dw = Math.abs(entry.currentDimensions.width - entry.baselineDimensions.width);\n const dh = Math.abs(entry.currentDimensions.height - entry.baselineDimensions.height);\n if (dw > 10 || dh > 10) return \"size_changed\";\n }\n\n return \"unchanged\";\n}\n\n// ---------------------------------------------------------------------------\n// Diff runner\n// ---------------------------------------------------------------------------\n\n/**\n * Run the full diff pipeline:\n * 1. Validate baseline directory exists\n * 2. Load baseline manifest + compliance + render metadata\n * 3. Generate (or load) current manifest\n * 4. Render all components in current manifest\n * 5. Run compliance audit on current renders\n * 6. Build per-component diff entries\n * 7. Return DiffResult\n */\nexport async function runDiff(options: DiffOptions = {}): Promise<DiffResult> {\n const {\n baselineDir: baselineDirRaw = DEFAULT_BASELINE_DIR,\n complianceTokens = [],\n componentsGlob,\n manifestPath,\n viewportWidth = 375,\n viewportHeight = 812,\n regressionThreshold = 0.01,\n } = options;\n\n const startTime = performance.now();\n const rootDir = process.cwd();\n const baselineDir = resolve(rootDir, baselineDirRaw);\n\n // ── 1. Validate baseline ─────────────────────────────────────────────────\n if (!existsSync(baselineDir)) {\n throw new Error(\n `Baseline directory not found at \"${baselineDir}\". ` +\n `Run \\`scope report baseline\\` first to create a baseline snapshot.`,\n );\n }\n\n const baselineManifestPath = resolve(baselineDir, \"manifest.json\");\n if (!existsSync(baselineManifestPath)) {\n throw new Error(\n `Baseline manifest.json not found at \"${baselineManifestPath}\". ` +\n `The baseline directory may be incomplete — re-run \\`scope report baseline\\`.`,\n );\n }\n\n // ── 2. Load baseline data ─────────────────────────────────────────────────\n const baselineManifest = JSON.parse(readFileSync(baselineManifestPath, \"utf-8\")) as Manifest;\n\n const baselineCompliance = loadBaselineCompliance(baselineDir);\n const baselineComponentNames = new Set(Object.keys(baselineManifest.components));\n\n process.stderr.write(\n `Comparing against baseline at ${baselineDir} ` +\n `(${baselineComponentNames.size} components)\\n`,\n );\n\n // ── 3. Generate (or load) current manifest ───────────────────────────────\n let currentManifest: Manifest;\n\n if (manifestPath !== undefined) {\n const absPath = resolve(rootDir, manifestPath);\n if (!existsSync(absPath)) {\n throw new Error(`Manifest not found at \"${absPath}\".`);\n }\n currentManifest = 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 currentManifest = await generateManifest({ rootDir });\n const count = Object.keys(currentManifest.components).length;\n process.stderr.write(`Found ${count} components.\\n`);\n }\n\n // ── 4. Determine component set ────────────────────────────────────────────\n let componentNames = Object.keys(currentManifest.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 // Add removed components (in baseline but not in current after glob filter)\n const removedNames = [...baselineComponentNames].filter(\n (name) =>\n !currentManifest.components[name] &&\n (componentsGlob === undefined || matchGlob(componentsGlob, name)),\n );\n\n const total = componentNames.length;\n\n // ── 5. Render current components ─────────────────────────────────────────\n process.stderr.write(`Rendering ${total} components for diff…\\n`);\n\n const computedStylesMap = new Map<string, import(\"@agent-scope/tokens\").ComputedStyles>();\n const currentRenderMeta = new Map<\n string,\n { width: number; height: number; renderTimeMs: number }\n >();\n const renderFailures = new Set<string>();\n\n let completed = 0;\n const CONCURRENCY = 4;\n let nextIdx = 0;\n\n const renderOne = async (name: string): Promise<void> => {\n const descriptor = currentManifest.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 renderFailures.add(name);\n return;\n }\n\n const result = outcome.result;\n currentRenderMeta.set(name, {\n width: result.width,\n height: result.height,\n renderTimeMs: result.renderTimeMs,\n });\n computedStylesMap.set(name, extractComputedStyles(result.computedStyles));\n };\n\n if (total > 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\n await shutdownPool();\n\n if (isTTY() && total > 0) {\n process.stderr.write(\"\\n\");\n }\n\n // ── 6. Compliance audit on current renders ────────────────────────────────\n const resolver = new TokenResolver(complianceTokens);\n const engine = new ComplianceEngine(resolver);\n const currentBatchReport: BatchReport = engine.auditBatch(computedStylesMap);\n\n // ── 7. Build diff entries ─────────────────────────────────────────────────\n const entries: ComponentDiffEntry[] = [];\n\n // Components in current run\n for (const name of componentNames) {\n const baselineComp = baselineCompliance?.components[name] ?? null;\n const currentComp = currentBatchReport.components[name] ?? null;\n const baselineMeta = loadBaselineRenderJson(baselineDir, name);\n const currentMeta = currentRenderMeta.get(name) ?? null;\n const failed = renderFailures.has(name);\n\n const baselineComplianceScore = baselineComp?.aggregateCompliance ?? null;\n const currentComplianceScore = currentComp?.compliance ?? null;\n const delta =\n baselineComplianceScore !== null && currentComplianceScore !== null\n ? currentComplianceScore - baselineComplianceScore\n : null;\n\n const partial: Omit<ComponentDiffEntry, \"status\"> = {\n name,\n baselineCompliance: baselineComplianceScore,\n currentCompliance: currentComplianceScore,\n complianceDelta: delta,\n baselineDimensions:\n baselineMeta !== null ? { width: baselineMeta.width, height: baselineMeta.height } : null,\n currentDimensions:\n currentMeta !== null ? { width: currentMeta.width, height: currentMeta.height } : null,\n renderTimeMs: currentMeta?.renderTimeMs ?? null,\n renderFailed: failed,\n };\n\n entries.push({ ...partial, status: classifyComponent(partial, regressionThreshold) });\n }\n\n // Components removed (in baseline but not current)\n for (const name of removedNames) {\n const baselineComp = baselineCompliance?.components[name] ?? null;\n const baselineMeta = loadBaselineRenderJson(baselineDir, name);\n\n entries.push({\n name,\n status: \"removed\",\n baselineCompliance: baselineComp?.aggregateCompliance ?? null,\n currentCompliance: null,\n complianceDelta: null,\n baselineDimensions:\n baselineMeta !== null ? { width: baselineMeta.width, height: baselineMeta.height } : null,\n currentDimensions: null,\n renderTimeMs: null,\n renderFailed: false,\n });\n }\n\n // ── 8. Summary ────────────────────────────────────────────────────────────\n const summary = {\n total: entries.length,\n added: entries.filter((e) => e.status === \"added\").length,\n removed: entries.filter((e) => e.status === \"removed\").length,\n unchanged: entries.filter((e) => e.status === \"unchanged\").length,\n complianceRegressed: entries.filter((e) => e.status === \"compliance_regressed\").length,\n complianceImproved: entries.filter((e) => e.status === \"compliance_improved\").length,\n sizeChanged: entries.filter((e) => e.status === \"size_changed\").length,\n renderFailed: entries.filter((e) => e.renderFailed).length,\n };\n\n const hasRegressions =\n summary.complianceRegressed > 0 || summary.removed > 0 || summary.renderFailed > 0;\n\n const wallClockMs = performance.now() - startTime;\n\n return {\n diffedAt: new Date().toISOString(),\n baselineDir,\n summary,\n components: entries,\n baselineAggregateCompliance: baselineCompliance?.aggregateCompliance ?? 0,\n currentAggregateCompliance: currentBatchReport.aggregateCompliance,\n hasRegressions,\n wallClockMs,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Human-readable formatter\n// ---------------------------------------------------------------------------\n\nconst STATUS_ICON: Record<ComponentDiffStatus, string> = {\n added: \"+\",\n removed: \"-\",\n unchanged: \" \",\n compliance_regressed: \"↓\",\n compliance_improved: \"↑\",\n size_changed: \"~\",\n};\n\nconst STATUS_LABEL: Record<ComponentDiffStatus, string> = {\n added: \"added\",\n removed: \"removed\",\n unchanged: \"ok\",\n compliance_regressed: \"regressed\",\n compliance_improved: \"improved\",\n size_changed: \"size changed\",\n};\n\n/**\n * Format a DiffResult as a human-readable text report.\n */\nexport function formatDiffReport(result: DiffResult): string {\n const lines: string[] = [];\n\n const title = \"Scope Report Diff\";\n const rule = \"━\".repeat(Math.max(title.length, 40));\n lines.push(title, rule);\n\n // Compliance delta summary\n const complianceDelta = result.currentAggregateCompliance - result.baselineAggregateCompliance;\n const complianceSign = complianceDelta >= 0 ? \"+\" : \"\";\n lines.push(\n `Baseline compliance: ${(result.baselineAggregateCompliance * 100).toFixed(1)}%`,\n `Current compliance: ${(result.currentAggregateCompliance * 100).toFixed(1)}%`,\n `Delta: ${complianceSign}${(complianceDelta * 100).toFixed(1)}%`,\n \"\",\n );\n\n // Summary counts\n const s = result.summary;\n lines.push(\n `Components: ${s.total} total ` +\n [\n s.added > 0 ? `${s.added} added` : \"\",\n s.removed > 0 ? `${s.removed} removed` : \"\",\n s.complianceRegressed > 0 ? `${s.complianceRegressed} regressed` : \"\",\n s.complianceImproved > 0 ? `${s.complianceImproved} improved` : \"\",\n s.sizeChanged > 0 ? `${s.sizeChanged} size changed` : \"\",\n s.renderFailed > 0 ? `${s.renderFailed} failed` : \"\",\n ]\n .filter(Boolean)\n .join(\" \"),\n \"\",\n );\n\n // Per-component table — only show non-unchanged entries unless all are unchanged\n const notable = result.components.filter((e) => e.status !== \"unchanged\");\n\n if (notable.length === 0) {\n lines.push(\" No changes detected.\");\n } else {\n // Column widths\n const nameWidth = Math.max(9, ...notable.map((e) => e.name.length));\n const header =\n `${\"COMPONENT\".padEnd(nameWidth)} ` +\n `${\"STATUS\".padEnd(13)} ` +\n `${\"COMPLIANCE Δ\".padEnd(13)} ` +\n `DIMENSIONS`;\n const divider = \"-\".repeat(header.length);\n\n lines.push(header, divider);\n\n for (const entry of notable) {\n const icon = STATUS_ICON[entry.status];\n const label = STATUS_LABEL[entry.status].padEnd(13);\n const name = entry.name.padEnd(nameWidth);\n\n let complianceStr = \"—\".padEnd(13);\n if (entry.complianceDelta !== null) {\n const sign = entry.complianceDelta >= 0 ? \"+\" : \"\";\n complianceStr = `${sign}${(entry.complianceDelta * 100).toFixed(1)}%`.padEnd(13);\n }\n\n let dimStr = \"—\";\n if (entry.baselineDimensions !== null && entry.currentDimensions !== null) {\n const b = entry.baselineDimensions;\n const c = entry.currentDimensions;\n if (b.width !== c.width || b.height !== c.height) {\n dimStr = `${b.width}×${b.height} → ${c.width}×${c.height}`;\n } else {\n dimStr = `${c.width}×${c.height}`;\n }\n } else if (entry.currentDimensions !== null) {\n dimStr = `${entry.currentDimensions.width}×${entry.currentDimensions.height}`;\n } else if (entry.baselineDimensions !== null) {\n dimStr = `${entry.baselineDimensions.width}×${entry.baselineDimensions.height} (removed)`;\n }\n\n if (entry.renderFailed) {\n dimStr = \"render failed\";\n }\n\n lines.push(`${icon} ${name} ${label} ${complianceStr} ${dimStr}`);\n }\n }\n\n lines.push(\n \"\",\n rule,\n result.hasRegressions\n ? `Diff complete: ${result.summary.complianceRegressed + result.summary.renderFailed} regression(s) detected in ${(result.wallClockMs / 1000).toFixed(1)}s`\n : `Diff complete: no regressions in ${(result.wallClockMs / 1000).toFixed(1)}s`,\n );\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// CLI command factory\n// ---------------------------------------------------------------------------\n\n/**\n * Registers the `diff` sub-command onto an existing Commander command\n * (typically the `report` command in program.ts).\n *\n * Exits with:\n * 0 — no regressions detected\n * 1 — regressions detected\n * 2 — operational error (missing baseline, render failure, etc.)\n */\nexport function registerDiffSubCommand(reportCmd: Command): void {\n reportCmd\n .command(\"diff\")\n .description(\"Compare the current component library against a saved baseline snapshot\")\n .option(\"-b, --baseline <dir>\", \"Baseline directory to compare against\", DEFAULT_BASELINE_DIR)\n .option(\"--components <glob>\", \"Glob pattern to diff 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 .option(\"--json\", \"Output diff as JSON instead of human-readable text\", false)\n .option(\"-o, --output <path>\", \"Write the diff JSON to a file\")\n .option(\n \"--regression-threshold <n>\",\n \"Minimum compliance drop (0–1) to classify as a regression\",\n \"0.01\",\n )\n .action(\n async (opts: {\n baseline: string;\n components?: string;\n manifest?: string;\n viewport: string;\n json: boolean;\n output?: string;\n regressionThreshold: 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 const regressionThreshold = Number.parseFloat(opts.regressionThreshold);\n\n const result = await runDiff({\n baselineDir: opts.baseline,\n componentsGlob: opts.components,\n manifestPath: opts.manifest,\n viewportWidth,\n viewportHeight,\n regressionThreshold,\n });\n\n // Write JSON output file if requested\n if (opts.output !== undefined) {\n writeFileSync(opts.output, JSON.stringify(result, null, 2), \"utf-8\");\n process.stderr.write(`Diff written to ${opts.output}\\n`);\n }\n\n // Emit to stdout\n if (opts.json) {\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n } else {\n process.stdout.write(`${formatDiffReport(result)}\\n`);\n }\n\n // Exit 1 on regressions\n process.exit(result.hasRegressions ? 1 : 0);\n } catch (err) {\n process.stderr.write(`Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n process.exit(2);\n }\n },\n );\n}\n","/**\n * @agent-scope/cli — report pr-comment command\n *\n * Implements `scope report pr-comment`, which reads a `DiffResult` JSON file\n * (produced by `scope report diff --json`) and formats it as a GitHub-flavored\n * Markdown comment suitable for posting to a pull request.\n *\n * The generated comment is written to stdout so it can be piped directly into\n * the GitHub CLI (`gh pr comment`) or the GitHub Actions API.\n *\n * Output structure:\n * ```\n * ## 🔬 Scope Report\n *\n * | Metric | Value |\n * |---------------------|------------|\n * | Baseline compliance | 82.0% |\n * | Current compliance | 79.0% |\n * | Delta | ↓ -3.0% |\n * | Components | 12 total |\n *\n * ### Changes\n *\n * | Component | Status | Compliance Δ | Dimensions |\n * |------------|-------------|--------------|--------------|\n * | Button | ✅ added | — | 320 × 200 |\n * | TokenBadge | ❌ regressed | -15.0% | 320 × 200 |\n *\n * <details><summary>6 unchanged</summary>…</details>\n *\n * > Generated by [Scope](https://github.com/FlatFilers/Scope)\n * ```\n *\n * Exit codes:\n * 0 — comment rendered successfully\n * 1 — input file missing, unreadable, or not valid DiffResult JSON\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Command } from \"commander\";\nimport type { ComponentDiffEntry, DiffResult } from \"./diff.js\";\n\n// ---------------------------------------------------------------------------\n// Emoji / badge helpers\n// ---------------------------------------------------------------------------\n\nconst STATUS_BADGE: Record<ComponentDiffEntry[\"status\"], string> = {\n added: \"✅ added\",\n removed: \"🗑️ removed\",\n unchanged: \"— unchanged\",\n compliance_regressed: \"❌ regressed\",\n compliance_improved: \"📈 improved\",\n size_changed: \"📐 resized\",\n};\n\nfunction fmt(n: number): string {\n return `${(n * 100).toFixed(1)}%`;\n}\n\nfunction fmtDelta(delta: number | null): string {\n if (delta === null) return \"—\";\n const sign = delta >= 0 ? \"+\" : \"\";\n return `${sign}${(delta * 100).toFixed(1)}%`;\n}\n\nfunction fmtDimensions(d: { width: number; height: number } | null): string {\n if (d === null) return \"—\";\n return `${d.width} × ${d.height}`;\n}\n\nfunction complianceDeltaArrow(diff: DiffResult): string {\n const delta = diff.currentAggregateCompliance - diff.baselineAggregateCompliance;\n if (Math.abs(delta) < 0.0005) return `→ ${fmt(diff.currentAggregateCompliance)} (no change)`;\n const arrow = delta > 0 ? \"↑\" : \"↓\";\n return `${arrow} ${fmtDelta(delta)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Markdown renderer\n// ---------------------------------------------------------------------------\n\n/**\n * Renders a `DiffResult` as a GitHub PR comment in Markdown.\n */\nexport function formatPrComment(diff: DiffResult): string {\n const { summary, components } = diff;\n\n const lines: string[] = [];\n\n // ── Header ────────────────────────────────────────────────────────────────\n const hasRegressions = diff.hasRegressions;\n const headerEmoji = hasRegressions ? \"⚠️\" : \"✅\";\n lines.push(`## ${headerEmoji} Scope Report`);\n lines.push(\"\");\n\n // ── Summary table ─────────────────────────────────────────────────────────\n lines.push(\"| Metric | Value |\");\n lines.push(\"|---|---|\");\n lines.push(`| Baseline compliance | ${fmt(diff.baselineAggregateCompliance)} |`);\n lines.push(`| Current compliance | ${fmt(diff.currentAggregateCompliance)} |`);\n lines.push(`| Delta | ${complianceDeltaArrow(diff)} |`);\n lines.push(\n `| Components | ${summary.total} total · ${summary.added} added · ${summary.removed} removed · ${summary.complianceRegressed} regressed |`,\n );\n if (summary.renderFailed > 0) {\n lines.push(`| Render failures | ${summary.renderFailed} |`);\n }\n lines.push(\"\");\n\n // ── Changed components table ───────────────────────────────────────────────\n const changed = components.filter((c) => c.status !== \"unchanged\");\n const unchanged = components.filter((c) => c.status === \"unchanged\");\n\n if (changed.length > 0) {\n lines.push(\"### Changes\");\n lines.push(\"\");\n lines.push(\"| Component | Status | Compliance Δ | Dimensions |\");\n lines.push(\"|---|---|---|---|\");\n for (const c of changed) {\n const badge = STATUS_BADGE[c.status];\n const delta = fmtDelta(c.complianceDelta);\n const dims = fmtDimensions(c.currentDimensions ?? c.baselineDimensions);\n lines.push(`| \\`${c.name}\\` | ${badge} | ${delta} | ${dims} |`);\n }\n lines.push(\"\");\n }\n\n // ── Unchanged (collapsed) ─────────────────────────────────────────────────\n if (unchanged.length > 0) {\n lines.push(\n `<details><summary>${unchanged.length} unchanged component${unchanged.length === 1 ? \"\" : \"s\"}</summary>`,\n );\n lines.push(\"\");\n lines.push(\"| Component | Compliance |\");\n lines.push(\"|---|---|\");\n for (const c of unchanged) {\n lines.push(\n `| \\`${c.name}\\` | ${c.currentCompliance !== null ? fmt(c.currentCompliance) : \"—\"} |`,\n );\n }\n lines.push(\"\");\n lines.push(\"</details>\");\n lines.push(\"\");\n }\n\n // ── Footer ────────────────────────────────────────────────────────────────\n lines.push(\n `> Generated by [Scope](https://github.com/FlatFilers/Scope) · diffed at ${diff.diffedAt}`,\n );\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// Command registration\n// ---------------------------------------------------------------------------\n\nexport interface PrCommentOptions {\n /** Path to the DiffResult JSON file produced by `scope report diff --json` */\n input: string;\n /** Optional path to write the comment to instead of stdout */\n output?: string;\n}\n\n/**\n * Loads and validates a DiffResult from a JSON file.\n * Throws a descriptive Error if the file is missing or malformed.\n */\nexport function loadDiffResult(filePath: string): DiffResult {\n const abs = resolve(filePath);\n if (!existsSync(abs)) {\n throw new Error(`DiffResult file not found: ${abs}`);\n }\n let raw: string;\n try {\n raw = readFileSync(abs, \"utf-8\");\n } catch (err) {\n throw new Error(\n `Failed to read DiffResult file: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`DiffResult file is not valid JSON: ${abs}`);\n }\n // Minimal structural validation\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n !(\"diffedAt\" in parsed) ||\n !(\"components\" in parsed) ||\n !(\"summary\" in parsed)\n ) {\n throw new Error(\n `DiffResult file does not match expected shape (missing diffedAt/components/summary): ${abs}`,\n );\n }\n return parsed as DiffResult;\n}\n\n/**\n * Registers `scope report pr-comment` as a sub-command on the existing\n * `report` command.\n */\nexport function registerPrCommentSubCommand(reportCmd: Command): void {\n reportCmd\n .command(\"pr-comment\")\n .description(\n \"Format a DiffResult JSON file as a GitHub PR comment (Markdown, written to stdout)\",\n )\n .requiredOption(\"-i, --input <path>\", \"Path to DiffResult JSON (from scope report diff --json)\")\n .option(\"-o, --output <path>\", \"Write comment to file instead of stdout\")\n .action(async (opts: PrCommentOptions) => {\n try {\n const diff = loadDiffResult(opts.input);\n const comment = formatPrComment(diff);\n\n if (opts.output !== undefined) {\n writeFileSync(resolve(opts.output), comment, \"utf-8\");\n process.stderr.write(`PR comment written to ${opts.output}\\n`);\n } else {\n process.stdout.write(`${comment}\\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-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 — site sub-commands\n *\n * Registers the `scope site` command group with two sub-commands:\n * - `scope site build`\n * - `scope site serve`\n */\n\nimport {\n createReadStream,\n existsSync,\n watch as fsWatch,\n readFileSync,\n statSync,\n writeFileSync,\n} from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { createServer, type ServerResponse } from \"node:http\";\nimport { extname, join, resolve } from \"node:path\";\nimport { type CollectionConfig, generateManifest, type Manifest } from \"@agent-scope/manifest\";\nimport { safeRender } from \"@agent-scope/render\";\nimport { buildSite } from \"@agent-scope/site\";\nimport { Command } from \"commander\";\nimport { formatScopeDiagnostic } from \"./diagnostics.js\";\nimport { buildPlaygroundHarness } from \"./playground-bundler.js\";\nimport { buildRenderer, isIconComponent, shutdownPool } from \"./render-commands.js\";\nimport { formatRenderJson } from \"./render-formatter.js\";\nimport { type RunSummaryFailure, writeRunSummary } from \"./run-summary.js\";\nimport { buildWrapperScript, loadScopeFileForComponent } from \"./scope-file.js\";\nimport { loadGlobalCss } from \"./tailwind-css.js\";\n\n// ---------------------------------------------------------------------------\n// Content-type map for static file serving\n// ---------------------------------------------------------------------------\n\nconst MIME_TYPES: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".js\": \"application/javascript; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n};\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction slugify(name: string): string {\n return name\n .replace(/([A-Z])/g, (m) => `-${m.toLowerCase()}`)\n .replace(/^-/, \"\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\ninterface SiteRenderConfig {\n components?: {\n wrappers?: {\n globalCSS?: string[];\n };\n };\n icons?: {\n patterns?: string[];\n };\n}\n\nfunction loadGlobalCssFilesFromConfig(cwd: string): string[] {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) return [];\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as SiteRenderConfig;\n return cfg.components?.wrappers?.globalCSS ?? [];\n } catch {\n return [];\n }\n}\n\nfunction loadIconPatternsFromConfig(cwd: string): string[] {\n const configPath = resolve(cwd, \"reactscope.config.json\");\n if (!existsSync(configPath)) return [];\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as SiteRenderConfig;\n return cfg.icons?.patterns ?? [];\n } catch {\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Livereload\n// ---------------------------------------------------------------------------\n\nconst LIVERELOAD_SCRIPT = `<script>(function(){var s=new EventSource(\"/__livereload\");s.onmessage=function(e){if(e.data===\"reload\")location.reload()};s.onerror=function(){setTimeout(function(){location.reload()},2000)}})()</script>`;\n\nfunction injectLiveReloadScript(html: string): string {\n const idx = html.lastIndexOf(\"</body>\");\n if (idx >= 0) return html.slice(0, idx) + LIVERELOAD_SCRIPT + html.slice(idx);\n return html + LIVERELOAD_SCRIPT;\n}\n\n// ---------------------------------------------------------------------------\n// Watch: config & glob helpers\n// ---------------------------------------------------------------------------\n\ninterface WatchConfig {\n include?: string[];\n exclude?: string[];\n internalPatterns?: string[];\n collections?: CollectionConfig[];\n iconPatterns?: string[];\n}\n\nfunction loadWatchConfig(rootDir: string): WatchConfig | null {\n const configPath = resolve(rootDir, \"reactscope.config.json\");\n if (!existsSync(configPath)) return null;\n try {\n const raw = readFileSync(configPath, \"utf-8\");\n const cfg = JSON.parse(raw) as Record<string, unknown>;\n const result: WatchConfig = {};\n const components = cfg.components as Record<string, unknown> | undefined;\n if (components && typeof components === \"object\") {\n if (Array.isArray(components.include)) result.include = components.include as string[];\n if (Array.isArray(components.exclude)) result.exclude = components.exclude as string[];\n }\n if (Array.isArray(cfg.internalPatterns))\n result.internalPatterns = cfg.internalPatterns as string[];\n if (Array.isArray(cfg.collections)) result.collections = cfg.collections as CollectionConfig[];\n const icons = cfg.icons as Record<string, unknown> | undefined;\n if (icons && typeof icons === \"object\" && Array.isArray(icons.patterns)) {\n result.iconPatterns = icons.patterns as string[];\n }\n return result;\n } catch {\n return null;\n }\n}\n\nfunction watchGlob(pattern: string, filePath: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"\\u00a7GLOBSTAR\\u00a7\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\u00a7GLOBSTAR\\u00a7/g, \".*\");\n return new RegExp(`^${regexStr}$`, \"i\").test(filePath);\n}\n\nfunction matchesWatchPatterns(filePath: string, include: string[], exclude: string[]): boolean {\n for (const pattern of exclude) {\n if (watchGlob(pattern, filePath)) return false;\n }\n for (const pattern of include) {\n if (watchGlob(pattern, filePath)) return true;\n }\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Watch pipeline: manifest → render → compliance → site rebuild\n// ---------------------------------------------------------------------------\n\nfunction findAffectedComponents(\n manifest: Manifest,\n changedFiles: string[],\n previousManifest: Manifest | null,\n): string[] {\n const affected = new Set<string>();\n const normalised = changedFiles.map((f) => f.replace(/\\\\/g, \"/\"));\n\n for (const [name, descriptor] of Object.entries(manifest.components)) {\n const componentFile = descriptor.filePath.replace(/\\\\/g, \"/\");\n for (const changed of normalised) {\n if (componentFile === changed) {\n affected.add(name);\n break;\n }\n // Handle scope file changes (e.g. Button.scope.ts → re-render Button)\n const scopeBase = changed.replace(/\\.scope\\.(ts|tsx|js|jsx)$/, \"\");\n const compBase = componentFile.replace(/\\.(tsx|ts|jsx|js)$/, \"\");\n if (scopeBase !== changed && compBase === scopeBase) {\n affected.add(name);\n break;\n }\n }\n }\n\n if (previousManifest) {\n const oldNames = new Set(Object.keys(previousManifest.components));\n for (const name of Object.keys(manifest.components)) {\n if (!oldNames.has(name)) affected.add(name);\n }\n }\n\n return [...affected];\n}\n\nasync function renderComponentsForWatch(\n manifest: Manifest,\n componentNames: string[],\n rootDir: string,\n inputDir: string,\n): Promise<void> {\n if (componentNames.length === 0) return;\n\n const rendersDir = join(inputDir, \"renders\");\n await mkdir(rendersDir, { recursive: true });\n\n const cssFiles = loadGlobalCssFilesFromConfig(rootDir);\n const iconPatterns = loadIconPatternsFromConfig(rootDir);\n\n const complianceStylesPath = join(inputDir, \"compliance-styles.json\");\n let complianceStyles: Record<string, unknown> = {};\n if (existsSync(complianceStylesPath)) {\n try {\n complianceStyles = JSON.parse(readFileSync(complianceStylesPath, \"utf-8\")) as Record<\n string,\n unknown\n >;\n } catch {\n /* ignore */\n }\n }\n\n for (const name of componentNames) {\n const descriptor = manifest.components[name];\n if (!descriptor) continue;\n\n const filePath = resolve(rootDir, descriptor.filePath);\n const isIcon = isIconComponent(descriptor.filePath, name, iconPatterns);\n\n let scopeData: Awaited<ReturnType<typeof loadScopeFileForComponent>> = null;\n try {\n scopeData = await loadScopeFileForComponent(filePath);\n } catch {\n /* ignore */\n }\n\n const scenarioEntries = scopeData ? Object.entries(scopeData.scenarios) : [];\n const defaultEntry = scenarioEntries.find(([k]) => k === \"default\") ?? scenarioEntries[0];\n const renderProps = defaultEntry?.[1] ?? {};\n\n let wrapperScript: string | undefined;\n try {\n wrapperScript = scopeData?.hasWrapper\n ? await buildWrapperScript(scopeData.filePath)\n : undefined;\n } catch {\n /* ignore */\n }\n\n const renderer = buildRenderer(\n filePath,\n name,\n 375,\n 812,\n cssFiles,\n rootDir,\n wrapperScript,\n isIcon,\n );\n\n const outcome = await safeRender(\n () => renderer.renderCell(renderProps, descriptor.complexityClass),\n {\n props: renderProps,\n sourceLocation: { file: descriptor.filePath, line: descriptor.loc.start, column: 0 },\n },\n );\n\n if (outcome.crashed) {\n process.stderr.write(` \\u2717 ${name}: ${outcome.error.message}\\n`);\n continue;\n }\n\n const result = outcome.result;\n\n if (!isIcon) {\n writeFileSync(join(rendersDir, `${name}.png`), result.screenshot);\n }\n\n const renderJson = formatRenderJson(name, renderProps, result) as unknown as Record<\n string,\n unknown\n >;\n const extResult = result as typeof result & { svgContent?: string };\n if (isIcon && extResult.svgContent) {\n renderJson.svgContent = extResult.svgContent;\n delete renderJson.screenshot;\n }\n writeFileSync(join(rendersDir, `${name}.json`), JSON.stringify(renderJson, null, 2));\n\n // Extract compliance styles\n const rawStyles = result.computedStyles[\"[data-reactscope-root] > *\"] ?? {};\n const compStyles = {\n colors: {} as Record<string, string>,\n spacing: {} as Record<string, string>,\n typography: {} as Record<string, string>,\n borders: {} as Record<string, string>,\n shadows: {} as Record<string, string>,\n };\n for (const [prop, val] of Object.entries(rawStyles)) {\n if (!val || val === \"none\" || val === \"\") continue;\n const lower = prop.toLowerCase();\n if (lower.includes(\"color\") || lower.includes(\"background\")) {\n compStyles.colors[prop] = val;\n } else if (\n lower.includes(\"padding\") ||\n lower.includes(\"margin\") ||\n lower.includes(\"gap\") ||\n lower.includes(\"width\") ||\n lower.includes(\"height\")\n ) {\n compStyles.spacing[prop] = val;\n } else if (\n lower.includes(\"font\") ||\n lower.includes(\"lineheight\") ||\n lower.includes(\"letterspacing\") ||\n lower.includes(\"texttransform\")\n ) {\n compStyles.typography[prop] = val;\n } else if (\n lower.includes(\"border\") ||\n lower.includes(\"radius\") ||\n lower.includes(\"outline\")\n ) {\n compStyles.borders[prop] = val;\n } else if (lower.includes(\"shadow\")) {\n compStyles.shadows[prop] = val;\n }\n }\n complianceStyles[name] = compStyles;\n\n process.stderr.write(` \\u2713 ${name} (${result.renderTimeMs.toFixed(0)}ms)\\n`);\n }\n\n await shutdownPool();\n writeFileSync(complianceStylesPath, JSON.stringify(complianceStyles, null, 2), \"utf-8\");\n}\n\nasync function watchRebuildSite(\n inputDir: string,\n outputDir: string,\n title: string,\n basePath: string,\n): Promise<void> {\n const rootDir = process.cwd();\n await generatePlaygrounds(inputDir, outputDir);\n\n const iconPatterns = loadIconPatternsFromConfig(rootDir);\n\n let tokenFilePath: string | undefined;\n const autoPath = resolve(rootDir, \"reactscope.tokens.json\");\n if (existsSync(autoPath)) tokenFilePath = autoPath;\n\n let compliancePath: string | undefined;\n const crPath = join(inputDir, \"compliance-report.json\");\n if (existsSync(crPath)) compliancePath = crPath;\n\n await buildSite({\n inputDir,\n outputDir,\n basePath,\n ...(compliancePath && { compliancePath }),\n ...(tokenFilePath && { tokenFilePath }),\n title,\n iconPatterns,\n });\n}\n\n/**\n * Determine which components need rendering by comparing the new manifest\n * against the previous one and checking for existing render outputs.\n * A component needs rendering when:\n * - it has no render JSON on disk\n * - it is new (not in the previous manifest)\n * - its descriptor changed (filePath, props, hooks, etc.)\n */\nfunction findStaleComponents(\n manifest: Manifest,\n previousManifest: Manifest | null,\n rendersDir: string,\n): string[] {\n const stale: string[] = [];\n\n for (const [name, descriptor] of Object.entries(manifest.components)) {\n const jsonPath = join(rendersDir, `${name}.json`);\n if (!existsSync(jsonPath)) {\n stale.push(name);\n continue;\n }\n\n if (!previousManifest) continue;\n\n const prev = previousManifest.components[name];\n if (!prev) {\n stale.push(name);\n continue;\n }\n\n if (JSON.stringify(prev) !== JSON.stringify(descriptor)) {\n stale.push(name);\n }\n }\n\n return stale;\n}\n\nasync function runFullBuild(\n rootDir: string,\n inputDir: string,\n outputDir: string,\n title: string,\n basePath: string,\n): Promise<Manifest> {\n process.stderr.write(\"[watch] Starting\\u2026\\n\");\n\n const config = loadWatchConfig(rootDir);\n\n // Load previous manifest if it exists (to diff against)\n const manifestPath = join(inputDir, \"manifest.json\");\n let previousManifest: Manifest | null = null;\n if (existsSync(manifestPath)) {\n try {\n previousManifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as Manifest;\n } catch {\n /* ignore corrupt manifest */\n }\n }\n\n process.stderr.write(\"[watch] Generating manifest\\u2026\\n\");\n const manifest = await generateManifest({\n rootDir,\n ...(config?.include && { include: config.include }),\n ...(config?.exclude && { exclude: config.exclude }),\n ...(config?.internalPatterns && { internalPatterns: config.internalPatterns }),\n ...(config?.collections && { collections: config.collections }),\n ...(config?.iconPatterns && { iconPatterns: config.iconPatterns }),\n });\n\n await mkdir(inputDir, { recursive: true });\n writeFileSync(join(inputDir, \"manifest.json\"), JSON.stringify(manifest, null, 2), \"utf-8\");\n const count = Object.keys(manifest.components).length;\n process.stderr.write(`[watch] Found ${count} components\\n`);\n\n const rendersDir = join(inputDir, \"renders\");\n const stale = findStaleComponents(manifest, previousManifest, rendersDir);\n\n if (stale.length > 0) {\n process.stderr.write(\n `[watch] Rendering ${stale.length} component(s) (${count - stale.length} already up-to-date)\\n`,\n );\n await renderComponentsForWatch(manifest, stale, rootDir, inputDir);\n } else {\n process.stderr.write(\"[watch] All renders up-to-date, skipping render step\\n\");\n }\n\n process.stderr.write(\"[watch] Building site\\u2026\\n\");\n await watchRebuildSite(inputDir, outputDir, title, basePath);\n\n process.stderr.write(\"[watch] Ready\\n\");\n return manifest;\n}\n\nfunction startFileWatcher(opts: {\n rootDir: string;\n inputDir: string;\n outputDir: string;\n title: string;\n basePath: string;\n previousManifest: Manifest;\n notifyReload: () => void;\n}): void {\n const { rootDir, inputDir, outputDir, title, basePath, notifyReload } = opts;\n let previousManifest = opts.previousManifest;\n\n const config = loadWatchConfig(rootDir);\n const includePatterns = config?.include ?? [\"src/**/*.tsx\", \"src/**/*.ts\"];\n const excludePatterns = config?.exclude ?? [\n \"**/node_modules/**\",\n \"**/*.test.*\",\n \"**/*.spec.*\",\n \"**/dist/**\",\n \"**/*.d.ts\",\n ];\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n const pendingFiles = new Set<string>();\n let isRunning = false;\n\n const IGNORE_PREFIXES = [\"node_modules/\", \".reactscope/\", \"dist/\", \".git/\", \".next/\", \".turbo/\"];\n\n const handleChange = async (): Promise<void> => {\n if (isRunning) return;\n isRunning = true;\n const changedFiles = [...pendingFiles];\n pendingFiles.clear();\n\n try {\n process.stderr.write(`\\n[watch] ${changedFiles.length} file(s) changed\\n`);\n\n process.stderr.write(\"[watch] Regenerating manifest\\u2026\\n\");\n const newManifest = await generateManifest({\n rootDir,\n ...(config?.include && { include: config.include }),\n ...(config?.exclude && { exclude: config.exclude }),\n ...(config?.internalPatterns && { internalPatterns: config.internalPatterns }),\n ...(config?.collections && { collections: config.collections }),\n ...(config?.iconPatterns && { iconPatterns: config.iconPatterns }),\n });\n writeFileSync(join(inputDir, \"manifest.json\"), JSON.stringify(newManifest, null, 2), \"utf-8\");\n\n const affected = findAffectedComponents(newManifest, changedFiles, previousManifest);\n\n if (affected.length > 0) {\n process.stderr.write(`[watch] Re-rendering: ${affected.join(\", \")}\\n`);\n await renderComponentsForWatch(newManifest, affected, rootDir, inputDir);\n } else {\n process.stderr.write(\"[watch] No components directly affected\\n\");\n }\n\n process.stderr.write(\"[watch] Rebuilding site\\u2026\\n\");\n await watchRebuildSite(inputDir, outputDir, title, basePath);\n\n previousManifest = newManifest;\n process.stderr.write(\"[watch] Done\\n\");\n notifyReload();\n } catch (err) {\n process.stderr.write(`[watch] Error: ${err instanceof Error ? err.message : String(err)}\\n`);\n } finally {\n isRunning = false;\n if (pendingFiles.size > 0) {\n handleChange();\n }\n }\n };\n\n const onFileChange = (_eventType: string, filename: string | null): void => {\n if (!filename) return;\n const normalised = filename.replace(/\\\\/g, \"/\");\n for (const prefix of IGNORE_PREFIXES) {\n if (normalised.startsWith(prefix)) return;\n }\n if (!matchesWatchPatterns(normalised, includePatterns, excludePatterns)) return;\n\n pendingFiles.add(normalised);\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n handleChange();\n }, 500);\n };\n\n try {\n fsWatch(rootDir, { recursive: true }, onFileChange);\n process.stderr.write(`[watch] Watching for changes (${includePatterns.join(\", \")})\\n`);\n } catch (err) {\n process.stderr.write(\n `[watch] Warning: Could not start watcher: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n }\n}\n\nasync function generatePlaygrounds(\n inputDir: string,\n outputDir: string,\n): Promise<RunSummaryFailure[]> {\n const manifestPath = join(inputDir, \"manifest.json\");\n const raw = readFileSync(manifestPath, \"utf-8\");\n const manifest = JSON.parse(raw) as Manifest;\n\n const rootDir = process.cwd();\n const componentNames = Object.keys(manifest.components);\n if (componentNames.length === 0) return [];\n\n const playgroundDir = join(outputDir, \"playground\");\n await mkdir(playgroundDir, { recursive: true });\n\n const cssFiles = loadGlobalCssFilesFromConfig(rootDir);\n const projectCss = (await loadGlobalCss(cssFiles, rootDir)) ?? undefined;\n\n let succeeded = 0;\n const failures: RunSummaryFailure[] = [];\n const allDefaults: Record<string, Record<string, unknown>> = {};\n\n for (const name of componentNames) {\n const descriptor = manifest.components[name];\n if (!descriptor) continue;\n\n const filePath = resolve(rootDir, descriptor.filePath);\n const slug = slugify(name);\n\n // Load default props from .scope.ts file\n try {\n const scopeData = await loadScopeFileForComponent(filePath);\n if (scopeData) {\n const defaultScenario =\n scopeData.scenarios.default ?? Object.values(scopeData.scenarios)[0];\n if (defaultScenario) allDefaults[name] = defaultScenario;\n }\n } catch {\n // scope file loading is best-effort\n }\n\n try {\n const html = await buildPlaygroundHarness(filePath, name, projectCss);\n await writeFile(join(playgroundDir, `${slug}.html`), html, \"utf-8\");\n succeeded++;\n } catch (err) {\n process.stderr.write(\n `[scope/site] ⚠ playground skip: ${name} — ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n failures.push({\n component: name,\n stage: \"playground\",\n message: err instanceof Error ? err.message : String(err),\n outputPath: join(playgroundDir, `${slug}.html`),\n });\n }\n }\n\n // Write playground defaults to input dir so the site builder can read them for prop controls\n await writeFile(\n join(inputDir, \"playground-defaults.json\"),\n JSON.stringify(allDefaults, null, 2),\n \"utf-8\",\n );\n\n process.stderr.write(\n `[scope/site] Playgrounds: ${succeeded} built${failures.length > 0 ? `, ${failures.length} failed` : \"\"}\\n`,\n );\n return failures;\n}\n\n// ---------------------------------------------------------------------------\n// site build\n// ---------------------------------------------------------------------------\n\nfunction registerBuild(siteCmd: Command): void {\n siteCmd\n .command(\"build\")\n .description(\n \"Build the static HTML site from manifest + render outputs.\\n\\n\" +\n \"INPUT DIRECTORY (.reactscope/ by default) must contain:\\n\" +\n \" manifest.json component registry\\n\" +\n \" renders/ screenshots and render.json files from `scope render all`\\n\\n\" +\n \"OPTIONAL:\\n\" +\n \" --compliance <path> include token compliance scores on detail pages\\n\" +\n \" --base-path <path> set if deploying to a subdirectory (e.g. /ui-docs)\\n\\n\" +\n \"Examples:\\n\" +\n \" scope site build\\n\" +\n ' scope site build --title \"Design System\" -o .reactscope/site\\n' +\n \" scope site build --compliance .reactscope/compliance-report.json\\n\" +\n \" scope site build --tokens reactscope.tokens.json\\n\" +\n \" scope site build --base-path /ui\",\n )\n .option(\"-i, --input <path>\", \"Path to .reactscope input directory\", \".reactscope\")\n .option(\"-o, --output <path>\", \"Output directory for generated site\", \".reactscope/site\")\n .option(\"--base-path <path>\", \"Base URL path prefix for subdirectory deployment\", \"/\")\n .option(\"--compliance <path>\", \"Path to compliance batch report JSON\")\n .option(\"--tokens <path>\", \"Path to reactscope.tokens.json (enables token browser page)\")\n .option(\"--title <text>\", \"Site title\", \"Scope — Component Gallery\")\n .action(\n async (opts: {\n input: string;\n output: string;\n basePath: string;\n compliance?: string;\n tokens?: string;\n title: string;\n }) => {\n try {\n const inputDir = resolve(process.cwd(), opts.input);\n const outputDir = resolve(process.cwd(), opts.output);\n\n if (!existsSync(inputDir)) {\n throw new Error(\n `Input directory not found: ${inputDir}\\nRun \\`scope manifest generate\\` and \\`scope render\\` first.`,\n );\n }\n\n const manifestPath = join(inputDir, \"manifest.json\");\n if (!existsSync(manifestPath)) {\n throw new Error(\n `Manifest not found at ${manifestPath}\\nRun \\`scope manifest generate\\` first.`,\n );\n }\n\n process.stderr.write(`Building site from ${inputDir}…\\n`);\n\n // Bundle playgrounds first so defaults are available to the site builder\n process.stderr.write(\"Bundling playgrounds…\\n\");\n const failures = await generatePlaygrounds(inputDir, outputDir);\n\n const iconPatterns = loadIconPatternsFromConfig(process.cwd());\n\n // Auto-detect token file if not specified\n let tokenFilePath = opts.tokens ? resolve(process.cwd(), opts.tokens) : undefined;\n if (tokenFilePath === undefined) {\n const autoPath = resolve(process.cwd(), \"reactscope.tokens.json\");\n if (existsSync(autoPath)) {\n tokenFilePath = autoPath;\n }\n }\n\n await buildSite({\n inputDir,\n outputDir,\n basePath: opts.basePath,\n ...(opts.compliance !== undefined && {\n compliancePath: resolve(process.cwd(), opts.compliance),\n }),\n ...(tokenFilePath !== undefined && { tokenFilePath }),\n title: opts.title,\n iconPatterns,\n });\n\n const manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")) as Manifest;\n const componentCount = Object.keys(manifest.components).length;\n const generatedPlaygroundCount =\n componentCount === 0\n ? 0\n : statSync(join(outputDir, \"playground\")).isDirectory()\n ? componentCount - failures.length\n : 0;\n const siteFailures = [...failures];\n if (componentCount === 0) {\n siteFailures.push({\n component: \"*\",\n stage: \"site\",\n message:\n \"Manifest contains zero components; generated site is structurally degraded.\",\n outputPath: manifestPath,\n });\n } else if (generatedPlaygroundCount === 0) {\n siteFailures.push({\n component: \"*\",\n stage: \"site\",\n message:\n \"No playground pages were generated successfully; site build is degraded and should not be treated as green.\",\n outputPath: join(outputDir, \"playground\"),\n });\n }\n\n const summaryPath = writeRunSummary({\n command: \"scope site build\",\n status: siteFailures.length > 0 ? \"failed\" : \"success\",\n outputPaths: [outputDir, join(outputDir, \"index.html\")],\n failures: siteFailures,\n });\n process.stderr.write(`Site written to ${outputDir}\\n`);\n process.stderr.write(`[scope/site] Run summary written to ${summaryPath}\\n`);\n process.stdout.write(`${outputDir}\\n`);\n if (siteFailures.length > 0) process.exit(1);\n } catch (err) {\n process.stderr.write(`${formatScopeDiagnostic(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// site serve\n// ---------------------------------------------------------------------------\n\nfunction registerServe(siteCmd: Command): void {\n siteCmd\n .command(\"serve\")\n .description(\n \"Start a local HTTP server for the built site directory.\\n\\n\" +\n \"Run `scope site build` first, or use --watch to auto-rebuild on changes.\\n\" +\n \"Ctrl+C to stop.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope site serve\\n\" +\n \" scope site serve --port 8080\\n\" +\n \" scope site serve --dir ./my-site-output\\n\" +\n \" scope site serve --watch\",\n )\n .option(\"-p, --port <number>\", \"Port to listen on\", \"3000\")\n .option(\"-d, --dir <path>\", \"Directory to serve\", \".reactscope/site\")\n .option(\"-w, --watch\", \"Watch source files and rebuild on changes\")\n .option(\n \"-i, --input <path>\",\n \"Input directory for .reactscope data (watch mode)\",\n \".reactscope\",\n )\n .option(\"--title <text>\", \"Site title (watch mode)\", \"Scope \\u2014 Component Gallery\")\n .option(\"--base-path <path>\", \"Base URL path prefix (watch mode)\", \"/\")\n .action(\n async (opts: {\n port: string;\n dir: string;\n watch?: boolean;\n input: string;\n title: string;\n basePath: string;\n }) => {\n try {\n const port = Number.parseInt(opts.port, 10);\n if (Number.isNaN(port) || port < 1 || port > 65535) {\n throw new Error(`Invalid port: ${opts.port}`);\n }\n\n const serveDir = resolve(process.cwd(), opts.dir);\n const watchMode = opts.watch === true;\n\n const sseClients = new Set<ServerResponse>();\n function notifyReload(): void {\n for (const client of sseClients) {\n client.write(\"data: reload\\n\\n\");\n }\n }\n\n if (watchMode) {\n await mkdir(serveDir, { recursive: true });\n }\n\n if (!watchMode && !existsSync(serveDir)) {\n throw new Error(\n `Serve directory not found: ${serveDir}\\nRun \\`scope site build\\` first.`,\n );\n }\n\n const server = createServer((req, res) => {\n const rawUrl = req.url ?? \"/\";\n const urlPath = decodeURIComponent(rawUrl.split(\"?\")[0] ?? \"/\");\n\n // SSE livereload endpoint\n if (watchMode && urlPath === \"/__livereload\") {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n \"Access-Control-Allow-Origin\": \"*\",\n });\n res.write(\"data: connected\\n\\n\");\n sseClients.add(res);\n req.on(\"close\", () => sseClients.delete(res));\n return;\n }\n\n const filePath = join(\n serveDir,\n urlPath.endsWith(\"/\") ? `${urlPath}index.html` : urlPath,\n );\n\n if (!filePath.startsWith(serveDir)) {\n res.writeHead(403, { \"Content-Type\": \"text/plain\" });\n res.end(\"Forbidden\");\n return;\n }\n\n if (existsSync(filePath) && statSync(filePath).isFile()) {\n const ext = extname(filePath).toLowerCase();\n const contentType = MIME_TYPES[ext] ?? \"application/octet-stream\";\n\n if (watchMode && ext === \".html\") {\n const html = injectLiveReloadScript(readFileSync(filePath, \"utf-8\"));\n res.writeHead(200, { \"Content-Type\": contentType });\n res.end(html);\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": contentType });\n createReadStream(filePath).pipe(res);\n return;\n }\n\n const htmlPath = `${filePath}.html`;\n if (existsSync(htmlPath) && statSync(htmlPath).isFile()) {\n if (watchMode) {\n const html = injectLiveReloadScript(readFileSync(htmlPath, \"utf-8\"));\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(html);\n return;\n }\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n createReadStream(htmlPath).pipe(res);\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(`Not found: ${urlPath}`);\n });\n\n server.listen(port, () => {\n process.stderr.write(`Scope site running at http://localhost:${port}\\n`);\n process.stderr.write(`Serving ${serveDir}\\n`);\n if (watchMode) {\n process.stderr.write(\n \"Watch mode enabled \\u2014 source changes trigger rebuild + browser reload\\n\",\n );\n }\n process.stderr.write(\"Press Ctrl+C to stop.\\n\");\n });\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n process.stderr.write(`Error: Port ${port} is already in use.\\n`);\n } else {\n process.stderr.write(`Server error: ${err.message}\\n`);\n }\n process.exit(1);\n });\n\n if (watchMode) {\n const rootDir = process.cwd();\n const inputDir = resolve(rootDir, opts.input);\n\n const initialManifest = await runFullBuild(\n rootDir,\n inputDir,\n serveDir,\n opts.title,\n opts.basePath,\n );\n\n notifyReload();\n\n startFileWatcher({\n rootDir,\n inputDir,\n outputDir: serveDir,\n title: opts.title,\n basePath: opts.basePath,\n previousManifest: initialManifest,\n notifyReload,\n });\n }\n } catch (err) {\n process.stderr.write(`${formatScopeDiagnostic(err)}\\n`);\n process.exit(1);\n }\n },\n );\n}\n\n// ---------------------------------------------------------------------------\n// Public factory\n// ---------------------------------------------------------------------------\n\n/**\n * Create and return the `site` command group (does not attach to any\n * parent — caller is responsible for mounting it).\n */\nexport function createSiteCommand(): Command {\n const siteCmd = new Command(\"site\").description(\n \"Build and serve the static HTML component gallery site.\\n\\n\" +\n \"PREREQUISITES:\\n\" +\n \" scope manifest generate (manifest.json)\\n\" +\n \" scope render all (renders/ + compliance-styles.json)\\n\\n\" +\n \"SITE CONTENTS:\\n\" +\n \" /index.html component gallery with screenshots + metadata\\n\" +\n \" /<component>/index.html detail page: props, renders, matrix, X-Ray, compliance\\n\\n\" +\n \"Examples:\\n\" +\n \" scope site build && scope site serve\\n\" +\n ' scope site build --title \"Acme UI\" --compliance .reactscope/compliance-report.json\\n' +\n \" scope site serve --port 8080\",\n );\n\n registerBuild(siteCmd);\n registerServe(siteCmd);\n\n return siteCmd;\n}\n","/**\n * playground-bundler.ts\n *\n * Bundles a React component into a self-contained HTML playground page.\n * Unlike component-bundler.ts (which hardcodes props for Playwright screenshots),\n * the playground harness accepts props dynamically via postMessage and reports\n * its content height back to the parent frame via ResizeObserver.\n *\n * Communication protocol (parent ↔ iframe):\n * Parent → Iframe: { type: \"scope-playground-props\", props: Record<string, unknown> }\n * Iframe → Parent: { type: \"scope-playground-height\", height: number }\n */\n\nimport { dirname } from \"node:path\";\nimport * as esbuild from \"esbuild\";\n\n/**\n * Bundle a component into a standalone playground HTML page.\n *\n * @param filePath Absolute path to the component source file\n * @param componentName Export name to try first (falls back to default / PascalCase)\n * @param projectCss Optional compiled CSS string (e.g. Tailwind) to inject\n * @param wrapperScript Optional pre-built wrapper IIFE from a .scope.ts(x) file\n */\nexport async function buildPlaygroundHarness(\n filePath: string,\n componentName: string,\n projectCss?: string,\n wrapperScript?: string,\n): Promise<string> {\n const bundledScript = await bundlePlaygroundIIFE(filePath, componentName);\n return wrapPlaygroundHtml(bundledScript, projectCss, wrapperScript);\n}\n\n// ---------------------------------------------------------------------------\n// esbuild bundling\n// ---------------------------------------------------------------------------\n\nasync function bundlePlaygroundIIFE(filePath: string, componentName: string): Promise<string> {\n const wrapperCode = /* ts */ `\nimport * as __scopeMod from ${JSON.stringify(filePath)};\nimport { createRoot } from \"react-dom/client\";\nimport { createElement, Component as ReactComponent } from \"react\";\n\n(function scopePlaygroundHarness() {\n var Target =\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 (!Target) {\n document.getElementById(\"scope-root\").innerHTML =\n '<p style=\"color:#dc2626;font-family:system-ui;font-size:13px\">No renderable component found.</p>';\n return;\n }\n\n // Error boundary to catch async render errors (React unmounts the whole\n // root when an error is uncaught — this keeps the error visible instead).\n var errorStyle = \"color:#dc2626;font-family:system-ui;font-size:13px;padding:12px\";\n class ScopeBoundary extends ReactComponent {\n constructor(p) { super(p); this.state = { error: null }; }\n static getDerivedStateFromError(err) { return { error: err }; }\n render() {\n if (this.state.error) {\n return createElement(\"pre\", { style: errorStyle },\n \"Render error: \" + (this.state.error.message || String(this.state.error)));\n }\n return this.props.children;\n }\n }\n\n var rootEl = document.getElementById(\"scope-root\");\n var root = createRoot(rootEl);\n var Wrapper = window.__SCOPE_WRAPPER__;\n\n function render(props) {\n var inner = createElement(Target, props);\n if (Wrapper) inner = createElement(Wrapper, null, inner);\n root.render(createElement(ScopeBoundary, null, inner));\n }\n\n // Render immediately with empty props\n render({});\n\n // Listen for messages from the parent frame\n window.addEventListener(\"message\", function(e) {\n if (!e.data) return;\n if (e.data.type === \"scope-playground-props\") {\n render(e.data.props || {});\n } else if (e.data.type === \"scope-playground-theme\") {\n document.documentElement.classList.toggle(\"dark\", e.data.theme === \"dark\");\n }\n });\n\n // Report content height changes to the parent frame\n var ro = new ResizeObserver(function() {\n var h = rootEl.scrollHeight;\n if (parent !== window) {\n parent.postMessage({ type: \"scope-playground-height\", height: h }, \"*\");\n }\n });\n ro.observe(rootEl);\n})();\n`;\n\n const result = await esbuild.build({\n stdin: {\n contents: wrapperCode,\n resolveDir: dirname(filePath),\n loader: \"tsx\",\n sourcefile: \"__scope_playground__.tsx\",\n },\n bundle: true,\n format: \"iife\",\n write: false,\n platform: \"browser\",\n jsx: \"automatic\",\n jsxImportSource: \"react\",\n target: \"es2020\",\n external: [],\n define: {\n \"process.env.NODE_ENV\": '\"production\"',\n global: \"globalThis\",\n },\n logLevel: \"silent\",\n banner: {\n js: \"/* @agent-scope/cli playground harness */\",\n },\n loader: {\n \".css\": \"empty\",\n \".svg\": \"dataurl\",\n \".png\": \"dataurl\",\n \".jpg\": \"dataurl\",\n \".jpeg\": \"dataurl\",\n \".gif\": \"dataurl\",\n \".webp\": \"dataurl\",\n \".ttf\": \"dataurl\",\n \".woff\": \"dataurl\",\n \".woff2\": \"dataurl\",\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 playground 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 playground output\");\n }\n\n return outputFile.text;\n}\n\n// ---------------------------------------------------------------------------\n// HTML template\n// ---------------------------------------------------------------------------\n\nfunction wrapPlaygroundHtml(\n bundledScript: string,\n projectCss?: string,\n wrapperScript?: string,\n): 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 const wrapperScriptBlock =\n wrapperScript != null && wrapperScript.length > 0\n ? `<script id=\"scope-wrapper-script\">${wrapperScript}</script>`\n : \"\";\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 <script>\n window.__SCOPE_WRAPPER__ = null;\n // Prevent React DevTools from interfering with the embedded playground.\n // The hook causes render instability in same-origin iframes.\n delete window.__REACT_DEVTOOLS_GLOBAL_HOOK__;\n </script>\n <style>\n *, *::before, *::after { box-sizing: border-box; }\n html, body { margin: 0; padding: 0; font-family: system-ui, sans-serif; }\n #scope-root { padding: 16px; min-width: 1px; min-height: 1px; }\n </style>\n ${projectStyleBlock}\n <style>html, body { background: transparent !important; }</style>\n</head>\n<body>\n <div id=\"scope-root\" data-reactscope-root></div>\n ${wrapperScriptBlock}\n <script>${bundledScript}</script>\n</body>\n</html>`;\n}\n","/**\n * @agent-scope/cli — tokens sub-commands\n *\n * Registers the `scope tokens` command group with sub-commands:\n * - `scope tokens init` — detect sources & generate token file\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 { registerCompliance } from \"./compliance.js\";\nimport { createTokensExportCommand } from \"./export.js\";\nimport { registerImpact } from \"./impact.js\";\nimport { registerTokensInit } from \"./init.js\";\nimport { registerPreview } from \"./preview.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(\n \"Resolve a token path and print its final computed value.\\n\" +\n \"Follows all {ref} chains to the raw value.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens get color.primary.500\\n\" +\n \" scope tokens get spacing.4 --format json\\n\" +\n \" scope tokens get font.size.base --file ./tokens/brand.json\",\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((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(\n \"List all tokens, optionally filtered by category prefix or type.\\n\\n\" +\n 'CATEGORY: top-level token namespace (e.g. \"color\", \"spacing\", \"typography\")\\n' +\n \"TYPE: token value type — color | spacing | typography | shadow | radius | opacity\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens list\\n\" +\n \" scope tokens list color\\n\" +\n \" scope tokens list --type spacing\\n\" +\n \" scope tokens list color --format json | jq '.[].path'\",\n )\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(\n \"Find the token(s) whose computed value matches the given raw value.\\n\" +\n \"Supports fuzzy color matching (hex ↔ rgb ↔ hsl equivalence).\\n\\n\" +\n \"Examples:\\n\" +\n ' scope tokens search \"#3b82f6\"\\n' +\n ' scope tokens search \"16px\"\\n' +\n ' scope tokens search \"rgb(59, 130, 246)\" # fuzzy-matches #3b82f6',\n )\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(\n \"Print the full reference chain from a token path down to its raw value.\\n\" +\n \"Useful for debugging circular references or understanding token inheritance.\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens resolve color.primary.500\\n\" +\n \" scope tokens resolve button.background --format json\",\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((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 and report errors.\\n\\n\" +\n \"CHECKS:\\n\" +\n \" - Circular reference chains (A → B → A)\\n\" +\n \" - Broken references ({path.that.does.not.exist})\\n\" +\n ' - Type mismatches (token declared as \"color\" but value is a number)\\n' +\n \" - Duplicate paths\\n\\n\" +\n \"Exits 1 if any errors are found (suitable for CI).\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens validate\\n\" +\n \" scope tokens validate --format json | jq '.errors'\",\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, validate, and export design tokens from reactscope.tokens.json.\\n\\n\" +\n \"TOKEN FILE RESOLUTION (in priority order):\\n\" +\n \" 1. --file <path> explicit override\\n\" +\n \" 2. tokens.file in reactscope.config.json\\n\" +\n \" 3. reactscope.tokens.json default (project root)\\n\\n\" +\n \"TOKEN FILE FORMAT (reactscope.tokens.json):\\n\" +\n \" Nested JSON. Each leaf is a token with { value, type } or just a raw value.\\n\" +\n \" Paths use dot notation: color.primary.500, spacing.4, font.size.base\\n\" +\n \" References use {path.to.other.token} syntax.\\n\" +\n ' Themes: top-level \"themes\" key with named override maps.\\n\\n' +\n \"TOKEN TYPES: color | spacing | typography | shadow | radius | opacity | other\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens validate\\n\" +\n \" scope tokens list color\\n\" +\n \" scope tokens get color.primary.500\\n\" +\n \" scope tokens compliance\\n\" +\n \" scope tokens export --format css --out tokens.css\",\n );\n\n registerTokensInit(tokensCmd);\n registerGet(tokensCmd);\n registerList(tokensCmd);\n registerSearch(tokensCmd);\n registerResolve(tokensCmd);\n registerValidate(tokensCmd);\n tokensCmd.addCommand(createTokensExportCommand());\n\n // Phase 11: compliance, impact, preview\n registerCompliance(tokensCmd);\n registerImpact(tokensCmd);\n registerPreview(tokensCmd);\n\n return tokensCmd;\n}\n","/**\n * @agent-scope/cli — tokens compliance sub-command\n *\n * Implements `scope tokens compliance`.\n *\n * Reads per-component computed styles from a styles file (default:\n * `.reactscope/compliance-styles.json`), runs the ComplianceEngine over every\n * component in batch, and renders an aggregate compliance report matching the\n * Token Spec §3.3 format:\n *\n * Overall compliance score: 87%\n * By category:\n * color: 92% (3 off-system values)\n * spacing: 88% (5 off-system values)\n * shadow: 71% (9 off-system values)\n *\n * Top off-system offenders (sorted by count):\n * Button box-shadow: 0 2px 4px rgba(0,0,0,0.1) → nearest: shadow.sm (0 1px 2px...)\n * Card color: #666666 → nearest: color.neutral.500 (#6B7280)\n *\n * Supports --threshold <0-100>: exits 1 if compliance score is below threshold.\n *\n * Styles file format:\n * {\n * \"ComponentName\": {\n * \"colors\": { \"background\": \"#3B82F6\" },\n * \"spacing\": { \"paddingTop\": \"16px\" },\n * \"typography\": {},\n * \"borders\": {},\n * \"shadows\": {}\n * }\n * }\n *\n * @packageDocumentation\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport {\n type BatchReport,\n ComplianceEngine,\n type ComputedStyles,\n TokenResolver,\n} from \"@agent-scope/tokens\";\nimport type { Command } from \"commander\";\nimport { isTTY } from \"../render-formatter.js\";\nimport { type RunSummaryFailure, writeRunSummary } from \"../run-summary.js\";\nimport { loadTokens, resolveTokenFilePath } from \"./commands.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STYLES_PATH = \".reactscope/compliance-styles.json\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Shape of the compliance styles file — a plain JSON object mapping component\n * names to their ComputedStyles.\n */\ntype StylesFile = Record<string, ComputedStyles>;\n\n/**\n * A single off-system offender entry for the top-offenders list.\n */\ninterface Offender {\n component: string;\n property: string;\n value: string;\n nearestToken: string;\n nearestValue: string;\n offSystemCount: number;\n}\n\n// ---------------------------------------------------------------------------\n// Styles file loader\n// ---------------------------------------------------------------------------\n\n/**\n * Load a compliance styles file (JSON mapping component → ComputedStyles).\n * Throws with a helpful message if the file is missing or malformed.\n */\nexport function loadStylesFile(stylesPath: string): StylesFile {\n const absPath = resolve(process.cwd(), stylesPath);\n if (!existsSync(absPath)) {\n throw new Error(\n `Compliance styles file not found at ${absPath}.\\n` +\n `Run \\`scope render all\\` first to generate component styles, or use --styles to specify a path.\\n` +\n `Expected format: { \"ComponentName\": { colors: {}, spacing: {}, typography: {}, borders: {}, shadows: {} } }`,\n );\n }\n const raw = readFileSync(absPath, \"utf-8\");\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (err) {\n throw new Error(`Failed to parse compliance styles file as JSON: ${String(err)}`);\n }\n if (typeof parsed !== \"object\" || parsed === null || Array.isArray(parsed)) {\n throw new Error(\n `Compliance styles file must be a JSON object mapping component names to ComputedStyles.`,\n );\n }\n return parsed as StylesFile;\n}\n\n// ---------------------------------------------------------------------------\n// Aggregate helpers\n// ---------------------------------------------------------------------------\n\n/**\n * CSS property → category mapping for per-category breakdown.\n * Mirrors the structure in @agent-scope/tokens ComplianceEngine.\n */\nfunction categoryForProperty(\n property: string,\n): \"color\" | \"spacing\" | \"typography\" | \"border\" | \"shadow\" {\n const lower = property.toLowerCase();\n if (lower.includes(\"shadow\")) return \"shadow\";\n if (lower.includes(\"color\") || lower === \"background\" || lower === \"fill\" || lower === \"stroke\")\n return \"color\";\n if (\n lower.includes(\"padding\") ||\n lower.includes(\"margin\") ||\n lower === \"gap\" ||\n lower === \"width\" ||\n lower === \"height\" ||\n lower === \"top\" ||\n lower === \"right\" ||\n lower === \"bottom\" ||\n lower === \"left\"\n )\n return \"spacing\";\n if (lower.includes(\"border\")) return \"border\";\n if (\n lower.includes(\"font\") ||\n lower.includes(\"line\") ||\n lower.includes(\"letter\") ||\n lower === \"texttransform\" ||\n lower === \"textdecoration\"\n )\n return \"typography\";\n return \"spacing\"; // fallback\n}\n\ninterface CategorySummary {\n total: number;\n onSystem: number;\n offSystem: number;\n compliance: number;\n}\n\n/**\n * Builds per-category summary from a batch report.\n */\nfunction buildCategorySummary(\n batch: BatchReport,\n): Record<\"color\" | \"spacing\" | \"typography\" | \"border\" | \"shadow\", CategorySummary> {\n const cats: Record<string, CategorySummary> = {\n color: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n spacing: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n typography: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n border: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n shadow: { total: 0, onSystem: 0, offSystem: 0, compliance: 0 },\n };\n\n for (const report of Object.values(batch.components)) {\n for (const [property, result] of Object.entries(report.properties)) {\n const cat = categoryForProperty(property);\n const summary = cats[cat];\n if (summary === undefined) continue;\n summary.total++;\n if (result.status === \"on_system\") {\n summary.onSystem++;\n } else {\n summary.offSystem++;\n }\n }\n }\n\n // Compute compliance percentages\n for (const summary of Object.values(cats)) {\n summary.compliance = summary.total === 0 ? 0 : summary.onSystem / summary.total;\n }\n\n return cats as Record<\"color\" | \"spacing\" | \"typography\" | \"border\" | \"shadow\", CategorySummary>;\n}\n\n/**\n * Collect top off-system offenders — sorted by per-component off-system count.\n * Returns the top-N component × property pairs.\n */\nfunction collectOffenders(batch: BatchReport, limit = 10): Offender[] {\n const offenders: Offender[] = [];\n\n // Group by component first, sort by off-system count descending\n const componentEntries = Object.entries(batch.components).map(([name, report]) => ({\n name,\n report,\n offSystemCount: report.offSystem,\n }));\n componentEntries.sort((a, b) => b.offSystemCount - a.offSystemCount);\n\n for (const { name, report, offSystemCount } of componentEntries) {\n if (offSystemCount === 0) continue;\n\n for (const [property, result] of Object.entries(report.properties)) {\n if (result.status !== \"OFF_SYSTEM\") continue;\n\n offenders.push({\n component: name,\n property,\n value: result.value,\n nearestToken: result.nearest?.token ?? \"—\",\n nearestValue: result.nearest?.value ?? \"—\",\n offSystemCount,\n });\n\n if (offenders.length >= limit) break;\n }\n\n if (offenders.length >= limit) break;\n }\n\n return offenders;\n}\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\n\nfunction formatPct(n: number): string {\n return `${Math.round(n * 100)}%`;\n}\n\nfunction truncate(s: string, max: number): string {\n return s.length > max ? `${s.slice(0, max - 1)}…` : s;\n}\n\n/**\n * Format the batch report as human-readable TTY output (Token Spec §3.3).\n */\nexport function formatComplianceReport(batch: BatchReport, threshold?: number): string {\n const pct = Math.round(batch.aggregateCompliance * 100);\n const lines: string[] = [];\n\n const thresholdLabel =\n threshold !== undefined\n ? pct >= threshold\n ? \" ✓ (pass)\"\n : ` ✗ (below threshold ${threshold}%)`\n : \"\";\n\n lines.push(`Overall compliance score: ${pct}%${thresholdLabel}`);\n if (batch.totalProperties === 0) {\n lines.push(\n \"No CSS properties were audited; run `scope render all` and inspect .reactscope/compliance-styles.json before treating compliance as green.\",\n );\n }\n lines.push(\"\");\n\n // Category breakdown (only show categories that have at least one audited property)\n const cats = buildCategorySummary(batch);\n const catEntries = Object.entries(cats).filter(([, s]) => s.total > 0);\n\n if (catEntries.length > 0) {\n lines.push(\"By category:\");\n const catWidth = Math.max(...catEntries.map(([k]) => k.length));\n for (const [cat, summary] of catEntries) {\n const label = cat.padEnd(catWidth);\n lines.push(\n ` ${label} ${formatPct(summary.compliance).padStart(4)} (${summary.offSystem} off-system value${summary.offSystem !== 1 ? \"s\" : \"\"})`,\n );\n }\n lines.push(\"\");\n }\n\n // Top off-system offenders\n const offenders = collectOffenders(batch);\n if (offenders.length > 0) {\n lines.push(\"Top off-system offenders (sorted by count):\");\n\n // Compute column widths\n const nameWidth = Math.max(9, ...offenders.map((o) => o.component.length));\n const propWidth = Math.max(8, ...offenders.map((o) => o.property.length));\n const valWidth = Math.max(5, ...offenders.map((o) => truncate(o.value, 40).length));\n\n for (const offender of offenders) {\n const name = offender.component.padEnd(nameWidth);\n const prop = offender.property.padEnd(propWidth);\n const val = truncate(offender.value, 40).padEnd(valWidth);\n const nearest = `${offender.nearestToken} (${truncate(offender.nearestValue, 30)})`;\n lines.push(` ${name} ${prop}: ${val} → nearest: ${nearest}`);\n }\n } else {\n lines.push(\"No off-system values detected. 🎉\");\n }\n\n return lines.join(\"\\n\");\n}\n\n// ---------------------------------------------------------------------------\n// registerCompliance\n// ---------------------------------------------------------------------------\n\n/**\n * Registers `scope tokens compliance` on the given `tokens` Command.\n */\nexport function registerCompliance(tokensCmd: Command): void {\n tokensCmd\n .command(\"compliance\")\n .description(\n \"Compute a token compliance score across all rendered components.\\n\\n\" +\n \"Compares computed CSS values from .reactscope/compliance-styles.json\\n\" +\n \"against the token file — reports what % of style values are on-token.\\n\\n\" +\n \"PREREQUISITES:\\n\" +\n \" scope render all must have run first (produces compliance-styles.json)\\n\\n\" +\n \"SCORING:\\n\" +\n \" compliant value exactly matches a token\\n\" +\n \" near-match value is within tolerance of a token (e.g. close color)\\n\" +\n \" off-token value not found in token file\\n\\n\" +\n \"EXIT CODES:\\n\" +\n \" 0 compliance >= threshold (or no --threshold set)\\n\" +\n \" 1 compliance < threshold\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens compliance\\n\" +\n \" scope tokens compliance --threshold 90\\n\" +\n \" scope tokens compliance --format json | jq '.summary'\\n\" +\n \" scope tokens compliance --out .reactscope/compliance-report.json\\n\" +\n \" scope tokens compliance --styles ./custom/compliance-styles.json\",\n )\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--styles <path>\", `Path to compliance styles JSON (default: ${DEFAULT_STYLES_PATH})`)\n .option(\n \"--out <path>\",\n \"Write JSON report to file (for use with scope site build --compliance)\",\n )\n .option(\"--threshold <n>\", \"Exit code 1 if compliance score is below this percentage (0-100)\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action(\n (opts: {\n file?: string;\n styles?: string;\n out?: string;\n threshold?: string;\n format?: string;\n }) => {\n try {\n const tokenFilePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(tokenFilePath);\n const resolver = new TokenResolver(tokens);\n const engine = new ComplianceEngine(resolver);\n\n const stylesPath = opts.styles ?? DEFAULT_STYLES_PATH;\n const stylesFile = loadStylesFile(stylesPath);\n\n // Build the component map\n const componentMap = new Map<string, ComputedStyles>();\n for (const [name, styles] of Object.entries(stylesFile)) {\n componentMap.set(name, styles);\n }\n\n if (componentMap.size === 0) {\n process.stderr.write(`Warning: No components found in styles file at ${stylesPath}\\n`);\n }\n\n const batch = engine.auditBatch(componentMap);\n const threshold =\n opts.threshold !== undefined ? Number.parseInt(opts.threshold, 10) : undefined;\n const failures: RunSummaryFailure[] = [];\n if (batch.totalProperties === 0) {\n failures.push({\n component: \"*\",\n stage: \"compliance\",\n message: `No CSS properties were audited from ${stylesPath}; refusing to report silent success.`,\n outputPath: stylesPath,\n });\n } else if (\n threshold !== undefined &&\n Math.round(batch.aggregateCompliance * 100) < threshold\n ) {\n failures.push({\n component: \"*\",\n stage: \"compliance\",\n message: `Compliance ${Math.round(batch.aggregateCompliance * 100)}% is below threshold ${threshold}%.`,\n outputPath: opts.out ?? \".reactscope/compliance-report.json\",\n });\n }\n\n // Write to file if --out is specified\n if (opts.out !== undefined) {\n const outPath = resolve(process.cwd(), opts.out);\n writeFileSync(outPath, JSON.stringify(batch, null, 2), \"utf-8\");\n process.stderr.write(`Compliance report written to ${outPath}\\n`);\n }\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify(batch, null, 2)}\\n`);\n } else {\n process.stdout.write(`${formatComplianceReport(batch, threshold)}\\n`);\n }\n\n const summaryPath = writeRunSummary({\n command: \"scope tokens compliance\",\n status: failures.length > 0 ? \"failed\" : \"success\",\n outputPaths: [opts.out ?? \".reactscope/compliance-report.json\", stylesPath],\n compliance: {\n auditedProperties: batch.totalProperties,\n onSystemProperties: batch.totalOnSystem,\n offSystemProperties: batch.totalOffSystem,\n score: Math.round(batch.aggregateCompliance * 100),\n threshold,\n },\n failures,\n });\n process.stderr.write(`[scope/tokens] Run summary written to ${summaryPath}\\n`);\n\n if (failures.length > 0) {\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","/**\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(\n \"Export design tokens to CSS variables, TypeScript, SCSS, Tailwind config, Figma, or flat JSON.\\n\\n\" +\n \"FORMATS:\\n\" +\n \" css CSS custom properties (:root { --color-primary-500: #3b82f6; })\\n\" +\n \" scss SCSS variables ($color-primary-500: #3b82f6;)\\n\" +\n \" ts TypeScript const export (export const tokens = {...})\\n\" +\n \" tailwind Tailwind theme.extend block (paste into tailwind.config.js)\\n\" +\n \" flat-json Flat { path: value } map (useful for tooling integration)\\n\" +\n \" figma Figma Tokens plugin format\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens export --format css --out src/tokens.css\\n\" +\n ' scope tokens export --format css --prefix brand --selector \":root, [data-theme]\"\\n' +\n \" scope tokens export --format tailwind --out tailwind-tokens.js\\n\" +\n \" scope tokens export --format ts --out src/tokens.ts\\n\" +\n \" scope tokens export --format css --theme dark --out dark-tokens.css\",\n )\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 // Provide a helpful hint for common aliases\n const FORMAT_ALIASES: Record<string, string> = {\n json: \"flat-json\",\n \"json-flat\": \"flat-json\",\n javascript: \"ts\",\n js: \"ts\",\n sass: \"scss\",\n tw: \"tailwind\",\n };\n const hint = FORMAT_ALIASES[opts.format.toLowerCase()];\n process.stderr.write(\n `Error: unsupported format \"${opts.format}\".\\n` +\n `Supported formats: ${SUPPORTED_FORMATS.join(\", \")}\\n` +\n (hint ? `Did you mean \"${hint}\"?\\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 impact sub-command\n *\n * Implements `scope tokens impact <path>`.\n *\n * Queries which components use a given token path and returns a component list\n * with element selectors, matching Token Spec §4.3.\n *\n * Usage:\n * scope tokens impact color.primary.500\n * → Button (3 elements), Badge (1 element), Link (2 elements)\n *\n * The command loads:\n * 1. The token file (default: reactscope.tokens.json)\n * 2. The compliance styles file (default: .reactscope/compliance-styles.json)\n * — same file used by `scope tokens compliance`\n *\n * It builds an ImpactAnalyzer over the compliance reports and calls\n * impactOf(tokenPath) to find all referencing components and properties.\n *\n * With --new-value <value>, it also reports the visual severity of the change.\n *\n * @packageDocumentation\n */\n\nimport {\n ComplianceEngine,\n ImpactAnalyzer,\n type ImpactReport,\n TokenResolver,\n} from \"@agent-scope/tokens\";\nimport type { Command } from \"commander\";\nimport { isTTY } from \"../render-formatter.js\";\nimport { loadTokens, resolveTokenFilePath } from \"./commands.js\";\nimport { loadStylesFile } from \"./compliance.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STYLES_PATH = \".reactscope/compliance-styles.json\";\n\n// ---------------------------------------------------------------------------\n// Formatters\n// ---------------------------------------------------------------------------\n\nconst SEVERITY_EMOJI: Record<string, string> = {\n none: \"○\",\n subtle: \"◔\",\n moderate: \"◑\",\n significant: \"●\",\n};\n\n/**\n * Format an ImpactReport as human-readable TTY output (Token Spec §4.3).\n *\n * Example:\n * Token: color.primary.500 (#3B82F6)\n *\n * Button background (on_system) ● significant\n * Card color (on_system) ◔ subtle\n * Link color (on_system) ◑ moderate\n *\n * 3 component(s) affected — overall severity: significant\n */\nexport function formatImpactReport(report: ImpactReport): string {\n const lines: string[] = [];\n\n const newValueSuffix = report.newValue !== report.oldValue ? ` → ${report.newValue}` : \"\";\n lines.push(`Token: ${report.tokenPath} (${report.oldValue})${newValueSuffix}`);\n\n if (report.components.length === 0) {\n lines.push(\"\");\n lines.push(\"No components reference this token.\");\n return lines.join(\"\\n\");\n }\n\n lines.push(\"\");\n\n const nameWidth = Math.max(9, ...report.components.map((c) => c.name.length));\n const propWidth = Math.max(\n 8,\n ...report.components.flatMap((c) => c.affectedProperties.map((p) => p.length)),\n );\n\n for (const comp of report.components) {\n for (const property of comp.affectedProperties) {\n const name = comp.name.padEnd(nameWidth);\n const prop = property.padEnd(propWidth);\n const severityIcon = SEVERITY_EMOJI[comp.severity] ?? \"?\";\n lines.push(` ${name} ${prop} ${severityIcon} ${comp.severity}`);\n }\n }\n\n lines.push(\"\");\n\n const countLabel = `${report.affectedComponentCount} component${report.affectedComponentCount !== 1 ? \"s\" : \"\"}`;\n const severityIcon = SEVERITY_EMOJI[report.overallSeverity] ?? \"?\";\n\n lines.push(\n `${countLabel} affected — overall severity: ${severityIcon} ${report.overallSeverity}`,\n );\n\n if (report.colorDelta !== undefined) {\n lines.push(`Color delta: ΔE ${report.colorDelta.toFixed(2)}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Compact summary line for each component (Token Spec §4.3 short form):\n * → Button (3 elements), Badge (1 element), Link (2 elements)\n */\nexport function formatImpactSummary(report: ImpactReport): string {\n if (report.components.length === 0) {\n return `No components reference token \"${report.tokenPath}\".`;\n }\n const parts = report.components.map(\n (c) =>\n `${c.name} (${c.affectedProperties.length} element${c.affectedProperties.length !== 1 ? \"s\" : \"\"})`,\n );\n return `→ ${parts.join(\", \")}`;\n}\n\n// ---------------------------------------------------------------------------\n// registerImpact\n// ---------------------------------------------------------------------------\n\n/**\n * Registers `scope tokens impact <path>` on the given `tokens` Command.\n */\nexport function registerImpact(tokensCmd: Command): void {\n tokensCmd\n .command(\"impact <path>\")\n .description(\n \"List every component and CSS element that uses a given token.\\n\" +\n \"Use this to understand the blast radius before changing a token value.\\n\\n\" +\n \"PREREQUISITE: scope render all (populates compliance-styles.json)\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens impact color.primary.500\\n\" +\n \" scope tokens impact spacing.4 --format json\\n\" +\n \" scope tokens impact font.size.base | grep Button\",\n )\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--styles <path>\", `Path to compliance styles JSON (default: ${DEFAULT_STYLES_PATH})`)\n .option(\"--new-value <value>\", \"Proposed new value — report visual severity of the change\")\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .action(\n (\n tokenPath: string,\n opts: {\n file?: string;\n styles?: string;\n newValue?: string;\n format?: string;\n },\n ) => {\n try {\n const tokenFilePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(tokenFilePath);\n const resolver = new TokenResolver(tokens);\n const engine = new ComplianceEngine(resolver);\n\n const stylesPath = opts.styles ?? DEFAULT_STYLES_PATH;\n const stylesFile = loadStylesFile(stylesPath);\n\n // Build compliance reports\n const componentMap = new Map(Object.entries(stylesFile));\n const batchReport = engine.auditBatch(componentMap);\n const complianceReports = new Map(Object.entries(batchReport.components));\n\n const analyzer = new ImpactAnalyzer(resolver, complianceReports);\n\n // Determine new value — default to current value (no-change analysis)\n const currentValue = resolver.resolve(tokenPath);\n const newValue = opts.newValue ?? currentValue;\n\n const report = analyzer.impactOf(tokenPath, newValue);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(`${JSON.stringify(report, null, 2)}\\n`);\n } else {\n // On TTY: full report; when piped without --format: full report in text\n process.stdout.write(`${formatImpactReport(report)}\\n`);\n if (isTTY()) {\n process.stdout.write(`\\n${formatImpactSummary(report)}\\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 init sub-command\n *\n * Implements `scope tokens init` which detects design-token sources in the\n * current project and scaffolds a reactscope.tokens.json file.\n *\n * Detected sources:\n * - Tailwind config (colors, spacing, fontFamily, borderRadius)\n * - CSS custom properties (:root { --var: value })\n * - Theme files (*.theme.{ts,js})\n *\n * Will not overwrite an existing token file unless --force is passed.\n */\n\nimport { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { Command } from \"commander\";\nimport type { TokenSource } from \"../init/detect.js\";\nimport { detectProject } from \"../init/detect.js\";\nimport { extractTailwindTokens } from \"../init/index.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_TOKEN_FILE = \"reactscope.tokens.json\";\nconst CONFIG_FILE = \"reactscope.config.json\";\n\n// ---------------------------------------------------------------------------\n// Output path resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve where the token file should be written.\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 */\nfunction resolveOutputPath(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 // fall through to default\n }\n }\n\n return resolve(process.cwd(), DEFAULT_TOKEN_FILE);\n}\n\n// ---------------------------------------------------------------------------\n// CSS custom properties extractor\n// ---------------------------------------------------------------------------\n\nconst CSS_VAR_RE = /--([\\w-]+)\\s*:\\s*([^;]+)/g;\nconst HEX_COLOR_RE = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;\nconst COLOR_FN_RE = /^(?:rgba?|hsla?|oklch|oklab|lch|lab|color|hwb)\\(/;\nconst DIMENSION_RE = /^-?\\d+(?:\\.\\d+)?(?:px|rem|em|%|vw|vh|ch|ex|cap|lh|dvh|svh|lvh)$/;\nconst DURATION_RE = /^-?\\d+(?:\\.\\d+)?(?:ms|s)$/;\nconst FONT_FAMILY_RE = /^[\"']|,\\s*(?:sans-serif|serif|monospace|cursive|fantasy|system-ui)/;\nconst NUMBER_RE = /^-?\\d+(?:\\.\\d+)?$/;\nconst CUBIC_BEZIER_RE = /^cubic-bezier\\(/;\nconst SHADOW_RE = /^\\d.*(?:px|rem|em)\\s+(?:#|rgba?|hsla?|oklch|oklab)/i;\n\nfunction inferTokenType(value: string): string {\n const v = value.trim();\n if (HEX_COLOR_RE.test(v) || COLOR_FN_RE.test(v)) return \"color\";\n if (DURATION_RE.test(v)) return \"duration\";\n if (DIMENSION_RE.test(v)) return \"dimension\";\n if (FONT_FAMILY_RE.test(v)) return \"fontFamily\";\n if (CUBIC_BEZIER_RE.test(v)) return \"cubicBezier\";\n if (SHADOW_RE.test(v)) return \"shadow\";\n if (NUMBER_RE.test(v)) return \"number\";\n return \"color\";\n}\n\n/**\n * Convert a CSS custom-property name like `color-primary-500` into a\n * nested token path structure: `{ color: { primary: { \"500\": { value, type } } } }`.\n */\nfunction setNestedToken(\n root: Record<string, unknown>,\n segments: string[],\n value: string,\n type: string,\n): void {\n let node = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (seg === undefined) continue;\n if (!(seg in node) || typeof node[seg] !== \"object\" || node[seg] === null) {\n node[seg] = {};\n }\n node = node[seg] as Record<string, unknown>;\n }\n const leaf = segments[segments.length - 1];\n if (leaf === undefined) return;\n node[leaf] = { value, type };\n}\n\n/**\n * Extract the body of a CSS block starting at `openBrace` in `css`.\n * Uses brace counting to handle nested blocks.\n */\nfunction extractBlockBody(css: string, openBrace: number): string {\n let depth = 0;\n let end = -1;\n for (let i = openBrace; i < css.length; i++) {\n if (css[i] === \"{\") depth++;\n else if (css[i] === \"}\") {\n depth--;\n if (depth === 0) {\n end = i;\n break;\n }\n }\n }\n if (end === -1) return \"\";\n return css.slice(openBrace + 1, end);\n}\n\n/** Scoped block with its selector/at-rule and body content. */\ninterface CSSBlock {\n scope: \"root\" | \"theme\" | \"dark\" | \"dark-high-contrast\";\n body: string;\n}\n\n/**\n * Parse a CSS file into scoped blocks.\n * Recognises: `:root`, `@theme`, `@theme inline`, `.dark`, `.dark.high-contrast`\n */\nfunction parseScopedBlocks(css: string): CSSBlock[] {\n const blocks: CSSBlock[] = [];\n const blockRe = /(?::root|@theme(?:\\s+inline)?|\\.dark\\.high-contrast|\\.dark)\\s*\\{/g;\n\n let match: RegExpExecArray | null = blockRe.exec(css);\n while (match !== null) {\n const selector = match[0];\n const braceIdx = css.indexOf(\"{\", match.index);\n if (braceIdx === -1) {\n match = blockRe.exec(css);\n continue;\n }\n\n const body = extractBlockBody(css, braceIdx);\n\n let scope: CSSBlock[\"scope\"];\n if (selector.includes(\".dark.high-contrast\")) scope = \"dark-high-contrast\";\n else if (selector.includes(\".dark\")) scope = \"dark\";\n else if (selector.includes(\"@theme\")) scope = \"theme\";\n else scope = \"root\";\n\n blocks.push({ scope, body });\n match = blockRe.exec(css);\n }\n\n return blocks;\n}\n\n/**\n * Extract concrete custom-property declarations from a CSS block body.\n * Skips var() references and calc() expressions.\n */\nfunction extractVarsFromBody(body: string): Array<{ name: string; value: string }> {\n const results: Array<{ name: string; value: string }> = [];\n for (const m of body.matchAll(CSS_VAR_RE)) {\n const name = m[1];\n const value = m[2]?.trim();\n if (name === undefined || value === undefined || value.length === 0) continue;\n if (value.startsWith(\"var(\") || value.startsWith(\"calc(\")) continue;\n results.push({ name, value });\n }\n return results;\n}\n\ninterface CSSExtractionResult {\n tokens: Record<string, unknown>;\n themes: Record<string, Record<string, string>>;\n}\n\n/**\n * Extract tokens from CSS files, scope-aware.\n * `:root` and `@theme` → base tokens.\n * `.dark` → themes.dark overrides.\n * `.dark.high-contrast` → themes[\"dark-high-contrast\"] overrides.\n */\nfunction extractCSSCustomProperties(tokenSources: TokenSource[]): CSSExtractionResult | null {\n const cssSources = tokenSources.filter(\n (s) => s.kind === \"css-custom-properties\" || s.kind === \"tailwind-v4-theme\",\n );\n if (cssSources.length === 0) return null;\n\n const tokens: Record<string, unknown> = {};\n const themes: Record<string, Record<string, string>> = {};\n let found = false;\n\n for (const source of cssSources) {\n try {\n if (source.path.includes(\"compiled\") || source.path.includes(\".min.\")) continue;\n\n const raw = readFileSync(source.path, \"utf-8\");\n const blocks = parseScopedBlocks(raw);\n\n for (const block of blocks) {\n const vars = extractVarsFromBody(block.body);\n\n for (const { name, value } of vars) {\n const segments = name.split(\"-\").filter(Boolean);\n if (segments.length === 0) continue;\n\n if (block.scope === \"root\" || block.scope === \"theme\") {\n const type = inferTokenType(value);\n setNestedToken(tokens, segments, value, type);\n found = true;\n } else {\n const themeName = block.scope;\n if (!themes[themeName]) themes[themeName] = {};\n const path = segments.join(\".\");\n themes[themeName][path] = value;\n found = true;\n }\n }\n }\n } catch {\n // skip unreadable files\n }\n }\n\n return found ? { tokens, themes } : null;\n}\n\n// ---------------------------------------------------------------------------\n// Public registration\n// ---------------------------------------------------------------------------\n\nexport function registerTokensInit(tokensCmd: Command): void {\n tokensCmd\n .command(\"init\")\n .description(\n \"Detect design-token sources in the project and generate a token file.\\n\\n\" +\n \"DETECTED SOURCES:\\n\" +\n \" - Tailwind config (colors, spacing, fontFamily, borderRadius)\\n\" +\n \" - CSS custom properties (:root { --color-primary: #0070f3; })\\n\\n\" +\n \"Will not overwrite an existing token file unless --force is passed.\\n\\n\" +\n \"OUTPUT PATH RESOLUTION (in priority order):\\n\" +\n \" 1. --file <path> explicit override\\n\" +\n \" 2. tokens.file in reactscope.config.json\\n\" +\n \" 3. reactscope.tokens.json default (project root)\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens init\\n\" +\n \" scope tokens init --force\\n\" +\n \" scope tokens init --file tokens/brand.json\\n\" +\n \" scope tokens init --force --file custom-tokens.json\",\n )\n .option(\"--file <path>\", \"Output path for the token file (overrides config)\")\n .option(\"--force\", \"Overwrite existing token file\", false)\n .action((opts: { file?: string; force: boolean }) => {\n try {\n const outPath = resolveOutputPath(opts.file);\n\n if (existsSync(outPath) && !opts.force) {\n process.stderr.write(\n `Token file already exists at ${outPath}.\\n` + `Run with --force to overwrite.\\n`,\n );\n process.exit(1);\n }\n\n const rootDir = process.cwd();\n const detected = detectProject(rootDir);\n\n const tailwindTokens = extractTailwindTokens(detected.tokenSources);\n const cssResult = extractCSSCustomProperties(detected.tokenSources);\n\n const mergedTokens: Record<string, unknown> = {};\n const mergedThemes: Record<string, Record<string, string>> = {};\n\n if (tailwindTokens !== null) {\n Object.assign(mergedTokens, tailwindTokens);\n }\n if (cssResult !== null) {\n for (const [key, value] of Object.entries(cssResult.tokens)) {\n if (!(key in mergedTokens)) {\n mergedTokens[key] = value;\n }\n }\n for (const [themeName, overrides] of Object.entries(cssResult.themes)) {\n if (!mergedThemes[themeName]) mergedThemes[themeName] = {};\n Object.assign(mergedThemes[themeName], overrides);\n }\n }\n\n const tokenFile: Record<string, unknown> = {\n $schema:\n \"https://raw.githubusercontent.com/FlatFilers/Scope/main/packages/tokens/schema.json\",\n version: \"1.0.0\",\n meta: {\n name: \"Design Tokens\",\n lastUpdated: new Date().toISOString().split(\"T\")[0],\n },\n tokens: mergedTokens,\n };\n\n if (Object.keys(mergedThemes).length > 0) {\n tokenFile.themes = mergedThemes;\n }\n\n writeFileSync(outPath, `${JSON.stringify(tokenFile, null, 2)}\\n`);\n\n // Summary\n const tokenGroupCount = Object.keys(mergedTokens).length;\n const themeNames = Object.keys(mergedThemes);\n\n if (detected.tokenSources.length > 0) {\n process.stdout.write(\"Detected token sources:\\n\");\n for (const source of detected.tokenSources) {\n process.stdout.write(` ${source.kind}: ${source.path}\\n`);\n }\n process.stdout.write(\"\\n\");\n }\n\n if (tokenGroupCount > 0) {\n process.stdout.write(`Extracted ${tokenGroupCount} token group(s) → ${outPath}\\n`);\n if (themeNames.length > 0) {\n for (const name of themeNames) {\n const count = Object.keys(mergedThemes[name] ?? {}).length;\n process.stdout.write(` theme \"${name}\": ${count} override(s)\\n`);\n }\n }\n } else {\n process.stdout.write(\n `No token sources detected. Created empty token file → ${outPath}\\n` +\n `Add tokens manually or re-run after configuring a design system.\\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 * @agent-scope/cli — tokens preview sub-command\n *\n * Implements `scope tokens preview <path> --new-value <value> --sprite`.\n *\n * Re-renders components affected by a token change with both the current and\n * proposed token values, and outputs a side-by-side sprite sheet PNG showing\n * the before / after visual diff.\n *\n * Usage:\n * scope tokens preview color.primary.500 --new-value \"#2563EB\" --sprite\n * scope tokens preview color.primary.500 --new-value \"#2563EB\" -o out.png\n *\n * Flags:\n * --new-value <value> (required) The proposed new value for the token\n * --sprite Write a PNG sprite sheet (default when stdout is TTY)\n * -o, --output <path> Output PNG path (default: .reactscope/previews/<token>.png)\n * --file <path> Token file path (overrides config)\n * --styles <path> Compliance styles file path\n * --manifest <path> Manifest path for component file resolution\n * --format <fmt> json or text (default: auto-detect)\n * --timeout <ms> Browser timeout per render (ms, default: 10000)\n * --viewport-width <px> Viewport width in pixels (default: 1280)\n * --viewport-height <px> Viewport height in pixels (default: 720)\n *\n * The command:\n * 1. Loads token file + styles → runs impact analysis to find affected components\n * 2. For each affected component, loads the file path from the manifest\n * 3. Bundles and renders each component twice via BrowserPool:\n * - Once with current token value (CSS var override injected)\n * - Once with new token value\n * 4. Composites the before/after renders into a sprite sheet using\n * SpriteSheetGenerator (rows = before/after, cols = components)\n * 5. Writes the PNG and reports cell coordinates\n *\n * @packageDocumentation\n */\n\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { BrowserPool, SpriteSheetGenerator } from \"@agent-scope/render\";\nimport { ComplianceEngine, ImpactAnalyzer, TokenResolver } from \"@agent-scope/tokens\";\nimport type { Command } from \"commander\";\nimport { buildComponentHarness } from \"../component-bundler.js\";\nimport { loadManifest } from \"../manifest-commands.js\";\nimport { isTTY } from \"../render-formatter.js\";\nimport { loadTokens, resolveTokenFilePath } from \"./commands.js\";\nimport { loadStylesFile } from \"./compliance.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_STYLES_PATH = \".reactscope/compliance-styles.json\";\nconst DEFAULT_MANIFEST_PATH = \".reactscope/manifest.json\";\nconst DEFAULT_OUTPUT_DIR = \".reactscope/previews\";\n\n// ---------------------------------------------------------------------------\n// Render a single component with an optional CSS override via page.setContent\n// ---------------------------------------------------------------------------\n\nasync function renderComponentWithCssOverride(\n filePath: string,\n componentName: string,\n cssOverride: string,\n vpWidth: number,\n vpHeight: number,\n timeoutMs: number,\n): Promise<{ screenshot: Buffer; width: number; height: number }> {\n const PAD = 16;\n // Build harness with CSS injection via projectCss parameter\n const htmlHarness = await buildComponentHarness(\n filePath,\n componentName,\n {}, // no props\n vpWidth,\n cssOverride, // injected as <style>\n undefined,\n PAD,\n );\n\n const pool = new BrowserPool({\n size: { browsers: 1, pagesPerBrowser: 1 },\n viewportWidth: vpWidth,\n viewportHeight: vpHeight,\n });\n await pool.init();\n\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: timeoutMs },\n );\n\n const rootLocator = page.locator(\"[data-reactscope-root]\");\n const bb = await rootLocator.boundingBox();\n\n const MIN_W = 320;\n const MIN_H = 120;\n\n const clipX = Math.max(0, (bb?.x ?? 0) - PAD);\n const clipY = Math.max(0, (bb?.y ?? 0) - PAD);\n const rawW = (bb?.width ?? MIN_W) + PAD * 2;\n const rawH = (bb?.height ?? MIN_H) + PAD * 2;\n const clipW = Math.min(Math.max(rawW, MIN_W), vpWidth - clipX);\n const clipH = Math.min(Math.max(rawH, MIN_H), vpHeight - clipY);\n\n const screenshot = await page.screenshot({\n clip: { x: clipX, y: clipY, width: clipW, height: clipH },\n type: \"png\",\n });\n\n return { screenshot, width: Math.round(clipW), height: Math.round(clipH) };\n } finally {\n pool.release(slot);\n await pool.close().catch(() => undefined);\n }\n}\n\n// ---------------------------------------------------------------------------\n// registerPreview\n// ---------------------------------------------------------------------------\n\n/**\n * Registers `scope tokens preview <path>` on the given `tokens` Command.\n */\nexport function registerPreview(tokensCmd: Command): void {\n tokensCmd\n .command(\"preview <path>\")\n .description(\n \"Render before/after screenshots of all components affected by a token change.\\n\" +\n \"Useful for visual review before committing a token value update.\\n\\n\" +\n \"PREREQUISITE: scope render all (provides baseline renders)\\n\\n\" +\n \"Examples:\\n\" +\n \" scope tokens preview color.primary.500\\n\" +\n ' scope tokens preview color.primary.500 --new-value \"#2563eb\" -o preview.png',\n )\n .requiredOption(\"--new-value <value>\", \"The proposed new resolved value for the token\")\n .option(\"--sprite\", \"Output a PNG sprite sheet (default when TTY)\", false)\n .option(\"-o, --output <path>\", \"Output PNG path (default: .reactscope/previews/<token>.png)\")\n .option(\"--file <path>\", \"Path to token file (overrides config)\")\n .option(\"--styles <path>\", `Path to compliance styles JSON (default: ${DEFAULT_STYLES_PATH})`)\n .option(\"--manifest <path>\", \"Path to manifest.json\", DEFAULT_MANIFEST_PATH)\n .option(\"--format <fmt>\", \"Output format: json or text (default: auto-detect)\")\n .option(\"--timeout <ms>\", \"Browser timeout per render (ms)\", \"10000\")\n .option(\"--viewport-width <px>\", \"Viewport width in pixels\", \"1280\")\n .option(\"--viewport-height <px>\", \"Viewport height in pixels\", \"720\")\n .action(\n async (\n tokenPath: string,\n opts: {\n newValue: string;\n sprite: boolean;\n output?: string;\n file?: string;\n styles?: string;\n manifest: string;\n format?: string;\n timeout: string;\n viewportWidth: string;\n viewportHeight: string;\n },\n ) => {\n try {\n const tokenFilePath = resolveTokenFilePath(opts.file);\n const { tokens } = loadTokens(tokenFilePath);\n const resolver = new TokenResolver(tokens);\n const engine = new ComplianceEngine(resolver);\n\n const stylesPath = opts.styles ?? DEFAULT_STYLES_PATH;\n const stylesFile = loadStylesFile(stylesPath);\n\n const componentMap = new Map(Object.entries(stylesFile));\n const batchReport = engine.auditBatch(componentMap);\n const complianceReports = new Map(Object.entries(batchReport.components));\n\n const analyzer = new ImpactAnalyzer(resolver, complianceReports);\n const currentValue = resolver.resolve(tokenPath);\n const impactReport = analyzer.impactOf(tokenPath, opts.newValue);\n\n if (impactReport.components.length === 0) {\n process.stdout.write(\n `No components reference token \"${tokenPath}\". Nothing to preview.\\n`,\n );\n return;\n }\n\n const affectedNames = impactReport.components.map((c) => c.name);\n process.stderr.write(\n `Rendering ${affectedNames.length} component(s): ${affectedNames.join(\", \")}\\n`,\n );\n\n const manifest = loadManifest(opts.manifest);\n const vpWidth = Number.parseInt(opts.viewportWidth, 10);\n const vpHeight = Number.parseInt(opts.viewportHeight, 10);\n const timeout = Number.parseInt(opts.timeout, 10);\n\n const tokenCssVar = `--token-${tokenPath.replace(/\\./g, \"-\")}`;\n const beforeCss = `:root { ${tokenCssVar}: ${currentValue}; }`;\n const afterCss = `:root { ${tokenCssVar}: ${opts.newValue}; }`;\n\n // Render before/after for each affected component\n const renders: Array<{\n name: string;\n before: { screenshot: Buffer; width: number; height: number };\n after: { screenshot: Buffer; width: number; height: number };\n }> = [];\n\n for (const componentName of affectedNames) {\n const descriptor = manifest.components[componentName];\n if (descriptor === undefined) {\n process.stderr.write(\n `Warning: \"${componentName}\" not found in manifest — skipping\\n`,\n );\n continue;\n }\n\n process.stderr.write(` Rendering ${componentName} (before)...\\n`);\n const before = await renderComponentWithCssOverride(\n descriptor.filePath,\n componentName,\n beforeCss,\n vpWidth,\n vpHeight,\n timeout,\n );\n\n process.stderr.write(` Rendering ${componentName} (after)...\\n`);\n const after = await renderComponentWithCssOverride(\n descriptor.filePath,\n componentName,\n afterCss,\n vpWidth,\n vpHeight,\n timeout,\n );\n\n renders.push({ name: componentName, before, after });\n }\n\n if (renders.length === 0) {\n process.stderr.write(\n \"Warning: No components could be rendered (all missing from manifest).\\n\",\n );\n return;\n }\n\n // Normalise cell dimensions to max across all renders\n const cellW = Math.max(...renders.flatMap((r) => [r.before.width, r.after.width]));\n const cellH = Math.max(...renders.flatMap((r) => [r.before.height, r.after.height]));\n\n // Build MatrixResult — rows=2 (before/after), cols=components\n const cells = renders.flatMap((r, colIdx) => [\n {\n props: { version: \"before\", component: r.name },\n result: {\n screenshot: r.before.screenshot,\n width: cellW,\n height: cellH,\n renderTimeMs: 0,\n computedStyles: {},\n },\n index: colIdx * 2,\n axisIndices: [0, colIdx],\n },\n {\n props: { version: \"after\", component: r.name },\n result: {\n screenshot: r.after.screenshot,\n width: cellW,\n height: cellH,\n renderTimeMs: 0,\n computedStyles: {},\n },\n index: colIdx * 2 + 1,\n axisIndices: [1, colIdx],\n },\n ]);\n\n const matrixResult = {\n cells,\n axes: [\n { name: \"component\", values: renders.map((r) => r.name) },\n { name: \"version\", values: [\"before\", \"after\"] },\n ],\n axisLabels: [renders.map((r) => r.name), [\"before\", \"after\"]],\n rows: 2,\n cols: renders.length,\n stats: {\n totalCells: cells.length,\n totalRenderTimeMs: 0,\n avgRenderTimeMs: 0,\n minRenderTimeMs: 0,\n maxRenderTimeMs: 0,\n wallClockTimeMs: 0,\n },\n };\n\n const generator = new SpriteSheetGenerator({\n cellPadding: 8,\n borderWidth: 1,\n labelHeight: 32,\n labelWidth: 120,\n });\n\n const spriteResult = await generator.generate(matrixResult);\n\n // Determine output path\n const tokenLabel = tokenPath.replace(/\\./g, \"-\");\n const outputPath =\n opts.output ?? resolve(process.cwd(), DEFAULT_OUTPUT_DIR, `preview-${tokenLabel}.png`);\n\n const outputDir = resolve(outputPath, \"..\");\n mkdirSync(outputDir, { recursive: true });\n writeFileSync(outputPath, spriteResult.png);\n\n const useJson = opts.format === \"json\" || (opts.format !== \"text\" && !isTTY());\n\n if (useJson) {\n process.stdout.write(\n `${JSON.stringify(\n {\n tokenPath,\n oldValue: currentValue,\n newValue: opts.newValue,\n outputPath,\n width: spriteResult.width,\n height: spriteResult.height,\n components: renders.map((r) => r.name),\n cells: spriteResult.coordinates.length,\n },\n null,\n 2,\n )}\\n`,\n );\n } else {\n process.stdout.write(\n `Preview written to ${outputPath} (${spriteResult.width}×${spriteResult.height}px)\\n`,\n );\n process.stdout.write(`Components: ${renders.map((r) => r.name).join(\", \")}\\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 — binary entry point\n *\n * Parses argv and executes the Scope CLI.\n */\n\nimport { createProgram } from \"./program.js\";\n\nconst program = createProgram();\nprogram.parseAsync(process.argv).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exit(1);\n});\n"],"mappings":"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","names":["readFileSync","Command","existsSync","readFileSync","writeFileSync","resolve","row","require","build","existsSync","readFileSync","createRequire","resolve","existsSync","readFileSync","rule","writeFileSync","existsSync","readFileSync","join","resolve","Command","existsSync","readFileSync","dirname","existsSync","readFileSync","chromium","existsSync","dirname","existsSync","join","resolve","readFileSync","Command","Command","Command","existsSync","readFileSync","writeFileSync","join","existsSync","readdirSync","readFileSync","join","detectPackageManager","generateManifest","Command","resolve","join","existsSync","readFileSync","writeFileSync","parseBlock","resolve","getBrowserEntryScript","BrowserPool","Command","existsSync","mkdirSync","readFileSync","writeFileSync","resolve","generateManifest","Command","resolve","existsSync","readFileSync","generateManifest","mkdirSync","writeFileSync","Command","resolve","getBrowserEntryScript","chromium","MANIFEST_PATH","chromium","getBrowserEntryScript","resolve","resolve","getBrowserEntryScript","Cmd","chromium","MANIFEST_PATH","chromium","getBrowserEntryScript","Cmd","resolve","resolve","getBrowserEntryScript","Command","chromium","MANIFEST_PATH","chromium","getBrowserEntryScript","Command","MANIFEST_PATH","resolve","fmt","resolveFormat","MANIFEST_PATH","replayInteraction","_pool","getPool","BrowserPool","shutdownPool","resolve","getBrowserEntryScript","Command","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","resolve","BrowserPool","safeRender","Command","mkdirSync","readFileSync","writeFileSync","dirname","resolve","existsSync","mkdirSync","createRequire","dirname","join","resolve","esbuild","resolve","existsSync","readFileSync","TAILWIND_CONFIG_FILES","matchGlob","MANIFEST_PATH","rmSync","writeFileSync","_pool","getPool","BrowserPool","shutdownPool","projectCss","fmt","props","safeRender","mkdirSync","SpriteSheetGenerator","summaryPath","scenarioEntries","Command","existsSync","mkdirSync","rmSync","writeFileSync","resolve","generateManifest","BrowserPool","safeRender","ComplianceEngine","TokenResolver","_pool","getPool","BrowserPool","shutdownPool","renderComponent","extractComputedStyles","resolve","existsSync","rmSync","mkdirSync","readFileSync","generateManifest","writeFileSync","safeRender","TokenResolver","ComplianceEngine","existsSync","readFileSync","writeFileSync","resolve","generateManifest","BrowserPool","safeRender","ComplianceEngine","TokenResolver","DEFAULT_BASELINE_DIR","resolve","existsSync","readFileSync","loadBaselineRenderJson","_pool","getPool","BrowserPool","shutdownPool","renderComponent","extractComputedStyles","generateManifest","safeRender","TokenResolver","ComplianceEngine","rule","writeFileSync","existsSync","readFileSync","writeFileSync","resolve","BRANCH","LAST_BRANCH","VERTICAL","EMPTY","visibleChildren","nextPrefix","pad","existsSync","readFileSync","statSync","writeFileSync","join","resolve","generateManifest","safeRender","Command","dirname","esbuild","loadGlobalCssFilesFromConfig","resolve","existsSync","readFileSync","loadIconPatternsFromConfig","join","safeRender","writeFileSync","shutdownPool","generateManifest","statSync","notifyReload","Command","existsSync","readFileSync","resolve","parseTokenFileSync","TokenResolver","Command","existsSync","readFileSync","writeFileSync","resolve","ComplianceEngine","TokenResolver","resolve","existsSync","readFileSync","TokenResolver","ComplianceEngine","writeFileSync","existsSync","readFileSync","writeFileSync","resolve","TokenResolver","Command","resolveTokenFilePath","ComplianceEngine","TokenResolver","DEFAULT_STYLES_PATH","severityIcon","TokenResolver","ComplianceEngine","existsSync","readFileSync","writeFileSync","resolve","DEFAULT_TOKEN_FILE","CONFIG_FILE","resolve","existsSync","readFileSync","writeFileSync","mkdirSync","writeFileSync","resolve","BrowserPool","ComplianceEngine","ImpactAnalyzer","TokenResolver","DEFAULT_STYLES_PATH","DEFAULT_OUTPUT_DIR","BrowserPool","TokenResolver","ComplianceEngine","ImpactAnalyzer","resolve","mkdirSync","writeFileSync","DEFAULT_TOKEN_FILE","CONFIG_FILE","isTTY","pad","buildTable","row","resolve","existsSync","readFileSync","parseTokenFileSync","registerGet","TokenResolver","registerList","Command","program","Command","readFileSync"]}