canicode 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/adapters/figma-client.ts","../../src/core/adapters/figma-transformer.ts","../../src/core/adapters/component-resolver.ts","../../src/core/design-tree/design-tree.ts","../../src/core/comparison/visual-compare-helpers.ts","../../src/core/comparison/visual-compare.ts","../../src/core/engine/config-store.ts","../../src/core/monitoring/events.ts","../../src/core/monitoring/capture.ts","../../src/core/monitoring/index.ts","../../src/core/monitoring/keys.ts","../../src/cli/docs.ts","../../src/core/rules/rule-config.ts","../../src/core/rules/rule-registry.ts","../../src/core/rules/node-semantics.ts","../../src/core/rules/rule-exceptions.ts","../../src/core/rules/rule-messages.ts","../../src/core/rules/structure/index.ts","../../src/core/rules/token/index.ts","../../src/core/contracts/category.ts","../../src/core/contracts/severity.ts","../../src/core/contracts/rule.ts","../../src/core/rules/component/index.ts","../../src/core/rules/naming/index.ts","../../src/core/rules/interaction/index.ts","../../src/core/engine/rule-engine.ts","../../src/core/engine/loader.ts","../../src/core/contracts/figma-node.ts","../../src/core/adapters/figma-file-loader.ts","../../src/core/adapters/figma-url-parser.ts","../../package.json","../../src/core/engine/scoring.ts","../../src/core/rules/config-loader.ts","../../src/core/ui-constants.ts","../../src/core/ui-helpers.ts","../../src/core/report-html/render.ts","../../src/core/report-html/index.ts","../../src/cli/helpers.ts","../../src/cli/commands/analyze.ts","../../src/cli/commands/save-fixture.ts","../../src/cli/commands/design-tree.ts","../../src/cli/commands/implement.ts","../../src/core/contracts/visual-compare.ts","../../src/cli/commands/visual-compare.ts","../../src/cli/commands/init.ts","../../src/cli/commands/config.ts","../../src/cli/commands/list-rules.ts","../../src/cli/commands/prompt.ts","../../src/agents/contracts/conversion-agent.ts","../../src/agents/contracts/calibration.ts","../../src/agents/analysis-agent.ts","../../src/core/design-tree/delta.ts","../../src/agents/evaluation-agent.ts","../../src/agents/tuning-agent.ts","../../src/agents/report-generator.ts","../../src/agents/contracts/evidence.ts","../../src/agents/evidence-collector.ts","../../src/agents/orchestrator.ts","../../src/cli/commands/internal/calibrate-analyze.ts","../../src/cli/commands/internal/calibrate-evaluate.ts","../../src/agents/contracts/gap-analyzer.ts","../../src/agents/gap-rule-report.ts","../../src/cli/commands/internal/calibrate-gap-report.ts","../../src/cli/commands/internal/calibrate-run.ts","../../src/agents/run-directory.ts","../../src/cli/commands/internal/cli-helpers.ts","../../src/cli/commands/internal/calibrate-debate.ts","../../src/cli/commands/internal/fixture-management.ts","../../src/core/design-tree/strip.ts","../../src/cli/commands/internal/design-tree-strip.ts","../../src/core/comparison/html-utils.ts","../../src/cli/commands/internal/html-postprocess.ts","../../src/cli/commands/internal/code-metrics.ts","../../src/cli/index.ts"],"names":["BATCH_SIZE","join","existsSync","readFileSync","resolve","statSync","width","height","mkdirSync","dirname","writeFileSync","PNG","config","require","z","response","file","componentDefs","interactionDests","version","readFile","esc","countNodes","cli","resolveComponentDefinitions","resolveInteractionDestinations","writeFile","FigmaClient","generateDesignTreeWithStats","readdirSync","copyFileSync","visualCompare","dominantDifficulty","loadFile","basename","result","createRequire","pkg"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;A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","file":"index.js","sourcesContent":["import type { GetFileResponse, Node } from \"@figma/rest-api-spec\";\n\nconst FIGMA_API_BASE = \"https://api.figma.com/v1\";\n\nexport interface GetFileNodesResponse {\n name: string;\n lastModified: string;\n version: string;\n nodes: Record<string, {\n document: Node;\n components: GetFileResponse[\"components\"];\n styles: GetFileResponse[\"styles\"];\n }>;\n}\n\nexport interface FigmaClientOptions {\n token: string;\n}\n\nexport class FigmaClient {\n private token: string;\n\n constructor(options: FigmaClientOptions) {\n this.token = options.token;\n }\n\n static fromEnv(): FigmaClient {\n const token = process.env[\"FIGMA_TOKEN\"];\n if (!token) {\n throw new FigmaClientError(\n \"FIGMA_TOKEN environment variable is not set\"\n );\n }\n return new FigmaClient({ token });\n }\n\n async getFile(fileKey: string): Promise<GetFileResponse> {\n const url = `${FIGMA_API_BASE}/files/${fileKey}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch file: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return response.json() as Promise<GetFileResponse>;\n }\n\n /**\n * Get rendered images for specific nodes\n * Returns a map of nodeId → image URL\n */\n async getNodeImages(\n fileKey: string,\n nodeIds: string[],\n options?: { format?: \"png\" | \"svg\" | \"jpg\"; scale?: number }\n ): Promise<Record<string, string | null>> {\n const format = options?.format ?? \"png\";\n const scale = options?.scale ?? 2;\n\n // Batch into chunks to avoid 414 URI Too Large\n const BATCH_SIZE = 50;\n const allImages: Record<string, string | null> = {};\n\n for (let i = 0; i < nodeIds.length; i += BATCH_SIZE) {\n const batch = nodeIds.slice(i, i + BATCH_SIZE);\n const ids = batch.join(\",\");\n const url = `${FIGMA_API_BASE}/images/${fileKey}?ids=${encodeURIComponent(ids)}&format=${format}&scale=${scale}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch images: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n const data = await response.json() as { images: Record<string, string | null> };\n for (const [nodeId, imageUrl] of Object.entries(data.images)) {\n allImages[nodeId] = imageUrl;\n }\n }\n\n return allImages;\n }\n\n /**\n * Get original image fill URLs by imageRef.\n * Returns a mapping of imageRef → download URL for all image fills in the file.\n */\n async getImageFills(fileKey: string): Promise<Record<string, string>> {\n const url = `${FIGMA_API_BASE}/files/${fileKey}/images`;\n const response = await fetch(url, {\n headers: { \"X-Figma-Token\": this.token },\n });\n if (!response.ok) {\n const error = await response.text().catch(() => \"\");\n throw new FigmaClientError(\n `Failed to fetch image fills: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n const data = await response.json() as { meta?: { images?: Record<string, string> } };\n return data.meta?.images ?? {};\n }\n\n /**\n * Download an image URL and return as base64\n */\n async fetchImageAsBase64(imageUrl: string): Promise<string> {\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new FigmaClientError(\n `Failed to download image: ${response.status}`,\n response.status\n );\n }\n const buffer = await response.arrayBuffer();\n return Buffer.from(buffer).toString(\"base64\");\n }\n\n async getFileNodes(\n fileKey: string,\n nodeIds: string[]\n ): Promise<GetFileNodesResponse> {\n const ids = nodeIds.join(\",\");\n const url = `${FIGMA_API_BASE}/files/${fileKey}/nodes?ids=${encodeURIComponent(ids)}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch nodes: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return response.json() as Promise<GetFileNodesResponse>;\n }\n}\n\nexport class FigmaClientError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public responseBody?: unknown\n ) {\n super(message);\n this.name = \"FigmaClientError\";\n }\n}\n","import type { GetFileResponse, Node } from \"@figma/rest-api-spec\";\nimport type { GetFileNodesResponse } from \"./figma-client.js\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\n\n/**\n * Transform Figma API response to analysis types\n */\nexport function transformFigmaResponse(\n fileKey: string,\n response: GetFileResponse\n): AnalysisFile {\n return {\n fileKey,\n name: response.name,\n lastModified: response.lastModified,\n version: response.version,\n document: transformNode(response.document),\n components: transformComponents(response.components),\n styles: transformStyles(response.styles),\n };\n}\n\nfunction transformNode(node: Node): AnalysisNode {\n const base: AnalysisNode = {\n id: node.id,\n name: node.name,\n type: node.type as AnalysisNode[\"type\"],\n visible: \"visible\" in node ? (node.visible ?? true) : true,\n };\n\n // Layout properties\n if (\"layoutMode\" in node && node.layoutMode) {\n base.layoutMode = node.layoutMode as AnalysisNode[\"layoutMode\"];\n }\n if (\"layoutAlign\" in node && node.layoutAlign) {\n base.layoutAlign = node.layoutAlign as AnalysisNode[\"layoutAlign\"];\n }\n if (\"layoutPositioning\" in node && node.layoutPositioning) {\n base.layoutPositioning =\n node.layoutPositioning as AnalysisNode[\"layoutPositioning\"];\n }\n if (\"layoutSizingHorizontal\" in node && node.layoutSizingHorizontal) {\n base.layoutSizingHorizontal =\n node.layoutSizingHorizontal as AnalysisNode[\"layoutSizingHorizontal\"];\n }\n if (\"layoutSizingVertical\" in node && node.layoutSizingVertical) {\n base.layoutSizingVertical =\n node.layoutSizingVertical as AnalysisNode[\"layoutSizingVertical\"];\n }\n if (\"primaryAxisAlignItems\" in node) {\n base.primaryAxisAlignItems = node.primaryAxisAlignItems as string;\n }\n if (\"counterAxisAlignItems\" in node) {\n base.counterAxisAlignItems = node.counterAxisAlignItems as string;\n }\n if (\"itemSpacing\" in node) {\n base.itemSpacing = node.itemSpacing as number;\n }\n if (\"paddingLeft\" in node) {\n base.paddingLeft = node.paddingLeft as number;\n }\n if (\"paddingRight\" in node) {\n base.paddingRight = node.paddingRight as number;\n }\n if (\"paddingTop\" in node) {\n base.paddingTop = node.paddingTop as number;\n }\n if (\"paddingBottom\" in node) {\n base.paddingBottom = node.paddingBottom as number;\n }\n\n // Size constraints (responsive)\n if (\"minWidth\" in node && typeof node.minWidth === \"number\") {\n base.minWidth = node.minWidth;\n }\n if (\"maxWidth\" in node && typeof node.maxWidth === \"number\") {\n base.maxWidth = node.maxWidth;\n }\n if (\"minHeight\" in node && typeof node.minHeight === \"number\") {\n base.minHeight = node.minHeight;\n }\n if (\"maxHeight\" in node && typeof node.maxHeight === \"number\") {\n base.maxHeight = node.maxHeight;\n }\n if (\"layoutGrow\" in node && node.layoutGrow !== undefined) {\n base.layoutGrow = node.layoutGrow as 0 | 1;\n }\n if (\"constraints\" in node && node.constraints) {\n base.constraints = node.constraints as AnalysisNode[\"constraints\"];\n }\n\n // Wrap (flex-wrap)\n if (\"layoutWrap\" in node && node.layoutWrap) {\n base.layoutWrap = node.layoutWrap as AnalysisNode[\"layoutWrap\"];\n }\n if (\"counterAxisSpacing\" in node && typeof node.counterAxisSpacing === \"number\") {\n base.counterAxisSpacing = node.counterAxisSpacing;\n }\n if (\"counterAxisAlignContent\" in node && node.counterAxisAlignContent) {\n base.counterAxisAlignContent =\n node.counterAxisAlignContent as AnalysisNode[\"counterAxisAlignContent\"];\n }\n\n // Grid layout (container)\n if (\"gridRowCount\" in node && typeof node.gridRowCount === \"number\") {\n base.gridRowCount = node.gridRowCount;\n }\n if (\"gridColumnCount\" in node && typeof node.gridColumnCount === \"number\") {\n base.gridColumnCount = node.gridColumnCount;\n }\n if (\"gridRowGap\" in node && typeof node.gridRowGap === \"number\") {\n base.gridRowGap = node.gridRowGap;\n }\n if (\"gridColumnGap\" in node && typeof node.gridColumnGap === \"number\") {\n base.gridColumnGap = node.gridColumnGap;\n }\n if (\"gridColumnsSizing\" in node && typeof node.gridColumnsSizing === \"string\") {\n base.gridColumnsSizing = node.gridColumnsSizing;\n }\n if (\"gridRowsSizing\" in node && typeof node.gridRowsSizing === \"string\") {\n base.gridRowsSizing = node.gridRowsSizing;\n }\n\n // Grid layout (child)\n if (\"gridChildHorizontalAlign\" in node && node.gridChildHorizontalAlign) {\n base.gridChildHorizontalAlign =\n node.gridChildHorizontalAlign as AnalysisNode[\"gridChildHorizontalAlign\"];\n }\n if (\"gridChildVerticalAlign\" in node && node.gridChildVerticalAlign) {\n base.gridChildVerticalAlign =\n node.gridChildVerticalAlign as AnalysisNode[\"gridChildVerticalAlign\"];\n }\n if (\"gridRowSpan\" in node && typeof node.gridRowSpan === \"number\") {\n base.gridRowSpan = node.gridRowSpan;\n }\n if (\"gridColumnSpan\" in node && typeof node.gridColumnSpan === \"number\") {\n base.gridColumnSpan = node.gridColumnSpan;\n }\n if (\"gridRowAnchorIndex\" in node && typeof node.gridRowAnchorIndex === \"number\") {\n base.gridRowAnchorIndex = node.gridRowAnchorIndex;\n }\n if (\"gridColumnAnchorIndex\" in node && typeof node.gridColumnAnchorIndex === \"number\") {\n base.gridColumnAnchorIndex = node.gridColumnAnchorIndex;\n }\n\n // Overflow / clip\n if (\"clipsContent\" in node && typeof node.clipsContent === \"boolean\") {\n base.clipsContent = node.clipsContent;\n }\n if (\"overflowDirection\" in node && node.overflowDirection) {\n base.overflowDirection =\n node.overflowDirection as AnalysisNode[\"overflowDirection\"];\n }\n\n // Size/position\n if (\"absoluteBoundingBox\" in node && node.absoluteBoundingBox) {\n base.absoluteBoundingBox = node.absoluteBoundingBox;\n }\n\n // Component properties\n if (\"componentId\" in node) {\n base.componentId = node.componentId as string;\n }\n if (\"componentPropertyDefinitions\" in node) {\n base.componentPropertyDefinitions =\n node.componentPropertyDefinitions as Record<string, unknown>;\n }\n if (\"componentProperties\" in node) {\n base.componentProperties = node.componentProperties as Record<\n string,\n unknown\n >;\n }\n\n // Style properties\n if (\"styles\" in node) {\n base.styles = node.styles as Record<string, string>;\n }\n if (\"fills\" in node) {\n base.fills = node.fills as unknown[];\n }\n if (\"strokes\" in node) {\n base.strokes = node.strokes as unknown[];\n }\n if (\"strokeWeight\" in node && typeof node.strokeWeight === \"number\") {\n base.strokeWeight = node.strokeWeight;\n }\n if (\"individualStrokeWeights\" in node && node.individualStrokeWeights) {\n base.individualStrokeWeights = node.individualStrokeWeights as Record<string, number>;\n }\n if (\"effects\" in node) {\n base.effects = node.effects as unknown[];\n }\n if (\"cornerRadius\" in node && typeof node.cornerRadius === \"number\") {\n base.cornerRadius = node.cornerRadius;\n }\n if (\"opacity\" in node && typeof node.opacity === \"number\" && node.opacity < 1) {\n base.opacity = node.opacity;\n }\n\n // Variable bindings\n if (\"boundVariables\" in node && node.boundVariables) {\n base.boundVariables = node.boundVariables as Record<string, unknown>;\n }\n\n // Text properties\n if (\"characters\" in node) {\n base.characters = node.characters as string;\n }\n if (\"style\" in node) {\n base.style = node.style as Record<string, unknown>;\n }\n if (\"textTruncation\" in node && (node.textTruncation === \"DISABLED\" || node.textTruncation === \"ENDING\")) {\n base.textTruncation = node.textTruncation;\n }\n if (\"maxLines\" in node && typeof node.maxLines === \"number\") {\n base.maxLines = node.maxLines;\n }\n\n // Handoff status\n if (\"devStatus\" in node && node.devStatus) {\n base.devStatus = node.devStatus as AnalysisNode[\"devStatus\"];\n }\n\n // Prototype interactions\n if (\"interactions\" in node && Array.isArray(node.interactions) && node.interactions.length > 0) {\n base.interactions = node.interactions;\n }\n\n // Recursively transform children\n if (\"children\" in node && Array.isArray(node.children)) {\n base.children = node.children.map(transformNode);\n }\n\n return base;\n}\n\n/**\n * Transform Figma /v1/files/{key}/nodes response to analysis types.\n * Returns the first node's subtree as the document.\n */\nexport function transformFileNodesResponse(\n fileKey: string,\n response: GetFileNodesResponse\n): AnalysisFile {\n const entries = Object.values(response.nodes);\n const first = entries[0];\n if (!first)\n throw new Error(\n \"No nodes returned from Figma API — the node-id in the URL may be invalid or deleted. \" +\n \"Try selecting the frame in Figma and copying the link again.\"\n );\n\n return {\n fileKey,\n name: response.name,\n lastModified: response.lastModified,\n version: response.version,\n document: transformNode(first.document),\n components: transformComponents(first.components),\n styles: transformStyles(first.styles),\n };\n}\n\n/**\n * Transform component master nodes from a /v1/files/{key}/nodes response.\n * Each requested node ID is transformed into an AnalysisNode if present.\n */\nexport function transformComponentMasterNodes(\n response: GetFileNodesResponse,\n requestedIds: string[]\n): Record<string, AnalysisNode> {\n const result: Record<string, AnalysisNode> = {};\n for (const id of requestedIds) {\n const entry = response.nodes[id];\n if (entry?.document) {\n result[id] = transformNode(entry.document);\n }\n }\n return result;\n}\n\nfunction transformComponents(\n components: GetFileResponse[\"components\"]\n): AnalysisFile[\"components\"] {\n const result: AnalysisFile[\"components\"] = {};\n for (const [id, component] of Object.entries(components)) {\n result[id] = {\n key: component.key,\n name: component.name,\n description: component.description,\n };\n }\n return result;\n}\n\nfunction transformStyles(\n styles: GetFileResponse[\"styles\"]\n): AnalysisFile[\"styles\"] {\n const result: AnalysisFile[\"styles\"] = {};\n for (const [id, style] of Object.entries(styles)) {\n result[id] = {\n key: style.key,\n name: style.name,\n styleType: style.styleType,\n };\n }\n return result;\n}\n","import type { FigmaClient } from \"./figma-client.js\";\nimport type { AnalysisNode } from \"../contracts/figma-node.js\";\nimport { transformComponentMasterNodes } from \"./figma-transformer.js\";\n\nconst BATCH_SIZE = 50;\n\n/**\n * Recursively collect all unique componentId values from INSTANCE nodes.\n */\nexport function collectComponentIds(node: AnalysisNode): Set<string> {\n const ids = new Set<string>();\n\n function walk(n: AnalysisNode): void {\n if (n.type === \"INSTANCE\" && n.componentId) {\n ids.add(n.componentId);\n }\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n }\n\n walk(node);\n return ids;\n}\n\n/**\n * Recursively collect all unique interaction destination IDs from nodes.\n * These are the node IDs that interactions (e.g., ON_HOVER → CHANGE_TO) point to.\n */\nexport function collectInteractionDestinationIds(node: AnalysisNode): Set<string> {\n const ids = new Set<string>();\n\n function walk(n: AnalysisNode): void {\n if (n.interactions && Array.isArray(n.interactions)) {\n for (const interaction of n.interactions) {\n const i = interaction as {\n trigger?: { type?: string };\n actions?: Array<{ destinationId?: string; navigation?: string }>;\n };\n if (i.trigger?.type === \"ON_HOVER\" && i.actions) {\n for (const action of i.actions) {\n if (action.navigation === \"CHANGE_TO\" && action.destinationId) {\n ids.add(action.destinationId);\n }\n }\n }\n }\n }\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n }\n\n walk(node);\n return ids;\n}\n\n/**\n * Resolve component master node trees via multi-pass fetching.\n *\n * Pass 1: collect component IDs from the document tree, fetch their masters.\n * Pass 2+: collect component IDs from fetched masters that were not in previous passes.\n * Repeats up to maxPasses (default 2).\n *\n * Batches API calls at BATCH_SIZE IDs per request.\n * Skips IDs that return null (e.g. external library components).\n */\nexport async function resolveComponentDefinitions(\n client: FigmaClient,\n fileKey: string,\n document: AnalysisNode,\n maxPasses = 2\n): Promise<Record<string, AnalysisNode>> {\n const allDefinitions: Record<string, AnalysisNode> = {};\n const resolvedIds = new Set<string>();\n\n // Pass 1: collect from the original document\n let pendingIds = collectComponentIds(document);\n\n for (let pass = 0; pass < maxPasses; pass++) {\n // Filter out already-resolved IDs\n const idsToFetch = [...pendingIds].filter((id) => !resolvedIds.has(id));\n if (idsToFetch.length === 0) break;\n\n // Fetch in batches\n for (let i = 0; i < idsToFetch.length; i += BATCH_SIZE) {\n const batch = idsToFetch.slice(i, i + BATCH_SIZE);\n try {\n const response = await client.getFileNodes(fileKey, batch);\n const transformed = transformComponentMasterNodes(response, batch);\n for (const [id, node] of Object.entries(transformed)) {\n allDefinitions[id] = node;\n }\n } catch (err) {\n // Skip failed batches (e.g. external library components)\n console.debug(`[component-resolver] batch fetch failed (${batch.length} ids):`, err);\n }\n }\n\n // Mark all attempted IDs as resolved (even if they failed/returned null)\n for (const id of idsToFetch) {\n resolvedIds.add(id);\n }\n\n // Collect new IDs only from masters fetched in this pass (not all accumulated)\n pendingIds = new Set<string>();\n for (const id of idsToFetch) {\n const node = allDefinitions[id];\n if (node) {\n for (const nestedId of collectComponentIds(node)) {\n if (!resolvedIds.has(nestedId)) {\n pendingIds.add(nestedId);\n }\n }\n }\n }\n }\n\n return allDefinitions;\n}\n\n/**\n * Resolve interaction destination nodes (e.g., hover variants).\n *\n * Collects all destinationId values from interactions in the document,\n * excludes those already in componentDefinitions, and fetches them.\n */\nexport async function resolveInteractionDestinations(\n client: FigmaClient,\n fileKey: string,\n document: AnalysisNode,\n existingDefinitions?: Record<string, AnalysisNode>,\n): Promise<Record<string, AnalysisNode>> {\n const destIds = collectInteractionDestinationIds(document);\n if (destIds.size === 0) return {};\n\n const allDestinations: Record<string, AnalysisNode> = {};\n const idsToFetch: string[] = [];\n\n for (const id of destIds) {\n const existing = existingDefinitions?.[id];\n if (existing) {\n allDestinations[id] = existing;\n } else {\n idsToFetch.push(id);\n }\n }\n\n if (idsToFetch.length === 0) return allDestinations;\n\n for (let i = 0; i < idsToFetch.length; i += BATCH_SIZE) {\n const batch = idsToFetch.slice(i, i + BATCH_SIZE);\n try {\n const response = await client.getFileNodes(fileKey, batch);\n const transformed = transformComponentMasterNodes(response, batch);\n for (const [id, node] of Object.entries(transformed)) {\n allDestinations[id] = node;\n }\n } catch (err) {\n console.debug(`[component-resolver] interaction destination fetch failed (${batch.length} ids):`, err);\n }\n }\n\n return allDestinations;\n}\n","/**\n * Extract a DOM-like design tree from AnalysisFile.\n * Converts Figma node tree to a concise text format with inline CSS styles.\n * AI reads this 1:1 to generate HTML+CSS — no information loss, 50-100x smaller.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\n\n/** Convert Figma RGBA color object to CSS hex string. */\nfunction rgbaToHex(color: { r?: number; g?: number; b?: number; a?: number }): string | null {\n if (!color) return null;\n const r = Math.round((color.r ?? 0) * 255);\n const g = Math.round((color.g ?? 0) * 255);\n const b = Math.round((color.b ?? 0) * 255);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`.toUpperCase();\n}\n\ninterface FillInfo {\n color: string | null;\n hasImage: boolean;\n imageScaleMode: string | null;\n}\n\n/** Extract fill color and IMAGE presence from a node, skipping invisible fills. */\nfunction getFillInfo(node: AnalysisNode): FillInfo {\n const result: FillInfo = { color: null, hasImage: false, imageScaleMode: null };\n if (!node.fills || !Array.isArray(node.fills)) return result;\n for (const fill of node.fills) {\n const f = fill as {\n type?: string;\n visible?: boolean;\n color?: { r?: number; g?: number; b?: number; a?: number };\n opacity?: number;\n boundVariables?: { color?: { id?: string } };\n scaleMode?: string;\n };\n // Skip invisible fills\n if (f.visible === false) continue;\n if (f.type === \"SOLID\" && f.color) {\n const opacity = f.opacity ?? f.color.a ?? 1;\n let colorValue: string;\n if (opacity < 1) {\n const r = Math.round((f.color.r ?? 0) * 255);\n const g = Math.round((f.color.g ?? 0) * 255);\n const b = Math.round((f.color.b ?? 0) * 255);\n colorValue = `rgba(${r}, ${g}, ${b}, ${opacity})`;\n } else {\n colorValue = rgbaToHex(f.color) ?? \"#000\";\n }\n // Append variable reference if available\n if (f.boundVariables?.color?.id) {\n result.color = `${colorValue} /* var:${f.boundVariables.color.id} */`;\n } else {\n result.color = colorValue;\n }\n } else if (f.type === \"IMAGE\") {\n result.hasImage = true;\n result.imageScaleMode = f.scaleMode ?? null;\n }\n }\n return result;\n}\n\n/** @deprecated Use getFillInfo instead for full fill details */\nfunction getFill(node: AnalysisNode): string | null {\n return getFillInfo(node).color;\n}\n\n/** Extract the first solid stroke color as a CSS hex string. */\nfunction getStroke(node: AnalysisNode): string | null {\n if (!node.strokes || !Array.isArray(node.strokes)) return null;\n for (const stroke of node.strokes) {\n const s = stroke as { type?: string; color?: { r?: number; g?: number; b?: number } };\n if (s.type === \"SOLID\" && s.color) return rgbaToHex(s.color);\n }\n return null;\n}\n\n/** Extract the first visible shadow effect as a CSS box-shadow value. */\nfunction getShadow(node: AnalysisNode): string | null {\n if (!node.effects || !Array.isArray(node.effects)) return null;\n for (const effect of node.effects) {\n const e = effect as {\n type?: string;\n visible?: boolean;\n color?: { r?: number; g?: number; b?: number };\n offset?: { x?: number; y?: number };\n radius?: number;\n };\n if ((e.type === \"DROP_SHADOW\" || e.type === \"INNER_SHADOW\") && e.visible !== false) {\n const c = e.color ? rgbaToHex(e.color) : \"#000\";\n const ox = e.offset?.x ?? 0;\n const oy = e.offset?.y ?? 0;\n return `${ox}px ${oy}px ${e.radius ?? 0}px ${c}`;\n }\n }\n return null;\n}\n\n/** Map Figma alignment values to CSS flexbox equivalents. */\nfunction mapAlign(figmaAlign: string): string {\n const map: Record<string, string> = {\n MIN: \"flex-start\",\n CENTER: \"center\",\n MAX: \"flex-end\",\n SPACE_BETWEEN: \"space-between\",\n };\n return map[figmaAlign] ?? figmaAlign;\n}\n\n/** Map Figma text horizontal alignment to CSS text-align. */\nfunction mapTextAlignHorizontal(figmaAlign: string): string {\n const map: Record<string, string> = {\n LEFT: \"left\",\n CENTER: \"center\",\n RIGHT: \"right\",\n JUSTIFIED: \"justify\",\n };\n return map[figmaAlign] ?? figmaAlign.toLowerCase();\n}\n\n/** Map Figma text vertical alignment to CSS flex align-items. */\nfunction mapTextAlignVertical(figmaAlign: string): string {\n const map: Record<string, string> = {\n TOP: \"flex-start\",\n CENTER: \"center\",\n BOTTOM: \"flex-end\",\n };\n return map[figmaAlign] ?? figmaAlign.toLowerCase();\n}\n\n/** Get variable reference comment from boundVariables if available. */\nfunction getVarRef(node: AnalysisNode, prop: string): string {\n const bv = node.boundVariables as Record<string, unknown> | undefined;\n if (!bv) return \"\";\n const ref = bv[prop];\n if (!ref) return \"\";\n if (typeof ref === \"object\" && ref !== null && \"id\" in ref) {\n return ` /* var:${(ref as { id: string }).id} */`;\n }\n return \"\";\n}\n\n/** Get first variable ref among multiple properties. */\nfunction getFirstVarRef(node: AnalysisNode, props: string[]): string {\n for (const prop of props) {\n const ref = getVarRef(node, prop);\n if (ref) return ref;\n }\n return \"\";\n}\n\n/** Format instance component property values for AI hints. */\nfunction formatComponentProperties(node: AnalysisNode): string | null {\n if (!node.componentProperties || typeof node.componentProperties !== \"object\") return null;\n const entries = Object.entries(node.componentProperties)\n .map(([name, value]) => {\n const v = value as { value?: unknown };\n const raw = typeof v?.value === \"string\" ? v.value : JSON.stringify(v?.value ?? \"\");\n return `${name}=${raw}`;\n });\n if (entries.length === 0) return null;\n return entries.join(\", \");\n}\n\n/** Extract key visual styles from a node for hover diff comparison. */\nfunction extractVisualStyles(node: AnalysisNode): Record<string, string> {\n const styles: Record<string, string> = {};\n const fillInfo = getFillInfo(node);\n if (fillInfo.color && node.type !== \"TEXT\") styles[\"background\"] = fillInfo.color;\n const stroke = getStroke(node);\n if (stroke) styles[\"border-color\"] = stroke;\n if (node.cornerRadius) styles[\"border-radius\"] = `${node.cornerRadius}px`;\n if (node.opacity !== undefined && node.opacity < 1) styles[\"opacity\"] = `${Math.round(node.opacity * 100) / 100}`;\n const shadow = getShadow(node);\n if (shadow) styles[\"box-shadow\"] = shadow;\n // Text color\n if (node.type === \"TEXT\") {\n const textColor = getFill(node);\n if (textColor) styles[\"color\"] = textColor;\n }\n return styles;\n}\n\nconst HOVER_STYLE_DEFAULTS: Record<string, string> = {\n background: \"transparent\",\n \"border-color\": \"transparent\",\n \"border-radius\": \"0px\",\n opacity: \"1\",\n \"box-shadow\": \"none\",\n color: \"inherit\",\n};\n\nfunction getHoverResetValue(styleKey: string): string {\n return HOVER_STYLE_DEFAULTS[styleKey] ?? \"initial\";\n}\n\nfunction appendStyleDiffs(\n currentStyles: Record<string, string>,\n hoverStyles: Record<string, string>,\n diffs: string[],\n namePrefix?: string,\n): void {\n const styleKeys = new Set([...Object.keys(currentStyles), ...Object.keys(hoverStyles)]);\n for (const key of styleKeys) {\n const currentValue = currentStyles[key];\n const hoverValue = hoverStyles[key] ?? getHoverResetValue(key);\n if (currentValue !== hoverValue) {\n const prefix = namePrefix ? `${namePrefix}: ` : \"\";\n diffs.push(`${prefix}${key}: ${hoverValue}`);\n }\n }\n}\n\nfunction getChildStableKey(node: AnalysisNode): string | null {\n // Prefer name over id: variant children share the same name but have different ids\n if (node.name) return `name:${node.name}`;\n return node.id ?? null;\n}\n\n/** Compute style diff between current node and its hover variant. */\nfunction computeHoverDiff(\n currentNode: AnalysisNode,\n hoverNode: AnalysisNode,\n): string | null {\n const current = extractVisualStyles(currentNode);\n const hover = extractVisualStyles(hoverNode);\n const diffs: string[] = [];\n appendStyleDiffs(current, hover, diffs);\n // Check children for text/color changes (first level only)\n if (currentNode.children && hoverNode.children) {\n const hoverByStableKey = new Map<string, AnalysisNode>();\n const hoverUnmatchedByIndex: AnalysisNode[] = [];\n\n for (const child of hoverNode.children) {\n const key = getChildStableKey(child);\n if (key) {\n // Keep the first occurrence to reduce noisy collisions.\n if (!hoverByStableKey.has(key)) hoverByStableKey.set(key, child);\n } else {\n hoverUnmatchedByIndex.push(child);\n }\n }\n\n let unkeyedIdx = 0;\n for (let i = 0; i < currentNode.children.length; i++) {\n const cc = currentNode.children[i];\n if (!cc) continue;\n\n const stableKey = getChildStableKey(cc);\n let hc: AnalysisNode | undefined;\n if (stableKey) {\n hc = hoverByStableKey.get(stableKey);\n } else {\n hc = hoverUnmatchedByIndex[unkeyedIdx];\n unkeyedIdx++;\n }\n if (!hc) continue;\n const ccStyles = extractVisualStyles(cc);\n const hcStyles = extractVisualStyles(hc);\n appendStyleDiffs(ccStyles, hcStyles, diffs, cc.name);\n }\n }\n return diffs.length > 0 ? diffs.join(\"; \") : null;\n}\n\n/** Render a single node and its children as indented design-tree text. */\nfunction renderNode(\n node: AnalysisNode,\n indent: number,\n vectorDir?: string,\n components?: AnalysisFile[\"components\"],\n imageMapping?: Record<string, string>,\n vectorMapping?: Record<string, string>,\n fileStyles?: AnalysisFile[\"styles\"],\n interactionDests?: Record<string, AnalysisNode>,\n parentBBox?: { x: number; y: number; width: number; height: number },\n): string {\n if (node.visible === false) return \"\";\n\n const prefix = \" \".repeat(indent);\n const lines: string[] = [];\n\n // Header — annotate INSTANCE nodes with component name\n const bbox = node.absoluteBoundingBox;\n const w = bbox ? Math.round(bbox.width) : \"?\";\n const h = bbox ? Math.round(bbox.height) : \"?\";\n let header = `${prefix}${node.name} (${node.type}, ${w}x${h})`;\n if (node.type === \"INSTANCE\" && node.componentId && components) {\n const comp = components[node.componentId];\n if (comp) {\n header += ` [component: ${comp.name}]`;\n }\n }\n lines.push(header);\n if (node.type === \"INSTANCE\") {\n const componentProps = formatComponentProperties(node);\n if (componentProps) {\n lines.push(`${prefix} component-properties: ${componentProps}`);\n }\n }\n\n // Styles\n const styles: string[] = [];\n\n // Layout\n if (node.layoutMode && node.layoutMode !== \"NONE\") {\n if (node.layoutMode === \"GRID\") {\n styles.push(`display: grid`);\n if (node.gridColumnsSizing) styles.push(`grid-template-columns: ${node.gridColumnsSizing}`);\n if (node.gridRowsSizing) styles.push(`grid-template-rows: ${node.gridRowsSizing}`);\n if (node.gridColumnGap != null && node.gridRowGap != null) {\n styles.push(`gap: ${node.gridRowGap}px ${node.gridColumnGap}px`);\n } else if (node.gridRowGap != null) {\n styles.push(`row-gap: ${node.gridRowGap}px`);\n } else if (node.gridColumnGap != null) {\n styles.push(`column-gap: ${node.gridColumnGap}px`);\n } else if (node.itemSpacing != null) {\n styles.push(`gap: ${node.itemSpacing}px`);\n }\n } else {\n const dir = node.layoutMode === \"VERTICAL\" ? \"column\" : \"row\";\n styles.push(`display: flex; flex-direction: ${dir}`);\n if (node.layoutWrap === \"WRAP\") styles.push(`flex-wrap: wrap`);\n if (node.itemSpacing != null) {\n const mainGap = node.layoutMode === \"VERTICAL\" ? \"row-gap\" : \"column-gap\";\n styles.push(`${mainGap}: ${node.itemSpacing}px${getVarRef(node, \"itemSpacing\")}`);\n }\n if (node.counterAxisSpacing != null) {\n const crossGap = node.layoutMode === \"VERTICAL\" ? \"column-gap\" : \"row-gap\";\n styles.push(`${crossGap}: ${node.counterAxisSpacing}px${getVarRef(node, \"counterAxisSpacing\")}`);\n }\n if (node.primaryAxisAlignItems) styles.push(`justify-content: ${mapAlign(node.primaryAxisAlignItems)}`);\n // Figma default is MIN (flex-start), CSS default is stretch — emit explicitly\n styles.push(`align-items: ${mapAlign(node.counterAxisAlignItems ?? \"MIN\")}`);\n if (node.counterAxisAlignContent && node.counterAxisAlignContent !== \"AUTO\") {\n styles.push(`align-content: ${mapAlign(node.counterAxisAlignContent)}`);\n }\n }\n }\n // Child self-alignment in auto-layout\n if (node.layoutAlign && node.layoutAlign !== \"INHERIT\") {\n styles.push(`align-self: ${mapAlign(node.layoutAlign)}`);\n }\n if (node.layoutGrow === 1) {\n styles.push(\"flex-grow: 1\");\n }\n\n // Absolute positioning (child placed outside normal auto-layout flow)\n if (node.layoutPositioning === \"ABSOLUTE\") {\n styles.push(\"position: absolute\");\n if (parentBBox && node.absoluteBoundingBox) {\n const top = Math.round(node.absoluteBoundingBox.y - parentBBox.y);\n const left = Math.round(node.absoluteBoundingBox.x - parentBBox.x);\n styles.push(`top: ${top}px`);\n styles.push(`left: ${left}px`);\n }\n }\n // If any child is absolute, parent needs position: relative (but not if already absolute)\n if (node.layoutPositioning !== \"ABSOLUTE\" && node.children?.some((c) => c.layoutPositioning === \"ABSOLUTE\")) {\n styles.push(\"position: relative\");\n }\n\n // Padding\n const pt = node.paddingTop ?? 0;\n const pr = node.paddingRight ?? 0;\n const pb = node.paddingBottom ?? 0;\n const pl = node.paddingLeft ?? 0;\n if (pt || pr || pb || pl) {\n const padRef = getFirstVarRef(node, [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"]);\n styles.push(`padding: ${pt}px ${pr}px ${pb}px ${pl}px${padRef}`);\n }\n\n // Sizing — FILL = stretch to parent. If flex-grow is already set, skip width: 100% (redundant + breaks wrap layouts)\n if (node.layoutSizingHorizontal === \"FILL\" && node.layoutGrow !== 1) styles.push(\"width: 100%\");\n if (node.layoutSizingVertical === \"FILL\") styles.push(\"height: 100%\");\n\n // Fill (not for TEXT — text fill is color)\n const fillInfo = getFillInfo(node);\n if (fillInfo.color && node.type !== \"TEXT\") styles.push(`background: ${fillInfo.color}`);\n if (fillInfo.hasImage) {\n const hasChildren = node.children && node.children.length > 0;\n const mappedFile = imageMapping?.[node.id];\n if (mappedFile) {\n if (hasChildren) {\n // Background image: node has children on top → CSS background-image\n styles.push(`background-image: url(images/${mappedFile})`);\n styles.push(\"background-position: center\");\n styles.push(\"background-repeat: no-repeat\");\n if (fillInfo.imageScaleMode === \"FIT\") {\n styles.push(\"background-size: contain\");\n } else if (fillInfo.imageScaleMode === \"FILL\") {\n styles.push(\"background-size: cover\");\n }\n } else {\n // Content image: leaf node → <img> tag\n styles.push(`content-image: url(images/${mappedFile})`);\n if (fillInfo.imageScaleMode === \"FIT\") {\n styles.push(\"object-fit: contain\");\n } else if (fillInfo.imageScaleMode === \"FILL\") {\n styles.push(\"object-fit: cover\");\n }\n }\n } else {\n styles.push(hasChildren ? \"background-image: [IMAGE]\" : \"content-image: [IMAGE]\");\n }\n }\n\n // Border — respect per-side stroke weights\n const stroke = getStroke(node);\n if (stroke) {\n const isw = node.individualStrokeWeights as\n | { top?: number; right?: number; bottom?: number; left?: number }\n | undefined;\n const sw = (node.strokeWeight as number | undefined) ?? 1;\n if (isw) {\n const strokeRef = getFirstVarRef(node, [\"individualStrokeWeights\", \"strokes\"]);\n if (isw.top) styles.push(`border-top: ${isw.top}px solid ${stroke}${strokeRef}`);\n if (isw.right) styles.push(`border-right: ${isw.right}px solid ${stroke}${strokeRef}`);\n if (isw.bottom) styles.push(`border-bottom: ${isw.bottom}px solid ${stroke}${strokeRef}`);\n if (isw.left) styles.push(`border-left: ${isw.left}px solid ${stroke}${strokeRef}`);\n } else {\n styles.push(`border: ${sw}px solid ${stroke}${getVarRef(node, \"strokes\")}`);\n }\n }\n\n // Border radius\n if (node.cornerRadius) {\n const radiusRef = getVarRef(node, \"rectangleCornerRadii\");\n styles.push(`border-radius: ${node.cornerRadius}px${radiusRef}`);\n }\n\n // Shadow\n const shadow = getShadow(node);\n if (shadow) styles.push(`box-shadow: ${shadow}`);\n\n // Overflow\n if (node.clipsContent) styles.push(\"overflow: hidden\");\n\n // Opacity\n if (node.opacity !== undefined && node.opacity < 1) {\n styles.push(`opacity: ${Math.round(node.opacity * 100) / 100}`);\n }\n\n // Min/max constraints\n if (node.minWidth !== undefined) styles.push(`min-width: ${Math.round(node.minWidth)}px`);\n if (node.maxWidth !== undefined) styles.push(`max-width: ${Math.round(node.maxWidth)}px`);\n if (node.minHeight !== undefined) styles.push(`min-height: ${Math.round(node.minHeight)}px`);\n if (node.maxHeight !== undefined) styles.push(`max-height: ${Math.round(node.maxHeight)}px`);\n\n // Typography\n if (node.type === \"TEXT\" && node.style) {\n // Add text style name if available\n const nodeStyles = node.styles as Record<string, string> | undefined;\n const textStyleId = nodeStyles?.[\"text\"];\n if (textStyleId && fileStyles) {\n const styleInfo = fileStyles[textStyleId] as { name?: string } | undefined;\n if (styleInfo?.name) {\n styles.push(`/* text-style: ${styleInfo.name} */`);\n }\n }\n\n const s = node.style as Record<string, unknown>;\n if (s[\"fontFamily\"]) styles.push(`font-family: \"${s[\"fontFamily\"]}\"${getVarRef(node, \"fontFamily\")}`);\n if (s[\"fontWeight\"]) styles.push(`font-weight: ${s[\"fontWeight\"]}${getVarRef(node, \"fontWeight\")}`);\n if (s[\"fontSize\"]) styles.push(`font-size: ${s[\"fontSize\"]}px${getVarRef(node, \"fontSize\")}`);\n if (s[\"lineHeightPx\"]) {\n const lh = s[\"lineHeightPx\"] as number;\n styles.push(`line-height: ${Math.round(lh * 100) / 100}px`);\n }\n if (s[\"letterSpacing\"]) {\n const ls = s[\"letterSpacing\"] as number;\n styles.push(`letter-spacing: ${Math.round(ls * 100) / 100}px`);\n }\n if (s[\"textDecoration\"]) {\n const td = (s[\"textDecoration\"] as string).toLowerCase();\n if (td !== \"none\") styles.push(`text-decoration: ${td}`);\n }\n if (s[\"textAlignHorizontal\"]) {\n styles.push(`text-align: ${mapTextAlignHorizontal(String(s[\"textAlignHorizontal\"]))}`);\n }\n if (s[\"textAlignVertical\"] && s[\"textAlignVertical\"] !== \"TOP\") {\n // CSS has no direct text vertical-align in a text box; emit flex hint.\n // TOP is the default — only emit for CENTER/BOTTOM.\n styles.push(\"display: flex\");\n styles.push(`align-items: ${mapTextAlignVertical(String(s[\"textAlignVertical\"]))}`);\n }\n\n const textColor = getFill(node);\n if (textColor) styles.push(`color: ${textColor}`);\n\n // Text auto-resize behavior\n const textAutoResize = s[\"textAutoResize\"] as string | undefined;\n if (textAutoResize === \"WIDTH_AND_HEIGHT\") {\n styles.push(\"text-resize: auto\");\n } else if (textAutoResize === \"HEIGHT\") {\n styles.push(\"text-resize: fixed-height\");\n } else if (textAutoResize === \"TRUNCATE\") {\n styles.push(\"text-resize: truncate\");\n styles.push(\"text-overflow: ellipsis\");\n if (node.maxLines != null) {\n styles.push(`max-lines: ${node.maxLines}`);\n }\n }\n\n // Text truncation (when textAutoResize is not TRUNCATE but truncation is set)\n if (textAutoResize !== \"TRUNCATE\" && node.textTruncation === \"ENDING\") {\n styles.push(\"text-overflow: ellipsis\");\n if (node.maxLines != null) {\n styles.push(`max-lines: ${node.maxLines}`);\n }\n }\n\n // Paragraph spacing\n const paragraphSpacing = s[\"paragraphSpacing\"] as number | undefined;\n if (paragraphSpacing) {\n styles.push(`paragraph-spacing: ${paragraphSpacing}px`);\n }\n }\n\n // Text content\n if (node.type === \"TEXT\" && node.characters) {\n styles.push(`text: \"${node.characters.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, '\\\\\"')}\"`);\n }\n\n // Vector SVG inline (when vector dir with downloaded SVGs is available)\n if (node.type === \"VECTOR\" && vectorDir) {\n const mappedFile = vectorMapping?.[node.id];\n const svgPath = mappedFile\n ? join(vectorDir, mappedFile)\n : join(vectorDir, `${node.id.replace(/:/g, \"-\")}.svg`); // fallback to legacy ID-based naming\n if (existsSync(svgPath)) {\n const svg = readFileSync(svgPath, \"utf-8\").trim().replace(/\\n\\s*/g, \" \");\n styles.push(`svg: ${svg}`);\n }\n }\n\n if (styles.length > 0) {\n lines.push(`${prefix} style: ${styles.join(\"; \")}`);\n }\n\n // Interaction states (hover)\n if (node.interactions && interactionDests) {\n for (const interaction of node.interactions) {\n const i = interaction as {\n trigger?: { type?: string };\n actions?: Array<{ destinationId?: string; navigation?: string }>;\n };\n if (i.trigger?.type === \"ON_HOVER\" && i.actions) {\n for (const action of i.actions) {\n if (action.destinationId && action.navigation === \"CHANGE_TO\") {\n const hoverNode = interactionDests[action.destinationId];\n if (hoverNode) {\n const diff = computeHoverDiff(node, hoverNode);\n if (diff) {\n lines.push(`${prefix} [hover]: ${diff}`);\n }\n }\n }\n }\n }\n }\n }\n\n // Children\n if (node.children) {\n for (const child of node.children) {\n const childOutput = renderNode(child, indent + 1, vectorDir, components, imageMapping, vectorMapping, fileStyles, interactionDests, node.absoluteBoundingBox ?? undefined);\n if (childOutput) lines.push(childOutput);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Options for design tree generation. */\nexport interface DesignTreeOptions {\n /** Directory containing <nodeId>.svg files for VECTOR nodes */\n vectorDir?: string;\n /** Directory containing downloaded PNGs and mapping.json for IMAGE fill nodes */\n imageDir?: string;\n}\n\n/**\n * Generate a design tree string from an AnalysisFile.\n */\nexport interface DesignTreeResult {\n /** The design tree text */\n tree: string;\n /** Estimated token count (~4 chars per token for mixed code/text) */\n estimatedTokens: number;\n /** Raw byte size */\n bytes: number;\n}\n\n/**\n * Generate a design tree string from an AnalysisFile.\n */\nexport function generateDesignTree(file: AnalysisFile, options?: DesignTreeOptions): string {\n return generateDesignTreeWithStats(file, options).tree;\n}\n\n/**\n * Generate a design tree with token/size statistics.\n * Use this when you need to measure token consumption for AI context budget.\n */\nexport function generateDesignTreeWithStats(file: AnalysisFile, options?: DesignTreeOptions): DesignTreeResult {\n const root = file.document;\n const w = root.absoluteBoundingBox ? Math.round(root.absoluteBoundingBox.width) : 0;\n const h = root.absoluteBoundingBox ? Math.round(root.absoluteBoundingBox.height) : 0;\n\n // Load image mapping once if imageDir is provided\n let imageMapping: Record<string, string> | undefined;\n if (options?.imageDir) {\n const mappingPath = join(options.imageDir, \"mapping.json\");\n if (existsSync(mappingPath)) {\n try {\n imageMapping = JSON.parse(readFileSync(mappingPath, \"utf-8\")) as Record<string, string>;\n } catch { /* ignore malformed mapping */ }\n }\n }\n\n // Load vector mapping once if vectorDir is provided\n let vectorMapping: Record<string, string> | undefined;\n if (options?.vectorDir) {\n const mappingPath = join(options.vectorDir, \"mapping.json\");\n if (existsSync(mappingPath)) {\n try {\n vectorMapping = JSON.parse(readFileSync(mappingPath, \"utf-8\")) as Record<string, string>;\n } catch { /* ignore malformed mapping */ }\n }\n }\n\n const tree = renderNode(root, 0, options?.vectorDir, file.components, imageMapping, vectorMapping, file.styles, file.interactionDestinations);\n\n const result = [\n \"# Design Tree\",\n `# Root: ${w}px x ${h}px`,\n \"# Each node shows: name (TYPE, WxH) followed by CSS-like styles\",\n \"# Reproduce this tree as HTML. Each node = one HTML element.\",\n \"# Every style value is from Figma data — use exactly as shown.\",\n \"\",\n tree,\n ].join(\"\\n\");\n\n const bytes = Buffer.byteLength(result, \"utf-8\");\n // ~4 chars per token for mixed code/text (conservative estimate)\n const estimatedTokens = Math.ceil(result.length / 4);\n\n return { tree: result, estimatedTokens, bytes };\n}\n","/**\n * Pure helper functions extracted from visual-compare.ts.\n * These have no side effects beyond file I/O and can be tested directly.\n */\n\nimport { writeFileSync, readFileSync, mkdirSync, statSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport pixelmatch from \"pixelmatch\";\nimport { PNG } from \"pngjs\";\n\n/** Directory used for caching Figma screenshots. */\nexport const FIGMA_CACHE_DIR = \"/tmp/canicode-figma-cache\";\n\n/**\n * Known @1x screenshot widths from fixture convention.\n * Screenshots at these widths are captured at 1x scale (pixel width = logical width).\n * All other widths are assumed @2x (e.g., 2400px PNG = 1200px logical).\n */\nexport const KNOWN_1X_WIDTHS = [1920, 768];\n\n/**\n * Infer the export scale of a fixture screenshot based on its pixel width.\n * Uses KNOWN_1X_WIDTHS convention: 1920/768 = @1x, others = @2x.\n */\nexport function inferExportScale(pngWidth: number): number {\n return KNOWN_1X_WIDTHS.includes(pngWidth) ? 1 : 2;\n}\n\n/** Cache time-to-live: 1 hour. */\nexport const FIGMA_CACHE_TTL_MS = 60 * 60 * 1000;\n\n/**\n * Tolerance for detecting integer scale factors (@2x, @3x).\n * Broader tolerance because render/rounding errors accumulate at higher scales.\n */\nexport const SCALE_ROUNDING_TOLERANCE = 0.08;\n\n/**\n * Tolerance for detecting 1x (unity) scale.\n * Tighter to avoid false positives — misidentifying a scaled PNG as 1x.\n */\nexport const UNITY_SCALE_TOLERANCE = 0.02;\n\n/**\n * Get the cache path for a given fileKey + nodeId combination.\n */\nexport function getFigmaCachePath(fileKey: string, nodeId: string, scale: number): string {\n // Sanitize nodeId for use as filename (replace : with -)\n const safeNodeId = nodeId.replace(/:/g, \"-\");\n return resolve(FIGMA_CACHE_DIR, `${fileKey}_${safeNodeId}@${scale}x.png`);\n}\n\n/**\n * Check if a cached Figma screenshot exists and is still fresh (within TTL).\n */\nexport function isCacheFresh(cachePath: string): boolean {\n try {\n const stats = statSync(cachePath);\n return Date.now() - stats.mtimeMs < FIGMA_CACHE_TTL_MS;\n } catch {\n // File doesn't exist or was removed between check and stat (TOCTOU safe)\n return false;\n }\n}\n\n/**\n * Infer device pixel ratio so the Playwright screenshot matches Figma PNG pixel dimensions.\n */\nexport function inferDeviceScaleFactor(\n pngW: number,\n pngH: number,\n logicalW: number,\n logicalH: number,\n fallback: number,\n): number {\n if (logicalW <= 0 || logicalH <= 0) return 1;\n const sx = pngW / logicalW;\n const sy = pngH / logicalH;\n const rounded = Math.round((sx + sy) / 2);\n if (rounded >= 2 && Math.abs(sx - rounded) < SCALE_ROUNDING_TOLERANCE && Math.abs(sy - rounded) < SCALE_ROUNDING_TOLERANCE) {\n return rounded;\n }\n if (Math.abs(sx - 1) < UNITY_SCALE_TOLERANCE && Math.abs(sy - 1) < UNITY_SCALE_TOLERANCE) return 1;\n return fallback >= 2 ? fallback : Math.max(1, Math.round(sx));\n}\n\n/**\n * Pad a PNG to target dimensions with a high-contrast fill color (magenta #FF00FF).\n * Unlike resize, padding preserves original pixels 1:1 and guarantees that\n * any size difference is counted as mismatched pixels by pixelmatch.\n *\n * Note: If both images contain magenta in the padded area, those pixels\n * will match — extremely rare in real designs but theoretically possible.\n */\nexport function padPng(png: PNG, targetWidth: number, targetHeight: number): PNG {\n const padded = new PNG({ width: targetWidth, height: targetHeight });\n // Fill entire canvas with magenta (FF00FF) — guaranteed to differ from any real content\n for (let i = 0; i < padded.data.length; i += 4) {\n padded.data[i] = 255; // R\n padded.data[i + 1] = 0; // G\n padded.data[i + 2] = 255; // B\n padded.data[i + 3] = 255; // A\n }\n // Copy original pixels into top-left corner\n for (let y = 0; y < png.height; y++) {\n for (let x = 0; x < png.width; x++) {\n const srcIdx = (y * png.width + x) * 4;\n const dstIdx = (y * targetWidth + x) * 4;\n padded.data[dstIdx] = png.data[srcIdx]!;\n padded.data[dstIdx + 1] = png.data[srcIdx + 1]!;\n padded.data[dstIdx + 2] = png.data[srcIdx + 2]!;\n padded.data[dstIdx + 3] = png.data[srcIdx + 3]!;\n }\n }\n return padded;\n}\n\n/** Options for screenshot comparison. */\nexport interface CompareOptions {\n /** How to handle size mismatches: \"pad\" (magenta fill) or \"crop\" (min dimensions). Default: \"pad\". */\n sizeMismatch?: \"pad\" | \"crop\";\n /** pixelmatch threshold (0-1). Default: 0.1. */\n threshold?: number;\n}\n\n/**\n * Crop a PNG to target dimensions (top-left corner preserved).\n */\nexport function cropPng(png: PNG, targetWidth: number, targetHeight: number): PNG {\n const cropped = new PNG({ width: targetWidth, height: targetHeight });\n for (let y = 0; y < targetHeight; y++) {\n png.data.copy(cropped.data, y * targetWidth * 4, y * png.width * 4, y * png.width * 4 + targetWidth * 4);\n }\n return cropped;\n}\n\n/**\n * Compare two PNG files using pixelmatch.\n */\nexport function compareScreenshots(\n path1: string,\n path2: string,\n diffOutputPath: string,\n options?: CompareOptions,\n): { similarity: number; diffPixels: number; totalPixels: number; width: number; height: number } {\n const sizeMismatch = options?.sizeMismatch ?? \"pad\";\n const threshold = options?.threshold ?? 0.1;\n const raw1 = PNG.sync.read(readFileSync(path1));\n const raw2 = PNG.sync.read(readFileSync(path2));\n\n let img1: PNG = raw1;\n let img2: PNG = raw2;\n\n // Size mismatch — normalize to same dimensions\n if (raw1.width !== raw2.width || raw1.height !== raw2.height) {\n if (sizeMismatch === \"crop\") {\n const width = Math.min(raw1.width, raw2.width);\n const height = Math.min(raw1.height, raw2.height);\n img1 = cropPng(raw1, width, height);\n img2 = cropPng(raw2, width, height);\n } else {\n const width = Math.max(raw1.width, raw2.width);\n const height = Math.max(raw1.height, raw2.height);\n img1 = padPng(raw1, width, height);\n img2 = padPng(raw2, width, height);\n }\n }\n\n const { width, height } = img1;\n const diff = new PNG({ width, height });\n const diffPixels = pixelmatch(img1.data, img2.data, diff.data, width, height, { threshold });\n\n mkdirSync(dirname(diffOutputPath), { recursive: true });\n writeFileSync(diffOutputPath, PNG.sync.write(diff));\n\n const totalPixels = width * height;\n const similarity = diffPixels === 0 ? 100 : Math.floor((1 - diffPixels / totalPixels) * 100);\n\n return { similarity, diffPixels, totalPixels, width, height };\n}\n\n// ── Root width expansion (for responsive comparison) ─────────────────────\n\n/**\n * Replace fixed root-element widths in HTML with fluid values so the layout\n * can expand to fill a wider viewport.\n *\n * Targets the first CSS rule that sets a pixel `width` on the root container\n * (commonly `.root`, `body > div`, etc.) and replaces it with `width: 100%`.\n * Also removes `min-width` pixel constraints.\n *\n * Originally from `src/experiments/ablation/run-condition.ts`.\n */\nexport function expandRootWidth(html: string): string {\n const styleMatch = html.match(/<style[\\s\\S]*?<\\/style>/i);\n if (!styleMatch) return html;\n\n const style = styleMatch[0];\n // Find the first CSS rule block (the root element's rule)\n const firstRuleMatch = style.match(/([^{}]*\\{)([^}]*)\\}/);\n if (!firstRuleMatch) return html;\n\n const rulePrefix = firstRuleMatch[1]!; // e.g. \".root {\"\n const ruleBody = firstRuleMatch[2]!; // e.g. \" width: 375px; min-width: 375px; \"\n\n // Replace width and min-width only inside the first rule\n const newBody = ruleBody\n .replace(/(?<![-\\w])width:\\s*\\d+px/, \"width: 100%\")\n .replace(/min-width:\\s*\\d+px/g, \"min-width: 0\");\n\n const newRule = `${rulePrefix}${newBody}}`;\n const newStyle = style.replace(firstRuleMatch[0], newRule);\n return html.replace(style, newStyle);\n}\n\n// ── Code metrics (shared with ablation helpers) ─────────────────────────\n\n/** Count unique CSS class selectors in an HTML string's <style> block. */\nexport function countCssClasses(html: string): number {\n const styleMatch = html.match(/<style[\\s\\S]*?<\\/style>/i);\n if (!styleMatch) return 0;\n const classes = styleMatch[0].match(/\\.[a-zA-Z][\\w-]*\\s*[{,:]/g);\n return new Set(classes?.map((c) => c.replace(/\\s*[{,:]$/, \"\"))).size;\n}\n\n/** Count unique CSS custom property definitions in an HTML string's <style> block. */\nexport function countCssVariables(html: string): number {\n const styleMatch = html.match(/<style[\\s\\S]*?<\\/style>/i);\n if (!styleMatch) return 0;\n const vars = styleMatch[0].match(/--[\\w-]+\\s*:/g);\n return new Set(vars?.map((v) => v.replace(/\\s*:$/, \"\"))).size;\n}\n\n/** Compute code metrics from an HTML string. */\nexport function computeCodeMetrics(html: string): {\n htmlBytes: number;\n htmlLines: number;\n cssClassCount: number;\n cssVariableCount: number;\n} {\n return {\n htmlBytes: Buffer.byteLength(html, \"utf-8\"),\n htmlLines: html.split(\"\\n\").length,\n cssClassCount: countCssClasses(html),\n cssVariableCount: countCssVariables(html),\n };\n}\n","/**\n * Visual comparison: renders HTML code with Playwright, fetches Figma screenshot,\n * and computes pixel-level similarity using pixelmatch.\n */\n\nimport { writeFileSync, readFileSync, mkdirSync, existsSync, copyFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { PNG } from \"pngjs\";\nimport {\n FIGMA_CACHE_DIR,\n getFigmaCachePath,\n isCacheFresh,\n inferDeviceScaleFactor,\n inferExportScale,\n compareScreenshots,\n expandRootWidth,\n type CompareOptions,\n} from \"./visual-compare-helpers.js\";\n\n/** Result of a visual comparison between Figma design and rendered code. */\nexport interface VisualCompareResult {\n similarity: number;\n diffPixels: number;\n totalPixels: number;\n width: number;\n height: number;\n figmaScreenshotPath: string;\n codeScreenshotPath: string;\n diffPath: string;\n}\n\n/** Options for the visual comparison pipeline. */\nexport interface VisualCompareOptions {\n figmaUrl: string;\n figmaToken: string;\n codePath: string;\n outputDir?: string | undefined;\n /**\n * Logical CSS viewport (CSS pixels). Omit a dimension to infer from the Figma PNG\n * using `figmaExportScale`. When the whole object is omitted, both dimensions are inferred.\n */\n viewport?: { width?: number; height?: number } | undefined;\n /**\n * Figma Images API `scale` and assumed scale for fixture `figma.png` (e.g. from `save-fixture`).\n * Default 2 matches REST exports and avoids comparing a @2x PNG against a 1× Playwright capture.\n */\n figmaExportScale?: number | undefined;\n /**\n * Path to a local Figma screenshot file. When provided, skips URL-based fetch\n * and uses this file directly as the ground truth. Useful for responsive comparison\n * where multiple fixture screenshots exist at different viewports.\n */\n figmaScreenshotPath?: string | undefined;\n /**\n * When true, replace the root element's fixed pixel width with `width: 100%`\n * before rendering. This allows the layout to expand to fill the viewport,\n * which is needed for responsive comparison (e.g., 375px design rendered at 768px).\n */\n expandRoot?: boolean | undefined;\n}\n\n/**\n * Fetch Figma node screenshot via REST API, with file-based caching.\n * Cache key: fileKey + nodeId. Cache location: /tmp/canicode-figma-cache/. TTL: 1 hour.\n */\nasync function fetchFigmaScreenshot(\n fileKey: string,\n nodeId: string,\n token: string,\n outputPath: string,\n scale: number,\n): Promise<void> {\n const cachePath = getFigmaCachePath(fileKey, nodeId, scale);\n\n // Return cached version if fresh\n if (isCacheFresh(cachePath)) {\n mkdirSync(dirname(outputPath), { recursive: true });\n copyFileSync(cachePath, outputPath);\n return;\n }\n\n const res = await fetch(\n `https://api.figma.com/v1/images/${fileKey}?ids=${nodeId}&format=png&scale=${scale}`,\n { headers: { \"X-Figma-Token\": token } },\n );\n if (!res.ok) throw new Error(`Figma Images API: ${res.status} ${res.statusText}`);\n\n const data = (await res.json()) as { images: Record<string, string | null> };\n const imgUrl = data.images[nodeId];\n if (!imgUrl) throw new Error(`No image returned for node ${nodeId}`);\n\n const imgRes = await fetch(imgUrl);\n if (!imgRes.ok) throw new Error(`Failed to download Figma screenshot: ${imgRes.status}`);\n\n const buffer = Buffer.from(await imgRes.arrayBuffer());\n\n // Write to output path\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, buffer);\n\n // Save to cache\n mkdirSync(FIGMA_CACHE_DIR, { recursive: true });\n writeFileSync(cachePath, buffer);\n}\n\n/**\n * Render HTML file with Playwright and take a screenshot.\n * @param deviceScaleFactor - Pass 2 when the Figma reference is @2x and `viewport` is logical CSS size.\n */\nexport async function renderCodeScreenshot(\n codePath: string,\n outputPath: string,\n logicalViewport: { width: number; height: number },\n deviceScaleFactor: number = 1,\n): Promise<void> {\n // Dynamic import — playwright is an optional dependency\n const { chromium } = await import(\"playwright\");\n const browser = await chromium.launch();\n try {\n const context = await browser.newContext({\n viewport: logicalViewport,\n deviceScaleFactor,\n });\n const page = await context.newPage();\n\n await page.goto(`file://${resolve(codePath)}`, {\n waitUntil: \"networkidle\",\n timeout: 30_000,\n });\n await page.waitForTimeout(1000);\n\n // Capture only the first child element (the design root), not the full body/viewport\n const root = page.locator(\"body > *:first-child\");\n if (await root.count() > 0) {\n await root.screenshot({ path: outputPath });\n } else {\n await page.screenshot({ path: outputPath });\n }\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Run full visual comparison pipeline.\n */\nexport async function visualCompare(options: VisualCompareOptions): Promise<VisualCompareResult> {\n const outputDir = options.outputDir ?? \"/tmp/canicode-visual-compare\";\n const figmaScreenshotPath = resolve(outputDir, \"figma.png\");\n const codeScreenshotPath = resolve(outputDir, \"code.png\");\n const diffPath = resolve(outputDir, \"diff.png\");\n\n // Parse Figma URL\n const urlMatch = options.figmaUrl.match(/\\/design\\/([^/]+)\\//);\n const fileKey = urlMatch?.[1];\n if (!fileKey) throw new Error(\"Invalid Figma URL — could not extract file key\");\n\n const nodeIdMatch = options.figmaUrl.match(/node-id=([^&\\s]+)/);\n const nodeId = nodeIdMatch?.[1]?.replace(/-/g, \":\");\n if (!nodeId) throw new Error(\"Invalid Figma URL — missing node-id\");\n\n // Step 1: Figma screenshot — use local file if provided, otherwise fetch via API\n if (options.figmaScreenshotPath) {\n if (!existsSync(options.figmaScreenshotPath)) {\n throw new Error(`Figma screenshot not found: ${options.figmaScreenshotPath}`);\n }\n mkdirSync(dirname(figmaScreenshotPath), { recursive: true });\n copyFileSync(options.figmaScreenshotPath, figmaScreenshotPath);\n } else if (!existsSync(figmaScreenshotPath)) {\n const fetchScale = options.figmaExportScale ?? 2;\n await fetchFigmaScreenshot(fileKey, nodeId, options.figmaToken, figmaScreenshotPath, fetchScale);\n if (!existsSync(figmaScreenshotPath)) {\n throw new Error(`Figma screenshot was not created at expected path: ${figmaScreenshotPath}`);\n }\n }\n\n // Step 2: Logical viewport + deviceScaleFactor so code.png matches figma.png pixels (@2x, etc.)\n const figmaPng = PNG.sync.read(readFileSync(figmaScreenshotPath));\n // Auto-detect export scale from PNG width when using local screenshot (KNOWN_1X_WIDTHS convention)\n const exportScale = options.figmaExportScale ?? inferExportScale(figmaPng.width);\n const hasViewportOverride = options.viewport !== undefined;\n let logicalW: number;\n let logicalH: number;\n let deviceScaleFactor: number;\n\n if (!hasViewportOverride) {\n logicalW = Math.max(1, Math.round(figmaPng.width / exportScale));\n logicalH = Math.max(1, Math.round(figmaPng.height / exportScale));\n deviceScaleFactor = exportScale;\n } else {\n logicalW =\n options.viewport!.width ?? Math.max(1, Math.round(figmaPng.width / exportScale));\n logicalH =\n options.viewport!.height ?? Math.max(1, Math.round(figmaPng.height / exportScale));\n deviceScaleFactor = inferDeviceScaleFactor(\n figmaPng.width,\n figmaPng.height,\n logicalW,\n logicalH,\n exportScale,\n );\n }\n\n // Step 3: Render code screenshot at matching physical resolution\n let renderPath = options.codePath;\n if (options.expandRoot) {\n const originalHtml = readFileSync(resolve(options.codePath), \"utf-8\");\n const expandedHtml = expandRootWidth(originalHtml);\n renderPath = resolve(outputDir, \"code-expanded.html\");\n writeFileSync(renderPath, expandedHtml);\n }\n await renderCodeScreenshot(\n renderPath,\n codeScreenshotPath,\n { width: logicalW, height: logicalH },\n deviceScaleFactor,\n );\n\n // Validate both screenshots exist before comparing\n if (!existsSync(codeScreenshotPath)) {\n throw new Error(`Code screenshot was not created at expected path: ${codeScreenshotPath}`);\n }\n\n // Compare\n const result = compareScreenshots(figmaScreenshotPath, codeScreenshotPath, diffPath);\n\n return {\n ...result,\n figmaScreenshotPath,\n codeScreenshotPath,\n diffPath,\n };\n}\n\n/** Options for renderAndCompare. */\nexport interface RenderAndCompareOptions {\n /** How to handle size mismatches. Default: \"pad\". */\n sizeMismatch?: CompareOptions[\"sizeMismatch\"];\n /** Output file suffix (e.g. \"baseline\", \"stripped-layout\"). */\n suffix?: string;\n /** pixelmatch threshold. Default: 0.1. */\n threshold?: number;\n /** Replace root element's fixed width with 100% before rendering. */\n expandRoot?: boolean;\n}\n\n/**\n * Render HTML → screenshot, then compare against a Figma screenshot.\n * Handles export scale inference and size normalization.\n *\n * Extracted from ablation helpers to be shared by calibration + experiments.\n */\nexport async function renderAndCompare(\n htmlPath: string,\n figmaScreenshotPath: string,\n outputDir: string,\n options?: RenderAndCompareOptions,\n): Promise<{ similarity: number }> {\n const suffix = options?.suffix ?? \"output\";\n const sizeMismatch = options?.sizeMismatch ?? \"pad\";\n const threshold = options?.threshold;\n\n const figmaImage = PNG.sync.read(readFileSync(figmaScreenshotPath));\n const figmaWidth = figmaImage.width;\n const exportScale = inferExportScale(figmaWidth);\n const logicalW = Math.max(1, Math.round(figmaWidth / exportScale));\n const logicalH = Math.max(1, Math.round(figmaImage.height / exportScale));\n\n let renderHtmlPath = htmlPath;\n if (options?.expandRoot) {\n const originalHtml = readFileSync(resolve(htmlPath), \"utf-8\");\n const expandedHtml = expandRootWidth(originalHtml);\n renderHtmlPath = resolve(outputDir, `code-expanded-${suffix}.html`);\n writeFileSync(renderHtmlPath, expandedHtml);\n }\n const codePngPath = resolve(outputDir, `code-${suffix}.png`);\n await renderCodeScreenshot(renderHtmlPath, codePngPath, { width: logicalW, height: logicalH }, exportScale);\n\n const figmaCopyPath = resolve(outputDir, `figma-${suffix}.png`);\n copyFileSync(figmaScreenshotPath, figmaCopyPath);\n\n const diffPath = resolve(outputDir, `diff-${suffix}.png`);\n const compareOpts: CompareOptions = { sizeMismatch };\n if (threshold !== undefined) compareOpts.threshold = threshold;\n return compareScreenshots(figmaCopyPath, codePngPath, diffPath, compareOpts);\n}\n","import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst AIREADY_DIR = join(homedir(), \".canicode\");\nconst CONFIG_PATH = join(AIREADY_DIR, \"config.json\");\nconst REPORTS_DIR = join(AIREADY_DIR, \"reports\");\n\ninterface AireadyConfig {\n figmaToken?: string;\n telemetry?: boolean;\n posthogApiKey?: string;\n sentryDsn?: string;\n deviceId?: string;\n}\n\nfunction hardenPermissions(path: string, mode: number): void {\n if (process.platform !== \"win32\") {\n chmodSync(path, mode);\n }\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n hardenPermissions(dir, 0o700);\n}\n\nexport function readConfig(): AireadyConfig {\n if (!existsSync(CONFIG_PATH)) {\n return {};\n }\n try {\n const raw = readFileSync(CONFIG_PATH, \"utf-8\");\n return JSON.parse(raw) as AireadyConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: AireadyConfig): void {\n ensureDir(AIREADY_DIR);\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n hardenPermissions(CONFIG_PATH, 0o600);\n}\n\nexport function getFigmaToken(): string | undefined {\n // Priority: env var > config file\n return process.env[\"FIGMA_TOKEN\"] ?? readConfig().figmaToken;\n}\n\nexport function setFigmaToken(token: string): void {\n const config = readConfig();\n config.figmaToken = token;\n writeConfig(config);\n}\n\nexport function hasConfig(): boolean {\n return existsSync(CONFIG_PATH);\n}\n\nexport function getConfigPath(): string {\n return CONFIG_PATH;\n}\n\nexport function getReportsDir(): string {\n return REPORTS_DIR;\n}\n\nexport function ensureReportsDir(): void {\n ensureDir(AIREADY_DIR);\n ensureDir(REPORTS_DIR);\n}\n\nexport function getTelemetryEnabled(): boolean {\n return readConfig().telemetry !== false;\n}\n\nexport function setTelemetryEnabled(enabled: boolean): void {\n const config = readConfig();\n config.telemetry = enabled;\n writeConfig(config);\n}\n\nexport function getPosthogApiKey(): string | undefined {\n return process.env[\"POSTHOG_API_KEY\"] ?? readConfig().posthogApiKey;\n}\n\nexport function getSentryDsn(): string | undefined {\n return process.env[\"SENTRY_DSN\"] ?? readConfig().sentryDsn;\n}\n\n/**\n * Get or create a stable anonymous device ID for telemetry.\n * Stored in ~/.canicode/config.json, persists across sessions.\n */\nexport function getDeviceId(): string {\n const config = readConfig();\n if (config.deviceId) return config.deviceId;\n\n const id = randomUUID();\n config.deviceId = id;\n writeConfig(config);\n return id;\n}\n\n/**\n * Initialize canicode: write config + create reports dir\n */\nexport function initAiready(token: string): void {\n setFigmaToken(token);\n ensureReportsDir();\n}\n","/**\n * Typed event definitions for PostHog analytics.\n * All events are prefixed with `cic_` (CanICode) to distinguish\n * from noise/spam in PostHog dashboards.\n *\n * Only event metadata is tracked — no design data, tokens, or file contents.\n */\n\n/** Event name prefix — use this to filter genuine events in PostHog */\nexport const EVENT_PREFIX = \"cic_\";\n\nexport const EVENTS = {\n // Analysis\n ANALYSIS_STARTED: `${EVENT_PREFIX}analysis_started`,\n ANALYSIS_COMPLETED: `${EVENT_PREFIX}analysis_completed`,\n ANALYSIS_FAILED: `${EVENT_PREFIX}analysis_failed`,\n\n // Report\n REPORT_GENERATED: `${EVENT_PREFIX}report_generated`,\n COMMENT_POSTED: `${EVENT_PREFIX}comment_posted`,\n COMMENT_FAILED: `${EVENT_PREFIX}comment_failed`,\n\n // MCP\n MCP_TOOL_CALLED: `${EVENT_PREFIX}mcp_tool_called`,\n\n // CLI\n CLI_COMMAND: `${EVENT_PREFIX}cli_command`,\n CLI_INIT: `${EVENT_PREFIX}cli_init`,\n} as const;\n\nexport type EventName = (typeof EVENTS)[keyof typeof EVENTS];\n","/**\n * Unified fetch-based monitoring capture for all environments (CLI, MCP, browser, plugin).\n *\n * No external dependencies — uses native `fetch` (Node 18+ / browser).\n * All operations are fire-and-forget; never throws.\n */\n\nimport type { MonitoringConfig } from \"./types.js\";\n\nlet monitoringEnabled = false;\nlet posthogApiKey: string | undefined;\nlet sentryDsn: string | undefined;\nlet distinctId = \"anonymous\";\nlet environment = \"unknown\";\nlet version = \"unknown\";\nlet commonProps: Record<string, unknown> = {};\n\n/** Generate a simple UUID v4 (no crypto dependency needed for monitoring) */\nfunction uuid4(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/** Parse Sentry DSN into components */\nfunction parseSentryDsn(dsn: string): { key: string; host: string; projectId: string } | null {\n try {\n // DSN format: https://{key}@{host}/{projectId}\n const url = new URL(dsn);\n const key = url.username;\n const projectId = url.pathname.slice(1); // remove leading /\n const host = url.protocol + \"//\" + url.host;\n if (!key || !projectId) return null;\n return { key, host, projectId };\n } catch {\n return null;\n }\n}\n\nexport function initCapture(config: MonitoringConfig): void {\n if (config.enabled === false) return;\n if (!config.posthogApiKey && !config.sentryDsn) return;\n\n monitoringEnabled = true;\n posthogApiKey = config.posthogApiKey;\n sentryDsn = config.sentryDsn;\n distinctId = config.distinctId ?? \"anonymous\";\n environment = config.environment ?? \"unknown\";\n version = config.version ?? \"unknown\";\n commonProps = {\n _sdk: \"canicode\",\n _sdk_version: version,\n _env: environment,\n };\n}\n\nexport function captureEvent(event: string, properties?: Record<string, unknown>): void {\n if (!monitoringEnabled || !posthogApiKey) return;\n\n try {\n fetch(\"https://us.i.posthog.com/i/v0/e/\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n api_key: posthogApiKey,\n event,\n distinct_id: distinctId,\n properties: { ...commonProps, ...properties },\n timestamp: new Date().toISOString(),\n }),\n }).catch(() => {});\n } catch {\n // never throw from monitoring\n }\n}\n\nexport function captureError(error: Error, context?: Record<string, unknown>): void {\n if (!monitoringEnabled) return;\n\n // Send to Sentry via envelope API\n if (sentryDsn) {\n const parsed = parseSentryDsn(sentryDsn);\n if (parsed) {\n try {\n const eventId = uuid4();\n const envelope = [\n JSON.stringify({ event_id: eventId, sent_at: new Date().toISOString(), dsn: sentryDsn }),\n JSON.stringify({ type: \"event\", content_type: \"application/json\" }),\n JSON.stringify({\n event_id: eventId,\n exception: { values: [{ type: error.name, value: error.message }] },\n platform: \"node\",\n environment,\n release: `canicode@${version}`,\n timestamp: Date.now() / 1000,\n extra: context,\n }),\n ].join(\"\\n\");\n\n fetch(`${parsed.host}/api/${parsed.projectId}/envelope/`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-sentry-envelope\",\n \"X-Sentry-Auth\": `Sentry sentry_version=7, sentry_key=${parsed.key}`,\n },\n body: envelope,\n }).catch(() => {});\n } catch {\n // never throw from monitoring\n }\n }\n }\n\n // Also send to PostHog as error event\n captureEvent(\"cic_error\", { error: error.message, ...context });\n}\n\nexport function shutdownCapture(): void {\n monitoringEnabled = false;\n posthogApiKey = undefined;\n sentryDsn = undefined;\n distinctId = \"anonymous\";\n environment = \"unknown\";\n version = \"unknown\";\n commonProps = {};\n}\n","/**\n * Shared monitoring module that works across CLI, MCP, and browser environments.\n *\n * Key design principles:\n * - If no API keys are configured, all functions are silent no-ops\n * - All tracking is fire-and-forget (never blocks or throws)\n * - Zero external dependencies — uses native fetch (Node 18+ / browser)\n * - CLI users can opt out via `canicode config --no-telemetry`\n * - No design data, tokens, or file contents are ever sent\n */\n\nexport type { MonitoringConfig } from \"./types.js\";\nexport { EVENTS } from \"./events.js\";\nexport type { EventName } from \"./events.js\";\n\nimport type { MonitoringConfig } from \"./types.js\";\nimport { initCapture, captureEvent, captureError, shutdownCapture } from \"./capture.js\";\n\n/**\n * Initialise monitoring for the current environment.\n * Safe to call multiple times — subsequent calls are ignored.\n */\nexport function initMonitoring(config: MonitoringConfig): void {\n initCapture(config);\n}\n\n/**\n * Track an analytics event. Fire-and-forget; never throws.\n */\nexport function trackEvent(event: string, properties?: Record<string, unknown>): void {\n try {\n captureEvent(event, properties);\n } catch {\n // never throw from monitoring\n }\n}\n\n/**\n * Track an error. Fire-and-forget; never throws.\n */\nexport function trackError(error: Error, context?: Record<string, unknown>): void {\n try {\n captureError(error, context);\n } catch {\n // never throw from monitoring\n }\n}\n\n/**\n * Shut down monitoring. Call before process exit.\n */\nexport function shutdownMonitoring(): void {\n try {\n shutdownCapture();\n } catch {\n // never throw from monitoring\n }\n}\n","/**\n * Monitoring keys injected at build time via tsup `define`.\n * These are replaced with actual values during CI builds.\n * Locally they default to empty strings (monitoring disabled).\n */\n\ndeclare const __POSTHOG_API_KEY__: string;\ndeclare const __SENTRY_DSN__: string;\n\nexport const POSTHOG_API_KEY: string =\n typeof __POSTHOG_API_KEY__ !== \"undefined\" ? __POSTHOG_API_KEY__ : \"\";\nexport const SENTRY_DSN: string =\n typeof __SENTRY_DSN__ !== \"undefined\" ? __SENTRY_DSN__ : \"\";\n","/**\n * Built-in documentation for canicode CLI\n */\n\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../../package.json\") as { version: string };\n\n/** Print the docs index with available topics. */\nexport function printDocsIndex(): void {\n console.log(`\nCANICODE DOCUMENTATION (v${pkg.version})\n\n canicode docs setup Full setup guide (CLI, MCP, Skills)\n canicode docs config Config override guide + example\n canicode docs implement Design-to-code package guide\n canicode docs scoring Scoring model explanation\n\nFull documentation: github.com/let-sunny/canicode#readme\n`.trimStart());\n}\n\n/** Print the setup guide (CLI, MCP, Skills). */\nexport function printDocsSetup(): void {\n console.log(`\nCANICODE SETUP GUIDE\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n 1. CLI (REST API)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Install:\n npm install -g canicode\n\n Setup:\n canicode init --token figd_xxxxxxxxxxxxx\n (saved to ~/.canicode/config.json, reports go to ~/.canicode/reports/)\n\n Use:\n canicode analyze \"https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\"\n (opens report in browser automatically, use --no-open to disable)\n\n Options:\n --preset strict|relaxed|dev-friendly|ai-ready\n --config ./my-config.json\n --no-open Don't open report in browser\n\n Output:\n ~/.canicode/reports/report-YYYY-MM-DD-HH-mm-<filekey>.html\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n 2. CLAUDE CODE SKILL (requires FIGMA_TOKEN)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Setup:\n cp -r .claude/skills/canicode /your-project/.claude/skills/\n\n Use (in Claude Code):\n /canicode https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n TOKEN PRIORITY\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n 1. --token flag (one-time override)\n 2. FIGMA_TOKEN env var (CI/CD)\n 3. ~/.canicode/config.json (canicode init)\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n WHICH ONE SHOULD I USE?\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n CI/CD, automation -> CLI + FIGMA_TOKEN env var\n Claude Code (full) -> canicode MCP server + FIGMA_TOKEN\n Claude Code (light) -> /canicode skill + FIGMA_TOKEN\n In Figma -> Figma Plugin\n Browser -> Web App (GitHub Pages)\n Quick trial, offline -> CLI + JSON fixtures\n`.trimStart());\n}\n\n/** Print config override guide with examples. */\nexport function printDocsConfig(): void {\n console.log(`\nCONFIG GUIDE\n\nOverride canicode's default rule scores, severity, and filters.\n\nSTRUCTURE\n - excludeNodeTypes: node types to skip (e.g. VECTOR, BOOLEAN_OPERATION)\n - excludeNodeNames: name patterns to skip (e.g. icon, ico)\n - gridBase: spacing grid unit, default 4\n - rules: per-rule overrides (score, severity, enabled)\n\nEXAMPLE\n {\n \"excludeNodeTypes\": [],\n \"excludeNodeNames\": [],\n \"gridBase\": 2,\n \"rules\": {\n \"no-auto-layout\": { \"score\": -15, \"severity\": \"blocking\" },\n \"raw-value\": { \"score\": -5 },\n \"non-semantic-name\": { \"enabled\": false }\n }\n }\n\nUSAGE\n canicode analyze <url> --config ./my-config.json\n\n Full guide: docs/CUSTOMIZATION.md\n Examples: examples/config.json\n`.trimStart());\n}\n\nfunction printDocsVisualCompare(): void {\n console.log(`\nVISUAL COMPARE — Pixel-level comparison between Figma and AI-generated code\n\nUSAGE\n canicode visual-compare ./index.html --figma-url 'https://www.figma.com/design/ABC/File?node-id=1-234'\n\nOPTIONS\n --figma-url <url> Figma URL with node-id (required)\n --token <token> Figma API token (or FIGMA_TOKEN env var)\n --output <dir> Output directory (default: /tmp/canicode-visual-compare)\n --width <px> Logical viewport width in CSS px (omit = infer from Figma PNG ÷ export scale)\n --height <px> Logical viewport height in CSS px (omit = infer from Figma PNG ÷ export scale)\n --figma-scale <n> Figma Images API scale (default: 2, matches save-fixture @2x PNGs)\n\nOUTPUT FILES\n /tmp/canicode-visual-compare/\n figma.png Figma screenshot (default scale=2)\n code.png Playwright render (devicePixelRatio matched to export scale)\n diff.png Pixel diff (red = different pixels)\n\nJSON OUTPUT (stdout)\n {\n \"similarity\": 87, // 0-100%\n \"diffPixels\": 1340,\n \"totalPixels\": 102400,\n \"width\": 800,\n \"height\": 600,\n \"figmaScreenshot\": \"/tmp/.../figma.png\",\n \"codeScreenshot\": \"/tmp/.../code.png\",\n \"diff\": \"/tmp/.../diff.png\"\n }\n\nHOW IT WORKS\n 1. Fetches Figma screenshot via REST API (default scale=2)\n 2. Infers logical CSS viewport (PNG size ÷ scale) unless --width/--height are set\n 3. Renders HTML in Playwright with matching devicePixelRatio so code.png matches figma.png pixels\n 4. Compares pixel-by-pixel with pixelmatch (threshold: 0.1)\n 5. Returns similarity % and diff image\n\nREQUIREMENTS\n npx playwright install chromium\n Figma API token with read access\n`.trimStart());\n}\n\nfunction printDocsDesignTree(): void {\n console.log(`\nDESIGN TREE — Generate DOM-like design tree from Figma fixture\n\nUSAGE\n canicode design-tree ./fixtures/design\n canicode design-tree ./fixtures/design --output tree.txt\n canicode design-tree \"https://www.figma.com/design/ABC/File?node-id=1-234\"\n\nOPTIONS\n --token <token> Figma API token (for URL input)\n --output <path> Output file (default: stdout)\n\nOUTPUT FORMAT\n Each node = one line: name (TYPE, WxH) + CSS-ready styles\n Indentation shows parent-child relationships\n\n Hero Form (INSTANCE, 375x960)\n style: display: flex; flex-direction: column; gap: 32px; background: #F5F5F5\n Title (TEXT, 117x58)\n style: font-family: \"Inter\"; font-size: 48px; color: #2C2C2C; text: \"Title\"\n\nUSE CASES\n Feed to AI for code generation (4KB vs 250KB raw JSON)\n Calibration pipeline (Converter uses this)\n Quick design structure inspection\n`.trimStart());\n}\n\n/** Print the implement command guide. */\nexport function printDocsImplement(): void {\n console.log(`\nDESIGN-TO-CODE IMPLEMENTATION GUIDE\n\nPrepare everything an AI needs to implement a Figma design as code.\n\nUSAGE\n canicode implement <figma-url-or-fixture> [options]\n\nOPTIONS\n --prompt <path> Custom prompt file (default: built-in HTML+CSS)\n --image-scale <n> Image export scale: 2 for PC (default), 3 for mobile\n --output <dir> Output directory (default: ./canicode-implement/)\n --token <token> Figma API token (for live URLs)\n\nOUTPUT\n canicode-implement/\n analysis.json Analysis report with issues and scores\n design-tree.txt DOM-like tree with CSS styles (~N tokens)\n images/ PNG assets with human-readable names (hero-banner@2x.png)\n vectors/ SVG assets for vector nodes\n PROMPT.md Stack-specific code generation prompt\n\nWORKFLOW\n 1. Run: canicode implement ./my-fixture --prompt ./my-react-prompt.md\n 2. Feed design-tree.txt + PROMPT.md to your AI assistant\n 3. AI generates code matching the design pixel-perfectly\n 4. Verify with: canicode visual-compare ./output.html --figma-url <url>\n\nCUSTOM PROMPT\n Default prompt generates HTML+CSS. For your own stack:\n 1. Write a prompt file (e.g. my-react-prompt.md)\n 2. Pass it: canicode implement ./fixture --prompt ./my-react-prompt.md\n The design-tree.txt format is stack-agnostic — your prompt just needs\n to describe how to convert it to your target framework.\n\nIMAGE SCALE\n --image-scale 2 PC/desktop (default) — @2x retina\n --image-scale 3 Mobile — @3x retina\n SVG vectors are scale-independent and always included.\n`.trimStart());\n}\n\n/** Print the scoring model summary with pointer to full docs. */\nexport function printDocsScoring(): void {\n console.log(`\nSCORING MODEL\n\n Score = density (70%) + diversity (30%), averaged across 6 categories.\n\n Severity weights:\n blocking 3.0x | risk 2.0x | missing-info 1.0x | suggestion 0.5x\n\n Grades: S(95) A+(90) A(85) B+(80) B(75) C+(70) C(65) D(50) F(<50)\n Floor: 5% minimum.\n\n Full documentation: https://github.com/let-sunny/canicode/wiki/Scoring-Model\n`.trimStart());\n}\n\nconst DOCS_TOPICS: Record<string, () => void> = {\n setup: printDocsSetup,\n install: printDocsSetup, // alias\n config: printDocsConfig,\n implement: printDocsImplement,\n scoring: printDocsScoring,\n \"visual-compare\": printDocsVisualCompare,\n \"design-tree\": printDocsDesignTree,\n};\n\n/** Route docs command to the appropriate topic handler. */\nexport function handleDocs(topic?: string): void {\n if (!topic) {\n printDocsIndex();\n return;\n }\n\n const handler = DOCS_TOPICS[topic];\n if (handler) {\n handler();\n } else {\n console.error(`Unknown docs topic: ${topic}`);\n console.error(`Available topics: ${Object.keys(DOCS_TOPICS).join(\", \")}`);\n process.exitCode = 1;\n }\n}\n","import type { Category } from \"../contracts/category.js\";\nimport type { RuleConfig, RuleId } from \"../contracts/rule.js\";\n\n/**\n * Maps each rule ID to its category.\n * Categories are based on ablation experiment data (PR #149, #150):\n * - pixel-critical: ΔV ≥ 5% — layout info removal directly degrades pixel accuracy\n * - responsive-critical: ΔV ≥ 15% at expanded viewport — size info critical for responsive\n * - code-quality: ΔV ≈ 0% but CSS classes -8~15 — affects code structure, not pixels\n * - token-management: raw values without design tokens — wrong input = wrong output\n * - semantic: ΔV < 2%, negligible code difference — naming and semantic issues\n */\nexport const RULE_ID_CATEGORY: Record<RuleId, Category> = {\n // Pixel Critical\n \"no-auto-layout\": \"pixel-critical\",\n \"absolute-position-in-auto-layout\": \"pixel-critical\",\n \"non-layout-container\": \"pixel-critical\",\n // Responsive Critical\n \"fixed-size-in-auto-layout\": \"responsive-critical\",\n \"missing-size-constraint\": \"responsive-critical\",\n // Code Quality\n \"missing-component\": \"code-quality\",\n \"detached-instance\": \"code-quality\",\n \"variant-structure-mismatch\": \"code-quality\",\n \"deep-nesting\": \"code-quality\",\n // Token Management\n \"raw-value\": \"token-management\",\n \"irregular-spacing\": \"token-management\",\n // Interaction\n \"missing-interaction-state\": \"interaction\",\n \"missing-prototype\": \"interaction\",\n // Semantic\n \"non-standard-naming\": \"semantic\",\n \"non-semantic-name\": \"semantic\",\n \"inconsistent-naming-convention\": \"semantic\",\n};\n\n/**\n * Central configuration for all rules.\n * Scores based on ablation experiment + AI implementation interview (#200):\n * - pixel-critical: -10 ~ -7 (layout strip caused ΔV +5.4%)\n * - responsive-critical: -8 ~ -6 (size-constraints ΔV +15.9% at responsive viewports)\n * - code-quality: -7 ~ -3 (CSS classes -8~15, no pixel impact)\n * - token-management: -5 ~ -4 (wrong input = wrong output, irregular spacing actively causes errors)\n * - interaction: -1 (uncalibrated — no metric to validate, kept minimal #210)\n * - semantic: -4 ~ -1 (non-semantic-name upgraded per interview — causes actual implementation errors)\n *\n * Category weights removed (#196) — overall score is simple average of categories.\n */\nexport const RULE_CONFIGS: Record<RuleId, RuleConfig> = {\n // ── Pixel Critical ──\n \"no-auto-layout\": {\n severity: \"blocking\",\n score: -10,\n depthWeight: 1.5,\n enabled: true,\n },\n \"absolute-position-in-auto-layout\": {\n severity: \"blocking\",\n score: -7,\n depthWeight: 1.3,\n enabled: true,\n },\n \"non-layout-container\": {\n severity: \"blocking\",\n score: -8,\n depthWeight: 1.2,\n enabled: true,\n },\n\n // ── Responsive Critical ──\n \"fixed-size-in-auto-layout\": {\n severity: \"risk\",\n score: -6,\n enabled: true,\n },\n \"missing-size-constraint\": {\n severity: \"risk\",\n score: -8,\n enabled: true,\n },\n\n // ── Code Quality ──\n \"missing-component\": {\n severity: \"risk\",\n score: -7,\n enabled: true,\n options: {\n minRepetitions: 2,\n structureMinRepetitions: 2,\n maxFingerprintDepth: 3,\n },\n },\n \"detached-instance\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"variant-structure-mismatch\": {\n severity: \"risk\",\n score: -6,\n enabled: true,\n },\n \"deep-nesting\": {\n severity: \"risk\",\n score: -3,\n enabled: true,\n options: {\n maxDepth: 5,\n },\n },\n\n // ── Token Management ──\n \"raw-value\": {\n severity: \"missing-info\",\n score: -4,\n enabled: true,\n },\n \"irregular-spacing\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n options: {\n gridBase: 2,\n },\n },\n\n // ── Interaction ──\n \"missing-interaction-state\": {\n severity: \"suggestion\",\n score: -1, // uncalibrated: no metric to validate score (#210), kept at -1 to preserve category visibility\n enabled: true,\n },\n \"missing-prototype\": {\n severity: \"missing-info\",\n score: -3,\n enabled: false, // disabled: interactionDestinations data missing from fixtures (#139)\n },\n\n // ── Semantic ──\n \"non-standard-naming\": {\n severity: \"suggestion\",\n score: -3, // higher than other naming rules: non-standard state names break interaction detection pipeline\n enabled: true,\n },\n \"non-semantic-name\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"inconsistent-naming-convention\": {\n severity: \"suggestion\",\n score: -1,\n enabled: true,\n },\n};\n\n/**\n * Preset types for different analysis modes\n */\nexport type Preset = \"relaxed\" | \"dev-friendly\" | \"ai-ready\" | \"strict\";\n\n/**\n * Get rule configs with preset applied\n */\nexport function getConfigsWithPreset(\n preset: Preset\n): Record<RuleId, RuleConfig> {\n const configs = { ...RULE_CONFIGS };\n\n switch (preset) {\n case \"relaxed\":\n // Disable blocking rules, reduce scores\n for (const [id, config] of Object.entries(configs)) {\n if (config.severity === \"blocking\") {\n configs[id as RuleId] = {\n ...config,\n severity: \"risk\",\n score: Math.round(config.score * 0.5),\n };\n }\n }\n break;\n\n case \"dev-friendly\":\n // Focus on pixel-critical and responsive-critical issues\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n const category = RULE_ID_CATEGORY[ruleId];\n if (category !== \"pixel-critical\" && category !== \"responsive-critical\") {\n configs[ruleId] = { ...config, enabled: false };\n }\n }\n break;\n\n case \"ai-ready\":\n // Boost pixel-critical and token-management rules\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n const category = RULE_ID_CATEGORY[ruleId];\n if (category === \"pixel-critical\" || category === \"token-management\") {\n configs[ruleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n }\n break;\n\n case \"strict\":\n // Increase scores but respect disabled rules\n for (const [id, config] of Object.entries(configs)) {\n configs[id as RuleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n break;\n }\n\n return configs;\n}\n\n/**\n * Get option value for a rule with type safety\n */\nexport function getRuleOption<T>(\n ruleId: RuleId,\n optionKey: string,\n defaultValue: T\n): T {\n const config = RULE_CONFIGS[ruleId];\n if (!config.options) return defaultValue;\n const value = config.options[optionKey];\n return (value as T) ?? defaultValue;\n}\n","import type { Rule, RuleConfig, RuleId } from \"../contracts/rule.js\";\nimport type { Category } from \"../contracts/category.js\";\nimport { RULE_CONFIGS } from \"./rule-config.js\";\n\n/**\n * Registry for all rules\n */\nclass RuleRegistry {\n private rules: Map<RuleId, Rule> = new Map();\n\n /**\n * Register a rule\n */\n register(rule: Rule): void {\n this.rules.set(rule.definition.id as RuleId, rule);\n }\n\n /**\n * Get a rule by ID\n */\n get(id: RuleId): Rule | undefined {\n return this.rules.get(id);\n }\n\n /**\n * Get all registered rules\n */\n getAll(): Rule[] {\n return Array.from(this.rules.values());\n }\n\n /**\n * Get rules by category\n */\n getByCategory(category: Category): Rule[] {\n return this.getAll().filter((rule) => rule.definition.category === category);\n }\n\n /**\n * Get enabled rules with their configs\n */\n getEnabled(configs: Record<RuleId, RuleConfig> = RULE_CONFIGS): Rule[] {\n return this.getAll().filter((rule) => {\n const config = configs[rule.definition.id as RuleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Get config for a rule\n */\n getConfig(\n id: RuleId,\n configs: Record<RuleId, RuleConfig> = RULE_CONFIGS\n ): RuleConfig {\n return configs[id];\n }\n\n /**\n * Check if a rule is registered\n */\n has(id: RuleId): boolean {\n return this.rules.has(id);\n }\n\n /**\n * Get count of registered rules\n */\n get size(): number {\n return this.rules.size;\n }\n}\n\n/**\n * Global rule registry instance\n */\nexport const ruleRegistry = new RuleRegistry();\n\n/**\n * Helper to create and register a rule\n */\nexport function defineRule(rule: Rule): Rule {\n ruleRegistry.register(rule);\n return rule;\n}\n","/**\n * Centralized node semantic classification.\n * All \"what is this node?\" logic lives here so rules share the same predicates.\n *\n * Categories:\n * - Container: layout containers (frame, group, component, instance)\n * - Visual: decorative/graphic elements (vector, shape, image)\n * - Interactive: user-interactable elements (button, link, tab, input, toggle)\n * - Overlay: elements that open on top (modal, drawer, dropdown)\n * - Carousel: elements that slide/swipe (carousel, slider, gallery)\n * - Token: style/variable binding checks\n * - Naming: name pattern classification\n */\n\nimport type { AnalysisNode } from \"../contracts/figma-node.js\";\n\n// ── Container classification ─────────────────────────────────────────────────\n\nexport function isContainerNode(node: AnalysisNode): boolean {\n return node.type === \"FRAME\" || node.type === \"GROUP\" || node.type === \"COMPONENT\" || node.type === \"INSTANCE\";\n}\n\nexport function hasAutoLayout(node: AnalysisNode): boolean {\n return node.layoutMode !== undefined && node.layoutMode !== \"NONE\";\n}\n\nexport function hasTextContent(node: AnalysisNode): boolean {\n return node.type === \"TEXT\" || (node.children?.some((c) => c.type === \"TEXT\") ?? false);\n}\n\nexport function hasOverlappingBounds(a: AnalysisNode, b: AnalysisNode): boolean {\n const boxA = a.absoluteBoundingBox;\n const boxB = b.absoluteBoundingBox;\n\n if (!boxA || !boxB) return false;\n\n return !(\n boxA.x + boxA.width <= boxB.x ||\n boxB.x + boxB.width <= boxA.x ||\n boxA.y + boxA.height <= boxB.y ||\n boxB.y + boxB.height <= boxA.y\n );\n}\n\n// ── Visual classification ────────────────────────────────────────────────────\n\nconst VISUAL_LEAF_TYPES = new Set([\n \"VECTOR\", \"BOOLEAN_OPERATION\", \"ELLIPSE\", \"LINE\", \"STAR\", \"REGULAR_POLYGON\", \"RECTANGLE\",\n]);\n\nexport function isVisualLeafType(type: string): boolean {\n return VISUAL_LEAF_TYPES.has(type);\n}\n\nexport function hasImageFill(node: AnalysisNode): boolean {\n if (!Array.isArray(node.fills)) return false;\n return node.fills.some(\n (fill) =>\n typeof fill === \"object\" &&\n fill !== null &&\n (fill as { type?: unknown }).type === \"IMAGE\",\n );\n}\n\nexport function isVisualOnlyNode(node: AnalysisNode): boolean {\n if (VISUAL_LEAF_TYPES.has(node.type)) return true;\n const hasOnlyVisualChildren =\n node.children !== undefined &&\n node.children.length > 0 &&\n node.children.every((c) => VISUAL_LEAF_TYPES.has(c.type));\n // Image fill only counts as visual-only when there are no content children\n if (hasImageFill(node) && (!node.children || node.children.length === 0 || hasOnlyVisualChildren)) {\n return true;\n }\n if (hasOnlyVisualChildren) return true;\n return false;\n}\n\n// ── Interactive classification ───────────────────────────────────────────────\n\nexport type StatefulComponentType = \"button\" | \"link\" | \"tab\" | \"input\" | \"toggle\";\n\n/** Name patterns → interactive type mapping */\nexport const STATEFUL_PATTERNS: Array<{ pattern: RegExp; type: StatefulComponentType }> = [\n { pattern: /\\b(btn|button|cta)\\b/i, type: \"button\" },\n { pattern: /\\b(link|anchor)\\b/i, type: \"link\" },\n { pattern: /\\b(tab|tabs)\\b/i, type: \"tab\" },\n { pattern: /\\b(nav|navigation|menu|navbar)\\b/i, type: \"tab\" },\n { pattern: /\\b(input|text-?field|search-?bar|textarea)\\b/i, type: \"input\" },\n { pattern: /\\b(select|dropdown|combo-?box)\\b/i, type: \"input\" },\n { pattern: /\\b(toggle|switch|checkbox|radio)\\b/i, type: \"toggle\" },\n];\n\nexport function getStatefulComponentType(node: AnalysisNode): StatefulComponentType | null {\n if (!node.name) return null;\n for (const entry of STATEFUL_PATTERNS) {\n if (entry.pattern.test(node.name)) return entry.type;\n }\n return null;\n}\n\nexport function isStatefulComponent(node: AnalysisNode): boolean {\n return getStatefulComponentType(node) !== null;\n}\n\n/**\n * Standard state names across web + mobile platforms.\n * Used by missing-interaction-state (to detect presence) and\n * non-standard-naming (to flag non-standard names).\n *\n * Sources:\n * - CSS: :hover, :active, :focus, :disabled, :enabled — https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Pseudo-classes\n * - Material Design 3: Hovered, Focused, Pressed, Dragged — https://m3.material.io/foundations/interaction/states\n * - UIKit: highlighted, selected, disabled, focused — https://developer.apple.com/documentation/uikit/uicontrol/state\n */\nexport const STANDARD_STATE_NAMES = new Set([\n // CSS pseudo-classes (web)\n \"default\", \"hover\", \"active\", \"focus\", \"focused\", \"disabled\", \"enabled\",\n // Material Design 3 (Android)\n \"pressed\", \"dragged\",\n // UIKit (iOS)\n \"highlighted\",\n // Common\n \"selected\",\n]);\n\n/**\n * Patterns that look like state names but aren't in the standard set.\n * Maps common non-standard names to their standard equivalent for suggestions.\n */\nexport const STATE_NAME_SUGGESTIONS: Record<string, string> = {\n on: \"active\",\n off: \"default\",\n clicked: \"pressed\",\n tapped: \"pressed\",\n inactive: \"disabled\",\n normal: \"default\",\n rest: \"default\",\n hovered: \"hover\",\n activated: \"active\",\n checked: \"selected\",\n unchecked: \"default\",\n};\n\n/** Pattern to detect state-like variant option names (broad match) */\nexport const STATE_LIKE_PATTERN = /\\b(on|off|clicked|tapped|inactive|normal|rest|hovered|activated|checked|unchecked)\\b/i;\n\n// ── Overlay / Carousel patterns ──────────────────────────────────────────────\n\n/** Elements that open on top of current view */\nexport const OVERLAY_PATTERN = /\\b(dropdown|select|combo-?box|popover|accordion|drawer|modal|bottom-?sheet|sheet|sidebar|panel|dialog|popup|toast)\\b/i;\n\n/** Elements that swipe/slide between items */\nexport const CAROUSEL_PATTERN = /\\b(carousel|slider|swiper|slide-?show|gallery)\\b/i;\n\nexport function isOverlayNode(node: AnalysisNode): boolean {\n return node.name !== undefined && OVERLAY_PATTERN.test(node.name);\n}\n\nexport function isCarouselNode(node: AnalysisNode): boolean {\n return node.name !== undefined && CAROUSEL_PATTERN.test(node.name);\n}\n\n// ── Token classification ─────────────────────────────────────────────────────\n\nexport function hasStyleReference(node: AnalysisNode, styleType: string): boolean {\n return node.styles !== undefined && styleType in node.styles;\n}\n\nexport function hasBoundVariable(node: AnalysisNode, key: string): boolean {\n return node.boundVariables !== undefined && key in node.boundVariables;\n}\n\n// ── Naming patterns ──────────────────────────────────────────────────────────\n\n/** Figma default name patterns (Frame 1, Group 2, etc.) */\nexport const DEFAULT_NAME_PATTERNS = [\n /^Frame\\s*\\d*$/i,\n /^Group\\s*\\d*$/i,\n /^Rectangle\\s*\\d*$/i,\n /^Ellipse\\s*\\d*$/i,\n /^Vector\\s*\\d*$/i,\n /^Line\\s*\\d*$/i,\n /^Text\\s*\\d*$/i,\n /^Image\\s*\\d*$/i,\n /^Component\\s*\\d*$/i,\n /^Instance\\s*\\d*$/i,\n];\n\nexport function isDefaultName(name: string): boolean {\n return DEFAULT_NAME_PATTERNS.some((pattern) => pattern.test(name));\n}\n\n/** Shape-only non-semantic names */\nexport const NON_SEMANTIC_NAMES = [\n \"rectangle\", \"ellipse\", \"vector\", \"line\", \"polygon\",\n \"star\", \"path\", \"shape\", \"image\", \"fill\", \"stroke\",\n];\n\nexport function isNonSemanticName(name: string): boolean {\n return NON_SEMANTIC_NAMES.includes(name.toLowerCase().trim());\n}\n\n// ── Exclusion ────────────────────────────────────────────────────────────────\n\nexport const EXCLUDED_NAME_PATTERN = /(badge|close|dismiss|overlay|float|fab|dot|indicator|corner|decoration|tag|status|notification|icon|ico|image|asset|filter|dim|dimmed|bg|background|logo|avatar|divider|separator|nav|navigation|gnb|header|footer|sidebar|toolbar|modal|dialog|popup|toast|tooltip|dropdown|menu|sticky|spinner|loader|cursor|cta|chatbot|thumb|thumbnail|tabbar|tab-bar|statusbar|status-bar)/i;\n\nexport function isExcludedName(name: string): boolean {\n return EXCLUDED_NAME_PATTERN.test(name);\n}\n","import type { AnalysisNode } from \"../contracts/figma-node.js\";\nimport type { RuleContext } from \"../contracts/rule.js\";\nimport { isVisualLeafType, isVisualOnlyNode, isExcludedName } from \"./node-semantics.js\";\n\n// ============================================\n// Auto-layout exceptions\n// ============================================\n\n/** Frames that don't need auto-layout (only visual-leaf children like icon paths) */\nexport function isAutoLayoutExempt(node: AnalysisNode): boolean {\n if (\n node.children &&\n node.children.length > 0 &&\n node.children.every((c) => isVisualLeafType(c.type))\n ) return true;\n\n return false;\n}\n\n// ============================================\n// Absolute-position exceptions\n// ============================================\n\n/** Nodes that are allowed to use absolute positioning inside auto-layout */\nexport function isAbsolutePositionExempt(node: AnalysisNode): boolean {\n if (isVisualOnlyNode(node)) return true;\n\n // Intentional name patterns (badge, close, overlay, etc.)\n if (isExcludedName(node.name)) return true;\n\n return false;\n}\n\n// ============================================\n// Size-constraint exceptions\n// ============================================\n\n/** Nodes that don't need maxWidth even with FILL sizing */\nexport function isSizeConstraintExempt(node: AnalysisNode, context: RuleContext): boolean {\n // Already has maxWidth\n if (node.maxWidth !== undefined) return true;\n\n // Parent already has maxWidth — parent constrains the stretch\n if (context.parent?.maxWidth !== undefined) return true;\n\n // Root-level frames — they represent the screen itself\n if (context.depth <= 1) return true;\n\n return false;\n}\n\n// ============================================\n// Fixed-size exceptions\n// ============================================\n\n/** Nodes that are allowed to use fixed sizing inside auto-layout */\nexport function isFixedSizeExempt(node: AnalysisNode): boolean {\n // Visual-only nodes (icons, images, shapes) — intentionally fixed\n if (isVisualOnlyNode(node)) return true;\n\n // Excluded names (nav, header, etc.)\n if (isExcludedName(node.name)) return true;\n\n return false;\n}\n","/**\n * Centralized rule violation messages.\n * All message text lives here so CLI, web, plugin, and MCP share the same strings.\n *\n * Each message function returns { message, suggestion, guide? }:\n * - message: what's wrong (node-specific, dynamic)\n * - suggestion: how to fix it (node-specific, dynamic)\n * - guide: exemption hint (optional, when the rule auto-excludes certain cases)\n */\n\n// ── Message return type ─────────────────────────────────────────────────────\n\nexport interface ViolationMsg {\n message: string;\n suggestion: string;\n guide?: string;\n}\n\n// ── Sub-type definitions ─────────────────────────────────────────────────────\n\nexport type RawValueSubType = \"color\" | \"font\" | \"shadow\" | \"opacity\" | \"spacing\";\nexport type NoAutoLayoutSubType = \"overlapping\" | \"nested\" | \"basic\";\nexport type FixedSizeSubType = \"both-axes\" | \"horizontal\";\nexport type MissingComponentSubType = \"unused-component\" | \"name-repetition\" | \"structure-repetition\" | \"style-override\";\n\n// ── raw-value ────────────────────────────────────────────────────────────────\n\nexport const rawValueMsg = {\n color: (name: string, hex: string): ViolationMsg => ({\n message: `\"${name}\" uses raw fill color ${hex} without style or variable`,\n suggestion: `Bind to a color token`,\n }),\n font: (name: string, fontDesc: string): ViolationMsg => ({\n message: `\"${name}\" uses raw font${fontDesc} without text style`,\n suggestion: `Apply a text style`,\n }),\n shadow: (name: string, shadowType: string, details: string): ViolationMsg => ({\n message: `\"${name}\" has ${shadowType}${details} without effect style`,\n suggestion: `Apply an effect style`,\n }),\n opacity: (name: string, pct: number): ViolationMsg => ({\n message: `\"${name}\" uses raw opacity (${pct}%) without a variable binding`,\n suggestion: `Bind opacity to a variable`,\n }),\n spacing: (name: string, label: string, value: number): ViolationMsg => ({\n message: `\"${name}\" uses raw ${label} (${value}px) without a variable binding`,\n suggestion: `Bind spacing to a variable`,\n }),\n};\n\n// ── irregular-spacing ────────────────────────────────────────────────────────\n\nexport type IrregularSpacingSubType = \"padding\" | \"gap\";\n\nexport const irregularSpacingMsg = (name: string, spacing: number, gridBase: number, nearest: number): ViolationMsg => ({\n message: `\"${name}\" has spacing ${spacing}px not on ${gridBase}pt grid`,\n suggestion: `Round to nearest ${gridBase}pt multiple (${nearest}px)`,\n});\n\n// ── no-auto-layout ───────────────────────────────────────────────────────────\n\nexport const noAutoLayoutMsg = {\n overlapping: (name: string): ViolationMsg => ({\n message: `\"${name}\" has overlapping children without Auto Layout`,\n suggestion: `Apply auto-layout to separate overlapping children`,\n guide: `If this is an intentional overlay (e.g., badge on avatar), this can be ignored`,\n }),\n nested: (name: string): ViolationMsg => ({\n message: `\"${name}\" has nested containers without layout hints`,\n suggestion: `Apply auto-layout to organize nested containers`,\n guide: `Icon wrappers containing only vectors are automatically excluded`,\n }),\n basic: (name: string, arrangement: string, directionHint: string): ViolationMsg => ({\n message: `Frame \"${name}\" has no auto-layout${arrangement}`,\n suggestion: directionHint ? `Apply ${directionHint} auto-layout` : `Apply auto-layout`,\n guide: `Single-child wrappers and icon containers are automatically excluded`,\n }),\n};\n\n// ── absolute-position-in-auto-layout ─────────────────────────────────────────\n\nexport const absolutePositionMsg = (name: string, parentName: string): ViolationMsg => ({\n message: `\"${name}\" uses absolute positioning inside Auto Layout parent \"${parentName}\"`,\n suggestion: `Remove absolute positioning or restructure outside the auto-layout parent`,\n guide: `If this is a badge or overlay, name it with \"badge\", \"overlay\", or \"icon\" to auto-exclude`,\n});\n\n// ── fixed-size-in-auto-layout ────────────────────────────────────────────────\n\nexport const fixedSizeMsg = {\n bothAxes: (name: string, width: number, height: number): ViolationMsg => ({\n message: `Container \"${name}\" (${width}×${height}) uses fixed size on both axes inside auto-layout`,\n suggestion: `Set at least one axis to HUG or FILL`,\n }),\n horizontal: (name: string, width: number): ViolationMsg => ({\n message: `\"${name}\" has fixed width (${width}px) inside auto-layout`,\n suggestion: `Set horizontal sizing to FILL`,\n }),\n};\n\n// ── missing-size-constraint ──────────────────────────────────────────────────\n\nexport type MissingSizeConstraintSubType = \"max-width\" | \"min-width\" | \"wrap\" | \"grid\";\n\nexport const missingSizeConstraintMsg = {\n maxWidth: (name: string, currentWidth: string): ViolationMsg => ({\n message: `\"${name}\" uses FILL width (currently ${currentWidth}) without max-width`,\n suggestion: `Add maxWidth to prevent stretching on large screens`,\n }),\n minWidth: (name: string, currentWidth: string): ViolationMsg => ({\n message: `\"${name}\" uses FILL width (currently ${currentWidth}) without min-width`,\n suggestion: `Add minWidth to prevent collapsing on small screens`,\n }),\n wrap: (name: string): ViolationMsg => ({\n message: `\"${name}\" is in a wrap container without min-width`,\n suggestion: `Add minWidth to control when wrapping occurs`,\n }),\n grid: (name: string): ViolationMsg => ({\n message: `\"${name}\" is in a grid layout without size constraints`,\n suggestion: `Add min/max-width for proper column sizing`,\n }),\n};\n\n// ── non-layout-container (was group-usage) ───────────────────────────────────\n\nexport type NonLayoutContainerSubType = \"group\" | \"section\";\n\nexport const nonLayoutContainerMsg = {\n group: (name: string): ViolationMsg => ({\n message: `\"${name}\" is a Group`,\n suggestion: `Convert to Frame and apply auto-layout`,\n }),\n section: (name: string): ViolationMsg => ({\n message: `\"${name}\" is a Section used as layout container`,\n suggestion: `Convert to Frame and apply auto-layout`,\n }),\n};\n\n// ── deep-nesting ─────────────────────────────────────────────────────────────\n\nexport const deepNestingMsg = (name: string, depth: number, maxDepth: number): ViolationMsg => ({\n message: `\"${name}\" is nested ${depth} levels deep within its component (max: ${maxDepth})`,\n suggestion: `Extract into a sub-component to reduce depth`,\n});\n\n// ── missing-component ────────────────────────────────────────────────────────\n\nexport const missingComponentMsg = {\n unusedComponent: (componentName: string, count: number): ViolationMsg => ({\n message: `Component \"${componentName}\" exists but ${count} repeated frames found instead of instances`,\n suggestion: `Replace frames with component instances`,\n }),\n nameRepetition: (name: string, count: number): ViolationMsg => ({\n message: `\"${name}\" appears ${count} times`,\n suggestion: `Extract as a reusable component`,\n }),\n structureRepetition: (name: string, siblingCount: number): ViolationMsg => ({\n message: `\"${name}\" and ${siblingCount} sibling frame(s) share the same internal structure`,\n suggestion: `Extract a shared component from the repeated structure`,\n }),\n styleOverride: (componentName: string, overrides: string[]): ViolationMsg => ({\n message: `\"${componentName}\" instance has style overrides (${overrides.join(\", \")})`,\n suggestion: `Create a new variant for this style combination`,\n }),\n};\n\n// ── detached-instance ────────────────────────────────────────────────────────\n\nexport const detachedInstanceMsg = (name: string, componentName: string): ViolationMsg => ({\n message: `\"${name}\" may be a detached instance of component \"${componentName}\"`,\n suggestion: `Restore as an instance of \"${componentName}\" or create a new variant`,\n});\n\n// ── variant-structure-mismatch ───────────────────────────────────────────────\n\nexport const variantStructureMismatchMsg = (name: string, mismatchCount: number, totalVariants: number): ViolationMsg => ({\n message: `\"${name}\" has ${mismatchCount}/${totalVariants} variants with different child structures`,\n suggestion: `Unify variant structures using visibility toggles for optional elements`,\n});\n\n// ── non-standard-naming ──────────────────────────────────────────────────────\n\nexport type NonStandardNamingSubType = \"state-name\";\n\nexport const nonStandardNamingMsg = {\n stateName: (name: string, nonStandard: string, suggested: string): ViolationMsg => ({\n message: `\"${name}\" has non-standard state name \"${nonStandard}\"`,\n suggestion: `Use \"${suggested}\" for dev-friendly naming`,\n }),\n};\n\n// ── non-semantic-name (merged: default-name + non-semantic-name) ─────────────\n\nexport type NonSemanticNameSubType = \"frame\" | \"group\" | \"vector\" | \"shape\" | \"text\" | \"image\" | \"component\" | \"instance\" | \"shape-name\";\n\nconst DEFAULT_NAME_SUBTYPE_MAP: Record<string, NonSemanticNameSubType> = {\n FRAME: \"frame\",\n GROUP: \"group\",\n RECTANGLE: \"shape\",\n ELLIPSE: \"shape\",\n VECTOR: \"vector\",\n LINE: \"vector\",\n STAR: \"shape\",\n REGULAR_POLYGON: \"shape\",\n TEXT: \"text\",\n IMAGE: \"image\",\n COMPONENT: \"component\",\n COMPONENT_SET: \"component\",\n INSTANCE: \"instance\",\n};\n\nexport function getDefaultNameSubType(nodeType: string): NonSemanticNameSubType {\n return DEFAULT_NAME_SUBTYPE_MAP[nodeType] ?? \"frame\";\n}\n\nconst NON_SEMANTIC_EXAMPLES: Record<string, string> = {\n FRAME: '\"Header\", \"ProductCard\", \"Sidebar\"',\n GROUP: '\"NavItems\", \"ButtonGroup\", \"CardContent\"',\n VECTOR: '\"ArrowIcon\", \"CheckMark\", \"LogoSymbol\"',\n LINE: '\"Divider\", \"Separator\", \"Underline\"',\n RECTANGLE: '\"Background\", \"Divider\", \"Overlay\"',\n ELLIPSE: '\"AvatarShape\", \"StatusDot\", \"Badge\"',\n STAR: '\"RatingIcon\", \"FavoriteIcon\", \"StarBadge\"',\n REGULAR_POLYGON: '\"PlayIcon\", \"WarningIcon\", \"ShapeDecor\"',\n TEXT: '\"PageTitle\", \"Description\", \"Price\"',\n IMAGE: '\"Avatar\", \"ProductPhoto\", \"Banner\"',\n COMPONENT: '\"PrimaryButton\", \"InputField\", \"CardTemplate\"',\n COMPONENT_SET: '\"Button\", \"Input\", \"Card\"',\n INSTANCE: '\"CloseButton\", \"UserAvatar\", \"StarIcon\"',\n};\n\nexport const nonSemanticNameMsg = (type: string, name: string): ViolationMsg => {\n const examples = NON_SEMANTIC_EXAMPLES[type] ?? '\"Header\", \"ProductCard\", \"Icon\"';\n return {\n message: `${type} \"${name}\" is a non-semantic name`,\n suggestion: `Rename to describe its role (e.g., ${examples})`,\n };\n};\n\n// ── missing-interaction-state ─────────────────────────────────────────────────\n\nexport type MissingInteractionStateSubType = \"hover\" | \"disabled\" | \"active\" | \"focus\";\n\nexport const missingInteractionStateMsg = {\n hover: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Hover state variant`,\n suggestion: `Add a State=Hover variant`,\n }),\n disabled: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Disabled state variant`,\n suggestion: `Add a State=Disabled variant`,\n }),\n active: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Active state variant`,\n suggestion: `Add a State=Active variant`,\n }),\n focus: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Focus state variant`,\n suggestion: `Add a State=Focus variant`,\n }),\n};\n\n// ── missing-prototype ─────────────────────────────────────────────────────────\n\nexport type MissingPrototypeSubType = \"button\" | \"navigation\" | \"tab\" | \"overlay\" | \"carousel\" | \"input\" | \"toggle\";\n\nexport const missingPrototypeMsg = {\n button: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a button but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define the click behavior`,\n }),\n navigation: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a navigation link but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define the destination`,\n }),\n tab: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a tab but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define tab switching behavior`,\n }),\n overlay: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like an overlay trigger but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define open/close behavior`,\n }),\n carousel: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a carousel but has no interaction prototype`,\n suggestion: `Add an ON_CLICK or ON_DRAG interaction to define slide navigation`,\n }),\n input: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like an input but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define focus/interaction behavior`,\n }),\n toggle: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a toggle but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define on/off behavior`,\n }),\n};\n\n// ── inconsistent-naming-convention ───────────────────────────────────────────\n\nexport const inconsistentNamingMsg = (name: string, nodeConvention: string, dominantConvention: string, suggested: string): ViolationMsg => ({\n message: `\"${name}\" uses ${nodeConvention} while siblings use ${dominantConvention}`,\n suggestion: `Rename to \"${suggested}\"`,\n guide: `This checks sibling layers at the same level — you don't have to follow the exact suggestion, just keep naming consistent across siblings`,\n});\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { isAutoLayoutExempt, isAbsolutePositionExempt, isSizeConstraintExempt, isFixedSizeExempt } from \"../rule-exceptions.js\";\nimport { noAutoLayoutMsg, absolutePositionMsg, fixedSizeMsg, missingSizeConstraintMsg, nonLayoutContainerMsg, deepNestingMsg } from \"../rule-messages.js\";\nimport { isContainerNode, hasAutoLayout, hasTextContent, hasOverlappingBounds } from \"../node-semantics.js\";\n\n// ============================================\n// no-auto-layout (merged: absorbs ambiguous-structure + missing-layout-hint)\n// ============================================\n\nconst noAutoLayoutDef: RuleDefinition = {\n id: \"no-auto-layout\",\n name: \"No Auto Layout\",\n category: \"pixel-critical\",\n why: \"Without Auto Layout, AI must guess positioning from absolute coordinates instead of reading explicit layout rules\",\n impact: \"Generated code uses hardcoded positions that break on any content or screen size change\",\n fix: \"Apply Auto Layout to create clear, explicit structure — enables AI to generate flexbox/grid instead of absolute positioning\",\n};\n\nconst noAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!isContainerNode(node)) return null;\n if (hasAutoLayout(node)) return null;\n if (!node.children || node.children.length === 0) return null;\n\n if (isAutoLayoutExempt(node)) return null;\n\n // Priority 1: Check for overlapping visible children (ambiguous-structure)\n if (node.children.length >= 2) {\n for (let i = 0; i < node.children.length; i++) {\n for (let j = i + 1; j < node.children.length; j++) {\n const childA = node.children[i];\n const childB = node.children[j];\n if (!childA || !childB) continue;\n\n if (hasOverlappingBounds(childA, childB)) {\n if (childA.visible !== false && childB.visible !== false) {\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"overlapping\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.overlapping(node.name),\n };\n }\n }\n }\n }\n }\n\n // Priority 2: Check for nested containers without layout hints (missing-layout-hint)\n if (node.children.length >= 2) {\n const nestedContainers = node.children.filter((c) => isContainerNode(c));\n if (nestedContainers.length >= 2) {\n const withoutLayout = nestedContainers.filter((c) => !hasAutoLayout(c));\n if (withoutLayout.length >= 2) {\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"nested\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.nested(node.name),\n };\n }\n }\n }\n\n // Priority 3: Basic no-auto-layout check (FRAME only)\n if (node.type !== \"FRAME\") return null;\n\n const childCount = node.children?.length ?? 0;\n let directionHint = \"\";\n if (node.children && node.children.length >= 2) {\n const boxes = node.children.filter(c => c.absoluteBoundingBox).map(c => c.absoluteBoundingBox!);\n if (boxes.length >= 2) {\n const yRange = Math.max(...boxes.map(b => b.y)) - Math.min(...boxes.map(b => b.y));\n const xRange = Math.max(...boxes.map(b => b.x)) - Math.min(...boxes.map(b => b.x));\n directionHint = yRange > xRange ? \"VERTICAL\" : \"HORIZONTAL\";\n }\n }\n\n const arrangement = directionHint\n ? ` (${childCount} children arranged ${directionHint.toLowerCase()}ly)`\n : childCount > 0 ? ` (${childCount} children)` : \"\";\n\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"basic\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.basic(node.name, arrangement, directionHint),\n };\n};\n\nexport const noAutoLayout = defineRule({\n definition: noAutoLayoutDef,\n check: noAutoLayoutCheck,\n});\n\n// ============================================\n// absolute-position-in-auto-layout\n// ============================================\n\nconst absolutePositionInAutoLayoutDef: RuleDefinition = {\n id: \"absolute-position-in-auto-layout\",\n name: \"Absolute Position in Auto Layout\",\n category: \"pixel-critical\",\n why: \"Absolute positioning inside Auto Layout contradicts the parent's layout rules — AI sees conflicting instructions\",\n impact: \"AI must decide whether to follow the parent's flexbox or the child's absolute position — often gets it wrong\",\n fix: \"Remove absolute positioning or use proper Auto Layout alignment\",\n};\n\nconst absolutePositionInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (node.layoutPositioning !== \"ABSOLUTE\") return null;\n\n if (isAbsolutePositionExempt(node)) return null;\n\n return {\n ruleId: absolutePositionInAutoLayoutDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...absolutePositionMsg(node.name, context.parent.name),\n };\n};\n\nexport const absolutePositionInAutoLayout = defineRule({\n definition: absolutePositionInAutoLayoutDef,\n check: absolutePositionInAutoLayoutCheck,\n});\n\n// ============================================\n// fixed-size-in-auto-layout (merged: absorbs fixed-width-in-responsive-context)\n// ============================================\n\nconst fixedSizeInAutoLayoutDef: RuleDefinition = {\n id: \"fixed-size-in-auto-layout\",\n name: \"Fixed Size in Auto Layout\",\n category: \"responsive-critical\",\n why: \"Fixed sizing inside Auto Layout contradicts the flexible layout intent\",\n impact: \"AI generates a rigid element inside a flex container — the layout won't respond to content changes\",\n fix: \"Use 'Hug' or 'Fill' for at least one axis. Both-axes FIXED → layout completely rigid; horizontal-only FIXED → width won't adapt to parent resize\",\n};\n\nconst fixedSizeInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (!isContainerNode(node)) return null;\n if (!node.absoluteBoundingBox) return null;\n\n if (isFixedSizeExempt(node)) return null;\n\n const { width, height } = node.absoluteBoundingBox;\n\n // Check both axes FIXED (stronger case)\n const hFixed =\n node.layoutSizingHorizontal === \"FIXED\" || node.layoutSizingHorizontal === undefined;\n const vFixed =\n node.layoutSizingVertical === \"FIXED\" || node.layoutSizingVertical === undefined;\n\n if (hFixed && vFixed) {\n // Skip if it has its own auto-layout\n if (node.layoutMode && node.layoutMode !== \"NONE\") return null;\n\n return {\n ruleId: fixedSizeInAutoLayoutDef.id,\n subType: \"both-axes\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...fixedSizeMsg.bothAxes(node.name, width, height),\n };\n }\n\n // Check horizontal-only FIXED (lighter case, from fixed-width-in-responsive-context)\n if (hFixed && !vFixed) {\n // Use layoutSizingHorizontal if available (accurate)\n if (node.layoutSizingHorizontal) {\n if (node.layoutSizingHorizontal !== \"FIXED\") return null;\n } else {\n // Fallback: STRETCH means fill, skip\n if (node.layoutAlign === \"STRETCH\") return null;\n if (node.layoutAlign !== \"INHERIT\") return null;\n }\n\n return {\n ruleId: fixedSizeInAutoLayoutDef.id,\n subType: \"horizontal\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...fixedSizeMsg.horizontal(node.name, width),\n };\n }\n\n return null;\n};\n\nexport const fixedSizeInAutoLayout = defineRule({\n definition: fixedSizeInAutoLayoutDef,\n check: fixedSizeInAutoLayoutCheck,\n});\n\n// ============================================\n// missing-size-constraint (merged: missing-min-width + missing-max-width)\n// ============================================\n\nconst missingSizeConstraintDef: RuleDefinition = {\n id: \"missing-size-constraint\",\n name: \"Missing Size Constraint\",\n category: \"responsive-critical\",\n why: \"Without min/max-width, AI has no bounds — generated code may collapse or stretch indefinitely\",\n impact: \"Content becomes unreadable or invisible at extreme screen sizes\",\n fix: \"Set min-width and/or max-width so AI can generate proper size constraints\",\n};\n\nconst missingSizeConstraintCheck: RuleCheckFn = (node, context) => {\n // Only check containers and text-containing nodes\n if (!isContainerNode(node) && !hasTextContent(node)) return null;\n // Skip if not in Auto Layout context\n if (!context.parent || !hasAutoLayout(context.parent)) return null;\n\n const nodePath = context.path.join(\" > \");\n\n // Check 1: wrap parent → FILL children need min-width\n if (context.parent.layoutWrap === \"WRAP\" && node.layoutSizingHorizontal === \"FILL\" && node.minWidth === undefined) {\n return {\n ruleId: missingSizeConstraintDef.id,\n subType: \"wrap\" as const,\n nodeId: node.id,\n nodePath,\n ...missingSizeConstraintMsg.wrap(node.name),\n };\n }\n\n // Check 2: grid parent → FILL children need size constraints\n if (context.parent.layoutMode === \"GRID\" && node.layoutSizingHorizontal === \"FILL\" && node.minWidth === undefined && node.maxWidth === undefined) {\n return {\n ruleId: missingSizeConstraintDef.id,\n subType: \"grid\" as const,\n nodeId: node.id,\n nodePath,\n ...missingSizeConstraintMsg.grid(node.name),\n };\n }\n\n // Check 3: FILL containers need max-width\n if (node.layoutSizingHorizontal === \"FILL\") {\n if (isSizeConstraintExempt(node, context)) return null;\n\n const currentWidth = node.absoluteBoundingBox ? `${node.absoluteBoundingBox.width}px` : \"unknown\";\n return {\n ruleId: missingSizeConstraintDef.id,\n subType: \"max-width\" as const,\n nodeId: node.id,\n nodePath,\n ...missingSizeConstraintMsg.maxWidth(node.name, currentWidth),\n };\n }\n\n return null;\n};\n\nexport const missingSizeConstraint = defineRule({\n definition: missingSizeConstraintDef,\n check: missingSizeConstraintCheck,\n});\n\n// ============================================\n// non-layout-container (was group-usage — now also catches Section)\n// ============================================\n\nconst nonLayoutContainerDef: RuleDefinition = {\n id: \"non-layout-container\",\n name: \"Non-Layout Container\",\n category: \"pixel-critical\",\n why: \"Groups and Sections lack proper layout rules — AI sees children with absolute coordinates but no container logic\",\n impact: \"AI wraps elements in a plain div with no spacing/alignment, producing fragile layouts\",\n fix: \"Convert to Frame with Auto Layout so AI can generate proper flex/grid containers\",\n};\n\nconst nonLayoutContainerCheck: RuleCheckFn = (node, context) => {\n if (node.type === \"GROUP\") {\n return {\n ruleId: nonLayoutContainerDef.id,\n subType: \"group\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonLayoutContainerMsg.group(node.name),\n };\n }\n\n if (node.type === \"SECTION\") {\n return {\n ruleId: nonLayoutContainerDef.id,\n subType: \"section\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonLayoutContainerMsg.section(node.name),\n };\n }\n\n return null;\n};\n\nexport const nonLayoutContainer = defineRule({\n definition: nonLayoutContainerDef,\n check: nonLayoutContainerCheck,\n});\n\n// ============================================\n// deep-nesting\n// ============================================\n\nconst deepNestingDef: RuleDefinition = {\n id: \"deep-nesting\",\n name: \"Deep Nesting\",\n category: \"code-quality\",\n why: \"Deep nesting consumes AI context exponentially — each level adds indentation and structural overhead\",\n impact: \"AI may lose track of parent-child relationships in deeply nested trees, producing wrong layout hierarchy\",\n fix: \"Flatten the structure by extracting deeply nested groups into sub-components\",\n};\n\nconst deepNestingCheck: RuleCheckFn = (node, context, options) => {\n const maxDepth = (options?.[\"maxDepth\"] as number) ?? getRuleOption(\"deep-nesting\", \"maxDepth\", 5);\n\n if (context.componentDepth < maxDepth) return null;\n if (!isContainerNode(node)) return null;\n\n return {\n ruleId: deepNestingDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...deepNestingMsg(node.name, context.componentDepth, maxDepth),\n };\n};\n\nexport const deepNesting = defineRule({\n definition: deepNestingDef,\n check: deepNestingCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { rawValueMsg, irregularSpacingMsg } from \"../rule-messages.js\";\nimport { hasStyleReference, hasBoundVariable } from \"../node-semantics.js\";\n\nfunction isOnGrid(value: number, gridBase: number): boolean {\n return value % gridBase === 0;\n}\n\n// ============================================\n// raw-value (merged: raw-color + raw-font + raw-shadow + raw-opacity + raw-spacing)\n// ============================================\n\nconst rawValueDef: RuleDefinition = {\n id: \"raw-value\",\n name: \"Raw Value\",\n category: \"token-management\",\n why: \"Values without design tokens or variables must be reproduced exactly per node — one typo means a visible difference\",\n impact: \"AI cannot reference a shared token, so each raw value is an independent source of error across large pages\",\n fix: \"Use design tokens or variables (color styles, text styles, effect styles, opacity/spacing variables) so values are referenceable\",\n};\n\nconst rawValueCheck: RuleCheckFn = (node, context) => {\n const nodePath = context.path.join(\" > \");\n\n // Check 1: Raw fill color\n if (node.fills && Array.isArray(node.fills) && node.fills.length > 0) {\n if (!hasStyleReference(node, \"fill\") && !hasBoundVariable(node, \"fills\")) {\n for (const fill of node.fills) {\n const fillObj = fill as Record<string, unknown>;\n if (fillObj[\"type\"] === \"SOLID\" && fillObj[\"color\"]) {\n const c = fillObj[\"color\"] as Record<string, number>;\n const hex = `#${Math.round((c[\"r\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}${Math.round((c[\"g\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}${Math.round((c[\"b\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}`.toUpperCase();\n return {\n ruleId: rawValueDef.id,\n subType: \"color\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.color(node.name, hex),\n };\n }\n }\n }\n }\n\n // Check 2: Raw font (TEXT nodes without text style)\n if (node.type === \"TEXT\") {\n if (\n !hasStyleReference(node, \"text\") &&\n (!hasBoundVariable(node, \"fontFamily\") || !hasBoundVariable(node, \"fontSize\"))\n ) {\n const fontParts: string[] = [];\n const s = node.style;\n if (s) {\n if (s[\"fontFamily\"]) fontParts.push(String(s[\"fontFamily\"]));\n if (s[\"fontSize\"]) fontParts.push(`${s[\"fontSize\"]}px`);\n if (s[\"fontWeight\"]) fontParts.push(String(s[\"fontWeight\"]));\n }\n const fontDesc = fontParts.length > 0 ? ` (${fontParts.join(\" \")})` : \"\";\n return {\n ruleId: rawValueDef.id,\n subType: \"font\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.font(node.name, fontDesc),\n };\n }\n }\n\n // Check 3: Raw shadow (effects without effect style)\n if (node.effects && Array.isArray(node.effects) && node.effects.length > 0) {\n if (!hasStyleReference(node, \"effect\")) {\n for (const effect of node.effects) {\n const effectObj = effect as Record<string, unknown>;\n if (effectObj[\"type\"] === \"DROP_SHADOW\" || effectObj[\"type\"] === \"INNER_SHADOW\") {\n const shadowType = effectObj[\"type\"] === \"DROP_SHADOW\" ? \"drop shadow\" : \"inner shadow\";\n const offset = effectObj[\"offset\"] as Record<string, number> | undefined;\n const radius = effectObj[\"radius\"] as number | undefined;\n const detailParts: string[] = [];\n if (offset) detailParts.push(`offset ${Math.round(offset[\"x\"] ?? 0)},${Math.round(offset[\"y\"] ?? 0)}`);\n if (radius !== undefined) detailParts.push(`blur ${Math.round(radius)}`);\n const details = detailParts.length > 0 ? ` (${detailParts.join(\" \")})` : \"\";\n return {\n ruleId: rawValueDef.id,\n subType: \"shadow\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.shadow(node.name, shadowType, details),\n };\n }\n }\n }\n }\n\n // Check 4: Raw opacity (non-default opacity without variable)\n if (node.opacity !== undefined && node.opacity < 1 && !hasBoundVariable(node, \"opacity\")) {\n return {\n ruleId: rawValueDef.id,\n subType: \"opacity\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.opacity(node.name, Math.round(node.opacity * 100)),\n };\n }\n\n // Check 5: Raw spacing (padding/gap without variable binding)\n const spacingKeys = [\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\", \"itemSpacing\"] as const;\n for (const key of spacingKeys) {\n const value = node[key];\n if (value !== undefined && value > 0 && !hasBoundVariable(node, key)) {\n const label = key === \"itemSpacing\" ? \"gap\" : key.replace(\"padding\", \"padding-\").toLowerCase();\n return {\n ruleId: rawValueDef.id,\n subType: \"spacing\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.spacing(node.name, label, value),\n };\n }\n }\n\n return null;\n};\n\nexport const rawValue = defineRule({\n definition: rawValueDef,\n check: rawValueCheck,\n});\n\n// ============================================\n// irregular-spacing (merged: inconsistent-spacing + magic-number-spacing)\n// ============================================\n\nconst irregularSpacingDef: RuleDefinition = {\n id: \"irregular-spacing\",\n name: \"Irregular Spacing\",\n category: \"token-management\",\n why: \"Off-grid or arbitrary spacing values force AI to handle many unique values instead of a predictable pattern\",\n impact: \"Higher chance of pixel-level differences when AI substitutes nearby round values\",\n fix: \"Align spacing to the design system grid (e.g., 4pt/8pt increments) for predictable implementation\",\n};\n\nconst irregularSpacingCheck: RuleCheckFn = (node, context, options) => {\n const configuredGridBase = (options?.[\"gridBase\"] as number) ?? getRuleOption(\"irregular-spacing\", \"gridBase\", 4);\n const gridBase = Number.isFinite(configuredGridBase) && configuredGridBase > 0 ? configuredGridBase : 4;\n\n const spacingEntries: Array<{ value: number; subType: \"padding\" | \"gap\" }> = [];\n for (const key of [\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\"] as const) {\n const v = node[key];\n if (v !== undefined && v > 0) spacingEntries.push({ value: v, subType: \"padding\" });\n }\n if (node.itemSpacing !== undefined && node.itemSpacing > 0) {\n spacingEntries.push({ value: node.itemSpacing, subType: \"gap\" });\n }\n\n // Allow small intentional values\n const commonValues = [1, 2];\n\n for (const entry of spacingEntries) {\n if (commonValues.includes(entry.value)) continue;\n if (!isOnGrid(entry.value, gridBase)) {\n return {\n ruleId: irregularSpacingDef.id,\n subType: entry.subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...irregularSpacingMsg(node.name, entry.value, gridBase, Math.round(entry.value / gridBase) * gridBase),\n };\n }\n }\n\n return null;\n};\n\nexport const irregularSpacing = defineRule({\n definition: irregularSpacingDef,\n check: irregularSpacingCheck,\n});\n","import { z } from \"zod\";\n\nexport const CategorySchema = z.enum([\n \"pixel-critical\",\n \"responsive-critical\",\n \"code-quality\",\n \"token-management\",\n \"semantic\",\n \"interaction\",\n]);\n\nexport type Category = z.infer<typeof CategorySchema>;\n\nexport const CATEGORIES = CategorySchema.options;\n\nexport const CATEGORY_LABELS: Record<Category, string> = {\n \"pixel-critical\": \"Pixel Critical\",\n \"responsive-critical\": \"Responsive Critical\",\n \"code-quality\": \"Code Quality\",\n \"token-management\": \"Token Management\",\n \"semantic\": \"Semantic\",\n \"interaction\": \"Interaction\",\n};\n","import { z } from \"zod\";\n\nexport const SeveritySchema = z.enum([\n \"blocking\",\n \"risk\",\n \"missing-info\",\n \"suggestion\",\n]);\n\nexport type Severity = z.infer<typeof SeveritySchema>;\n\nexport const SEVERITY_WEIGHT: Record<Severity, number> = {\n blocking: 10,\n risk: 5,\n \"missing-info\": 2,\n suggestion: 1,\n};\n\nexport const SEVERITY_LABELS: Record<Severity, string> = {\n blocking: \"Blocking\",\n risk: \"Risk\",\n \"missing-info\": \"Missing Info\",\n suggestion: \"Suggestion\",\n};\n","import { z } from \"zod\";\nimport { CategorySchema, type Category } from \"./category.js\";\nimport { SeveritySchema } from \"./severity.js\";\nimport type { AnalysisFile, AnalysisNode } from \"./figma-node.js\";\n\n/**\n * Rule definition - static metadata (does not change)\n */\nexport const RuleDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n category: CategorySchema,\n why: z.string(),\n impact: z.string(),\n fix: z.string(),\n});\n\nexport type RuleDefinition = z.infer<typeof RuleDefinitionSchema>;\n\n/**\n * Rule config - adjustable settings (can be modified via presets)\n */\nexport const RuleConfigSchema = z.object({\n severity: SeveritySchema,\n score: z.number().int().max(0),\n depthWeight: z.number().min(1).max(2).optional(),\n enabled: z.boolean().default(true),\n options: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type RuleConfig = z.infer<typeof RuleConfigSchema>;\n\n/**\n * Context passed to rule check functions\n */\nexport interface RuleContext {\n file: AnalysisFile;\n parent?: AnalysisNode | undefined;\n depth: number;\n /** Depth relative to the nearest COMPONENT/INSTANCE ancestor. Resets at component boundaries. */\n componentDepth: number;\n maxDepth: number;\n path: string[];\n /** Ancestor node types from root to parent (excludes current node). */\n ancestorTypes: string[];\n siblings?: AnalysisNode[] | undefined;\n /** Per-analysis shared state. Created fresh for each analysis run, eliminating module-level mutable state. */\n analysisState: Map<string, unknown>;\n}\n\n/**\n * Get or initialize per-analysis state for a rule.\n * Each key gets its own lazily-initialized state that persists for the duration of one analysis run.\n */\nexport function getAnalysisState<T>(context: RuleContext, key: string, init: () => T): T {\n if (context.analysisState.has(key)) {\n return context.analysisState.get(key) as T;\n }\n const value = init();\n context.analysisState.set(key, value);\n return value;\n}\n\n/**\n * Rule violation result from check function\n */\nexport interface RuleViolation {\n ruleId: string;\n subType?: string;\n nodeId: string;\n nodePath: string;\n message: string;\n suggestion: string;\n guide?: string;\n}\n\n/**\n * Rule check function signature\n */\nexport type RuleCheckFn = (\n node: AnalysisNode,\n context: RuleContext,\n options?: Record<string, unknown>\n) => RuleViolation | null;\n\n/**\n * Complete rule with definition, config, and check function\n */\nexport interface Rule {\n definition: RuleDefinition;\n check: RuleCheckFn;\n}\n\n/**\n * Rule ID type for type safety\n */\nexport type RuleId =\n // Pixel Critical — layout issues that directly affect pixel accuracy (ΔV ≥ 5%)\n | \"no-auto-layout\"\n | \"absolute-position-in-auto-layout\"\n | \"non-layout-container\"\n // Responsive Critical — size issues that break at different viewports (ΔV ≥ 15%)\n | \"fixed-size-in-auto-layout\"\n | \"missing-size-constraint\"\n // Code Quality — structural issues affecting code reuse (ΔV ≈ 0%, CSS classes -8~15)\n | \"missing-component\"\n | \"detached-instance\"\n | \"variant-structure-mismatch\"\n | \"deep-nesting\"\n // Token Management — raw values without design tokens\n | \"raw-value\"\n | \"irregular-spacing\"\n // Interaction — missing state variants and prototype links for interactive components\n | \"missing-interaction-state\"\n | \"missing-prototype\"\n // Semantic — naming issues with negligible pixel impact (ΔV < 2%)\n | \"non-standard-naming\"\n | \"non-semantic-name\"\n | \"inconsistent-naming-convention\";\n\n/**\n * Categories that support depthWeight\n */\nexport const DEPTH_WEIGHT_CATEGORIES: Category[] = [\"pixel-critical\", \"responsive-critical\"];\n\n/**\n * Check if a category supports depth weighting\n */\nexport function supportsDepthWeight(category: Category): boolean {\n return DEPTH_WEIGHT_CATEGORIES.includes(category);\n}\n","import type { RuleCheckFn, RuleDefinition, RuleContext } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { missingComponentMsg, detachedInstanceMsg, variantStructureMismatchMsg } from \"../rule-messages.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\n\n/** Style properties to compare between master and instance. */\nconst STYLE_COMPARE_KEYS = [\"fills\", \"strokes\", \"effects\", \"cornerRadius\", \"strokeWeight\", \"individualStrokeWeights\"] as const;\n\n/**\n * Detect style overrides between a component master and an instance.\n * Returns list of property names that differ.\n */\nfunction detectStyleOverrides(master: AnalysisNode, instance: AnalysisNode): string[] {\n const overrides: string[] = [];\n for (const key of STYLE_COMPARE_KEYS) {\n const masterVal = master[key];\n const instanceVal = instance[key];\n // Both undefined/null → no override\n if (masterVal == null && instanceVal == null) continue;\n // One exists, other doesn't → override\n if (masterVal == null || instanceVal == null) {\n overrides.push(key);\n continue;\n }\n // Deep compare via JSON\n if (JSON.stringify(masterVal) !== JSON.stringify(instanceVal)) {\n overrides.push(key);\n }\n }\n return overrides;\n}\n\n/**\n * Collect all frame names in the file for duplicate detection\n */\nfunction collectFrameNames(\n node: AnalysisNode,\n names: Map<string, string[]> = new Map()\n): Map<string, string[]> {\n if (node.type === \"FRAME\" && node.name) {\n const existing = names.get(node.name) ?? [];\n existing.push(node.id);\n names.set(node.name, existing);\n }\n\n if (node.children) {\n for (const child of node.children) {\n collectFrameNames(child, names);\n }\n }\n\n return names;\n}\n\n/**\n * Build a structural fingerprint for a node.\n * The fingerprint encodes type, layoutMode, and child types recursively up to maxDepth.\n */\nfunction buildFingerprint(node: AnalysisNode, depth: number): string {\n if (depth <= 0 || !node.children || node.children.length === 0) {\n return `${node.type}:${node.layoutMode ?? \"NONE\"}`;\n }\n\n const childFingerprints = node.children\n .map((child) => buildFingerprint(child, depth - 1))\n .join(\",\");\n\n return `${node.type}:${node.layoutMode ?? \"NONE\"}:[${childFingerprints}]`;\n}\n\n/**\n * Check if the node is inside an INSTANCE subtree.\n * Walks the full ancestor type chain to detect INSTANCE at any level.\n */\nfunction isInsideInstance(context: {\n ancestorTypes: string[];\n}): boolean {\n return context.ancestorTypes.includes(\"INSTANCE\");\n}\n\n\n\n// ============================================\n// missing-component (unified 4-stage rule)\n// ============================================\n\n/** State keys for per-analysis deduplication via RuleContext.analysisState */\nconst SEEN_STAGE1_KEY = \"missing-component:seenStage1ComponentNames\";\nconst SEEN_STAGE4_KEY = \"missing-component:seenStage4ComponentIds\";\n\nfunction getSeenStage1(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_STAGE1_KEY, () => new Set<string>());\n}\n\nfunction getSeenStage4(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_STAGE4_KEY, () => new Set<string>());\n}\n\nconst missingComponentDef: RuleDefinition = {\n id: \"missing-component\",\n name: \"Missing Component\",\n category: \"code-quality\",\n why: \"Repeated structures, unused components, and divergent instance overrides indicate missing or underutilized components. This inflates AI token consumption and forces manual maintenance.\",\n impact: \"AI code generators reproduce each repeated frame independently instead of emitting a reusable component. Divergent instance overrides produce inconsistent implementations.\",\n fix: \"Create components from repeated structures, use instances instead of duplicated frames, and create variants for instances with significantly different overrides.\",\n};\n\nconst missingComponentCheck: RuleCheckFn = (node, context, options) => {\n // ========================================\n // FRAME stages (1, 2, 3) — ordered by priority\n // ========================================\n if (node.type === \"FRAME\") {\n // Stage 1: Component exists but not used — FRAME name matches a component in metadata AND frame is repeated\n const components = context.file.components;\n const matchingComponent = Object.values(components).find(\n (c) => c.name.toLowerCase() === node.name.toLowerCase()\n );\n\n // Collect frame names once for Stage 1 and Stage 2\n const frameNames = collectFrameNames(context.file.document);\n const sameNameFrames = frameNames.get(node.name);\n const firstFrame = sameNameFrames?.[0];\n\n if (matchingComponent) {\n const seenStage1 = getSeenStage1(context);\n if (\n sameNameFrames &&\n firstFrame !== undefined &&\n sameNameFrames.length >= 2 &&\n !seenStage1.has(node.name.toLowerCase()) &&\n firstFrame === node.id\n ) {\n seenStage1.add(node.name.toLowerCase());\n return {\n ruleId: missingComponentDef.id,\n subType: \"unused-component\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.unusedComponent(matchingComponent.name, sameNameFrames.length),\n };\n }\n }\n\n // Stage 2: Name-based repetition (existing logic)\n const minRepetitions =\n (options?.[\"minRepetitions\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"minRepetitions\", 3);\n\n if (sameNameFrames && firstFrame !== undefined && sameNameFrames.length >= minRepetitions) {\n if (firstFrame === node.id) {\n return {\n ruleId: missingComponentDef.id,\n subType: \"name-repetition\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.nameRepetition(node.name, sameNameFrames.length),\n };\n }\n }\n\n // Stage 3: Structure-based repetition (absorbed from repeated-frame-structure)\n // Skip if node is inside an INSTANCE subtree\n if (isInsideInstance(context)) return null;\n\n // Skip if parent is COMPONENT_SET\n if (context.parent?.type === \"COMPONENT_SET\") return null;\n\n // Skip if node has no children\n if (!node.children || node.children.length === 0) return null;\n\n const structureMinRepetitions =\n (options?.[\"structureMinRepetitions\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"structureMinRepetitions\", 2);\n\n const maxFingerprintDepth =\n (options?.[\"maxFingerprintDepth\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"maxFingerprintDepth\", 3);\n\n // Compute fingerprint for this node\n const fingerprint = buildFingerprint(node, maxFingerprintDepth);\n\n // Access siblings (may be undefined)\n const siblings = context.siblings ?? [];\n\n // Filter siblings to qualifying frames (type === FRAME, not inside INSTANCE, has children)\n const qualifyingSiblings = siblings.filter(\n (s) =>\n s.type === \"FRAME\" &&\n s.children !== undefined &&\n s.children.length > 0\n );\n\n // Count siblings (including self) sharing the same fingerprint\n const matchingNodes = qualifyingSiblings.filter(\n (s) => buildFingerprint(s, maxFingerprintDepth) === fingerprint\n );\n\n // Ensure self is counted (it should be in siblings, but add a guard)\n const selfIsInSiblings = qualifyingSiblings.some((s) => s.id === node.id);\n const count = selfIsInSiblings\n ? matchingNodes.length\n : matchingNodes.length + 1;\n\n if (count >= structureMinRepetitions) {\n // Only emit for the first sibling (by array order) with this fingerprint\n const firstMatch = qualifyingSiblings.find(\n (s) => buildFingerprint(s, maxFingerprintDepth) === fingerprint\n );\n\n // If self is not in siblings list, treat self as first match when no earlier match exists\n const firstMatchId = firstMatch?.id ?? node.id;\n if (firstMatchId === node.id) {\n return {\n ruleId: missingComponentDef.id,\n subType: \"structure-repetition\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.structureRepetition(node.name, count - 1),\n };\n }\n }\n\n return null;\n }\n\n // ========================================\n // Stage 4: Instance style override detection\n // Compares instance styles against component master.\n // Any style override (fills, strokes, effects, cornerRadius) means\n // the designer should use a variant instead.\n // ========================================\n if (node.type === \"INSTANCE\" && node.componentId) {\n const seenStage4 = getSeenStage4(context);\n if (seenStage4.has(node.componentId)) return null;\n\n const componentDefs = context.file.componentDefinitions;\n if (!componentDefs) return null;\n\n const master = componentDefs[node.componentId];\n if (!master) return null;\n\n // Compare style properties between master and instance\n const overrides = detectStyleOverrides(master, node);\n if (overrides.length > 0) {\n // Only mark as seen when we actually flag — allows other instances to be checked\n seenStage4.add(node.componentId);\n const componentMeta = context.file.components[node.componentId];\n const componentName = componentMeta?.name ?? node.name;\n\n return {\n ruleId: missingComponentDef.id,\n subType: \"style-override\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.styleOverride(componentName, overrides),\n };\n }\n return null;\n }\n\n return null;\n};\n\nexport const missingComponent = defineRule({\n definition: missingComponentDef,\n check: missingComponentCheck,\n});\n\n// ============================================\n// detached-instance\n// ============================================\n\nconst detachedInstanceDef: RuleDefinition = {\n id: \"detached-instance\",\n name: \"Detached Instance\",\n category: \"code-quality\",\n why: \"Detached instances lose component relationship — AI sees a one-off frame instead of a reusable component reference\",\n impact: \"AI generates duplicate code instead of reusing the component, inflating output and causing inconsistencies\",\n fix: \"Reset the instance or create a new variant if customization is needed\",\n};\n\nconst detachedInstanceCheck: RuleCheckFn = (node, context) => {\n // A detached instance would be a FRAME that was once an INSTANCE\n // This is hard to detect without historical data\n // Heuristic: Frame with a name that looks like it came from a component\n if (node.type !== \"FRAME\") return null;\n\n // Check if there's a component in the file with a matching name (word boundary)\n const components = context.file.components;\n\n for (const [, component] of Object.entries(components)) {\n const pattern = new RegExp(`\\\\b${component.name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`);\n if (pattern.test(node.name)) {\n // This frame might be a detached instance of this component\n return {\n ruleId: detachedInstanceDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...detachedInstanceMsg(node.name, component.name),\n };\n }\n }\n\n return null;\n};\n\nexport const detachedInstance = defineRule({\n definition: detachedInstanceDef,\n check: detachedInstanceCheck,\n});\n\n// ============================================\n// variant-structure-mismatch\n// ============================================\n\nconst variantStructureMismatchDef: RuleDefinition = {\n id: \"variant-structure-mismatch\",\n name: \"Variant Structure Mismatch\",\n category: \"code-quality\",\n why: \"Variants with different child structures prevent AI from creating a unified component template\",\n impact: \"AI must generate separate implementations for each variant instead of a single parameterized component\",\n fix: \"Ensure all variants share the same child structure, using visibility toggles for optional elements\",\n};\n\nconst variantStructureMismatchCheck: RuleCheckFn = (node, context) => {\n // Only COMPONENT_SET\n if (node.type !== \"COMPONENT_SET\") return null;\n if (!node.children?.length || node.children.length < 2) return null;\n\n // Build fingerprint for each variant child\n const fingerprints = node.children\n .filter(child => child.type === \"COMPONENT\")\n .map(child => buildFingerprint(child, 2));\n\n if (fingerprints.length < 2) return null;\n\n // Compare all fingerprints to the first one\n const base = fingerprints[0];\n const mismatched = fingerprints.filter(fp => fp !== base);\n\n if (mismatched.length === 0) return null;\n\n const mismatchCount = mismatched.length;\n const totalVariants = fingerprints.length;\n\n return {\n ruleId: variantStructureMismatchDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...variantStructureMismatchMsg(node.name, mismatchCount, totalVariants),\n };\n};\n\nexport const variantStructureMismatch = defineRule({\n definition: variantStructureMismatchDef,\n check: variantStructureMismatchCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getDefaultNameSubType, nonSemanticNameMsg, inconsistentNamingMsg, nonStandardNamingMsg } from \"../rule-messages.js\";\nimport { isExcludedName, isDefaultName, isNonSemanticName, STANDARD_STATE_NAMES, STATE_NAME_SUGGESTIONS, STATE_LIKE_PATTERN } from \"../node-semantics.js\";\n\nfunction detectNamingConvention(name: string): string | null {\n if (/^[a-z]+(-[a-z]+)*$/.test(name)) return \"kebab-case\";\n if (/^[a-z]+(_[a-z]+)*$/.test(name)) return \"snake_case\";\n if (/^[a-z]+([A-Z][a-z]*)*$/.test(name)) return \"camelCase\";\n if (/^[A-Z][a-z]+([A-Z][a-z]*)*$/.test(name)) return \"PascalCase\";\n if (/^[A-Z]+(_[A-Z]+)*$/.test(name)) return \"SCREAMING_SNAKE_CASE\";\n if (/\\s/.test(name)) return \"Title Case\";\n return null;\n}\n\n/** Single capitalized word is compatible with both PascalCase and Title Case */\nfunction isCompatible(nodeConvention: string, dominantConvention: string, name: string): boolean {\n if (!/^[A-Z][a-z]+$/.test(name)) return false;\n const pair = new Set([nodeConvention, dominantConvention]);\n return pair.has(\"PascalCase\") && pair.has(\"Title Case\");\n}\n\n/** Split a name into words regardless of convention */\nfunction splitWords(name: string): string[] {\n // Title Case / space-separated\n if (/\\s/.test(name)) return name.split(/\\s+/);\n // SCREAMING_SNAKE_CASE or snake_case\n if (name.includes(\"_\")) return name.split(\"_\");\n // kebab-case\n if (name.includes(\"-\")) return name.split(\"-\");\n // camelCase / PascalCase — split on uppercase boundaries (including acronym runs)\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1\\0$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1\\0$2\")\n .split(\"\\0\");\n}\n\n/** Convert a name to the target convention */\nfunction convertName(name: string, target: string): string {\n const words = splitWords(name);\n switch (target) {\n case \"kebab-case\":\n return words.map(w => w.toLowerCase()).join(\"-\");\n case \"snake_case\":\n return words.map(w => w.toLowerCase()).join(\"_\");\n case \"camelCase\":\n return words.map((w, i) => i === 0 ? w.toLowerCase() : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\"\");\n case \"PascalCase\":\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\"\");\n case \"SCREAMING_SNAKE_CASE\":\n return words.map(w => w.toUpperCase()).join(\"_\");\n case \"Title Case\":\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\" \");\n default:\n return name;\n }\n}\n\n// ============================================\n// non-semantic-name (merged: default-name + non-semantic-name)\n// ============================================\n\nconst nonSemanticNameDef: RuleDefinition = {\n id: \"non-semantic-name\",\n name: \"Non-Semantic Name\",\n category: \"semantic\",\n why: \"Default or shape names give AI no semantic context — it cannot choose appropriate HTML tags or class names\",\n impact: \"AI generates generic <div> wrappers instead of semantic elements like <header>, <nav>, <article>\",\n fix: \"Rename with a descriptive, purpose-driven name (e.g., 'Header', 'ProductCard', 'Divider')\",\n};\n\nconst nonSemanticNameCheck: RuleCheckFn = (node, context) => {\n if (!node.name) return null;\n if (isExcludedName(node.name)) return null;\n\n // Check 1: Figma default names (Frame 1, Group 2, etc.)\n if (isDefaultName(node.name)) {\n return {\n ruleId: nonSemanticNameDef.id,\n subType: getDefaultNameSubType(node.type),\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonSemanticNameMsg(node.type, node.name),\n };\n }\n\n // Check 2: Shape-only names (rectangle, ellipse, vector, etc.)\n if (isNonSemanticName(node.name)) {\n // Allow shape names for actual shape primitives at leaf level\n if (!node.children || node.children.length === 0) {\n const shapeTypes = [\"RECTANGLE\", \"ELLIPSE\", \"VECTOR\", \"LINE\", \"STAR\", \"REGULAR_POLYGON\"];\n if (shapeTypes.includes(node.type)) return null;\n }\n\n return {\n ruleId: nonSemanticNameDef.id,\n subType: \"shape-name\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonSemanticNameMsg(node.type, node.name),\n };\n }\n\n return null;\n};\n\nexport const nonSemanticName = defineRule({\n definition: nonSemanticNameDef,\n check: nonSemanticNameCheck,\n});\n\n// ============================================\n// inconsistent-naming-convention\n// ============================================\n\nconst inconsistentNamingConventionDef: RuleDefinition = {\n id: \"inconsistent-naming-convention\",\n name: \"Inconsistent Naming Convention\",\n category: \"semantic\",\n why: \"Mixed naming conventions (camelCase + kebab-case + Title Case) at the same level confuse AI pattern recognition\",\n impact: \"AI generates inconsistent class/component names, making the codebase harder to maintain\",\n fix: \"Pick one convention for sibling elements (e.g., kebab-case: 'product-card', or PascalCase: 'ProductCard') — AI maps names to CSS classes and component names, so mixed conventions produce inconsistent code\",\n};\n\nconst inconsistentNamingConventionCheck: RuleCheckFn = (node, context) => {\n if (!context.siblings || context.siblings.length < 2) return null;\n\n // Detect conventions used by siblings\n const conventions = new Map<string, number>();\n let ambiguousPascalCount = 0;\n\n for (const sibling of context.siblings) {\n if (!sibling.name) continue;\n const convention = detectNamingConvention(sibling.name);\n if (convention) {\n conventions.set(convention, (conventions.get(convention) ?? 0) + 1);\n if (convention === \"PascalCase\" && /^[A-Z][a-z]+$/.test(sibling.name)) {\n ambiguousPascalCount++;\n }\n }\n }\n\n // Single capitalized words (Header, Footer) are detected as PascalCase but are\n // equally valid as Title Case. When both conventions appear, discount these\n // ambiguous names so they don't bias the dominant convention toward PascalCase.\n if (conventions.has(\"PascalCase\") && conventions.has(\"Title Case\") && ambiguousPascalCount > 0) {\n const adjusted = (conventions.get(\"PascalCase\") ?? 0) - ambiguousPascalCount;\n if (adjusted <= 0) {\n conventions.delete(\"PascalCase\");\n } else {\n conventions.set(\"PascalCase\", adjusted);\n }\n }\n\n // Skip if we can't detect clear conventions\n if (conventions.size < 2) return null;\n\n // Find the dominant convention\n let dominantConvention = \"\";\n let maxCount = 0;\n for (const [convention, count] of conventions) {\n if (count > maxCount) {\n maxCount = count;\n dominantConvention = convention;\n }\n }\n\n // Check if current node violates the dominant convention\n const nodeConvention = detectNamingConvention(node.name);\n if (nodeConvention && nodeConvention !== dominantConvention && maxCount >= 2) {\n // Single capitalized word is compatible with both PascalCase and Title Case\n if (isCompatible(nodeConvention, dominantConvention, node.name)) return null;\n\n const suggested = convertName(node.name, dominantConvention);\n return {\n ruleId: inconsistentNamingConventionDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...inconsistentNamingMsg(node.name, nodeConvention, dominantConvention, suggested),\n };\n }\n\n return null;\n};\n\nexport const inconsistentNamingConvention = defineRule({\n definition: inconsistentNamingConventionDef,\n check: inconsistentNamingConventionCheck,\n});\n\n// ============================================\n// non-standard-naming\n// ============================================\n\nconst nonStandardNamingDef: RuleDefinition = {\n id: \"non-standard-naming\",\n name: \"Non-Standard Naming\",\n category: \"semantic\",\n why: \"Non-standard state names prevent interaction rules from detecting state variants — AI cannot generate correct :hover/:active/:disabled styles\",\n impact: \"Interaction state detection fails, resulting in static UI with no state transitions\",\n fix: \"Use platform-standard state names: default, hover, active, pressed, selected, highlighted, disabled, enabled, focus, focused, dragged\",\n};\n\nconst nonStandardNamingCheck: RuleCheckFn = (node, context) => {\n // Only check COMPONENT_SET (variant container)\n if (node.type !== \"COMPONENT_SET\") return null;\n if (!node.componentPropertyDefinitions) return null;\n\n for (const prop of Object.values(node.componentPropertyDefinitions)) {\n const p = prop as Record<string, unknown>;\n if (p[\"type\"] !== \"VARIANT\") continue;\n const options = p[\"variantOptions\"];\n if (!Array.isArray(options)) continue;\n\n for (const opt of options) {\n if (typeof opt !== \"string\") continue;\n const lower = opt.toLowerCase().trim();\n\n // Skip if it's a standard name\n if (STANDARD_STATE_NAMES.has(lower)) continue;\n\n // Check if it matches a known non-standard state name\n if (STATE_LIKE_PATTERN.test(opt)) {\n const suggestion = STATE_NAME_SUGGESTIONS[lower];\n if (suggestion) {\n return {\n ruleId: nonStandardNamingDef.id,\n subType: \"state-name\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonStandardNamingMsg.stateName(node.name, opt, suggestion),\n };\n }\n }\n }\n }\n\n return null;\n};\n\nexport const nonStandardNaming = defineRule({\n definition: nonStandardNamingDef,\n check: nonStandardNamingCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition, RuleContext } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport type { MissingInteractionStateSubType, MissingPrototypeSubType } from \"../rule-messages.js\";\nimport { missingInteractionStateMsg, missingPrototypeMsg } from \"../rule-messages.js\";\nimport { getStatefulComponentType, isOverlayNode, isCarouselNode, type StatefulComponentType } from \"../node-semantics.js\";\n\n/** Expected state variants by interactive type */\nconst EXPECTED_STATES: Record<StatefulComponentType, MissingInteractionStateSubType[]> = {\n button: [\"hover\", \"active\", \"disabled\"],\n link: [\"hover\"],\n tab: [\"hover\", \"active\"],\n input: [\"focus\", \"disabled\"],\n toggle: [\"disabled\"],\n};\n\n/** State name patterns — web + mobile platform standard names */\nconst STATE_PATTERNS: Record<MissingInteractionStateSubType, RegExp> = {\n hover: /\\bhover\\b/i,\n disabled: /\\bdisabled\\b/i,\n active: /\\b(active|pressed|selected|highlighted)\\b/i,\n focus: /\\bfocus(ed)?\\b/i,\n};\n\n// ============================================\n// Helpers\n// ============================================\n\n/** Dedup key: emit at most one violation per componentId + subType */\nconst SEEN_KEY = \"missing-interaction-state:seen\";\n\nfunction getSeen(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_KEY, () => new Set<string>());\n}\n\n/**\n * Check if a state variant exists via componentPropertyDefinitions.\n * Looks for VARIANT type properties where variantOptions contain the state name.\n */\nfunction hasStateInVariantProps(node: AnalysisNode, statePattern: RegExp): boolean {\n if (!node.componentPropertyDefinitions) return false;\n for (const prop of Object.values(node.componentPropertyDefinitions)) {\n const p = prop as Record<string, unknown>;\n if (p[\"type\"] !== \"VARIANT\") continue;\n const options = p[\"variantOptions\"];\n if (!Array.isArray(options)) continue;\n if (options.some((opt) => typeof opt === \"string\" && statePattern.test(opt))) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a state variant exists via component master's componentPropertyDefinitions.\n * Falls back to componentDefinitions (fetched masters) when the instance itself\n * doesn't carry the property definitions.\n */\nfunction hasStateInComponentMaster(\n node: AnalysisNode,\n context: RuleContext,\n statePattern: RegExp,\n): boolean {\n if (!node.componentId) return false;\n const defs = context.file.componentDefinitions;\n if (!defs) return false;\n const master = defs[node.componentId];\n if (!master) return false;\n return hasStateInVariantProps(master, statePattern);\n}\n\n// ============================================\n// missing-interaction-state\n// ============================================\n\nconst missingInteractionStateDef: RuleDefinition = {\n id: \"missing-interaction-state\",\n name: \"Missing Interaction State\",\n category: \"interaction\",\n why: \"Interactive components without state variants force AI to guess hover/focus/disabled appearances — or skip them entirely\",\n impact: \"Generated code has no :hover, :focus, or :disabled styles, making the UI feel static and unresponsive\",\n fix: \"Add state variants (Hover, Disabled, Focus, Active) to interactive components in Figma\",\n};\n\nconst missingInteractionStateCheck: RuleCheckFn = (node, context) => {\n // Only check component instances and components\n if (node.type !== \"INSTANCE\" && node.type !== \"COMPONENT\") return null;\n\n const interactiveType = getStatefulComponentType(node);\n if (!interactiveType) return null;\n\n const expectedStates = EXPECTED_STATES[interactiveType];\n if (!expectedStates) return null;\n\n const seen = getSeen(context);\n const nodePath = context.path.join(\" > \");\n\n for (const state of expectedStates) {\n const dedupeKey = `${node.componentId ?? node.id}:${state}`;\n if (seen.has(dedupeKey)) continue;\n\n const pattern = STATE_PATTERNS[state];\n\n // Check variant properties on instance\n if (hasStateInVariantProps(node, pattern)) continue;\n\n // Check variant properties on component master (fetched definitions)\n if (hasStateInComponentMaster(node, context, pattern)) continue;\n\n // Missing state — report first missing one\n seen.add(dedupeKey);\n return {\n ruleId: missingInteractionStateDef.id,\n subType: state,\n nodeId: node.id,\n nodePath,\n ...missingInteractionStateMsg[state](node.name),\n };\n }\n\n return null;\n};\n\nexport const missingInteractionState = defineRule({\n definition: missingInteractionStateDef,\n check: missingInteractionStateCheck,\n});\n\n// ============================================\n// missing-prototype\n// ============================================\n\n/** Interactive types that need click prototype */\nconst PROTOTYPE_TYPES: Record<StatefulComponentType, MissingPrototypeSubType> = {\n button: \"button\",\n link: \"navigation\",\n tab: \"tab\",\n input: \"input\",\n toggle: \"toggle\",\n};\n\nfunction getPrototypeSubType(node: AnalysisNode): MissingPrototypeSubType | null {\n // Check overlay/carousel first — select/dropdown are classified as \"input\" in\n // STATEFUL_PATTERNS but need \"overlay\" subType for prototype checks\n if (isOverlayNode(node)) return \"overlay\";\n if (isCarouselNode(node)) return \"carousel\";\n const interactiveType = getStatefulComponentType(node);\n if (interactiveType) {\n const mapped = PROTOTYPE_TYPES[interactiveType];\n if (mapped) return mapped;\n }\n return null;\n}\n\nfunction hasInteractionTrigger(node: AnalysisNode, triggerType: string): boolean {\n if (!node.interactions || !Array.isArray(node.interactions)) return false;\n return node.interactions.some((interaction) => {\n const i = interaction as { trigger?: { type?: string } };\n return i.trigger?.type === triggerType;\n });\n}\n\n/** Check if node (or its component master) has any of the given trigger types */\nfunction hasAnyInteraction(node: AnalysisNode, context: RuleContext, triggers: string[]): boolean {\n for (const trigger of triggers) {\n if (hasInteractionTrigger(node, trigger)) return true;\n }\n // INSTANCE nodes don't inherit interactions from master — check master fallback\n if (node.componentId && context.file.componentDefinitions) {\n const master = context.file.componentDefinitions[node.componentId];\n if (master) {\n for (const trigger of triggers) {\n if (hasInteractionTrigger(master, trigger)) return true;\n }\n }\n }\n return false;\n}\n\n/** Trigger types to check per subType */\nconst PROTOTYPE_TRIGGERS: Record<string, string[]> = {\n carousel: [\"ON_CLICK\", \"ON_DRAG\"],\n};\n\nconst DEFAULT_TRIGGERS = [\"ON_CLICK\"];\n\nconst missingPrototypeDef: RuleDefinition = {\n id: \"missing-prototype\",\n name: \"Missing Prototype\",\n category: \"interaction\",\n why: \"Interactive elements without prototype interactions give AI no information about navigation or behavior\",\n impact: \"AI cannot generate interaction handlers, routing, or state changes — interactive elements become static\",\n fix: \"Add prototype interactions (ON_CLICK, ON_DRAG) to define navigation targets or state changes\",\n};\n\nconst SEEN_PROTO_KEY = \"missing-prototype:seen\";\n\nfunction getSeenProto(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_PROTO_KEY, () => new Set<string>());\n}\n\nconst missingPrototypeCheck: RuleCheckFn = (node, context) => {\n if (node.type !== \"INSTANCE\" && node.type !== \"COMPONENT\" && node.type !== \"FRAME\") return null;\n\n const subType = getPrototypeSubType(node);\n if (!subType) return null;\n\n // Already has relevant interaction (click, or drag for carousel)\n const triggers = PROTOTYPE_TRIGGERS[subType] ?? DEFAULT_TRIGGERS;\n if (hasAnyInteraction(node, context, triggers)) return null;\n\n // Dedup per componentId + subType\n const seen = getSeenProto(context);\n const dedupeKey = `${node.componentId ?? node.id}:${subType}`;\n if (seen.has(dedupeKey)) return null;\n seen.add(dedupeKey);\n\n return {\n ruleId: missingPrototypeDef.id,\n subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingPrototypeMsg[subType](node.name),\n };\n};\n\nexport const missingPrototype = defineRule({\n definition: missingPrototypeDef,\n check: missingPrototypeCheck,\n});\n","import type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport type {\n Rule,\n RuleConfig,\n RuleContext,\n RuleId,\n RuleViolation,\n} from \"../contracts/rule.js\";\nimport { supportsDepthWeight } from \"../contracts/rule.js\";\nimport { ruleRegistry } from \"../rules/rule-registry.js\";\nimport { RULE_CONFIGS } from \"../rules/rule-config.js\";\n\n/**\n * Analysis issue with calculated score and metadata\n */\nexport interface AnalysisIssue {\n violation: RuleViolation;\n rule: Rule;\n config: RuleConfig;\n depth: number;\n maxDepth: number;\n calculatedScore: number;\n}\n\n/**\n * Information about a rule that threw during analysis\n */\nexport interface RuleFailure {\n ruleId: string;\n nodeName: string;\n nodeId: string;\n error: string;\n}\n\n/**\n * Analysis result from the rule engine\n */\nexport interface AnalysisResult {\n file: AnalysisFile;\n issues: AnalysisIssue[];\n failedRules: RuleFailure[];\n maxDepth: number;\n nodeCount: number;\n analyzedAt: string;\n}\n\n/**\n * Options for the rule engine\n */\nexport interface RuleEngineOptions {\n configs?: Record<RuleId, RuleConfig>;\n enabledRules?: RuleId[];\n disabledRules?: RuleId[];\n targetNodeId?: string;\n excludeNodeNames?: string[];\n excludeNodeTypes?: string[];\n}\n\n/**\n * Calculate the maximum depth of a node tree\n */\nfunction calculateMaxDepth(node: AnalysisNode, currentDepth = 0): number {\n if (!node.children || node.children.length === 0) {\n return currentDepth;\n }\n\n let maxChildDepth = currentDepth;\n for (const child of node.children) {\n const childDepth = calculateMaxDepth(child, currentDepth + 1);\n if (childDepth > maxChildDepth) {\n maxChildDepth = childDepth;\n }\n }\n\n return maxChildDepth;\n}\n\n/**\n * Count total nodes in a tree\n */\nfunction countNodes(node: AnalysisNode): number {\n let count = 1;\n if (node.children) {\n for (const child of node.children) {\n count += countNodes(child);\n }\n }\n return count;\n}\n\n/**\n * Find a node by ID in the tree\n */\nfunction findNodeById(node: AnalysisNode, nodeId: string): AnalysisNode | null {\n // Figma node IDs use \":\" separator, URL uses \"-\"\n const normalizedId = nodeId.replace(/-/g, \":\");\n\n if (node.id === normalizedId) {\n return node;\n }\n\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, nodeId);\n if (found) return found;\n }\n }\n\n return null;\n}\n\n/**\n * Calculate depth weight multiplier for a rule\n * Higher values (closer to 1.5x) at root level, 1.0x at leaf level\n */\nfunction calcDepthWeight(\n depth: number,\n maxDepth: number,\n depthWeight?: number\n): number {\n if (!depthWeight || depthWeight <= 1) return 1;\n if (maxDepth === 0) return depthWeight;\n\n // Linear interpolation: depthWeight at depth 0, 1.0 at maxDepth\n const ratio = depth / maxDepth;\n return depthWeight - (depthWeight - 1) * ratio;\n}\n\n/**\n * Rule engine for analyzing Figma files\n */\nexport class RuleEngine {\n private configs: Record<RuleId, RuleConfig>;\n private enabledRuleIds: Set<RuleId> | null;\n private disabledRuleIds: Set<RuleId>;\n private targetNodeId: string | undefined;\n private excludeNamePattern: RegExp | null;\n private excludeNodeTypes: Set<string> | null;\n\n constructor(options: RuleEngineOptions = {}) {\n this.configs = options.configs ?? RULE_CONFIGS;\n this.enabledRuleIds = options.enabledRules\n ? new Set(options.enabledRules)\n : null;\n this.disabledRuleIds = new Set(options.disabledRules ?? []);\n this.targetNodeId = options.targetNodeId;\n this.excludeNamePattern = options.excludeNodeNames && options.excludeNodeNames.length > 0\n ? new RegExp(`\\\\b(${options.excludeNodeNames.join(\"|\")})\\\\b`, \"i\")\n : null;\n this.excludeNodeTypes = options.excludeNodeTypes && options.excludeNodeTypes.length > 0\n ? new Set(options.excludeNodeTypes)\n : null;\n }\n\n /**\n * Analyze a Figma file and return issues\n */\n analyze(file: AnalysisFile): AnalysisResult {\n // Fresh per-analysis state — eliminates module-level mutable state in rules\n const analysisState = new Map<string, unknown>();\n\n // Find target node if specified\n let rootNode = file.document;\n if (this.targetNodeId) {\n const targetNode = findNodeById(file.document, this.targetNodeId);\n if (!targetNode) {\n throw new Error(`Node not found: ${this.targetNodeId}`);\n }\n rootNode = targetNode;\n }\n\n // Calculate max depth before analysis\n const maxDepth = calculateMaxDepth(rootNode);\n const nodeCount = countNodes(rootNode);\n\n const issues: AnalysisIssue[] = [];\n const failedRules: RuleFailure[] = [];\n const enabledRules = this.getEnabledRules();\n\n // Traverse the tree and run rules on each node\n this.traverseAndCheck(\n rootNode,\n file,\n enabledRules,\n maxDepth,\n issues,\n failedRules,\n 0,\n [],\n [],\n 0,\n analysisState,\n undefined,\n undefined\n );\n\n return {\n file,\n issues,\n failedRules,\n maxDepth,\n nodeCount,\n analyzedAt: new Date().toISOString(),\n };\n }\n\n /**\n * Get rules that should be run based on configuration\n */\n private getEnabledRules(): Rule[] {\n return ruleRegistry.getAll().filter((rule) => {\n const ruleId = rule.definition.id as RuleId;\n\n // Check if explicitly disabled\n if (this.disabledRuleIds.has(ruleId)) return false;\n\n // Check if we have an explicit enable list\n if (this.enabledRuleIds && !this.enabledRuleIds.has(ruleId)) return false;\n\n // Check config enabled status\n const config = this.configs[ruleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Recursively traverse the tree and run rules\n */\n private traverseAndCheck(\n node: AnalysisNode,\n file: AnalysisFile,\n rules: Rule[],\n maxDepth: number,\n issues: AnalysisIssue[],\n failedRules: RuleFailure[],\n depth: number,\n path: string[],\n ancestorTypes: string[],\n componentDepth: number,\n analysisState: Map<string, unknown>,\n parent?: AnalysisNode,\n siblings?: AnalysisNode[]\n ): void {\n const nodePath = [...path, node.name];\n\n // Reset componentDepth at component boundaries\n const isComponentBoundary = node.type === \"COMPONENT\" || node.type === \"COMPONENT_SET\" || node.type === \"INSTANCE\";\n const currentComponentDepth = isComponentBoundary ? 0 : componentDepth;\n\n // Skip nodes matching excluded types or name patterns\n if (this.excludeNodeTypes && this.excludeNodeTypes.has(node.type)) {\n return;\n }\n if (this.excludeNamePattern && this.excludeNamePattern.test(node.name)) {\n return;\n }\n\n // Build context for this node\n const context: RuleContext = {\n file,\n parent,\n depth,\n componentDepth: currentComponentDepth,\n maxDepth,\n path: nodePath,\n ancestorTypes,\n siblings,\n analysisState,\n };\n\n // Run each rule on this node\n for (const rule of rules) {\n const ruleId = rule.definition.id as RuleId;\n const config = this.configs[ruleId];\n const options = config?.options;\n\n try {\n const violation = rule.check(node, context, options);\n\n if (violation) {\n // Calculate score with depth weight if applicable\n let calculatedScore = config.score;\n\n if (\n supportsDepthWeight(rule.definition.category) &&\n config.depthWeight\n ) {\n const weight = calcDepthWeight(depth, maxDepth, config.depthWeight);\n calculatedScore = Math.round(config.score * weight);\n }\n\n issues.push({\n violation,\n rule,\n config,\n depth,\n maxDepth,\n calculatedScore,\n });\n }\n } catch (error) {\n // Track failure and continue — never let one rule break the whole analysis\n failedRules.push({\n ruleId,\n nodeName: node.name,\n nodeId: node.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Recurse into children\n if (node.children && node.children.length > 0) {\n const childAncestorTypes = [...ancestorTypes, node.type];\n for (const child of node.children) {\n this.traverseAndCheck(\n child,\n file,\n rules,\n maxDepth,\n issues,\n failedRules,\n depth + 1,\n nodePath,\n childAncestorTypes,\n currentComponentDepth + 1,\n analysisState,\n node,\n node.children\n );\n }\n }\n }\n}\n\n/**\n * Create a rule engine with default configuration\n */\nexport function createRuleEngine(options?: RuleEngineOptions): RuleEngine {\n return new RuleEngine(options);\n}\n\n/**\n * Convenience function to analyze a file with default settings\n */\nexport function analyzeFile(\n file: AnalysisFile,\n options?: RuleEngineOptions\n): AnalysisResult {\n const engine = createRuleEngine(options);\n return engine.analyze(file);\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { resolve, join } from \"node:path\";\nimport { FigmaClient } from \"../adapters/figma-client.js\";\nimport { resolveComponentDefinitions, resolveInteractionDestinations } from \"../adapters/component-resolver.js\";\nimport { loadFigmaFileFromJson } from \"../adapters/figma-file-loader.js\";\nimport { transformFigmaResponse, transformFileNodesResponse } from \"../adapters/figma-transformer.js\";\nimport { parseFigmaUrl } from \"../adapters/figma-url-parser.js\";\nimport { getFigmaToken } from \"./config-store.js\";\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\n\nexport interface LoadResult {\n file: AnalysisFile;\n nodeId?: string | undefined;\n}\n\n/** Check if input string is a Figma URL. */\nexport function isFigmaUrl(input: string): boolean {\n return input.includes(\"figma.com/\");\n}\n\n/** Check if input string is a JSON file path. */\nexport function isJsonFile(input: string): boolean {\n return input.endsWith(\".json\");\n}\n\n/**\n * Check if input is a fixture directory (contains data.json).\n */\nexport function isFixtureDir(input: string): boolean {\n const resolved = resolve(input);\n if (!existsSync(resolved)) return false;\n try {\n if (!statSync(resolved).isDirectory()) return false;\n } catch {\n return false;\n }\n return existsSync(join(resolved, \"data.json\"));\n}\n\n/**\n * Resolve fixture input to data.json path.\n * Input: fixtures/name/ or fixtures/name → fixtures/name/data.json\n */\nexport function resolveFixturePath(input: string): string {\n if (isJsonFile(input)) return resolve(input);\n return resolve(join(input, \"data.json\"));\n}\n\n/**\n * Load a Figma file from a URL, JSON file, or fixture directory.\n * Resolves component master node trees for accurate analysis.\n */\nexport async function loadFile(\n input: string,\n token?: string,\n): Promise<LoadResult> {\n if (isJsonFile(input) || isFixtureDir(input)) {\n const filePath = resolveFixturePath(input);\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n console.error(`Loading from JSON: ${filePath}`);\n return { file: await loadFigmaFileFromJson(filePath) };\n }\n\n if (isFigmaUrl(input)) {\n const { fileKey, nodeId } = parseFigmaUrl(input);\n return loadFromApi(fileKey, nodeId, token);\n }\n\n throw new Error(\n `Invalid input: ${input}. Provide a Figma URL or fixture directory path.`\n );\n}\n\nasync function loadFromApi(\n fileKey: string,\n nodeId: string | undefined,\n token?: string\n): Promise<LoadResult> {\n console.error(`Fetching from Figma REST API: ${fileKey}`);\n if (nodeId) {\n console.error(`Target node: ${nodeId}`);\n }\n\n const figmaToken = token ?? getFigmaToken();\n if (!figmaToken) {\n throw new Error(\n \"Figma token required. Run 'canicode init --token YOUR_TOKEN' or set FIGMA_TOKEN env var.\"\n );\n }\n\n const client = new FigmaClient({ token: figmaToken });\n\n if (nodeId) {\n // Fetch only the target node subtree — faster, less rate limit impact\n const response = await client.getFileNodes(fileKey, [nodeId.replace(/-/g, \":\")]);\n const file = transformFileNodesResponse(fileKey, response);\n\n // Resolve component master node trees for accurate analysis\n const componentDefs = await resolveComponentDefinitions(client, fileKey, file.document);\n if (Object.keys(componentDefs).length > 0) {\n file.componentDefinitions = componentDefs;\n }\n\n // Resolve interaction destination nodes (e.g., hover variants)\n const interactionDests = await resolveInteractionDestinations(client, fileKey, file.document, file.componentDefinitions);\n if (Object.keys(interactionDests).length > 0) {\n file.interactionDestinations = interactionDests;\n }\n\n return { file, nodeId };\n }\n\n const response = await client.getFile(fileKey);\n const file = transformFigmaResponse(fileKey, response);\n\n // Full file fetch may still miss component masters from external libraries\n const componentDefs = await resolveComponentDefinitions(client, fileKey, file.document);\n if (Object.keys(componentDefs).length > 0) {\n file.componentDefinitions = componentDefs;\n }\n\n // Resolve interaction destination nodes (e.g., hover variants)\n const interactionDests = await resolveInteractionDestinations(client, fileKey, file.document, file.componentDefinitions);\n if (Object.keys(interactionDests).length > 0) {\n file.interactionDestinations = interactionDests;\n }\n\n return { file, nodeId };\n}\n","import { z } from \"zod\";\n\n/**\n * Figma node types required for analysis\n * See @figma/rest-api-spec for full API types\n */\n\nexport const AnalysisNodeTypeSchema = z.enum([\n \"DOCUMENT\",\n \"CANVAS\",\n \"FRAME\",\n \"GROUP\",\n \"SECTION\",\n \"COMPONENT\",\n \"COMPONENT_SET\",\n \"INSTANCE\",\n \"RECTANGLE\",\n \"ELLIPSE\",\n \"VECTOR\",\n \"TEXT\",\n \"LINE\",\n \"BOOLEAN_OPERATION\",\n \"STAR\",\n \"REGULAR_POLYGON\",\n \"SLICE\",\n \"STICKY\",\n \"SHAPE_WITH_TEXT\",\n \"CONNECTOR\",\n \"WIDGET\",\n \"EMBED\",\n \"LINK_UNFURL\",\n \"TABLE\",\n \"TABLE_CELL\",\n \"SLOT\",\n]);\n\nexport type AnalysisNodeType = z.infer<typeof AnalysisNodeTypeSchema>;\n\nexport const LayoutModeSchema = z.enum([\"NONE\", \"HORIZONTAL\", \"VERTICAL\", \"GRID\"]);\nexport type LayoutMode = z.infer<typeof LayoutModeSchema>;\n\nexport const LayoutAlignSchema = z.enum([\"MIN\", \"CENTER\", \"MAX\", \"STRETCH\", \"INHERIT\"]);\nexport type LayoutAlign = z.infer<typeof LayoutAlignSchema>;\n\nexport const LayoutPositioningSchema = z.enum([\"AUTO\", \"ABSOLUTE\"]);\nexport type LayoutPositioning = z.infer<typeof LayoutPositioningSchema>;\n\nexport const LayoutConstraintSchema = z.object({\n horizontal: z.enum([\"LEFT\", \"RIGHT\", \"CENTER\", \"LEFT_RIGHT\", \"SCALE\"]),\n vertical: z.enum([\"TOP\", \"BOTTOM\", \"CENTER\", \"TOP_BOTTOM\", \"SCALE\"]),\n});\nexport type LayoutConstraint = z.infer<typeof LayoutConstraintSchema>;\n\nexport const LayoutWrapSchema = z.enum([\"NO_WRAP\", \"WRAP\"]);\nexport type LayoutWrap = z.infer<typeof LayoutWrapSchema>;\n\nexport const OverflowDirectionSchema = z.enum([\n \"HORIZONTAL_SCROLLING\",\n \"VERTICAL_SCROLLING\",\n \"HORIZONTAL_AND_VERTICAL_SCROLLING\",\n \"NONE\",\n]);\nexport type OverflowDirection = z.infer<typeof OverflowDirectionSchema>;\n\nexport const GridChildAlignSchema = z.enum([\"AUTO\", \"MIN\", \"CENTER\", \"MAX\"]);\nexport type GridChildAlign = z.infer<typeof GridChildAlignSchema>;\n\n/**\n * Lightweight FigmaNode type for analysis\n * Contains only properties needed by rules\n */\nconst BaseAnalysisNodeSchema = z.object({\n // Basic identification\n id: z.string(),\n name: z.string(),\n type: AnalysisNodeTypeSchema,\n visible: z.boolean().default(true),\n\n // Layout analysis\n layoutMode: LayoutModeSchema.optional(),\n layoutAlign: LayoutAlignSchema.optional(),\n layoutPositioning: LayoutPositioningSchema.optional(),\n layoutSizingHorizontal: z.enum([\"FIXED\", \"HUG\", \"FILL\"]).optional(),\n layoutSizingVertical: z.enum([\"FIXED\", \"HUG\", \"FILL\"]).optional(),\n primaryAxisAlignItems: z.string().optional(),\n counterAxisAlignItems: z.string().optional(),\n itemSpacing: z.number().optional(),\n paddingLeft: z.number().optional(),\n paddingRight: z.number().optional(),\n paddingTop: z.number().optional(),\n paddingBottom: z.number().optional(),\n\n // Size constraints (responsive)\n minWidth: z.number().optional(),\n maxWidth: z.number().optional(),\n minHeight: z.number().optional(),\n maxHeight: z.number().optional(),\n layoutGrow: z.union([z.literal(0), z.literal(1)]).optional(),\n constraints: LayoutConstraintSchema.optional(),\n\n // Wrap (flex-wrap)\n layoutWrap: LayoutWrapSchema.optional(),\n counterAxisSpacing: z.number().optional(),\n counterAxisAlignContent: z.enum([\"AUTO\", \"SPACE_BETWEEN\"]).optional(),\n\n // Grid layout (container)\n gridRowCount: z.number().optional(),\n gridColumnCount: z.number().optional(),\n gridRowGap: z.number().optional(),\n gridColumnGap: z.number().optional(),\n gridColumnsSizing: z.string().optional(),\n gridRowsSizing: z.string().optional(),\n\n // Grid layout (child)\n gridChildHorizontalAlign: GridChildAlignSchema.optional(),\n gridChildVerticalAlign: GridChildAlignSchema.optional(),\n gridRowSpan: z.number().optional(),\n gridColumnSpan: z.number().optional(),\n gridRowAnchorIndex: z.number().optional(),\n gridColumnAnchorIndex: z.number().optional(),\n\n // Overflow / clip\n clipsContent: z.boolean().optional(),\n overflowDirection: OverflowDirectionSchema.optional(),\n\n // Size/position analysis\n absoluteBoundingBox: z\n .object({\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n })\n .nullable()\n .optional(),\n\n // Component analysis\n componentId: z.string().optional(),\n componentPropertyDefinitions: z.record(z.string(), z.unknown()).optional(),\n componentProperties: z.record(z.string(), z.unknown()).optional(),\n\n // Style/token analysis\n styles: z.record(z.string(), z.string()).optional(),\n fills: z.array(z.unknown()).optional(),\n strokes: z.array(z.unknown()).optional(),\n strokeWeight: z.number().optional(),\n individualStrokeWeights: z.record(z.string(), z.number()).optional(),\n effects: z.array(z.unknown()).optional(),\n cornerRadius: z.number().optional(),\n opacity: z.number().optional(),\n\n // Variable binding analysis (design tokens)\n boundVariables: z.record(z.string(), z.unknown()).optional(),\n\n // Text analysis\n characters: z.string().optional(),\n style: z.record(z.string(), z.unknown()).optional(),\n textTruncation: z.enum([\"DISABLED\", \"ENDING\"]).optional(),\n maxLines: z.number().optional(),\n\n // Handoff analysis\n devStatus: z\n .object({\n type: z.enum([\"NONE\", \"READY_FOR_DEV\", \"COMPLETED\"]),\n description: z.string().optional(),\n })\n .optional(),\n\n // Prototype interactions\n interactions: z.array(z.unknown()).optional(),\n\n // Naming analysis metadata\n isAsset: z.boolean().optional(),\n});\n\nexport type AnalysisNode = z.infer<typeof BaseAnalysisNodeSchema> & {\n children?: AnalysisNode[] | undefined;\n};\n\nexport const AnalysisNodeSchema: z.ZodType<AnalysisNode> =\n BaseAnalysisNodeSchema.extend({\n children: z.lazy(() => AnalysisNodeSchema.array().optional()),\n }) as z.ZodType<AnalysisNode>;\n\n/**\n * Figma file metadata for analysis\n */\nexport const AnalysisFileSchema = z.object({\n fileKey: z.string(),\n name: z.string(),\n lastModified: z.string(),\n version: z.string(),\n sourceUrl: z.string().optional(),\n document: AnalysisNodeSchema,\n components: z.record(\n z.string(),\n z.object({\n key: z.string(),\n name: z.string(),\n description: z.string(),\n })\n ),\n componentDefinitions: z.record(z.string(), AnalysisNodeSchema).optional(),\n interactionDestinations: z.record(z.string(), AnalysisNodeSchema).optional(),\n styles: z.record(\n z.string(),\n z.object({\n key: z.string(),\n name: z.string(),\n styleType: z.string(),\n })\n ),\n});\n\nexport type AnalysisFile = z.infer<typeof AnalysisFileSchema>;\n","import { readFile } from \"node:fs/promises\";\nimport { basename, dirname } from \"node:path\";\nimport type { GetFileResponse } from \"@figma/rest-api-spec\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport { AnalysisNodeSchema } from \"../contracts/figma-node.js\";\nimport { transformFigmaResponse } from \"./figma-transformer.js\";\n\n/**\n * Extract fileKey from fixture path.\n * - fixtures/name/data.json → name (directory-based fixture)\n * - fixtures/name.json → name (legacy flat fixture)\n */\nfunction extractFileKey(filePath: string): string {\n const fileName = basename(filePath, \".json\");\n if (fileName === \"data\") {\n // Directory-based fixture: use parent directory name\n return basename(dirname(filePath));\n }\n return fileName;\n}\n\n/**\n * Load Figma data from a JSON file\n * For MVP testing and fixture support\n */\nexport async function loadFigmaFileFromJson(\n filePath: string\n): Promise<AnalysisFile> {\n const content = await readFile(filePath, \"utf-8\");\n const data = JSON.parse(content) as GetFileResponse & {\n componentDefinitions?: Record<string, unknown>;\n interactionDestinations?: Record<string, unknown>;\n };\n\n const fileKey = extractFileKey(filePath);\n\n const file = transformFigmaResponse(fileKey, data);\n\n // Preserve componentDefinitions from previously-saved fixtures\n if (data.componentDefinitions) {\n const parsed: Record<string, AnalysisNode> = {};\n for (const [id, raw] of Object.entries(data.componentDefinitions)) {\n const result = AnalysisNodeSchema.safeParse(raw);\n if (result.success) {\n parsed[id] = result.data;\n } else {\n console.debug(`[figma-file-loader] componentDefinitions[${id}] failed validation:`, result.error.issues);\n }\n }\n if (Object.keys(parsed).length > 0) {\n file.componentDefinitions = parsed;\n }\n }\n\n // Preserve interactionDestinations from previously-saved fixtures\n if (data.interactionDestinations) {\n const parsed: Record<string, AnalysisNode> = {};\n for (const [id, raw] of Object.entries(data.interactionDestinations)) {\n const result = AnalysisNodeSchema.safeParse(raw);\n if (result.success) {\n parsed[id] = result.data;\n } else {\n console.debug(`[figma-file-loader] interactionDestinations[${id}] failed validation:`, result.error.issues);\n }\n }\n if (Object.keys(parsed).length > 0) {\n file.interactionDestinations = parsed;\n }\n }\n\n return file;\n}\n\n/**\n * Parse Figma data from a JSON string\n */\nexport function parseFigmaJson(\n json: string,\n fileKey: string\n): AnalysisFile {\n const data = JSON.parse(json) as GetFileResponse;\n return transformFigmaResponse(fileKey, data);\n}\n\nexport class FigmaFileLoadError extends Error {\n constructor(message: string, public filePath?: string) {\n super(message);\n this.name = \"FigmaFileLoadError\";\n }\n}\n","import { z } from \"zod\";\n\nexport const FigmaUrlInfoSchema = z.object({\n fileKey: z.string(),\n nodeId: z.string().optional(),\n fileName: z.string().optional(),\n});\n\nexport type FigmaUrlInfo = z.infer<typeof FigmaUrlInfoSchema>;\n\nconst FIGMA_URL_PATTERNS = [\n // https://www.figma.com/design/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/design\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n // https://www.figma.com/file/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/file\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n // https://www.figma.com/proto/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/proto\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n];\n\nexport function parseFigmaUrl(url: string): FigmaUrlInfo {\n for (const pattern of FIGMA_URL_PATTERNS) {\n const match = url.match(pattern);\n if (match) {\n const [, fileKey, fileName, nodeId] = match;\n if (!fileKey) {\n throw new FigmaUrlParseError(`Invalid Figma URL: missing file key`);\n }\n return {\n fileKey,\n fileName: fileName ? decodeURIComponent(fileName) : undefined,\n nodeId: nodeId ? decodeURIComponent(nodeId) : undefined,\n };\n }\n }\n\n throw new FigmaUrlParseError(\n `Invalid Figma URL format. Expected: https://www.figma.com/design/FILE_KEY/...`\n );\n}\n\nexport class FigmaUrlParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FigmaUrlParseError\";\n }\n}\n\n/**\n * Extract the commentable node ID from a potentially nested instance path.\n * Instance-internal IDs like \"I3010:7457;1442:7704\" use semicolons to\n * separate path segments. The Figma Comments API only accepts simple IDs\n * (e.g. \"3010:7457\"), so we take the first segment and strip the \"I\" prefix.\n */\nexport function toCommentableNodeId(nodeId: string): string {\n const firstSegment = nodeId.split(\";\")[0]!;\n return firstSegment.replace(/^I/, \"\");\n}\n\nexport function buildFigmaDeepLink(fileKey: string, nodeId: string): string {\n // Strip instance-internal path to top-level node:\n // \"I175:7425;1442:7704\" → \"175:7425\" → \"175-7425\"\n const topNodeId = toCommentableNodeId(nodeId).replace(/:/g, \"-\");\n return `https://www.figma.com/design/${fileKey}?node-id=${topNodeId}`;\n}\n","{\n \"name\": \"canicode\",\n \"version\": \"0.9.0\",\n \"mcpName\": \"io.github.let-sunny/canicode\",\n \"description\": \"Score your Figma designs with AI-calibrated rules. CLI + MCP server.\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"canicode\": \"dist/cli/index.js\",\n \"canicode-mcp\": \"dist/mcp/server.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup --config tsup.config.ts\",\n \"build:web\": \"bash scripts/build-web.sh\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"lint\": \"tsc --noEmit\",\n \"build:plugin\": \"bash scripts/build-plugin.sh\",\n \"sync-docs\": \"tsx scripts/sync-rule-docs.ts\",\n \"clean\": \"rm -rf dist\"\n },\n \"files\": [\n \"dist\",\n \"docs/CUSTOMIZATION.md\",\n \".claude/skills/design-to-code/PROMPT.md\"\n ],\n \"keywords\": [\n \"figma\",\n \"design\",\n \"analysis\",\n \"cli\",\n \"mcp\",\n \"readiness\",\n \"ai\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/let-sunny/canicode.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/let-sunny/canicode/issues\"\n },\n \"homepage\": \"https://github.com/let-sunny/canicode\",\n \"author\": \"minseon\",\n \"license\": \"MIT\",\n \"pnpm\": {\n \"overrides\": {\n \"picomatch\": \"4.0.4\",\n \"path-to-regexp\": \"8.4.0\"\n }\n },\n \"packageManager\": \"pnpm@10.32.1\",\n \"engines\": {\n \"node\": \">=22\"\n },\n \"dependencies\": {\n \"@figma/rest-api-spec\": \"^0.36.0\",\n \"@modelcontextprotocol/sdk\": \"^1.27.1\",\n \"cac\": \"^7.0.0\",\n \"dotenv\": \"^17.3.1\",\n \"pixelmatch\": \"^7.1.0\",\n \"pngjs\": \"^7.0.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@anthropic-ai/sdk\": \"^0.80.0\",\n \"@figma/plugin-typings\": \"^1.123.0\",\n \"@types/node\": \"^25.5.0\",\n \"@types/pngjs\": \"^6.0.5\",\n \"playwright\": \"^1.58.2\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.0\"\n }\n}\n","import type { Category } from \"../contracts/category.js\";\nimport { CATEGORIES, CATEGORY_LABELS } from \"../contracts/category.js\";\nimport type { RuleId, RuleConfig } from \"../contracts/rule.js\";\nimport type { Severity } from \"../contracts/severity.js\";\nimport type { AnalysisResult } from \"./rule-engine.js\";\nimport { RULE_CONFIGS, RULE_ID_CATEGORY } from \"../rules/rule-config.js\";\nimport { version as VERSION } from \"../../../package.json\";\n\n/**\n * Score breakdown for a single category\n */\nexport interface CategoryScoreResult {\n category: Category;\n score: number;\n maxScore: number;\n percentage: number;\n issueCount: number;\n uniqueRuleCount: number;\n weightedIssueCount: number;\n densityScore: number;\n diversityScore: number;\n bySeverity: Record<Severity, number>;\n}\n\n/**\n * Overall score report\n */\nexport interface ScoreReport {\n overall: {\n score: number;\n maxScore: number;\n percentage: number;\n grade: Grade;\n };\n byCategory: Record<Category, CategoryScoreResult>;\n summary: {\n totalIssues: number;\n blocking: number;\n risk: number;\n missingInfo: number;\n suggestion: number;\n nodeCount: number;\n };\n}\n\n/**\n * Grade levels based on percentage\n */\nexport type Grade = \"S\" | \"A+\" | \"A\" | \"B+\" | \"B\" | \"C+\" | \"C\" | \"D\" | \"F\";\n\n/**\n * Density weighting uses per-rule base |score| with sqrt damping (#226).\n *\n * Previously, each issue's |calculatedScore| was summed linearly — a rule\n * triggering N times contributed N× its score. This over-penalized designs\n * with many instances of the same issue (e.g., raw-value ×79 = -316 weight),\n * causing most real files to score Grade D/F with no differentiation.\n *\n * Now: same rule triggered N times contributes |score| × sqrt(N).\n * raw-value ×79 = 4 × sqrt(79) ≈ 36 instead of 316.\n * At low counts sqrt ≈ linear (sqrt(1)=1, sqrt(4)=2), preserving sensitivity.\n * At high counts the curve flattens — 79th occurrence adds ~0.2 vs 1st adding 4.\n *\n * Category weights removed (#196) — overall score is simple average of categories.\n * Category importance is already encoded in rule scores (pixel-critical -10\n * vs semantic -4), so per-category weighting is unnecessary.\n */\n\n/**\n * Compute sum of |score| for all rules in each category from a given config map.\n * Used as denominator for severity-weighted diversity scoring.\n * Must use the same preset-adjusted config map that produced the analysis issues,\n * otherwise diversity ratios will be incorrect.\n */\nfunction computeTotalScorePerCategory(\n configs: Record<RuleId, RuleConfig>\n): Record<Category, number> {\n const totals = Object.fromEntries(\n CATEGORIES.map(c => [c, 0])\n ) as Record<Category, number>;\n\n for (const [id, config] of Object.entries(configs)) {\n const category = RULE_ID_CATEGORY[id as RuleId];\n if (category && config.enabled) {\n totals[category] += Math.abs(config.score);\n }\n }\n\n return totals;\n}\n\n/**\n * Score composition weights (initial intuition, pending calibration validation).\n *\n * Density (0.7): \"how many issues per node\" — measures issue volume relative to design size.\n * Designs with many issues per node are harder to implement accurately.\n *\n * Diversity (0.3): \"how many different rule types triggered\" — measures issue breadth.\n * A design that triggers 1 rule 50 times is easier to fix than one triggering 10 different rules.\n *\n * The 70:30 ratio prioritizes volume over variety. Rationale: a design with a single\n * systemic problem (e.g., all frames missing auto-layout) is still very hard to implement,\n * even though diversity is low. Density captures this; diversity adds a penalty for\n * designs with scattered, unrelated issues.\n *\n * Status: initial values. To be validated via /calibrate-loop against visual-compare results.\n */\nconst DENSITY_WEIGHT = 0.7;\nconst DIVERSITY_WEIGHT = 0.3;\n\n/**\n * Minimum score floor.\n * Even the worst design gets 5% instead of 0%. Rationale: a score of 0 implies\n * \"completely unimplementable\", but any Figma file with visible nodes provides\n * some structural information. The floor also avoids demoralizing UX — seeing 0%\n * feels like the tool failed, not that the design needs improvement.\n */\nconst SCORE_FLOOR = 5;\n\n/**\n * Calculate grade from percentage.\n * Thresholds follow a 5-point interval pattern (95/90/85/80/75/70/65) with a wider\n * gap for D (50-64) and F (<50). This mirrors academic grading conventions where\n * the top tiers are tightly spaced and the failing range is broad.\n */\nfunction calculateGrade(percentage: number): Grade {\n if (percentage >= 95) return \"S\";\n if (percentage >= 90) return \"A+\";\n if (percentage >= 85) return \"A\";\n if (percentage >= 80) return \"B+\";\n if (percentage >= 75) return \"B\";\n if (percentage >= 70) return \"C+\";\n if (percentage >= 65) return \"C\";\n if (percentage >= 50) return \"D\";\n return \"F\";\n}\n\n/**\n * Convert grade to a CSS-safe class name suffix\n * e.g. \"A+\" -> \"Aplus\", \"B+\" -> \"Bplus\", \"C+\" -> \"Cplus\"\n */\nexport function gradeToClassName(grade: Grade): string {\n return grade.replace(\"+\", \"plus\");\n}\n\n/**\n * Clamp a value between min and max\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Calculate scores from analysis result using density + diversity scoring\n *\n * Density Score = 100 - (weighted issue count / node count) * 100\n * Diversity Score = (1 - weighted triggered rule scores / total category scores) * 100\n * Final Score = density * 0.7 + diversity * 0.3\n *\n * @param result Analysis result with issues\n * @param configs Optional preset-adjusted config map used to produce the issues.\n * If not provided, diversity totals are reconstructed from issue.config values.\n */\nexport function calculateScores(\n result: AnalysisResult,\n configs?: Record<RuleId, RuleConfig>\n): ScoreReport {\n const categoryScores = initializeCategoryScores();\n const nodeCount = result.nodeCount;\n\n // Track unique rules and their base |score| per category\n const uniqueRulesPerCategory = new Map<Category, Set<string>>();\n const ruleScorePerCategory = new Map<Category, Map<string, number>>();\n // Track issue counts per rule per category for sqrt damping (#226)\n const ruleIssueCountPerCategory = new Map<Category, Map<string, number>>();\n for (const category of CATEGORIES) {\n uniqueRulesPerCategory.set(category, new Set());\n ruleScorePerCategory.set(category, new Map());\n ruleIssueCountPerCategory.set(category, new Map());\n }\n\n // Compute totals from the config map.\n // If configs provided: use preset-adjusted totals (recommended when using presets).\n // If not: fall back to static RULE_CONFIGS — only correct when issues were\n // produced with default RULE_CONFIGS, otherwise diversity ratios will be skewed.\n const totalScorePerCategory = computeTotalScorePerCategory(configs ?? RULE_CONFIGS);\n\n // Count issues by severity per category and track unique rules with scores\n for (const issue of result.issues) {\n const category = issue.rule.definition.category;\n const severity = issue.config.severity;\n const ruleId = issue.rule.definition.id;\n\n categoryScores[category].issueCount++;\n categoryScores[category].bySeverity[severity]++;\n uniqueRulesPerCategory.get(category)!.add(ruleId);\n ruleScorePerCategory.get(category)!.set(ruleId, Math.abs(issue.config.score));\n // Accumulate per-rule issue count (using |calculatedScore| as weight unit)\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n ruleCountMap.set(ruleId, (ruleCountMap.get(ruleId) ?? 0) + 1);\n }\n\n // Compute weightedIssueCount with sqrt damping per rule (#226).\n // Same rule triggered N times contributes |score| × sqrt(N) instead of |score| × N.\n // Rationale: 79 raw-value issues represent one systemic problem, not 79× the difficulty.\n // First few occurrences identify the problem; subsequent ones have diminishing impact.\n // At low counts sqrt ≈ linear (sqrt(1)=1, sqrt(4)=2), preserving sensitivity for rare issues.\n for (const category of CATEGORIES) {\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n const ruleScoreMap = ruleScorePerCategory.get(category)!;\n let dampedWeight = 0;\n for (const [ruleId, count] of ruleCountMap) {\n const ruleScore = ruleScoreMap.get(ruleId) ?? 0;\n dampedWeight += ruleScore * Math.sqrt(count);\n }\n categoryScores[category].weightedIssueCount = dampedWeight;\n }\n\n // Calculate percentage for each category based on density + diversity\n for (const category of CATEGORIES) {\n const catScore = categoryScores[category];\n const uniqueRules = uniqueRulesPerCategory.get(category)!;\n\n catScore.uniqueRuleCount = uniqueRules.size;\n\n // Density score: lower density = higher score\n let densityScore = 100;\n if (nodeCount > 0 && catScore.issueCount > 0) {\n const density = catScore.weightedIssueCount / nodeCount;\n densityScore = clamp(Math.round(100 - density * 100), 0, 100);\n }\n catScore.densityScore = densityScore;\n\n // Diversity score: weighted by base rule |score| (config.score, not calculatedScore).\n // Uses base score intentionally — diversity measures \"what types of problems exist\",\n // not \"where they occur\". depthWeight affects density (volume penalty) but not diversity\n // (breadth penalty). A blocking rule (score -10) penalizes diversity more than a\n // suggestion (score -1), so low-severity-only designs correctly get high diversity scores.\n let diversityScore = 100;\n if (catScore.issueCount > 0) {\n const ruleScores = ruleScorePerCategory.get(category)!;\n const weightedTriggered = Array.from(ruleScores.values()).reduce((sum, s) => sum + s, 0);\n const weightedTotal = totalScorePerCategory[category];\n const diversityRatio = weightedTotal > 0 ? weightedTriggered / weightedTotal : 0;\n diversityScore = clamp(Math.round((1 - diversityRatio) * 100), 0, 100);\n }\n catScore.diversityScore = diversityScore;\n\n // Combined score with floor\n const combinedScore = densityScore * DENSITY_WEIGHT + diversityScore * DIVERSITY_WEIGHT;\n catScore.percentage = catScore.issueCount > 0\n ? clamp(Math.round(combinedScore), SCORE_FLOOR, 100)\n : 100;\n\n catScore.score = catScore.percentage;\n catScore.maxScore = 100;\n }\n\n // Calculate overall score as simple average of categories\n // Category importance is already encoded in rule scores (weight baked in),\n // so no per-category weighting is needed.\n let categorySum = 0;\n for (const category of CATEGORIES) {\n categorySum += categoryScores[category].percentage;\n }\n\n const overallPercentage = CATEGORIES.length > 0\n ? Math.round(categorySum / CATEGORIES.length)\n : 100;\n\n // Count issues by severity\n const summary = {\n totalIssues: result.issues.length,\n blocking: 0,\n risk: 0,\n missingInfo: 0,\n suggestion: 0,\n nodeCount,\n };\n\n for (const issue of result.issues) {\n switch (issue.config.severity) {\n case \"blocking\":\n summary.blocking++;\n break;\n case \"risk\":\n summary.risk++;\n break;\n case \"missing-info\":\n summary.missingInfo++;\n break;\n case \"suggestion\":\n summary.suggestion++;\n break;\n }\n }\n\n return {\n overall: {\n score: overallPercentage,\n maxScore: 100,\n percentage: overallPercentage,\n grade: calculateGrade(overallPercentage),\n },\n byCategory: categoryScores,\n summary,\n };\n}\n\n/**\n * Initialize empty category scores\n */\nfunction initializeCategoryScores(): Record<Category, CategoryScoreResult> {\n const scores: Partial<Record<Category, CategoryScoreResult>> = {};\n\n for (const category of CATEGORIES) {\n scores[category] = {\n category,\n score: 100,\n maxScore: 100,\n percentage: 100,\n issueCount: 0,\n uniqueRuleCount: 0,\n weightedIssueCount: 0,\n densityScore: 100,\n diversityScore: 100,\n bySeverity: {\n blocking: 0,\n risk: 0,\n \"missing-info\": 0,\n suggestion: 0,\n },\n };\n }\n\n return scores as Record<Category, CategoryScoreResult>;\n}\n\n/**\n * Format score report as a summary string\n */\nexport function formatScoreSummary(report: ScoreReport): string {\n const lines: string[] = [];\n\n lines.push(`Overall: ${report.overall.grade} (${report.overall.percentage}%)`);\n lines.push(\"\");\n lines.push(\"By Category:\");\n\n for (const category of CATEGORIES) {\n const cat = report.byCategory[category];\n lines.push(` ${category}: ${cat.percentage}% (${cat.issueCount} issues, ${cat.uniqueRuleCount} rules)`);\n }\n\n lines.push(\"\");\n lines.push(\"Issues:\");\n lines.push(` Blocking: ${report.summary.blocking}`);\n lines.push(` Risk: ${report.summary.risk}`);\n lines.push(` Missing Info: ${report.summary.missingInfo}`);\n lines.push(` Suggestion: ${report.summary.suggestion}`);\n lines.push(` Total: ${report.summary.totalIssues}`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get category label for display\n */\nexport function getCategoryLabel(category: Category): string {\n return CATEGORY_LABELS[category];\n}\n\n/**\n * Get severity label for display\n */\nexport function getSeverityLabel(severity: Severity): string {\n const labels: Record<Severity, string> = {\n blocking: \"Blocking\",\n risk: \"Risk\",\n \"missing-info\": \"Missing Info\",\n suggestion: \"Suggestion\",\n };\n return labels[severity];\n}\n\n/**\n * Build a JSON-serializable analysis result summary.\n * Shared by CLI (--json) and MCP server (analyze tool response).\n */\nexport function buildResultJson(\n fileName: string,\n result: AnalysisResult,\n scores: ScoreReport,\n options?: { fileKey?: string },\n): Record<string, unknown> {\n const issuesByRule: Record<string, number> = {};\n for (const issue of result.issues) {\n const id = issue.violation.ruleId;\n issuesByRule[id] = (issuesByRule[id] ?? 0) + 1;\n }\n\n const issues = result.issues.map((issue) => ({\n ruleId: issue.violation.ruleId,\n ...(issue.violation.subType && { subType: issue.violation.subType }),\n severity: issue.config.severity,\n nodeId: issue.violation.nodeId,\n nodePath: issue.violation.nodePath,\n message: issue.violation.message,\n }));\n\n const json: Record<string, unknown> = {\n version: VERSION,\n analyzedAt: result.analyzedAt,\n ...(options?.fileKey && { fileKey: options.fileKey }),\n fileName,\n nodeCount: result.nodeCount,\n maxDepth: result.maxDepth,\n issueCount: result.issues.length,\n scores: {\n overall: scores.overall,\n categories: scores.byCategory,\n },\n issuesByRule,\n issues,\n summary: formatScoreSummary(scores),\n };\n\n if (result.failedRules.length > 0) {\n json[\"failedRules\"] = result.failedRules;\n }\n\n return json;\n}","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { SeveritySchema } from \"../contracts/severity.js\";\nimport type { RuleConfig } from \"../contracts/rule.js\";\nimport { RULE_CONFIGS } from \"./rule-config.js\";\n\nconst VALID_RULE_IDS = new Set(Object.keys(RULE_CONFIGS));\n\nconst RuleOverrideSchema = z.object({\n score: z.number().int().max(0).optional(),\n severity: SeveritySchema.optional(),\n enabled: z.boolean().optional(),\n});\n\nconst ConfigFileSchema = z.object({\n excludeNodeTypes: z.array(z.string()).optional(),\n excludeNodeNames: z.array(z.string()).optional(),\n gridBase: z.number().int().positive().optional(),\n rules: z.record(z.string(), RuleOverrideSchema)\n .superRefine((rules, ctx) => {\n const unknown = Object.keys(rules).filter((id) => !VALID_RULE_IDS.has(id));\n if (unknown.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Unknown rule ID(s): ${unknown.join(\", \")}. Valid IDs: ${[...VALID_RULE_IDS].join(\", \")}`,\n });\n }\n })\n .optional(),\n});\n\nexport type ConfigFile = z.infer<typeof ConfigFileSchema>;\n\nexport async function loadConfigFile(filePath: string): Promise<ConfigFile> {\n const absPath = resolve(filePath);\n const raw = await readFile(absPath, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n return ConfigFileSchema.parse(parsed);\n}\n\n/**\n * Merge config overrides into the base rule configs\n */\nexport function mergeConfigs(\n base: Record<string, RuleConfig>,\n overrides: ConfigFile,\n): Record<string, RuleConfig> {\n const merged = { ...base };\n\n // Apply global gridBase to relevant rules\n if (overrides.gridBase !== undefined) {\n for (const [id, config] of Object.entries(merged)) {\n if (config.options && \"gridBase\" in config.options) {\n merged[id] = {\n ...config,\n options: { ...config.options, gridBase: overrides.gridBase },\n };\n }\n }\n }\n\n // Apply per-rule overrides\n if (overrides.rules) {\n for (const [ruleId, override] of Object.entries(overrides.rules)) {\n const existing = merged[ruleId];\n if (existing) {\n merged[ruleId] = {\n ...existing,\n ...(override.score !== undefined && { score: override.score }),\n ...(override.severity !== undefined && { severity: override.severity }),\n ...(override.enabled !== undefined && { enabled: override.enabled }),\n };\n }\n }\n }\n\n return merged;\n}\n","// Shared UI constants — single source of truth for report-html (Node) and app/shared (browser)\n\nimport type { Category } from \"./contracts/category.js\";\nimport type { Severity } from \"./contracts/severity.js\";\n\n// Re-export category/severity constants that already exist\nexport { CATEGORIES, CATEGORY_LABELS } from \"./contracts/category.js\";\nexport { SEVERITY_LABELS } from \"./contracts/severity.js\";\n\n// Gauge geometry\nexport const GAUGE_R = 54;\nexport const GAUGE_C = Math.round(2 * Math.PI * GAUGE_R); // ~339\n\nexport const CATEGORY_DESCRIPTIONS: Record<Category, string> = {\n \"pixel-critical\":\n \"Auto Layout, absolute positioning, group usage — layout issues that directly affect pixel accuracy\",\n \"responsive-critical\":\n \"Fixed sizing, size constraints, responsive behavior — issues that break at different viewports\",\n \"code-quality\":\n \"Component reuse, detached instances, variant structure, nesting depth\",\n \"token-management\":\n \"Design token binding for colors, fonts, shadows, opacity, spacing grid\",\n \"interaction\":\n \"State variants for interactive components — hover, disabled, active, focus\",\n \"semantic\":\n \"Semantic layer names, naming conventions, default names\",\n};\n\nexport const SEVERITY_ORDER: Severity[] = [\n \"blocking\",\n \"risk\",\n \"missing-info\",\n \"suggestion\",\n];\n","// Shared UI helper functions — single source of truth for report-html (Node) and app/shared (browser)\n// All functions here must be pure (no Node.js or DOM dependencies)\n\nimport type { Severity } from \"./contracts/severity.js\";\nimport { GAUGE_R, GAUGE_C } from \"./ui-constants.js\";\n\n/** Map a percentage score to a color hex string */\nexport function gaugeColor(pct: number): string {\n if (pct >= 75) return \"#22c55e\";\n if (pct >= 50) return \"#f59e0b\";\n return \"#ef4444\";\n}\n\n/** Map a percentage score to a color class name (green/amber/red) */\nexport function scoreClass(pct: number): string {\n if (pct >= 75) return \"green\";\n if (pct >= 50) return \"amber\";\n return \"red\";\n}\n\n/** Escape HTML special characters — works in both Node.js and browser */\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\n\n/** Severity to CSS modifier class (used with .rpt-dot, .rpt-issue-score) */\nexport function severityDot(sev: Severity): string {\n const map: Record<Severity, string> = {\n blocking: \"sev-blocking\",\n risk: \"sev-risk\",\n \"missing-info\": \"sev-missing\",\n suggestion: \"sev-suggestion\",\n };\n return map[sev];\n}\n\n/** Severity to CSS modifier class (used with .rpt-issue-score) */\nexport function severityBadge(sev: Severity): string {\n const map: Record<Severity, string> = {\n blocking: \"sev-blocking\",\n risk: \"sev-risk\",\n \"missing-info\": \"sev-missing\",\n suggestion: \"sev-suggestion\",\n };\n return map[sev];\n}\n\n/** Score percentage to CSS modifier class (used with .rpt-badge) */\nexport function scoreBadgeStyle(pct: number): string {\n if (pct >= 75) return \"score-green\";\n if (pct >= 50) return \"score-amber\";\n return \"score-red\";\n}\n\n/** Render a circular gauge SVG string — works in both Node.js and browser */\nexport function renderGaugeSvg(\n pct: number,\n size: number,\n strokeW: number,\n grade?: string\n): string {\n const offset = GAUGE_C * (1 - pct / 100);\n const color = gaugeColor(pct);\n if (grade) {\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" class=\"gauge-svg\">\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke-width=\"${strokeW}\" stroke=\"#e4e4e7\" />\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"${strokeW}\" stroke-linecap=\"round\" stroke-dasharray=\"${GAUGE_C}\" stroke-dashoffset=\"${offset}\" transform=\"rotate(-90 60 60)\" class=\"gauge-fill\" />\n <text x=\"60\" y=\"60\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"currentColor\" font-size=\"48\" font-weight=\"700\" font-family=\"Inter,-apple-system,sans-serif\">${escapeHtml(grade)}</text>\n </svg>`;\n }\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" class=\"gauge-svg\">\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke-width=\"${strokeW}\" stroke=\"#e4e4e7\" />\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"${strokeW}\" stroke-linecap=\"round\" stroke-dasharray=\"${GAUGE_C}\" stroke-dashoffset=\"${offset}\" transform=\"rotate(-90 60 60)\" class=\"gauge-fill\" />\n <text x=\"60\" y=\"62\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"currentColor\" font-size=\"28\" font-weight=\"700\" font-family=\"Inter,-apple-system,sans-serif\">${pct}</text>\n </svg>`;\n}\n","/**\n * Pure template functions for report HTML rendering.\n * No Node.js dependencies — usable in browser via CanICode.* globals.\n *\n * Single source of truth for all report UI:\n * - CLI: generateHtmlReport() wraps with <html> shell\n * - Web app: CanICode.renderReportBody() → innerHTML\n * - Figma plugin: CanICode.renderReportBody() → innerHTML\n *\n * Layout: category tabs → rule sections (static info) → node accordion (dynamic info)\n * Styled via self-contained CSS (app/shared/styles.css) — no Tailwind dependency.\n */\n\nimport type { Category } from \"../contracts/category.js\";\nimport type { AnalysisIssue } from \"../engine/rule-engine.js\";\nimport type { ScoreReport } from \"../engine/scoring.js\";\nimport { version as VERSION } from \"../../../package.json\";\nimport { buildFigmaDeepLink } from \"../adapters/figma-url-parser.js\";\nimport {\n CATEGORIES,\n CATEGORY_LABELS,\n} from \"../ui-constants.js\";\nimport {\n escapeHtml,\n severityDot,\n severityBadge,\n renderGaugeSvg,\n} from \"../ui-helpers.js\";\n\n// ---- Data interface ----\n\nexport interface ReportData {\n fileName: string;\n fileKey: string;\n scores: ScoreReport;\n issues: AnalysisIssue[];\n nodeCount: number;\n maxDepth: number;\n figmaToken?: string;\n}\n\n/** Issues grouped by rule within a category */\ninterface RuleGroup {\n ruleId: string;\n ruleName: string;\n severity: string;\n severityClass: string;\n why: string;\n impact: string;\n fix: string;\n issues: AnalysisIssue[];\n totalScore: number;\n}\n\n// ---- Main render ----\n\n/**\n * Render the report body content (everything inside <main>).\n * Does NOT include <html>, <head>, <body> — caller wraps as needed.\n */\nexport function renderReportBody(data: ReportData): string {\n const { scores, issues, fileKey, figmaToken } = data;\n const issuesByCategory = groupIssuesByCategory(issues);\n const ruleOpportunities = getTopRules(issues, 5);\n\n return `\n <!-- Overall Score -->\n <section class=\"rpt-overall\">\n ${renderGaugeSvg(scores.overall.percentage, 200, 10, scores.overall.grade)}\n <div class=\"rpt-score\">\n <span class=\"rpt-score-value\">${scores.overall.percentage}</span>\n <span class=\"rpt-score-max\">/ 100</span>\n </div>\n <p class=\"rpt-score-label\">Overall Score</p>\n </section>\n\n <!-- Category Gauges -->\n <section class=\"card rpt-gauges\">\n <div class=\"rpt-gauges-grid\">\n${CATEGORIES.map((cat) => {\n const cs = scores.byCategory[cat];\n return ` <button type=\"button\" class=\"rpt-gauge-item\" data-tab=\"${cat}\">\n ${renderGaugeSvg(cs.percentage, 100, 7)}\n <span class=\"rpt-gauge-label\">${CATEGORY_LABELS[cat]}</span>\n <span class=\"rpt-gauge-count\">${cs.issueCount} issues</span>\n </button>`;\n }).join(\"\\n\")}\n </div>\n </section>\n\n <!-- Issue Summary -->\n <section class=\"card rpt-summary\">\n <div class=\"rpt-summary-inner\">\n ${renderSummaryDot(\"sev-blocking\", scores.summary.blocking, \"Blocking\")}\n ${renderSummaryDot(\"sev-risk\", scores.summary.risk, \"Risk\")}\n ${renderSummaryDot(\"sev-missing\", scores.summary.missingInfo, \"Missing Info\")}\n ${renderSummaryDot(\"sev-suggestion\", scores.summary.suggestion, \"Suggestion\")}\n <div class=\"rpt-summary-total\">\n <span class=\"rpt-summary-count\">${scores.summary.totalIssues}</span>\n <span class=\"rpt-summary-label\">Total</span>\n </div>\n </div>\n </section>\n\n${ruleOpportunities.length > 0 ? renderOpportunities(ruleOpportunities) : \"\"}\n\n <!-- Category Tabs -->\n <div class=\"rpt-tabs\">\n <div class=\"rpt-tab-list\" role=\"tablist\">\n${CATEGORIES.map((cat, i) => {\n const cs = scores.byCategory[cat];\n return ` <button type=\"button\" role=\"tab\" class=\"rpt-tab${i === 0 ? \" active\" : \"\"}\" data-tab=\"${cat}\" aria-selected=\"${i === 0}\">${CATEGORY_LABELS[cat]} <span class=\"rpt-tab-count\">${cs.issueCount}</span></button>`;\n }).join(\"\\n\")}\n </div>\n\n${CATEGORIES.map((cat, i) => {\n const catIssues = issuesByCategory.get(cat) ?? [];\n const ruleGroups = groupIssuesByRule(catIssues);\n return ` <div class=\"rpt-tab-panel${i === 0 ? \" active\" : \"\"}\" data-panel=\"${cat}\" role=\"tabpanel\">\n${ruleGroups.length === 0\n ? ' <div class=\"rpt-cat-empty\">No issues found</div>'\n : ruleGroups.map(rg => renderRuleSection(rg, fileKey, figmaToken)).join(\"\\n\")\n}\n </div>`;\n }).join(\"\\n\")}\n </div>\n\n <!-- Footer -->\n <footer class=\"rpt-footer\">\n <p class=\"rpt-footer-main\"><strong>CanICode</strong> <span style=\"opacity:0.5\">v${VERSION}</span></p>\n <p class=\"rpt-footer-meta\">${new Date().toLocaleString()} · ${data.nodeCount} nodes · Max depth ${data.maxDepth}</p>\n <p class=\"rpt-footer-links\"><a href=\"https://github.com/let-sunny/canicode/issues\" target=\"_blank\" rel=\"noopener\">Feedback</a> <span style=\"opacity:0.3\">&middot;</span> <a href=\"https://github.com/let-sunny/canicode/discussions/new?category=share-your-figma\" target=\"_blank\" rel=\"noopener\">Share your Figma</a></p>\n </footer>`;\n}\n\n// ---- Components ----\n\nexport function renderSummaryDot(sevClass: string, count: number, label: string): string {\n return `<div class=\"rpt-summary-item\">\n <span class=\"rpt-dot ${sevClass}\"></span>\n <span class=\"rpt-summary-count\">${count}</span>\n <span class=\"rpt-summary-label\">${label}</span>\n </div>`;\n}\n\nexport function renderOpportunities(ruleGroups: RuleGroup[]): string {\n const maxAbs = ruleGroups.reduce((m, rg) => Math.max(m, Math.abs(rg.totalScore)), 1);\n return `\n <!-- Opportunities -->\n <section class=\"card rpt-opps\">\n <div class=\"rpt-opps-header\">\n <h2 class=\"rpt-opps-title\">\n <span class=\"rpt-dot sev-blocking\"></span>\n Opportunities\n </h2>\n <p class=\"rpt-opps-desc\">Top impact rules — fix these first for the biggest improvement.</p>\n </div>\n <div class=\"rpt-opps-list\">\n${ruleGroups.map(rg => {\n const barW = Math.round((Math.abs(rg.totalScore) / maxAbs) * 100);\n const cat = rg.issues[0]?.rule.definition.category ?? \"\";\n return ` <div class=\"rpt-opps-item\" data-opp-rule=\"${esc(rg.ruleId)}\" data-opp-cat=\"${cat}\" style=\"cursor:pointer\">\n <div class=\"rpt-opps-info\">\n <div class=\"rpt-opps-name\">${esc(rg.ruleName)}</div>\n <div class=\"rpt-opps-msg\">${rg.issues.length} issues</div>\n </div>\n <div class=\"rpt-opps-bar-wrap\">\n <div class=\"rpt-opps-bar\">\n <div class=\"rpt-opps-bar-fill\" style=\"width:${barW}%\"></div>\n </div>\n <span class=\"rpt-opps-score\">${rg.totalScore}</span>\n </div>\n </div>`;\n }).join(\"\\n\")}\n </div>\n </section>`;\n}\n\nexport function renderRuleSection(\n rg: RuleGroup,\n fileKey: string,\n figmaToken?: string\n): string {\n const isOpen = rg.severity === \"blocking\" || rg.severity === \"risk\";\n return ` <details class=\"card rpt-rule\" data-rule=\"${esc(rg.ruleId)}\"${isOpen ? \" open\" : \"\"}>\n <summary class=\"rpt-rule-header\">\n <span class=\"rpt-badge score-red\">${rg.totalScore}</span>\n <span class=\"rpt-rule-title\">\n <span class=\"rpt-rule-name\">${esc(rg.ruleName)}</span>\n <span class=\"rpt-rule-meta\">\n <span class=\"rpt-dot-sm ${rg.severityClass}\"></span>\n ${esc(rg.severity)} · ${rg.issues.length} issues\n </span>\n <span class=\"rpt-rule-info\">\n <span class=\"rpt-rule-info-line\"><strong>Why:</strong> ${esc(rg.why)}</span>\n <span class=\"rpt-rule-info-line\"><strong>Impact:</strong> ${esc(rg.impact)}</span>\n <span class=\"rpt-rule-info-line\"><strong>Fix:</strong> ${esc(rg.fix)}</span>\n </span>\n </span>\n <svg class=\"rpt-rule-chevron no-print\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M19 9l-7 7-7-7\"/></svg>\n </summary>\n <div class=\"rpt-rule-issues\">\n${rg.issues.map(issue => renderIssueRow(issue, fileKey, figmaToken)).join(\"\\n\")}\n </div>\n </details>`;\n}\n\nexport function renderIssueRow(\n issue: AnalysisIssue,\n fileKey: string,\n figmaToken?: string\n): string {\n const sev = issue.config.severity;\n const v = issue.violation;\n const link = buildFigmaDeepLink(fileKey, v.nodeId);\n\n return ` <details class=\"rpt-issue\">\n <summary class=\"rpt-issue-header\">\n <span class=\"rpt-issue-msg\">${esc(v.message)}</span>\n <span class=\"rpt-issue-score ${severityBadge(sev)}\">${issue.calculatedScore}</span>\n </summary>\n <div class=\"rpt-issue-body\">\n <div class=\"rpt-issue-suggestion\">${esc(v.suggestion)}</div>${v.guide ? `\n <div class=\"rpt-issue-guide\">${esc(v.guide)}</div>` : \"\"}\n <div class=\"rpt-issue-path\">${esc(v.nodePath)}</div>\n <div class=\"rpt-issue-actions no-print\">\n <a href=\"${link}\" target=\"_blank\" rel=\"noopener\" data-node-id=\"${esc(v.nodeId)}\" class=\"rpt-btn\">Go to node <span>→</span></a>${figmaToken ? `\n <button onclick=\"postComment(this)\" data-file-key=\"${esc(fileKey)}\" data-node-id=\"${esc(v.nodeId)}\" data-message=\"${esc(v.message)} — ${esc(v.suggestion)}\" class=\"rpt-btn\">Comment on Figma</button>` : \"\"}\n </div>\n </div>\n </details>`;\n}\n\n// ---- Interactions ----\n\n/**\n * Initialize tab switching + navigation for a rendered report.\n * Call after inserting renderReportBody() HTML into a container.\n * Uses 'any' to avoid DOM type dependency (this file targets Node.js).\n */\nexport function initReportInteractions(container: any): void {\n // Remove previous handler if re-initialized (e.g., re-analysis)\n if (container._rptHandler) {\n container.removeEventListener(\"click\", container._rptHandler);\n }\n function activate(cat: string, scrollTo: boolean) {\n container.querySelectorAll(\".rpt-tab\").forEach((t: any) => {\n const active = t.dataset.tab === cat;\n t.classList.toggle(\"active\", active);\n t.setAttribute(\"aria-selected\", String(active));\n });\n container.querySelectorAll(\".rpt-tab-panel\").forEach((p: any) => {\n p.classList.toggle(\"active\", p.dataset.panel === cat);\n });\n if (scrollTo) {\n const tabList = container.querySelector(\".rpt-tab-list\");\n if (tabList) tabList.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n }\n function focusRule(ruleId: string) {\n const el = container.querySelector('[data-rule=\"' + ruleId + '\"]');\n if (el) {\n el.open = true;\n setTimeout(() => el.scrollIntoView({ behavior: \"smooth\", block: \"start\" }), 50);\n }\n }\n const handler = (e: any) => {\n const tab = e.target.closest(\"[data-tab]\");\n if (tab) {\n const isGauge = tab.classList.contains(\"rpt-gauge-item\");\n activate(tab.dataset.tab ?? \"\", isGauge);\n return;\n }\n const opp = e.target.closest(\"[data-opp-rule]\");\n if (opp) {\n const cat = opp.dataset.oppCat ?? \"\";\n const rule = opp.dataset.oppRule ?? \"\";\n if (cat) activate(cat, false);\n setTimeout(() => focusRule(rule), 50);\n }\n };\n container._rptHandler = handler;\n container.addEventListener(\"click\", handler);\n}\n\n// ---- Utils ----\n\n/** Get top N rules by total score impact */\nfunction getTopRules(issues: AnalysisIssue[], limit: number): RuleGroup[] {\n const byRule = new Map<string, RuleGroup>();\n for (const issue of issues) {\n const id = issue.rule.definition.id;\n let group = byRule.get(id);\n if (!group) {\n const def = issue.rule.definition;\n group = {\n ruleId: id,\n ruleName: def.name,\n severity: issue.config.severity,\n severityClass: severityDot(issue.config.severity),\n why: def.why,\n impact: def.impact,\n fix: def.fix,\n issues: [],\n totalScore: 0,\n };\n byRule.set(id, group);\n }\n group.issues.push(issue);\n group.totalScore += issue.calculatedScore;\n }\n return [...byRule.values()]\n .sort((a, b) => a.totalScore - b.totalScore)\n .slice(0, limit);\n}\n\nfunction groupIssuesByCategory(issues: AnalysisIssue[]): Map<Category, AnalysisIssue[]> {\n const grouped = new Map<Category, AnalysisIssue[]>();\n for (const category of CATEGORIES) grouped.set(category, []);\n for (const issue of issues) grouped.get(issue.rule.definition.category)!.push(issue);\n return grouped;\n}\n\n/** Group issues by rule within a category, sorted by severity then score */\nfunction groupIssuesByRule(issues: AnalysisIssue[]): RuleGroup[] {\n const byRule = new Map<string, RuleGroup>();\n for (const issue of issues) {\n const id = issue.rule.definition.id;\n let group = byRule.get(id);\n if (!group) {\n const def = issue.rule.definition;\n group = {\n ruleId: id,\n ruleName: def.name,\n severity: issue.config.severity,\n severityClass: severityDot(issue.config.severity),\n why: def.why,\n impact: def.impact,\n fix: def.fix,\n issues: [],\n totalScore: 0,\n };\n byRule.set(id, group);\n }\n group.issues.push(issue);\n group.totalScore += issue.calculatedScore;\n }\n\n const SEVERITY_RANK: Record<string, number> = { blocking: 0, risk: 1, \"missing-info\": 2, suggestion: 3 };\n return [...byRule.values()].sort((a, b) => {\n const sevDiff = (SEVERITY_RANK[a.severity] ?? 4) - (SEVERITY_RANK[b.severity] ?? 4);\n return sevDiff !== 0 ? sevDiff : a.totalScore - b.totalScore;\n });\n}\n\nconst esc = escapeHtml;\n","// Report HTML module — full page generation for CLI\n// Rendering logic lives in render.ts (shared with web/plugin)\n\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\nimport type { AnalysisResult } from \"../engine/rule-engine.js\";\nimport type { ScoreReport } from \"../engine/scoring.js\";\nimport { escapeHtml } from \"../ui-helpers.js\";\nimport { renderReportBody, initReportInteractions } from \"./render.js\";\nimport type { ReportData } from \"./render.js\";\n\ndeclare const __REPORT_CSS__: string;\nconst reportCss: string = __REPORT_CSS__;\n\nexport type { ReportData } from \"./render.js\";\nexport { renderReportBody, initReportInteractions } from \"./render.js\";\n\nexport interface NodeScreenshot {\n nodeId: string;\n nodePath: string;\n screenshotBase64: string;\n issueCount: number;\n topSeverity: string;\n}\n\nexport interface HtmlReportOptions {\n nodeScreenshots?: NodeScreenshot[];\n figmaToken?: string | undefined;\n}\n\nconst esc = escapeHtml;\n\n/**\n * Generate a complete standalone HTML report page.\n * Used by CLI — opens in browser.\n */\nexport function generateHtmlReport(\n file: AnalysisFile,\n result: AnalysisResult,\n scores: ScoreReport,\n options?: HtmlReportOptions\n): string {\n const figmaToken = options?.figmaToken;\n\n const data: ReportData = {\n fileName: file.name,\n fileKey: file.fileKey,\n scores,\n issues: result.issues,\n nodeCount: result.nodeCount,\n maxDepth: result.maxDepth,\n ...(figmaToken && { figmaToken }),\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 <title>CanICode Report — ${esc(file.name)}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n <style>\n${reportCss}\n .cli-topbar {\n background: #09090b; color: white;\n border-bottom: 1px solid #27272a;\n }\n .cli-topbar-inner {\n max-width: 960px; margin: 0 auto;\n padding: 12px 24px;\n display: flex; align-items: center; gap: 16px;\n }\n .cli-topbar-logo { font-weight: 600; font-size: 14px; letter-spacing: -0.01em; }\n .cli-topbar-file { color: #a1a1aa; font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .cli-topbar-date { margin-left: auto; color: #71717a; font-size: 12px; }\n .cli-main { max-width: 960px; margin: 0 auto; padding: 0 24px 64px; }\n @media print {\n .cli-topbar { position: static !important; background: white !important; color: var(--fg) !important; }\n .cli-topbar-file { color: var(--fg-muted) !important; }\n }\n </style>\n</head>\n<body>\n\n <!-- Top Bar -->\n <header class=\"cli-topbar\">\n <div class=\"cli-topbar-inner\">\n <span class=\"cli-topbar-logo\">CanICode</span>\n <span class=\"cli-topbar-file\">${esc(file.name)}</span>\n <span class=\"cli-topbar-date no-print\">${new Date().toLocaleDateString()}</span>\n </div>\n </header>\n\n <main class=\"cli-main\">\n${renderReportBody(data)}\n </main>\n\n <script>(${String(initReportInteractions)})(document.querySelector('.cli-main'));</script>\n${figmaToken ? renderFigmaCommentScript(figmaToken) : \"\"}\n</body>\n</html>`;\n}\n\nfunction renderFigmaCommentScript(figmaToken: string): string {\n return ` <script>\n const FIGMA_TOKEN = '${figmaToken}';\n async function postComment(btn) {\n const fileKey = btn.dataset.fileKey;\n const nodeId = btn.dataset.nodeId.replace(/-/g, ':');\n const commentNodeId = nodeId.split(';')[0].replace(/^I/, '');\n const message = btn.dataset.message;\n const commentBody = '[CanICode] ' + message;\n btn.disabled = true;\n btn.textContent = 'Sending...';\n btn.title = '';\n try {\n const res = await fetch('https://api.figma.com/v1/files/' + fileKey + '/comments', {\n method: 'POST',\n headers: { 'X-FIGMA-TOKEN': FIGMA_TOKEN, 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: commentBody, client_meta: { node_id: commentNodeId, node_offset: { x: 0, y: 0 } } }),\n });\n if (!res.ok) {\n const errBody = await res.text().catch(() => '');\n const errMsg = res.status === 400 ? 'Bad request' : res.status === 403 ? 'Token lacks file access' : res.status === 404 ? 'File not found' : res.status === 429 ? 'Rate limited' : 'HTTP ' + res.status;\n throw new Error(errMsg + (errBody ? ': ' + errBody.slice(0, 100) : ''));\n }\n btn.textContent = 'Sent';\n btn.classList.remove('rpt-btn-fail');\n btn.classList.add('rpt-btn-ok');\n } catch (e) {\n btn.textContent = 'Failed';\n btn.title = e.message || String(e);\n btn.classList.remove('rpt-btn-ok');\n btn.classList.add('rpt-btn-fail');\n btn.disabled = false;\n }\n }\n </script>`;\n}\n","import type { AnalysisFile, AnalysisNode } from \"../core/contracts/figma-node.js\";\n\nexport const MAX_NODES_WITHOUT_SCOPE = 500;\n\n/**\n * Find all FRAME/COMPONENT nodes with 50-500 nodes in their subtree,\n * then pick one at random. Used to auto-scope fixture analysis.\n */\nexport function pickRandomScope(root: AnalysisFile[\"document\"]): AnalysisFile[\"document\"] | null {\n const candidates: AnalysisFile[\"document\"][] = [];\n\n function collect(node: AnalysisFile[\"document\"]): void {\n const isContainer = node.type === \"FRAME\" || node.type === \"COMPONENT\" || node.type === \"SECTION\";\n if (isContainer) {\n const size = countNodes(node);\n if (size >= 50 && size <= 500) {\n candidates.push(node);\n }\n }\n if (\"children\" in node && node.children) {\n for (const child of node.children) {\n collect(child);\n }\n }\n }\n\n collect(root);\n if (candidates.length === 0) return null;\n const idx = Math.floor(Math.random() * candidates.length);\n return candidates[idx] ?? null;\n}\n\nexport function collectVectorNodeIds(node: { id: string; type: string; children?: readonly unknown[] | undefined }): string[] {\n const ids: string[] = [];\n if (node.type === \"VECTOR\") ids.push(node.id);\n if (node.children) {\n for (const child of node.children) {\n ids.push(...collectVectorNodeIds(child as typeof node));\n }\n }\n return ids;\n}\n\nexport function collectVectorNodes(node: { id: string; name: string; type: string; children?: readonly unknown[] | undefined }, parentName?: string): Array<{ id: string; name: string }> {\n const nodes: Array<{ id: string; name: string }> = [];\n if (node.type === \"VECTOR\") {\n // Include parent name for unique filenames (all vectors are often named \"Icon\")\n const qualifiedName = parentName ? `${parentName}-${node.name}` : node.name;\n nodes.push({ id: node.id, name: qualifiedName });\n }\n if (node.children) {\n for (const child of node.children) {\n nodes.push(...collectVectorNodes(child as typeof node, node.name));\n }\n }\n return nodes;\n}\n\nexport function collectImageNodes(node: AnalysisNode): Array<{ id: string; name: string; imageRef?: string }> {\n const nodes: Array<{ id: string; name: string; imageRef?: string }> = [];\n function walk(n: AnalysisNode): void {\n if (n.fills && Array.isArray(n.fills)) {\n for (const fill of n.fills) {\n const f = fill as { type?: string; imageRef?: string };\n if (f.type === \"IMAGE\") {\n if (f.imageRef) {\n nodes.push({ id: n.id, name: n.name, imageRef: f.imageRef });\n } else {\n nodes.push({ id: n.id, name: n.name });\n }\n break;\n }\n }\n }\n if (n.children) {\n for (const child of n.children) walk(child);\n }\n }\n walk(node);\n return nodes;\n}\n\nexport function sanitizeFilename(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n || \"image\";\n}\n\nexport function countNodes(node: { children?: readonly unknown[] | undefined }): number {\n let count = 1;\n if (node.children) {\n for (const child of node.children) {\n count += countNodes(child as { children?: readonly unknown[] | undefined });\n }\n }\n return count;\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport type { RuleConfig, RuleId } from \"../../core/contracts/rule.js\";\nimport { analyzeFile } from \"../../core/engine/rule-engine.js\";\nimport { loadFile, isJsonFile, isFixtureDir } from \"../../core/engine/loader.js\";\nimport {\n getFigmaToken, getReportsDir, ensureReportsDir,\n} from \"../../core/engine/config-store.js\";\nimport { calculateScores, formatScoreSummary, buildResultJson } from \"../../core/engine/scoring.js\";\nimport { getConfigsWithPreset, RULE_CONFIGS } from \"../../core/rules/rule-config.js\";\nimport { loadConfigFile, mergeConfigs } from \"../../core/rules/config-loader.js\";\nimport { generateHtmlReport } from \"../../core/report-html/index.js\";\nimport { trackEvent, trackError, EVENTS } from \"../../core/monitoring/index.js\";\nimport { pickRandomScope, countNodes, MAX_NODES_WITHOUT_SCOPE } from \"../helpers.js\";\n\nconst AnalyzeOptionsSchema = z.object({\n preset: z.enum([\"relaxed\", \"dev-friendly\", \"ai-ready\", \"strict\"]).optional(),\n output: z.string().optional(),\n token: z.string().optional(),\n api: z.boolean().optional(),\n screenshot: z.boolean().optional(),\n config: z.string().optional(),\n noOpen: z.boolean().optional(),\n json: z.boolean().optional(),\n});\n\n\nexport function registerAnalyze(cli: CAC): void {\n cli\n .command(\"analyze <input>\", \"Analyze a Figma file or JSON fixture\")\n .option(\"--preset <preset>\", \"Analysis preset (relaxed | dev-friendly | ai-ready | strict)\")\n .option(\"--output <path>\", \"HTML report output path\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--api\", \"Load via Figma REST API (requires FIGMA_TOKEN)\")\n .option(\"--screenshot\", \"Include screenshot comparison in report (requires ANTHROPIC_API_KEY)\")\n .option(\"--config <path>\", \"Path to config JSON file (override rule scores/settings)\")\n .option(\"--no-open\", \"Don't open report in browser after analysis\")\n .option(\"--json\", \"Output JSON results to stdout (same format as MCP)\")\n .example(\" canicode analyze https://www.figma.com/design/ABC123/MyDesign\")\n .example(\" canicode analyze https://www.figma.com/design/ABC123/MyDesign --api --token YOUR_TOKEN\")\n .example(\" canicode analyze ./fixtures/my-design --output report.html\")\n .example(\" canicode analyze ./fixtures/my-design --config ./my-config.json\")\n .action(async (input: string, rawOptions: Record<string, unknown>) => {\n const parseResult = AnalyzeOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => `--${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n const analysisStart = Date.now();\n trackEvent(EVENTS.ANALYSIS_STARTED, { source: isJsonFile(input) || isFixtureDir(input) ? \"fixture\" : \"figma\" });\n // In --json mode, send progress messages to stderr so stdout contains only valid JSON\n const log = options.json ? console.error.bind(console) : console.log.bind(console);\n try {\n // Check init\n if (!options.token && !getFigmaToken() && !isJsonFile(input) && !isFixtureDir(input)) {\n throw new Error(\n \"canicode is not configured. Run 'canicode init --token YOUR_TOKEN' first.\"\n );\n }\n\n // Validate --screenshot requirements\n if (options.screenshot) {\n const anthropicKey = process.env[\"ANTHROPIC_API_KEY\"];\n if (!anthropicKey) {\n throw new Error(\n \"ANTHROPIC_API_KEY required for --screenshot mode. Set it in .env or environment.\"\n );\n }\n log(\"Screenshot comparison mode enabled (coming soon).\\n\");\n }\n\n // Load file\n const { file, nodeId } = await loadFile(input, options.token);\n\n // Scope enforcement for large files\n const totalNodes = countNodes(file.document);\n let effectiveNodeId = nodeId;\n\n if (!effectiveNodeId && totalNodes > MAX_NODES_WITHOUT_SCOPE) {\n if (isJsonFile(input) || isFixtureDir(input)) {\n // Fixture: auto-pick a random suitable FRAME\n const picked = pickRandomScope(file.document);\n if (picked) {\n effectiveNodeId = picked.id;\n log(`\\nAuto-scoped to \"${picked.name}\" (${picked.id}, ${countNodes(picked)} nodes) — file too large (${totalNodes} nodes) for unscoped analysis.`);\n } else {\n console.warn(`\\nWarning: Could not find a suitable scope in fixture. Analyzing all ${totalNodes} nodes.`);\n }\n } else {\n // Figma URL: require explicit node-id\n throw new Error(\n `Too many nodes (${totalNodes}) for unscoped analysis. ` +\n `Max ${MAX_NODES_WITHOUT_SCOPE} nodes without a node-id scope.\\n\\n` +\n `Add ?node-id=XXX to the Figma URL to target a specific section.\\n` +\n `Example: canicode analyze \"https://www.figma.com/design/.../MyDesign?node-id=1-234\"`\n );\n }\n }\n if (!effectiveNodeId && totalNodes > 100) {\n console.warn(`\\nWarning: Analyzing ${totalNodes} nodes without scope. Results may be noisy.`);\n console.warn(\"Tip: Add ?node-id=XXX to analyze a specific section.\\n\");\n }\n\n log(`\\nAnalyzing: ${file.name}`);\n log(`Nodes: ${totalNodes}`);\n\n // Build rule configs: start from preset or defaults\n let configs: Record<string, RuleConfig> = options.preset\n ? { ...getConfigsWithPreset(options.preset) }\n : { ...RULE_CONFIGS };\n\n // Load and merge config file overrides\n let excludeNodeNames: string[] | undefined;\n let excludeNodeTypes: string[] | undefined;\n\n if (options.config) {\n const configFile = await loadConfigFile(options.config);\n configs = mergeConfigs(configs, configFile);\n excludeNodeNames = configFile.excludeNodeNames;\n excludeNodeTypes = configFile.excludeNodeTypes;\n log(`Config loaded: ${options.config}`);\n }\n\n // Build analysis options\n const analyzeOptions = {\n configs: configs as Record<RuleId, RuleConfig>,\n ...(effectiveNodeId && { targetNodeId: effectiveNodeId }),\n ...(excludeNodeNames && { excludeNodeNames }),\n ...(excludeNodeTypes && { excludeNodeTypes }),\n };\n\n // Run analysis\n const result = analyzeFile(file, analyzeOptions);\n log(`Nodes: ${result.nodeCount} (max depth: ${result.maxDepth})`);\n\n // Calculate scores using the same preset-adjusted configs\n const scores = calculateScores(result, configs as Record<RuleId, RuleConfig>);\n\n // JSON output mode — only JSON goes to stdout; exit code still applies\n if (options.json) {\n console.log(JSON.stringify(buildResultJson(file.name, result, scores, { fileKey: file.fileKey }), null, 2));\n if (scores.overall.grade === \"F\") {\n process.exitCode = 1;\n }\n return;\n }\n\n // Print summary to terminal\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(formatScoreSummary(scores));\n console.log(\"=\".repeat(50));\n\n // Generate HTML report\n const now = new Date();\n const ts = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")}-${String(now.getHours()).padStart(2, \"0\")}-${String(now.getMinutes()).padStart(2, \"0\")}`;\n let outputPath: string;\n\n if (options.output) {\n outputPath = resolve(options.output);\n const outputDir = dirname(outputPath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n } else {\n ensureReportsDir();\n outputPath = resolve(getReportsDir(), `report-${ts}-${file.fileKey}.html`);\n }\n\n const figmaToken = options.token ?? getFigmaToken();\n const html = generateHtmlReport(file, result, scores, { figmaToken });\n await writeFile(outputPath, html, \"utf-8\");\n console.log(`\\nReport saved: ${outputPath}`);\n\n trackEvent(EVENTS.ANALYSIS_COMPLETED, {\n nodeCount: result.nodeCount,\n issueCount: result.issues.length,\n grade: scores.overall.grade,\n percentage: scores.overall.percentage,\n duration: Date.now() - analysisStart,\n });\n trackEvent(EVENTS.REPORT_GENERATED, { format: \"html\" });\n\n // Open in browser unless --no-open\n if (!options.noOpen) {\n const { exec } = await import(\"node:child_process\");\n const cmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${cmd} \"${outputPath}\"`);\n }\n\n // Exit with error code if grade is F\n if (scores.overall.grade === \"F\") {\n process.exitCode = 1;\n }\n } catch (error) {\n trackError(\n error instanceof Error ? error : new Error(String(error)),\n { command: \"analyze\", input },\n );\n trackEvent(EVENTS.ANALYSIS_FAILED, {\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - analysisStart,\n });\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport { parseFigmaUrl } from \"../../core/adapters/figma-url-parser.js\";\nimport { loadFile, isFigmaUrl } from \"../../core/engine/loader.js\";\nimport { getFigmaToken } from \"../../core/engine/config-store.js\";\nimport { collectVectorNodes, collectImageNodes, sanitizeFilename, countNodes } from \"../helpers.js\";\n\nconst SaveFixtureOptionsSchema = z.object({\n output: z.string().optional(),\n api: z.boolean().optional(),\n token: z.string().optional(),\n imageScale: z.string().optional(),\n name: z.string().optional(),\n});\n\n\nexport function registerSaveFixture(cli: CAC): void {\n cli\n .command(\n \"save-fixture <input>\",\n \"Save Figma design as a fixture directory for offline analysis\"\n )\n .option(\"--output <path>\", \"Output directory (default: fixtures/<name>/)\")\n .option(\"--name <name>\", \"Fixture name (default: extracted from URL)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--image-scale <n>\", \"Image export scale: 2 for PC (default), 3 for mobile\")\n .example(\" canicode save-fixture https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\")\n .example(\" canicode save-fixture https://www.figma.com/design/ABC123/MyDesign?node-id=1-234 --image-scale 3\")\n .action(async (input: string, rawOptions: Record<string, unknown>) => {\n try {\n const parseResult = SaveFixtureOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => `--${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n\n if (!isFigmaUrl(input)) {\n throw new Error(\"save-fixture requires a Figma URL as input.\");\n }\n\n // Validate --image-scale early (before any file I/O)\n if (options.imageScale !== undefined) {\n const scale = Number(options.imageScale);\n if (!Number.isFinite(scale) || scale < 1 || scale > 4) {\n console.error(\"Error: --image-scale must be 1-4 (2 for PC, 3 for mobile)\");\n process.exit(1);\n }\n }\n\n if (!parseFigmaUrl(input).nodeId) {\n console.warn(\"\\nWarning: No node-id specified. Saving entire file as fixture.\");\n console.warn(\"Tip: Add ?node-id=XXX to save a specific section.\\n\");\n }\n\n const { file } = await loadFile(input, options.token);\n file.sourceUrl = input;\n\n const fixtureName = options.name ?? file.fileKey;\n const fixtureDir = resolve(options.output ?? `fixtures/${fixtureName}`);\n mkdirSync(fixtureDir, { recursive: true });\n\n // 0. Resolve component master node trees\n const figmaTokenForComponents = options.token ?? getFigmaToken();\n if (figmaTokenForComponents) {\n const { FigmaClient: FC } = await import(\"../../core/adapters/figma-client.js\");\n const { resolveComponentDefinitions, resolveInteractionDestinations } = await import(\"../../core/adapters/component-resolver.js\");\n const componentClient = new FC({ token: figmaTokenForComponents });\n try {\n const definitions = await resolveComponentDefinitions(componentClient, file.fileKey, file.document);\n const count = Object.keys(definitions).length;\n if (count > 0) {\n file.componentDefinitions = definitions;\n console.log(`Resolved ${count} component master node tree(s)`);\n }\n // Resolve interaction destinations (hover variants, etc.)\n const interactionDests = await resolveInteractionDestinations(componentClient, file.fileKey, file.document, file.componentDefinitions);\n const destCount = Object.keys(interactionDests).length;\n if (destCount > 0) {\n file.interactionDestinations = interactionDests;\n console.log(`Resolved ${destCount} interaction destination(s)`);\n }\n } catch {\n console.warn(\"Warning: failed to resolve component definitions (continuing)\");\n }\n }\n\n // 1. Save data.json\n const dataPath = resolve(fixtureDir, \"data.json\");\n await writeFile(dataPath, JSON.stringify(file, null, 2), \"utf-8\");\n console.log(`Fixture saved: ${fixtureDir}/`);\n console.log(` data.json: ${file.name} (${countNodes(file.document)} nodes)`);\n\n // 2. Download screenshot\n const figmaToken = options.token ?? getFigmaToken();\n if (figmaToken) {\n const { FigmaClient } = await import(\"../../core/adapters/figma-client.js\");\n const client = new FigmaClient({ token: figmaToken });\n const { nodeId } = parseFigmaUrl(input);\n const rootNodeId = nodeId?.replace(/-/g, \":\") ?? file.document.id;\n\n try {\n const imageUrls = await client.getNodeImages(file.fileKey, [rootNodeId], { format: \"png\", scale: 2 });\n const url = imageUrls[rootNodeId];\n if (url) {\n const resp = await fetch(url);\n if (resp.ok) {\n const buffer = Buffer.from(await resp.arrayBuffer());\n const { writeFile: writeFileSync } = await import(\"node:fs/promises\");\n await writeFileSync(resolve(fixtureDir, \"screenshot.png\"), buffer);\n console.log(` screenshot.png: saved`);\n }\n }\n } catch {\n console.warn(\" screenshot.png: failed to download (continuing)\");\n }\n\n // 3. Download SVGs for VECTOR nodes\n const vectorNodes = collectVectorNodes(file.document);\n if (vectorNodes.length > 0) {\n const vectorDir = resolve(fixtureDir, \"vectors\");\n mkdirSync(vectorDir, { recursive: true });\n\n const svgUrls = await client.getNodeImages(\n file.fileKey,\n vectorNodes.map(n => n.id),\n { format: \"svg\" },\n );\n // Build mapping + download in a single pass to keep filenames consistent\n const mapping: Record<string, string> = {};\n const usedNames = new Map<string, number>();\n let downloaded = 0;\n for (const { id, name } of vectorNodes) {\n let base = sanitizeFilename(name);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n if (count > 0) base = `${base}-${count + 1}`;\n const filename = `${base}.svg`;\n mapping[id] = filename;\n const svgUrl = svgUrls[id];\n if (!svgUrl) continue;\n try {\n const resp = await fetch(svgUrl);\n if (resp.ok) {\n const svg = await resp.text();\n await writeFile(resolve(vectorDir, filename), svg, \"utf-8\");\n downloaded++;\n }\n } catch {\n // Skip failed downloads\n }\n }\n await writeFile(resolve(vectorDir, \"mapping.json\"), JSON.stringify(mapping, null, 2), \"utf-8\");\n\n console.log(` vectors/: ${downloaded}/${vectorNodes.length} SVGs`);\n }\n\n // 4. Download PNGs for IMAGE fill nodes\n const imageNodes = collectImageNodes(file.document);\n if (imageNodes.length > 0) {\n const imgScale = options.imageScale !== undefined ? Number(options.imageScale) : 2;\n\n const imageDir = resolve(fixtureDir, \"images\");\n mkdirSync(imageDir, { recursive: true });\n\n // Use image fills API to get original images (not node renders which include children)\n const imageFills = await client.getImageFills(file.fileKey);\n\n const usedNames = new Map<string, number>();\n const mapping: Record<string, string> = {};\n let imgDownloaded = 0;\n for (const { id, name, imageRef } of imageNodes) {\n let base = sanitizeFilename(name);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n if (count > 0) base = `${base}-${count + 1}`;\n const filename = `${base}@${imgScale}x.png`;\n mapping[id] = filename;\n if (!imageRef) continue;\n const imgUrl = imageFills[imageRef];\n if (!imgUrl) continue;\n try {\n const resp = await fetch(imgUrl);\n if (resp.ok) {\n const buf = Buffer.from(await resp.arrayBuffer());\n await writeFile(resolve(imageDir, filename), buf);\n imgDownloaded++;\n }\n } catch {\n // Skip failed downloads\n }\n }\n await writeFile(\n resolve(imageDir, \"mapping.json\"),\n JSON.stringify(mapping, null, 2),\n \"utf-8\"\n );\n\n console.log(` images/: ${imgDownloaded}/${imageNodes.length} PNGs (@${imgScale}x)`);\n }\n }\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { loadFile, isJsonFile } from \"../../core/engine/loader.js\";\n\nexport function registerDesignTree(cli: CAC): void {\n cli\n .command(\n \"design-tree <input>\",\n \"Generate a DOM-like design tree from a Figma file or fixture\"\n )\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--output <path>\", \"Output file path (default: stdout)\")\n .option(\"--vector-dir <path>\", \"Directory with SVG files for VECTOR nodes (auto-detected from fixture path)\")\n .option(\"--image-dir <path>\", \"Directory with image PNGs for IMAGE fill nodes (auto-detected from fixture path)\")\n .example(\" canicode design-tree ./fixtures/my-design\")\n .example(\" canicode design-tree https://www.figma.com/design/ABC/File?node-id=1-234 --output tree.txt\")\n .action(async (input: string, options: { token?: string; output?: string; vectorDir?: string; imageDir?: string }) => {\n try {\n const { file } = await loadFile(input, options.token);\n\n const fixtureBase = isJsonFile(input) ? dirname(resolve(input)) : resolve(input);\n\n // Auto-detect vector dir from fixture path\n let vectorDir = options.vectorDir;\n if (!vectorDir) {\n const autoDir = resolve(fixtureBase, \"vectors\");\n if (existsSync(autoDir)) vectorDir = autoDir;\n }\n\n // Auto-detect image dir from fixture path\n let imageDir = options.imageDir;\n if (!imageDir) {\n const autoDir = resolve(fixtureBase, \"images\");\n if (existsSync(autoDir)) imageDir = autoDir;\n }\n\n const { generateDesignTreeWithStats } = await import(\"../../core/design-tree/design-tree.js\");\n const treeOptions = {\n ...(vectorDir ? { vectorDir } : {}),\n ...(imageDir ? { imageDir } : {}),\n };\n const stats = generateDesignTreeWithStats(file, treeOptions);\n\n if (options.output) {\n const outputDir = dirname(resolve(options.output));\n if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true });\n const { writeFile: writeFileAsync } = await import(\"node:fs/promises\");\n await writeFileAsync(resolve(options.output), stats.tree, \"utf-8\");\n console.log(`Design tree saved: ${resolve(options.output)} (${Math.round(stats.bytes / 1024)}KB, ~${stats.estimatedTokens} tokens)`);\n } else {\n console.log(stats.tree);\n }\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport { parseFigmaUrl } from \"../../core/adapters/figma-url-parser.js\";\nimport { analyzeFile } from \"../../core/engine/rule-engine.js\";\nimport { loadFile, isFigmaUrl, isJsonFile, isFixtureDir } from \"../../core/engine/loader.js\";\nimport { getFigmaToken } from \"../../core/engine/config-store.js\";\nimport { calculateScores, buildResultJson } from \"../../core/engine/scoring.js\";\nimport { collectVectorNodes, collectImageNodes, sanitizeFilename } from \"../helpers.js\";\n\nconst ImplementOptionsSchema = z.object({\n token: z.string().optional(),\n output: z.string().optional(),\n prompt: z.string().optional(),\n imageScale: z.string().optional(),\n});\n\n\nexport function registerImplement(cli: CAC): void {\n cli\n .command(\n \"implement <input>\",\n \"Prepare design-to-code package: analysis + design tree + assets + prompt\"\n )\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--output <dir>\", \"Output directory (default: ./canicode-implement/)\")\n .option(\"--prompt <path>\", \"Custom prompt file (default: built-in HTML+CSS prompt)\")\n .option(\"--image-scale <n>\", \"Image export scale: 2 for PC (default), 3 for mobile\")\n .example(\" canicode implement ./fixtures/my-design\")\n .example(\" canicode implement ./fixtures/my-design --prompt ./my-react-prompt.md --image-scale 3\")\n .action(async (input: string, rawOptions: Record<string, unknown>) => {\n try {\n const parseResult = ImplementOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => `--${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n\n // Validate --image-scale early\n if (options.imageScale !== undefined) {\n const scale = Number(options.imageScale);\n if (!Number.isFinite(scale) || scale < 1 || scale > 4) {\n console.error(\"Error: --image-scale must be 1-4 (2 for PC, 3 for mobile)\");\n process.exit(1);\n }\n }\n\n // Warn for unscoped Figma URL\n if (isFigmaUrl(input) && !parseFigmaUrl(input).nodeId) {\n console.warn(\"Warning: No node-id in Figma URL. Implementation package will cover the entire file.\");\n console.warn(\"Tip: Add ?node-id=XXX to target a specific section.\\n\");\n }\n\n const outputDir = resolve(options.output ?? \"canicode-implement\");\n mkdirSync(outputDir, { recursive: true });\n\n console.log(\"\\nPreparing implementation package...\\n\");\n\n // 1. Load file\n const { file } = await loadFile(input, options.token);\n console.log(`Design: ${file.name}`);\n\n // 2. Analysis\n const result = analyzeFile(file);\n const scores = calculateScores(result);\n const resultJson = buildResultJson(file.name, result, scores, { fileKey: file.fileKey });\n await writeFile(resolve(outputDir, \"analysis.json\"), JSON.stringify(resultJson, null, 2), \"utf-8\");\n console.log(` analysis.json: ${result.issues.length} issues, grade ${scores.overall.grade}`);\n\n // 3. Prepare assets (before design tree, so tree can reference image paths)\n const fixtureBase = (isJsonFile(input) || isFixtureDir(input))\n ? (isJsonFile(input) ? dirname(resolve(input)) : resolve(input))\n : undefined;\n\n let vectorDir = fixtureBase ? resolve(fixtureBase, \"vectors\") : undefined;\n let imageDir = fixtureBase ? resolve(fixtureBase, \"images\") : undefined;\n\n // Copy fixture assets to output\n if (vectorDir && existsSync(vectorDir)) {\n const vecOutputDir = resolve(outputDir, \"vectors\");\n mkdirSync(vecOutputDir, { recursive: true });\n const { readdirSync, copyFileSync } = await import(\"node:fs\");\n const vecFiles = readdirSync(vectorDir).filter(f => f.endsWith(\".svg\") || f === \"mapping.json\");\n for (const f of vecFiles) {\n copyFileSync(resolve(vectorDir, f), resolve(vecOutputDir, f));\n }\n vectorDir = vecOutputDir;\n console.log(` vectors/: ${vecFiles.length} SVGs copied`);\n }\n\n if (imageDir && existsSync(imageDir)) {\n const imgOutputDir = resolve(outputDir, \"images\");\n mkdirSync(imgOutputDir, { recursive: true });\n const { readdirSync, copyFileSync } = await import(\"node:fs\");\n const imgFiles = readdirSync(imageDir).filter(f => f.endsWith(\".png\") || f.endsWith(\".jpg\") || f.endsWith(\".json\"));\n for (const f of imgFiles) {\n copyFileSync(resolve(imageDir, f), resolve(imgOutputDir, f));\n }\n imageDir = imgOutputDir;\n const pngCount = imgFiles.filter(f => f.endsWith(\".png\")).length;\n console.log(` images/: ${pngCount} assets copied`);\n }\n\n // Download assets from Figma API for live URLs\n if (isFigmaUrl(input) && !fixtureBase) {\n const figmaToken = options.token ?? getFigmaToken();\n if (figmaToken) {\n const imgScale = options.imageScale !== undefined ? Number(options.imageScale) : 2;\n\n const { FigmaClient } = await import(\"../../core/adapters/figma-client.js\");\n const client = new FigmaClient({ token: figmaToken });\n\n // Download screenshot\n const { nodeId } = parseFigmaUrl(input);\n const rootNodeId = nodeId?.replace(/-/g, \":\") ?? file.document.id;\n try {\n const screenshotUrls = await client.getNodeImages(file.fileKey, [rootNodeId], { format: \"png\", scale: 2 });\n const screenshotUrl = screenshotUrls[rootNodeId];\n if (screenshotUrl) {\n const resp = await fetch(screenshotUrl);\n if (resp.ok) {\n const buf = Buffer.from(await resp.arrayBuffer());\n await writeFile(resolve(outputDir, \"screenshot.png\"), buf);\n console.log(` screenshot.png: saved`);\n }\n }\n } catch {\n console.warn(\" screenshot.png: failed to download (continuing)\");\n }\n\n // Download vector SVGs\n const vectorNodes = collectVectorNodes(file.document);\n if (vectorNodes.length > 0) {\n const vecOutDir = resolve(outputDir, \"vectors\");\n mkdirSync(vecOutDir, { recursive: true });\n try {\n const svgUrls = await client.getNodeImages(\n file.fileKey,\n vectorNodes.map(n => n.id),\n { format: \"svg\" },\n );\n // Build mapping + download in a single pass to keep filenames consistent\n const mapping: Record<string, string> = {};\n const usedNames = new Map<string, number>();\n let downloaded = 0;\n for (const { id, name } of vectorNodes) {\n let base = sanitizeFilename(name);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n if (count > 0) base = `${base}-${count + 1}`;\n const filename = `${base}.svg`;\n mapping[id] = filename;\n const svgUrl = svgUrls[id];\n if (!svgUrl) continue;\n try {\n const resp = await fetch(svgUrl);\n if (resp.ok) {\n const svg = await resp.text();\n await writeFile(resolve(vecOutDir, filename), svg, \"utf-8\");\n downloaded++;\n }\n } catch { /* skip */ }\n }\n await writeFile(resolve(vecOutDir, \"mapping.json\"), JSON.stringify(mapping, null, 2), \"utf-8\");\n\n console.log(` vectors/: ${downloaded}/${vectorNodes.length} SVGs`);\n } catch {\n console.warn(\" vectors/: failed to download (continuing)\");\n }\n }\n\n // Download image PNGs\n const imgNodes = collectImageNodes(file.document);\n if (imgNodes.length > 0) {\n const imgOutDir = resolve(outputDir, \"images\");\n mkdirSync(imgOutDir, { recursive: true });\n try {\n // Use image fills API to get original images (not node renders which include children)\n const imageFills = await client.getImageFills(file.fileKey);\n const mapping: Record<string, string> = {};\n const usedNames = new Map<string, number>();\n let downloaded = 0;\n for (const { id, name, imageRef } of imgNodes) {\n let base = sanitizeFilename(name);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n if (count > 0) base = `${base}-${count + 1}`;\n const filename = `${base}@${imgScale}x.png`;\n mapping[id] = filename;\n if (!imageRef) continue;\n const imgUrl = imageFills[imageRef];\n if (!imgUrl) continue;\n try {\n const resp = await fetch(imgUrl);\n if (resp.ok) {\n const buf = Buffer.from(await resp.arrayBuffer());\n await writeFile(resolve(imgOutDir, filename), buf);\n downloaded++;\n }\n } catch { /* skip */ }\n }\n await writeFile(resolve(imgOutDir, \"mapping.json\"), JSON.stringify(mapping, null, 2), \"utf-8\");\n\n imageDir = imgOutDir;\n console.log(` images/: ${downloaded}/${imgNodes.length} PNGs (@${imgScale}x)`);\n } catch {\n console.warn(\" images/: failed to download (continuing)\");\n }\n }\n\n // Update vectorDir to point to downloaded assets\n const vecOutCheck = resolve(outputDir, \"vectors\");\n if (existsSync(vecOutCheck)) vectorDir = vecOutCheck;\n }\n }\n\n // 4. Design tree (after assets so image paths are available)\n const { generateDesignTreeWithStats } = await import(\"../../core/design-tree/design-tree.js\");\n const treeOptions = {\n ...(vectorDir && existsSync(vectorDir) ? { vectorDir } : {}),\n ...(imageDir && existsSync(imageDir) ? { imageDir } : {}),\n };\n const stats = generateDesignTreeWithStats(file, treeOptions);\n await writeFile(resolve(outputDir, \"design-tree.txt\"), stats.tree, \"utf-8\");\n console.log(` design-tree.txt: ~${stats.estimatedTokens} tokens`);\n\n // 5. Assemble prompt\n if (options.prompt) {\n // Custom prompt: copy user's file\n const { readFile: rf } = await import(\"node:fs/promises\");\n const customPrompt = await rf(resolve(options.prompt), \"utf-8\");\n await writeFile(resolve(outputDir, \"PROMPT.md\"), customPrompt, \"utf-8\");\n console.log(` PROMPT.md: custom (${options.prompt})`);\n } else {\n // Default: built-in HTML+CSS prompt\n const { readFile: rf } = await import(\"node:fs/promises\");\n const { dirname: dirnameFn, resolve: resolveFn } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n const cliDir = dirnameFn(fileURLToPath(import.meta.url));\n const projectRoot = resolveFn(cliDir, \"../..\");\n const altRoot = resolveFn(cliDir, \"..\");\n\n let prompt = \"\";\n for (const root of [projectRoot, altRoot]) {\n const p = resolveFn(root, \".claude/skills/design-to-code/PROMPT.md\");\n try {\n prompt = await rf(p, \"utf-8\");\n break;\n } catch { /* try next */ }\n }\n\n if (prompt) {\n await writeFile(resolve(outputDir, \"PROMPT.md\"), prompt, \"utf-8\");\n console.log(` PROMPT.md: default (html-css)`);\n } else {\n console.warn(\" PROMPT.md: built-in prompt not found (skipped)\");\n }\n }\n\n // Summary\n console.log(`\\n${\"=\".repeat(50)}`);\n console.log(`Implementation package ready: ${outputDir}/`);\n console.log(` Grade: ${scores.overall.grade} (${scores.overall.percentage}%)`);\n console.log(` Issues: ${result.issues.length}`);\n console.log(` Design tree: ~${stats.estimatedTokens} tokens`);\n console.log(`${\"=\".repeat(50)}`);\n console.log(`\\nNext: Feed design-tree.txt + PROMPT.md to your AI assistant.`);\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { z } from \"zod\";\n\nconst positiveCliNumber = z\n .union([z.string(), z.number()])\n .transform((v) => Number(v))\n .refine(Number.isFinite, \"must be a valid number\")\n .refine((v) => v > 0, \"must be positive\");\n\nconst figmaScaleNumber = z\n .union([z.string(), z.number()])\n .transform((v) => Number(v))\n .refine(Number.isFinite, \"must be a valid number\")\n .refine((v) => v >= 1, \"must be >= 1\");\n\n/** Zod schema for CLI visual-compare options (raw CLI input). */\nexport const VisualCompareCliOptionsSchema = z.object({\n figmaUrl: z.string().optional(),\n figmaScreenshot: z.string().optional(),\n token: z.string().optional(),\n output: z.string().optional(),\n width: positiveCliNumber.optional(),\n height: positiveCliNumber.optional(),\n figmaScale: figmaScaleNumber.optional(),\n expandRoot: z.boolean().optional(),\n});\n\nexport type VisualCompareCliOptions = z.infer<typeof VisualCompareCliOptionsSchema>;\n","import { resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { parseFigmaUrl } from \"../../core/adapters/figma-url-parser.js\";\nimport { getFigmaToken } from \"../../core/engine/config-store.js\";\nimport { VisualCompareCliOptionsSchema } from \"../../core/contracts/visual-compare.js\";\n\n\nexport function registerVisualCompare(cli: CAC): void {\n cli\n .command(\n \"visual-compare <codePath>\",\n \"Compare rendered code against Figma screenshot (pixel-level similarity)\"\n )\n .option(\"--figma-url <url>\", \"Figma URL with node-id (required for API fetch)\")\n .option(\"--figma-screenshot <path>\", \"Local Figma screenshot file (skips API fetch)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--output <dir>\", \"Output directory for screenshots and diff (default: /tmp/canicode-visual-compare)\")\n .option(\"--width <px>\", \"Logical viewport width in CSS px (default: infer from Figma PNG ÷ export scale)\")\n .option(\"--height <px>\", \"Logical viewport height in CSS px (default: infer from Figma PNG ÷ export scale)\")\n .option(\"--figma-scale <n>\", \"Figma export scale (default: 2, matches save-fixture / @2x PNGs)\")\n .option(\"--expand-root\", \"Replace root element's fixed width with 100% before rendering (for responsive comparison)\")\n .example(\" canicode visual-compare ./generated/index.html --figma-url 'https://www.figma.com/design/ABC/File?node-id=1-234'\")\n .action(async (codePath: string, rawOptions: Record<string, unknown>) => {\n try {\n const parseResult = VisualCompareCliOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => `--${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n\n if (!options.figmaUrl && !options.figmaScreenshot) {\n console.error(\"Error: --figma-url or --figma-screenshot is required\");\n process.exitCode = 1; return;\n }\n\n // When using --figma-screenshot, --figma-url is still needed for URL parsing\n // but token is not required (no API fetch)\n if (options.figmaUrl && !parseFigmaUrl(options.figmaUrl).nodeId) {\n console.warn(\"Warning: --figma-url has no node-id. Results may be inaccurate for full files.\");\n console.warn(\"Tip: Add ?node-id=XXX to target a specific section.\\n\");\n }\n\n const token = options.token ?? getFigmaToken();\n if (!token && !options.figmaScreenshot) {\n console.error(\"Error: Figma token required. Use --token or set FIGMA_TOKEN env var (or use --figma-screenshot for local files).\");\n process.exitCode = 1; return;\n }\n\n const { visualCompare } = await import(\"../../core/comparison/visual-compare.js\");\n\n const hasViewportOverride = options.width !== undefined || options.height !== undefined;\n\n // Progress to stderr so stdout contains only valid JSON\n console.error(\"Comparing...\");\n const result = await visualCompare({\n figmaUrl: options.figmaUrl ?? \"https://www.figma.com/design/local/file?node-id=0-0\",\n figmaToken: token ?? \"\",\n codePath: resolve(codePath),\n outputDir: options.output,\n ...(options.figmaScale !== undefined ? { figmaExportScale: options.figmaScale } : {}),\n ...(options.figmaScreenshot ? { figmaScreenshotPath: resolve(options.figmaScreenshot) } : {}),\n ...(hasViewportOverride\n ? {\n viewport: {\n ...(options.width !== undefined ? { width: options.width } : {}),\n ...(options.height !== undefined ? { height: options.height } : {}),\n },\n }\n : {}),\n ...(options.expandRoot ? { expandRoot: true } : {}),\n });\n\n // JSON output for programmatic use\n console.log(JSON.stringify({\n similarity: result.similarity,\n diffPixels: result.diffPixels,\n totalPixels: result.totalPixels,\n width: result.width,\n height: result.height,\n figmaScreenshot: result.figmaScreenshotPath,\n codeScreenshot: result.codeScreenshotPath,\n diff: result.diffPath,\n }, null, 2));\n\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport {\n initAiready, getConfigPath, getReportsDir,\n} from \"../../core/engine/config-store.js\";\n\nconst InitOptionsSchema = z.object({\n token: z.string().optional(),\n});\n\nexport function registerInit(cli: CAC): void {\n cli\n .command(\"init\", \"Set up canicode with Figma API token\")\n .option(\"--token <token>\", \"Save Figma API token to ~/.canicode/\")\n .action((rawOptions: Record<string, unknown>) => {\n try {\n const parseResult = InitOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => i.message).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n\n if (options.token) {\n initAiready(options.token);\n\n console.log(` Config saved: ${getConfigPath()}`);\n console.log(` Reports will be saved to: ${getReportsDir()}/`);\n console.log(`\\n Next: canicode analyze \"https://www.figma.com/design/...\"`);\n return;\n }\n\n // No flags: show setup guide\n console.log(`CANICODE SETUP\\n`);\n console.log(` canicode init --token YOUR_FIGMA_TOKEN`);\n console.log(` Get token: figma.com > Settings > Personal access tokens\\n`);\n console.log(`After setup:`);\n console.log(` canicode analyze \"https://www.figma.com/design/...\"`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\n\nimport {\n getConfigPath, readConfig, setTelemetryEnabled,\n} from \"../../core/engine/config-store.js\";\n\ninterface ConfigOptions {\n telemetry?: boolean;\n}\n\nexport function registerConfig(cli: CAC): void {\n cli\n .command(\"config\", \"Manage canicode configuration\")\n .option(\"--telemetry\", \"Enable anonymous telemetry\")\n .option(\"--no-telemetry\", \"Disable anonymous telemetry\")\n .action((options: ConfigOptions) => {\n try {\n // CAC maps --no-telemetry to options.telemetry === false\n if (options.telemetry === false) {\n setTelemetryEnabled(false);\n console.log(\"Telemetry disabled. No analytics data will be sent.\");\n return;\n }\n\n if (options.telemetry === true) {\n setTelemetryEnabled(true);\n console.log(\"Telemetry enabled. Only anonymous usage events are tracked — no design data.\");\n return;\n }\n\n // No flags: show current config\n const cfg = readConfig();\n console.log(\"CANICODE CONFIG\\n\");\n console.log(` Config path: ${getConfigPath()}`);\n console.log(` Figma token: ${cfg.figmaToken ? \"set\" : \"not set\"}`);\n console.log(` Telemetry: ${cfg.telemetry !== false ? \"enabled\" : \"disabled\"}`);\n console.log(`\\nOptions:`);\n console.log(` canicode config --no-telemetry Opt out of anonymous telemetry`);\n console.log(` canicode config --telemetry Opt back in`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\n\nimport type { RuleConfig } from \"../../core/contracts/rule.js\";\nimport { RULE_CONFIGS } from \"../../core/rules/rule-config.js\";\nimport { ruleRegistry } from \"../../core/rules/rule-registry.js\";\nimport { loadConfigFile, mergeConfigs } from \"../../core/rules/config-loader.js\";\n\ninterface ListRulesOptions {\n config?: string;\n json?: boolean;\n}\n\nexport function registerListRules(cli: CAC): void {\n cli\n .command(\"list-rules\", \"List all analysis rules with scores and severity\")\n .option(\"--config <path>\", \"Apply config overrides to show effective scores\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options: ListRulesOptions) => {\n try {\n let configs: Record<string, RuleConfig> = { ...RULE_CONFIGS };\n\n if (options.config) {\n const configFile = await loadConfigFile(options.config);\n configs = mergeConfigs(configs, configFile);\n }\n\n const rules = ruleRegistry.getAll().map((rule) => {\n const config = configs[rule.definition.id as string];\n return {\n id: rule.definition.id,\n name: rule.definition.name,\n category: rule.definition.category,\n severity: config?.severity ?? \"risk\",\n score: config?.score ?? 0,\n enabled: config?.enabled ?? true,\n };\n });\n\n if (options.json) {\n console.log(JSON.stringify(rules, null, 2));\n return;\n }\n\n // Group by category\n const byCategory = new Map<string, typeof rules>();\n for (const rule of rules) {\n const list = byCategory.get(rule.category) ?? [];\n list.push(rule);\n byCategory.set(rule.category, list);\n }\n\n for (const [category, catRules] of byCategory) {\n console.log(`\\n ${category.toUpperCase()}`);\n for (const r of catRules) {\n const status = r.enabled ? \"\" : \" (disabled)\";\n const pad = \" \".repeat(Math.max(0, 40 - r.id.length));\n console.log(` ${r.id}${pad} ${String(r.score).padStart(4)} ${r.severity}${status}`);\n }\n }\n console.log(`\\n Total: ${rules.length} rules\\n`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\n\nexport function registerPrompt(cli: CAC): void {\n cli\n .command(\"prompt\", \"Output the standard design-to-code prompt for AI code generation\")\n .action(async () => {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n const { dirname: dirnameFn, resolve: resolveFn } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n const __dirname = dirnameFn(fileURLToPath(import.meta.url));\n // Try from source location first, then npm-installed location\n const paths = [\n resolveFn(__dirname, \"../../.claude/skills/design-to-code/PROMPT.md\"),\n resolveFn(__dirname, \"../.claude/skills/design-to-code/PROMPT.md\"),\n ];\n for (const p of paths) {\n try {\n const content = await readFile(p, \"utf-8\");\n console.log(content);\n return;\n } catch { /* try next */ }\n }\n console.error(\"Prompt file not found\");\n process.exitCode = 1; return;\n } catch (error) {\n console.error(\"Error:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { z } from \"zod\";\n\nexport const DifficultySchema = z.enum([\"easy\", \"moderate\", \"hard\", \"failed\"]);\nexport type Difficulty = z.infer<typeof DifficultySchema>;\n\nexport const RuleRelatedStruggleSchema = z.object({\n ruleId: z.string(),\n description: z.string(),\n actualImpact: DifficultySchema,\n});\n\nexport type RuleRelatedStruggle = z.infer<typeof RuleRelatedStruggleSchema>;\n\nexport const UncoveredStruggleSchema = z.object({\n description: z.string(),\n suggestedCategory: z.string(),\n estimatedImpact: DifficultySchema,\n});\n\nexport type UncoveredStruggle = z.infer<typeof UncoveredStruggleSchema>;\n\nexport const ConversionRecordSchema = z.object({\n nodeId: z.string(),\n nodePath: z.string(),\n generatedCode: z.string(),\n difficulty: DifficultySchema,\n notes: z.string(),\n ruleRelatedStruggles: z.array(RuleRelatedStruggleSchema),\n uncoveredStruggles: z.array(UncoveredStruggleSchema),\n durationMs: z.number(),\n});\n\nexport type ConversionRecord = z.infer<typeof ConversionRecordSchema>;\n\nexport const StripTypeEnum = z.enum([\n \"layout-direction-spacing\",\n \"size-constraints\",\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n]);\n\nexport const StripDeltaResultSchema = z.object({\n stripType: StripTypeEnum,\n // Pixel similarity (design viewport)\n baselineSimilarity: z.number(),\n strippedSimilarity: z.number(),\n delta: z.number().finite(),\n deltaDifficulty: DifficultySchema,\n // Responsive similarity (expanded viewport — primarily for size-constraints)\n baselineResponsiveSimilarity: z.number().finite().nullable().optional(),\n strippedResponsiveSimilarity: z.number().finite().nullable().optional(),\n responsiveDelta: z.number().finite().nullable().optional(),\n responsiveViewport: z.number().int().positive().nullable().optional(),\n // Input tokens (design-tree token count)\n baselineInputTokens: z.number().int().nonnegative().optional(),\n strippedInputTokens: z.number().int().nonnegative().optional(),\n tokenDelta: z.number().int().optional(),\n // HTML output size\n baselineHtmlBytes: z.number().int().nonnegative().optional(),\n strippedHtmlBytes: z.number().int().nonnegative().optional(),\n htmlBytesDelta: z.number().int().optional(),\n // CSS metrics\n baselineCssClassCount: z.number().int().nonnegative().optional(),\n strippedCssClassCount: z.number().int().nonnegative().optional(),\n baselineCssVariableCount: z.number().int().nonnegative().optional(),\n strippedCssVariableCount: z.number().int().nonnegative().optional(),\n});\n\nexport const StripDeltasArraySchema = z.array(StripDeltaResultSchema);\n\nexport type StripDeltaResult = z.infer<typeof StripDeltaResultSchema>;\n\nexport const RuleImpactAssessmentSchema = z.array(\n z.object({\n ruleId: z.string(),\n issueCount: z.number(),\n actualImpact: z.string(),\n description: z.string(),\n })\n);\n\nexport const UncoveredStrugglesInputSchema = z.array(\n z.object({\n description: z.string(),\n suggestedCategory: z.string(),\n estimatedImpact: z.string(),\n })\n);\n\n","import { z } from \"zod\";\n\nexport const SamplingStrategySchema = z.enum([\"all\", \"top-issues\", \"random\"]);\nexport type SamplingStrategy = z.infer<typeof SamplingStrategySchema>;\n\nexport const CalibrationStatusSchema = z.enum([\n \"pending\",\n \"analyzing\",\n \"converting\",\n \"evaluating\",\n \"tuning\",\n \"completed\",\n \"failed\",\n]);\nexport type CalibrationStatus = z.infer<typeof CalibrationStatusSchema>;\n\nexport const CalibrationConfigSchema = z.object({\n input: z.string(),\n token: z.string().optional(),\n targetNodeId: z.string().optional(),\n maxConversionNodes: z.number().int().positive().default(20),\n samplingStrategy: SamplingStrategySchema.default(\"top-issues\"),\n outputPath: z.string().default(\"logs/calibration/calibration-report.md\"),\n runDir: z.string().optional(),\n});\n\nexport type CalibrationConfig = z.infer<typeof CalibrationConfigSchema>;\nexport type CalibrationConfigInput = z.input<typeof CalibrationConfigSchema>;\n\nexport interface CalibrationRun {\n config: CalibrationConfig;\n status: CalibrationStatus;\n startedAt: string;\n completedAt?: string;\n error?: string;\n}\n","import type { AnalysisResult } from \"../core/engine/rule-engine.js\";\nimport { calculateScores } from \"../core/engine/scoring.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport type { Severity } from \"../core/contracts/severity.js\";\nimport type {\n AnalysisAgentInput,\n AnalysisAgentOutput,\n NodeIssueSummary,\n} from \"./contracts/analysis-agent.js\";\n\n/**\n * Group issues by nodeId and produce sorted summaries\n */\nfunction buildNodeIssueSummaries(\n result: AnalysisResult\n): NodeIssueSummary[] {\n const nodeMap = new Map<\n string,\n {\n nodePath: string;\n totalScore: number;\n issueCount: number;\n ruleIds: Set<string>;\n severities: Set<string>;\n }\n >();\n\n for (const issue of result.issues) {\n const nodeId = issue.violation.nodeId;\n const existing = nodeMap.get(nodeId);\n\n if (existing) {\n existing.totalScore += issue.calculatedScore;\n existing.issueCount++;\n existing.ruleIds.add(issue.rule.definition.id);\n existing.severities.add(issue.config.severity);\n } else {\n nodeMap.set(nodeId, {\n nodePath: issue.violation.nodePath,\n totalScore: issue.calculatedScore,\n issueCount: 1,\n ruleIds: new Set([issue.rule.definition.id]),\n severities: new Set([issue.config.severity as string]),\n });\n }\n }\n\n const summaries: NodeIssueSummary[] = [];\n\n for (const [nodeId, data] of nodeMap) {\n summaries.push({\n nodeId,\n nodePath: data.nodePath,\n totalScore: data.totalScore,\n issueCount: data.issueCount,\n flaggedRuleIds: [...data.ruleIds],\n severities: [...data.severities],\n });\n }\n\n // Sort by totalScore ascending (most negative = most problematic first)\n summaries.sort((a, b) => a.totalScore - b.totalScore);\n\n return summaries;\n}\n\n/**\n * Extract rule scores map from analysis result for downstream agents\n */\nexport function extractRuleScores(\n result: AnalysisResult\n): Record<string, { score: number; severity: string }> {\n const scores: Record<string, { score: number; severity: string }> = {};\n\n for (const issue of result.issues) {\n const ruleId = issue.rule.definition.id as RuleId;\n if (!scores[ruleId]) {\n scores[ruleId] = {\n score: issue.config.score,\n severity: issue.config.severity as Severity,\n };\n }\n }\n\n return scores;\n}\n\n/**\n * Analysis Agent - Step 1 of calibration pipeline\n *\n * Wraps existing analyzeFile + calculateScores and adds\n * nodeId-grouped issue summaries for downstream agents.\n */\nexport function runAnalysisAgent(\n input: AnalysisAgentInput\n): AnalysisAgentOutput {\n const { analysisResult } = input;\n\n const scoreReport = calculateScores(analysisResult);\n const nodeIssueSummaries = buildNodeIssueSummaries(analysisResult);\n\n return {\n analysisResult,\n scoreReport,\n nodeIssueSummaries,\n };\n}\n","/**\n * Delta-based difficulty mapping for ablation experiments.\n * Converts pixel similarity delta (baseline - stripped) to a difficulty level.\n *\n * Used by calibration pipeline to objectively measure rule impact\n * instead of relying on Converter self-assessment.\n */\n\nimport type { Difficulty } from \"../../agents/contracts/conversion-agent.js\";\n\n/**\n * Map a strip experiment's similarity delta to a difficulty level.\n *\n * Delta = baseline similarity - stripped similarity (percentage points).\n * Higher delta means removing that information caused more pixel degradation.\n *\n * Thresholds from issue #191:\n * - ≤ 5%p → easy (removing info barely matters)\n * - 6-15%p → moderate (noticeable degradation)\n * - 16-30%p → hard (significant degradation)\n * - > 30%p → failed (critical information)\n */\nexport function stripDeltaToDifficulty(delta: number): Difficulty {\n if (!Number.isFinite(delta)) {\n throw new TypeError(`Invalid strip delta: ${delta}`);\n }\n if (delta <= 5) return \"easy\";\n if (delta <= 15) return \"moderate\";\n if (delta <= 30) return \"hard\";\n return \"failed\";\n}\n\n/**\n * Map a token count delta percentage to a difficulty level.\n *\n * tokenDelta = baselineInputTokens - strippedInputTokens.\n * tokenDeltaPercent = tokenDelta / baselineInputTokens * 100.\n * Higher percentage means removing that info significantly reduces token cost,\n * i.e. the info contributed a lot of tokens — its absence matters for token management.\n *\n * Thresholds:\n * - ≤ 5% → easy (minimal token impact)\n * - 6-20% → moderate (noticeable token savings)\n * - 21-40% → hard (significant token impact)\n * - > 40% → failed (critical for token budget)\n */\nexport function tokenDeltaToDifficulty(baselineTokens: number, strippedTokens: number): Difficulty {\n if (!Number.isFinite(baselineTokens) || !Number.isFinite(strippedTokens)) {\n throw new TypeError(`Invalid token counts: baseline=${baselineTokens}, stripped=${strippedTokens}`);\n }\n if (baselineTokens <= 0) return \"easy\";\n const deltaPercent = ((baselineTokens - strippedTokens) / baselineTokens) * 100;\n if (deltaPercent <= 5) return \"easy\";\n if (deltaPercent <= 20) return \"moderate\";\n if (deltaPercent <= 40) return \"hard\";\n return \"failed\";\n}\n","import type {\n EvaluationAgentInput,\n EvaluationAgentOutput,\n MismatchCase,\n MismatchType,\n StripDeltaForEval,\n} from \"./contracts/evaluation-agent.js\";\nimport type { Difficulty } from \"./contracts/conversion-agent.js\";\nimport type { Severity } from \"../core/contracts/severity.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport { RULE_ID_CATEGORY } from \"../core/rules/rule-config.js\";\nimport type { DesignTreeInfoType } from \"../core/design-tree/strip.js\";\nimport { stripDeltaToDifficulty, tokenDeltaToDifficulty } from \"../core/design-tree/delta.js\";\n\n/**\n * Difficulty-to-score range mapping.\n * Used to determine if a rule's current score aligns with actual conversion difficulty.\n *\n * easy → score should be 0 to -3\n * moderate → score should be -4 to -7\n * hard → score should be -8 to -12\n * failed → score should be -8 to -12\n */\nconst DIFFICULTY_SCORE_RANGES: Record<Difficulty, { min: number; max: number }> = {\n easy: { min: -3, max: 0 },\n moderate: { min: -7, max: -4 },\n hard: { min: -12, max: -8 },\n failed: { min: -12, max: -8 },\n};\n\n/**\n * Check if a score falls within the expected range for a given difficulty\n */\nfunction scoreMatchesDifficulty(score: number, difficulty: Difficulty): boolean {\n const range = DIFFICULTY_SCORE_RANGES[difficulty];\n return score >= range.min && score <= range.max;\n}\n\n/**\n * Determine mismatch type for a flagged rule based on conversion difficulty\n */\nfunction classifyFlaggedRule(\n currentScore: number,\n actualDifficulty: Difficulty\n): MismatchType {\n if (scoreMatchesDifficulty(currentScore, actualDifficulty)) {\n return \"validated\";\n }\n\n // If actual difficulty is easier than what the score suggests\n if (\n (actualDifficulty === \"easy\" && currentScore < -3) ||\n (actualDifficulty === \"moderate\" && currentScore < -7)\n ) {\n return \"overscored\";\n }\n\n // If actual difficulty is harder than what the score suggests\n return \"underscored\";\n}\n\n/**\n * Build reasoning string for a mismatch\n */\nfunction buildReasoning(\n type: MismatchType,\n ruleId: string | undefined,\n currentScore: number | undefined,\n actualDifficulty: Difficulty\n): string {\n const range = DIFFICULTY_SCORE_RANGES[actualDifficulty];\n\n switch (type) {\n case \"validated\":\n return `Rule \"${ruleId}\" score (${currentScore}) aligns with actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"overscored\":\n return `Rule \"${ruleId}\" score (${currentScore}) is too harsh for actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"underscored\":\n return `Rule \"${ruleId}\" score (${currentScore}) is too lenient for actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"missing-rule\":\n return `No rule covers this difficulty \"${actualDifficulty}\" (expected score range: ${range.min} to ${range.max}).`;\n }\n}\n\n/**\n * Merge all node issue summaries into a single virtual summary.\n * Used when whole-design conversion produces a single root record but analysis\n * flags rules on individual child nodes. Without merging, rules only flagged on\n * non-root nodes would be silently dropped from evaluation.\n */\nfunction mergeAllSummaries(\n summaries: Array<{ nodeId: string; nodePath: string; flaggedRuleIds: string[] }>,\n rootNodeId: string,\n rootNodePath: string,\n): { nodeId: string; nodePath: string; flaggedRuleIds: string[] } {\n const allRuleIds = new Set<string>();\n for (const s of summaries) {\n for (const id of s.flaggedRuleIds) {\n allRuleIds.add(id);\n }\n }\n return { nodeId: rootNodeId, nodePath: rootNodePath, flaggedRuleIds: [...allRuleIds] };\n}\n\n/**\n * Evaluation Agent - Step 3 of calibration pipeline\n *\n * Deterministic comparison of analysis results vs conversion results.\n * No LLM required — pure algorithmic evaluation.\n */\nexport function runEvaluationAgent(\n input: EvaluationAgentInput\n): EvaluationAgentOutput {\n const mismatches: MismatchCase[] = [];\n const validatedRuleSet = new Set<string>();\n\n // Build a lookup from nodeId to issue summary\n const nodeSummaryMap = new Map(\n input.nodeIssueSummaries.map((s) => [s.nodeId, s])\n );\n\n for (const record of input.conversionRecords) {\n const summary = input.wholeDesign\n ? mergeAllSummaries(input.nodeIssueSummaries, record.nodeId, record.nodePath)\n : nodeSummaryMap.get(record.nodeId);\n const difficulty = record.difficulty as Difficulty;\n\n // Process rule-related struggles from conversion\n for (const struggle of record.ruleRelatedStruggles) {\n const ruleInfo = input.ruleScores[struggle.ruleId];\n if (!ruleInfo) continue;\n\n const actualDifficulty = struggle.actualImpact as Difficulty;\n const type = classifyFlaggedRule(ruleInfo.score, actualDifficulty);\n\n if (type === \"validated\") {\n validatedRuleSet.add(struggle.ruleId);\n }\n\n mismatches.push({\n type,\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId: struggle.ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty,\n reasoning: buildReasoning(type, struggle.ruleId, ruleInfo.score, actualDifficulty),\n });\n }\n\n // Process flagged rules that had NO struggle reported\n // Not mentioned ≠ overscored. Only classify as overscored when the Converter\n // explicitly reported actualImpact: \"easy\" for this rule. Otherwise validate.\n if (summary) {\n const struggledRuleIds = new Set(\n record.ruleRelatedStruggles.map((s) => s.ruleId)\n );\n\n for (const ruleId of summary.flaggedRuleIds) {\n if (struggledRuleIds.has(ruleId)) continue;\n\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n // Rule was flagged but conversion had no struggle with it — validate conservatively\n validatedRuleSet.add(ruleId);\n mismatches.push({\n type: \"validated\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty: difficulty,\n reasoning: `Rule \"${ruleId}\" was flagged but not mentioned in conversion struggles (overall: \"${difficulty}\") — validated (no explicit easy signal).`,\n });\n }\n }\n\n // Process uncovered struggles (no existing rule)\n for (const uncovered of record.uncoveredStruggles) {\n const estimatedDifficulty = uncovered.estimatedImpact as Difficulty;\n\n mismatches.push({\n type: \"missing-rule\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n actualDifficulty: estimatedDifficulty,\n reasoning: `Uncovered struggle: \"${uncovered.description}\" (category: ${uncovered.suggestedCategory}, impact: ${estimatedDifficulty}).`,\n category: uncovered.suggestedCategory,\n description: uncovered.description,\n });\n }\n }\n\n // Override responsive-critical rule evaluations with measured responsiveDelta\n if (input.responsiveDelta != null) {\n const responsiveDifficulty = responsiveDeltaToDifficulty(input.responsiveDelta);\n for (const mismatch of mismatches) {\n if (!mismatch.ruleId) continue;\n if (!(mismatch.ruleId in RULE_ID_CATEGORY)) continue;\n const category = RULE_ID_CATEGORY[mismatch.ruleId as RuleId];\n if (category !== \"responsive-critical\") continue;\n\n const prevType = mismatch.type;\n const newType = classifyFlaggedRule(mismatch.currentScore ?? 0, responsiveDifficulty);\n mismatch.type = newType;\n mismatch.actualDifficulty = responsiveDifficulty;\n mismatch.reasoning = buildReasoning(newType, mismatch.ruleId, mismatch.currentScore, responsiveDifficulty)\n + ` (responsive: delta=${input.responsiveDelta}%p, overrides AI opinion \"${prevType}\")`;\n\n if (newType === \"validated\") {\n validatedRuleSet.add(mismatch.ruleId);\n } else {\n validatedRuleSet.delete(mismatch.ruleId);\n }\n }\n }\n\n // Override rule evaluations with objective strip ablation deltas\n if (input.stripDeltas) {\n for (const mismatch of mismatches) {\n if (!mismatch.ruleId) continue;\n // Responsive-critical: only apply strip override when size-constraints has a measured\n // responsive delta (#205). Otherwise skip so design-viewport pixel fallback cannot replace\n // baseline page responsiveDelta classification.\n if (mismatch.ruleId in RULE_ID_CATEGORY) {\n const category = RULE_ID_CATEGORY[mismatch.ruleId as RuleId];\n if (\n category === \"responsive-critical\" &&\n !sizeConstraintsStripHasResponsiveMetric(input.stripDeltas)\n ) {\n continue;\n }\n }\n const stripDifficulty = getStripDifficultyForRule(mismatch.ruleId, input.stripDeltas);\n if (!stripDifficulty) continue;\n\n const prevType = mismatch.type;\n const newType = classifyFlaggedRule(mismatch.currentScore ?? 0, stripDifficulty);\n mismatch.type = newType;\n mismatch.actualDifficulty = stripDifficulty;\n mismatch.reasoning = buildReasoning(newType, mismatch.ruleId, mismatch.currentScore, stripDifficulty)\n + ` (strip-ablation: overrides AI opinion \"${prevType}\")`;\n\n if (newType === \"validated\") {\n validatedRuleSet.add(mismatch.ruleId);\n } else {\n validatedRuleSet.delete(mismatch.ruleId);\n }\n }\n }\n\n return {\n mismatches,\n validatedRules: [...validatedRuleSet],\n };\n}\n\n/**\n * Map strip type to related rule IDs.\n * Based on what information each strip type removes and which rules detect those issues.\n */\nfunction sizeConstraintsStripHasResponsiveMetric(\n stripDeltas: Record<string, StripDeltaForEval>,\n): boolean {\n const rd = stripDeltas[\"size-constraints\"]?.responsiveDelta;\n return rd != null && Number.isFinite(rd);\n}\n\nconst STRIP_TYPE_RULES: Record<DesignTreeInfoType, RuleId[]> = {\n \"layout-direction-spacing\": [\"no-auto-layout\", \"absolute-position-in-auto-layout\", \"non-layout-container\", \"irregular-spacing\"],\n \"size-constraints\": [\"missing-size-constraint\", \"fixed-size-in-auto-layout\"],\n \"component-references\": [\"missing-component\", \"detached-instance\", \"variant-structure-mismatch\"],\n \"node-names-hierarchy\": [\"non-standard-naming\", \"non-semantic-name\", \"inconsistent-naming-convention\"],\n \"variable-references\": [\"raw-value\"],\n \"style-references\": [\"raw-value\"],\n};\n\n/**\n * Strip types that should use token delta instead of pixel delta.\n * These represent information whose absence affects token cost/code quality,\n * not pixel accuracy at design viewport.\n */\nconst TOKEN_METRIC_STRIPS = new Set<DesignTreeInfoType>([\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n]);\n\n/**\n * Strip types that should use responsive pixel delta.\n * These represent information whose absence manifests at expanded viewports.\n */\nconst RESPONSIVE_METRIC_STRIPS = new Set<DesignTreeInfoType>([\n \"size-constraints\",\n]);\n\n/**\n * Get the objective strip-based difficulty for a rule.\n * Uses category-appropriate metric per strip type:\n * - layout-direction-spacing → pixel delta\n * - size-constraints → responsive pixel delta\n * - component/naming/variable/style → token delta\n * If multiple strip types affect the same rule, take the worst difficulty.\n */\nfunction getStripDifficultyForRule(\n ruleId: string,\n stripDeltas: Record<string, StripDeltaForEval>,\n): Difficulty | null {\n const difficulties: Difficulty[] = [];\n\n for (const [stripType, ruleIds] of Object.entries(STRIP_TYPE_RULES)) {\n if (!ruleIds.includes(ruleId as RuleId)) continue;\n const data = stripDeltas[stripType];\n if (!data) continue;\n\n const infoType = stripType as DesignTreeInfoType;\n\n if (RESPONSIVE_METRIC_STRIPS.has(infoType)) {\n // size-constraints: use responsive delta if available, fall back to pixel delta\n const delta = data.responsiveDelta ?? data.pixelDelta;\n difficulties.push(stripDeltaToDifficulty(delta));\n } else if (TOKEN_METRIC_STRIPS.has(infoType)) {\n // token-management strips: use token delta if available, fall back to pixel delta\n if (data.baselineInputTokens != null && data.strippedInputTokens != null) {\n difficulties.push(tokenDeltaToDifficulty(data.baselineInputTokens, data.strippedInputTokens));\n } else {\n difficulties.push(stripDeltaToDifficulty(data.pixelDelta));\n }\n } else {\n // layout: use pixel delta\n difficulties.push(stripDeltaToDifficulty(data.pixelDelta));\n }\n }\n\n if (difficulties.length === 0) return null;\n\n // Take worst difficulty (failed > hard > moderate > easy)\n const order: Difficulty[] = [\"easy\", \"moderate\", \"hard\", \"failed\"];\n return difficulties.reduce((worst, d) =>\n order.indexOf(d) > order.indexOf(worst) ? d : worst\n );\n}\n\n/**\n * Map responsiveDelta to difficulty.\n * Based on ablation Experiment 04: structure drops -32%p at different viewport.\n * Higher delta = more responsive breakage = harder to implement.\n */\nfunction responsiveDeltaToDifficulty(delta: number): Difficulty {\n // Negative delta = expanded viewport matches better than original (unusual).\n // Treat as easy — the design is not breaking at wider viewport.\n const d = Math.max(0, delta);\n if (d <= 5) return \"easy\"; // minimal responsive breakage\n if (d <= 15) return \"moderate\"; // noticeable breakage\n if (d <= 30) return \"hard\"; // severe breakage\n return \"failed\"; // completely broken at expanded viewport\n}\n","import type { Severity } from \"../core/contracts/severity.js\";\nimport type { Confidence } from \"./contracts/tuning-agent.js\";\nimport type {\n TuningAgentInput,\n TuningAgentOutput,\n ScoreAdjustment,\n NewRuleProposal,\n} from \"./contracts/tuning-agent.js\";\n\n/**\n * Difficulty-to-score midpoint mapping for proposing new scores\n */\nconst DIFFICULTY_MIDPOINT: Record<string, number> = {\n easy: -2,\n moderate: -5,\n hard: -10,\n failed: -12,\n};\n\n/**\n * Difficulty-to-severity mapping for new rule proposals\n */\nconst DIFFICULTY_SEVERITY: Record<string, Severity> = {\n easy: \"suggestion\",\n moderate: \"risk\",\n hard: \"blocking\",\n failed: \"blocking\",\n};\n\n/**\n * Determine confidence based on number of supporting cases\n */\nfunction getConfidence(caseCount: number): Confidence {\n if (caseCount >= 3) return \"high\";\n if (caseCount >= 2) return \"medium\";\n return \"low\";\n}\n\n/**\n * Score range for worst-case floor clamping\n */\nconst DIFFICULTY_SCORE_MAX: Record<string, number> = {\n easy: 0,\n moderate: -4,\n hard: -8,\n failed: -8,\n};\n\n/**\n * Propose a score based on weighted average of actual difficulties,\n * with a worst-case floor so hard cases aren't drowned out by easy ones.\n */\nfunction proposedScoreFromDifficulties(difficulties: string[]): number {\n if (difficulties.length === 0) return -5;\n\n // Weighted average: Σ(midpoint × count) / total\n let sum = 0;\n let worstFloor = 0;\n for (const d of difficulties) {\n const midpoint = DIFFICULTY_MIDPOINT[d] ?? -5;\n sum += midpoint;\n // Track the harshest floor from any observed difficulty\n const floor = DIFFICULTY_SCORE_MAX[d] ?? -5;\n if (floor < worstFloor) worstFloor = floor;\n }\n\n const weightedAvg = Math.round(sum / difficulties.length);\n\n // Clamp: proposed score must be at least as harsh as the worst observed difficulty's range start\n return Math.min(weightedAvg, worstFloor);\n}\n\n/**\n * Determine if severity should change based on proposed score\n */\nfunction proposeSeverity(\n currentSeverity: Severity,\n proposedScore: number\n): Severity | undefined {\n let expectedSeverity: Severity;\n if (proposedScore <= -8) {\n expectedSeverity = \"blocking\";\n } else if (proposedScore <= -4) {\n expectedSeverity = \"risk\";\n } else if (proposedScore <= -2) {\n expectedSeverity = \"missing-info\";\n } else {\n expectedSeverity = \"suggestion\";\n }\n\n if (expectedSeverity !== currentSeverity) {\n return expectedSeverity;\n }\n return undefined;\n}\n\n/**\n * Tuning Agent - Step 4 of calibration pipeline\n *\n * Deterministic aggregation algorithm. No LLM required.\n * Aggregates mismatch cases into score adjustment proposals.\n */\nexport function runTuningAgent(\n input: TuningAgentInput\n): TuningAgentOutput {\n const adjustments: ScoreAdjustment[] = [];\n const newRuleProposals: NewRuleProposal[] = [];\n\n // Group mismatches by ruleId for overscored and underscored\n const overscoredByRule = new Map<string, typeof input.mismatches>();\n const underscoredByRule = new Map<string, typeof input.mismatches>();\n const missingRuleCases: typeof input.mismatches = [];\n\n for (const mismatch of input.mismatches) {\n switch (mismatch.type) {\n case \"overscored\": {\n if (!mismatch.ruleId) break;\n const existing = overscoredByRule.get(mismatch.ruleId);\n if (existing) {\n existing.push(mismatch);\n } else {\n overscoredByRule.set(mismatch.ruleId, [mismatch]);\n }\n break;\n }\n case \"underscored\": {\n if (!mismatch.ruleId) break;\n const existing = underscoredByRule.get(mismatch.ruleId);\n if (existing) {\n existing.push(mismatch);\n } else {\n underscoredByRule.set(mismatch.ruleId, [mismatch]);\n }\n break;\n }\n case \"missing-rule\":\n missingRuleCases.push(mismatch);\n break;\n }\n }\n\n const prior = input.priorEvidence ?? {};\n\n // Generate score reduction proposals for overscored rules\n // Include rules with prior-only evidence (no current mismatches)\n const allOverscoredRuleIds = new Set([\n ...overscoredByRule.keys(),\n ...Object.keys(prior).filter((id) => {\n const p = prior[id];\n return p && p.overscoredCount > 0 && !overscoredByRule.has(id);\n }),\n ]);\n\n for (const ruleId of allOverscoredRuleIds) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const cases = overscoredByRule.get(ruleId) ?? [];\n const priorData = prior[ruleId];\n const currentDifficulties = cases.map((c) => c.actualDifficulty);\n const priorDifficulties = priorData?.overscoredDifficulties ?? [];\n const allDifficulties = [...currentDifficulties, ...priorDifficulties];\n const totalCases = cases.length + (priorData?.overscoredCount ?? 0);\n\n const proposedScore = proposedScoreFromDifficulties(allDifficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n const priorNote = priorData?.overscoredCount\n ? ` (+ ${priorData.overscoredCount} case(s) from prior runs)`\n : \"\";\n\n // Propose disable when rule converges to zero impact:\n // score already at suggestion floor (-2) + 3+ cases + all easy\n const shouldDisable =\n proposedScore >= -2 &&\n totalCases >= 3 &&\n allDifficulties.every((d) => d === \"easy\");\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: shouldDisable\n ? `Converged to zero impact: ${totalCases} case(s) all \"easy\"${priorNote}. Recommend disabling.`\n : `Overscored in ${cases.length} case(s)${priorNote}. Actual difficulties: [${allDifficulties.join(\", \")}]. Current score ${ruleInfo.score} is too harsh.`,\n confidence: getConfidence(totalCases),\n supportingCases: totalCases,\n ...(shouldDisable && { proposedDisable: true }),\n });\n }\n\n // Generate score increase proposals for underscored rules\n // Include rules with prior-only evidence (no current mismatches)\n const allUnderscoredRuleIds = new Set([\n ...underscoredByRule.keys(),\n ...Object.keys(prior).filter((id) => {\n const p = prior[id];\n return p && p.underscoredCount > 0 && !underscoredByRule.has(id);\n }),\n ]);\n\n for (const ruleId of allUnderscoredRuleIds) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const cases = underscoredByRule.get(ruleId) ?? [];\n const priorData = prior[ruleId];\n const currentDifficulties = cases.map((c) => c.actualDifficulty);\n const priorDifficulties = priorData?.underscoredDifficulties ?? [];\n const allDifficulties = [...currentDifficulties, ...priorDifficulties];\n const totalCases = cases.length + (priorData?.underscoredCount ?? 0);\n\n const proposedScore = proposedScoreFromDifficulties(allDifficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n const priorNote = priorData?.underscoredCount\n ? ` (+ ${priorData.underscoredCount} case(s) from prior runs)`\n : \"\";\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: `Underscored in ${cases.length} case(s)${priorNote}. Actual difficulties: [${allDifficulties.join(\", \")}]. Current score ${ruleInfo.score} is too lenient.`,\n confidence: getConfidence(totalCases),\n supportingCases: totalCases,\n });\n }\n\n // Generate new rule proposals from missing-rule cases\n // Group by suggestedCategory extracted from reasoning\n const missingGrouped = new Map<string, typeof input.mismatches>();\n\n for (const c of missingRuleCases) {\n const category = c.category ?? \"unknown\";\n\n const existing = missingGrouped.get(category);\n if (existing) {\n existing.push(c);\n } else {\n missingGrouped.set(category, [c]);\n }\n }\n\n for (const [category, cases] of missingGrouped) {\n const difficulties = cases.map((c) => c.actualDifficulty);\n const dominantDifficulty = getDominantDifficulty(difficulties);\n const descriptions = cases.map((c) => c.description ?? c.reasoning);\n\n newRuleProposals.push({\n suggestedId: `new-${category}-rule`,\n category,\n description: descriptions.join(\"; \"),\n suggestedSeverity: DIFFICULTY_SEVERITY[dominantDifficulty] ?? \"risk\",\n suggestedScore: DIFFICULTY_MIDPOINT[dominantDifficulty] ?? -5,\n reasoning: `${cases.length} uncovered struggle(s) in category \"${category}\". Difficulties: [${difficulties.join(\", \")}].`,\n supportingCases: cases.length,\n });\n }\n\n return { adjustments, newRuleProposals };\n}\n\nfunction getDominantDifficulty(difficulties: string[]): string {\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n\n let dominant = difficulties[0] ?? \"moderate\";\n let maxCount = 0;\n for (const [difficulty, count] of Object.entries(counts)) {\n if (count > maxCount) {\n maxCount = count;\n dominant = difficulty;\n }\n }\n return dominant;\n}\n","import type { ScoreReport } from \"../core/engine/scoring.js\";\nimport type { MismatchCase } from \"./contracts/evaluation-agent.js\";\nimport type { ScoreAdjustment, NewRuleProposal } from \"./contracts/tuning-agent.js\";\n\n/** Data structure for generating calibration report markdown. */\nexport interface CalibrationReportData {\n fileKey: string;\n fileName: string;\n analyzedAt: string;\n nodeCount: number;\n issueCount: number;\n convertedNodeCount: number;\n skippedNodeCount: number;\n scoreReport: ScoreReport;\n mismatches: MismatchCase[];\n validatedRules: string[];\n adjustments: ScoreAdjustment[];\n newRuleProposals: NewRuleProposal[];\n /** Design tree token metrics (optional — present when design-tree stats are available) */\n tokenMetrics?: {\n designTreeTokens: number;\n designTreeBytes: number;\n tokensPerNode: number;\n } | undefined;\n}\n\n/**\n * Generate a CALIBRATION_REPORT.md from calibration pipeline results\n */\nexport function generateCalibrationReport(data: CalibrationReportData): string {\n const lines: string[] = [];\n\n lines.push(\"# Calibration Report\");\n lines.push(\"\");\n lines.push(renderOverview(data));\n lines.push(renderCurrentScores(data));\n lines.push(renderAdjustmentProposals(data.adjustments));\n lines.push(renderNewRuleProposals(data.newRuleProposals));\n lines.push(renderValidatedRules(data.validatedRules));\n lines.push(renderMismatchDetails(data.mismatches));\n lines.push(renderApplicationGuide(data.adjustments));\n\n return lines.join(\"\\n\");\n}\n\nfunction renderOverview(data: CalibrationReportData): string {\n return `## Overview\n\n| Metric | Value |\n|--------|-------|\n| File | ${data.fileName} (${data.fileKey}) |\n| Analyzed At | ${data.analyzedAt} |\n| Total Nodes | ${data.nodeCount} |\n| Total Issues | ${data.issueCount} |\n| Converted Nodes | ${data.convertedNodeCount} |\n| Skipped Nodes | ${data.skippedNodeCount} |\n| Overall Grade | ${data.scoreReport.overall.grade} (${data.scoreReport.overall.percentage}%) |${data.tokenMetrics ? `\n| Design Tree Tokens | ~${data.tokenMetrics.designTreeTokens.toLocaleString()} tokens (${Math.round(data.tokenMetrics.designTreeBytes / 1024)}KB) |\n| Tokens per Node | ~${Math.round(data.tokenMetrics.tokensPerNode)} |` : \"\"}\n`;\n}\n\nfunction renderCurrentScores(data: CalibrationReportData): string {\n const lines: string[] = [];\n lines.push(\"## Current Score Summary\");\n lines.push(\"\");\n lines.push(\"| Category | Score | Issues | Density | Diversity |\");\n lines.push(\"|----------|-------|--------|---------|-----------|\");\n\n for (const [category, catScore] of Object.entries(data.scoreReport.byCategory)) {\n lines.push(\n `| ${category} | ${catScore.percentage}% | ${catScore.issueCount} | ${catScore.densityScore} | ${catScore.diversityScore} |`\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderAdjustmentProposals(adjustments: ScoreAdjustment[]): string {\n if (adjustments.length === 0) {\n return \"## Score Adjustment Proposals\\n\\nNo adjustments proposed.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Score Adjustment Proposals\");\n lines.push(\"\");\n lines.push(\"| Rule | Current Score | Proposed Score | Disable? | Severity Change | Confidence | Cases | Reasoning |\");\n lines.push(\"|------|--------------|----------------|----------|-----------------|------------|-------|-----------|\");\n\n for (const adj of adjustments) {\n const severityChange = adj.proposedSeverity\n ? `${adj.currentSeverity} -> ${adj.proposedSeverity}`\n : adj.currentSeverity;\n const disable = adj.proposedDisable ? \"⛔ YES\" : \"\";\n\n lines.push(\n `| ${adj.ruleId} | ${adj.currentScore} | ${adj.proposedScore} | ${disable} | ${severityChange} | ${adj.confidence} | ${adj.supportingCases} | ${adj.reasoning} |`\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderNewRuleProposals(proposals: NewRuleProposal[]): string {\n if (proposals.length === 0) {\n return \"## New Rule Proposals\\n\\nNo new rules proposed.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## New Rule Proposals\");\n lines.push(\"\");\n\n for (const proposal of proposals) {\n lines.push(`### ${proposal.suggestedId}`);\n lines.push(\"\");\n lines.push(`- **Category**: ${proposal.category}`);\n lines.push(`- **Suggested Severity**: ${proposal.suggestedSeverity}`);\n lines.push(`- **Suggested Score**: ${proposal.suggestedScore}`);\n lines.push(`- **Supporting Cases**: ${proposal.supportingCases}`);\n lines.push(`- **Description**: ${proposal.description}`);\n lines.push(`- **Reasoning**: ${proposal.reasoning}`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderValidatedRules(validatedRules: string[]): string {\n if (validatedRules.length === 0) {\n return \"## Validated Rules\\n\\nNo rules were validated in this run.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Validated Rules\");\n lines.push(\"\");\n lines.push(\"The following rules had scores that aligned with actual conversion difficulty:\");\n lines.push(\"\");\n\n for (const ruleId of validatedRules) {\n lines.push(`- \\`${ruleId}\\``);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderMismatchDetails(mismatches: MismatchCase[]): string {\n if (mismatches.length === 0) {\n return \"## Detailed Mismatch List\\n\\nNo mismatches found.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Detailed Mismatch List\");\n lines.push(\"\");\n\n const grouped: Record<string, MismatchCase[]> = {};\n for (const m of mismatches) {\n const list = grouped[m.type];\n if (list) {\n list.push(m);\n } else {\n grouped[m.type] = [m];\n }\n }\n\n for (const [type, cases] of Object.entries(grouped)) {\n lines.push(`### ${type} (${cases.length})`);\n lines.push(\"\");\n\n for (const c of cases) {\n const ruleInfo = c.ruleId ? ` | Rule: \\`${c.ruleId}\\`` : \"\";\n const scoreInfo = c.currentScore !== undefined ? ` | Score: ${c.currentScore}` : \"\";\n lines.push(`- **${c.nodePath}** (${c.nodeId})${ruleInfo}${scoreInfo} | Difficulty: ${c.actualDifficulty}`);\n lines.push(` > ${c.reasoning}`);\n }\n\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderApplicationGuide(adjustments: ScoreAdjustment[]): string {\n const lines: string[] = [];\n lines.push(\"## Application Guide\");\n lines.push(\"\");\n lines.push(\"To apply these calibration results:\");\n lines.push(\"\");\n lines.push(\"1. Review each adjustment proposal above\");\n lines.push(\"2. Edit `src/core/rules/rule-config.ts` to update scores and severities\");\n lines.push(\"3. Run `pnpm test:run` to verify no tests break\");\n lines.push(\"4. Re-run calibration to confirm improvements\");\n lines.push(\"\");\n\n if (adjustments.length > 0) {\n lines.push(\"### Suggested Changes to `rule-config.ts`\");\n lines.push(\"\");\n lines.push(\"```typescript\");\n\n for (const adj of adjustments) {\n if (adj.proposedDisable) {\n lines.push(`// ${adj.ruleId}: DISABLE (${adj.confidence} confidence, ${adj.supportingCases} cases)`);\n lines.push(`// enabled: false`);\n } else {\n lines.push(`// ${adj.ruleId}: ${adj.currentScore} -> ${adj.proposedScore} (${adj.confidence} confidence)`);\n }\n if (adj.proposedSeverity && !adj.proposedDisable) {\n lines.push(`// severity: \"${adj.currentSeverity}\" -> \"${adj.proposedSeverity}\"`);\n }\n }\n\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { z } from \"zod\";\n\n// --- Calibration evidence ---\n\nexport const CalibrationEvidenceEntrySchema = z.object({\n ruleId: z.string(),\n type: z.enum([\"overscored\", \"underscored\"]),\n actualDifficulty: z.string(),\n fixture: z.string(),\n timestamp: z.string(),\n // Phase 1 fields (#144) — optional for backward compatibility with existing evidence\n confidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n pro: z.array(z.string()).optional(),\n con: z.array(z.string()).optional(),\n decision: z.enum([\"APPROVE\", \"REJECT\", \"REVISE\", \"HOLD\"]).optional(),\n});\n\nexport type CalibrationEvidenceEntry = z.infer<typeof CalibrationEvidenceEntrySchema>;\n\nexport const CrossRunEvidenceGroupSchema = z.object({\n overscoredCount: z.number(),\n underscoredCount: z.number(),\n overscoredDifficulties: z.array(z.string()),\n underscoredDifficulties: z.array(z.string()),\n // Aggregated pro/con from all entries for this rule\n allPro: z.array(z.string()).optional(),\n allCon: z.array(z.string()).optional(),\n lastConfidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n lastDecision: z.enum([\"APPROVE\", \"REJECT\", \"REVISE\", \"HOLD\"]).optional(),\n});\n\nexport type CrossRunEvidenceGroup = z.infer<typeof CrossRunEvidenceGroupSchema>;\n\nexport type CrossRunEvidence = Record<string, CrossRunEvidenceGroup>;\n\n// --- Evidence ratio summary (deterministic pre-computation for Critic) ---\n\nexport const EvidenceRatioSummarySchema = z.object({\n totalSamples: z.number(),\n overscoredCount: z.number(),\n underscoredCount: z.number(),\n overscoredRate: z.number(),\n underscoredRate: z.number(),\n dominantDirection: z.enum([\"overscored\", \"underscored\", \"mixed\"]),\n dominantRate: z.number(),\n expectedDifficulty: z.string(),\n confidence: z.enum([\"high\", \"medium\", \"low\", \"insufficient\"]),\n summary: z.string(),\n});\n\nexport type EvidenceRatioSummary = z.infer<typeof EvidenceRatioSummarySchema>;\n\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n CalibrationEvidenceEntrySchema,\n} from \"./contracts/evidence.js\";\nimport type {\n CalibrationEvidenceEntry,\n CrossRunEvidence,\n CrossRunEvidenceGroup,\n EvidenceRatioSummary,\n} from \"./contracts/evidence.js\";\n\nexport type { CalibrationEvidenceEntry, CrossRunEvidence, CrossRunEvidenceGroup, EvidenceRatioSummary };\n\nconst DEFAULT_CALIBRATION_PATH = resolve(\"data/calibration-evidence.json\");\n\nfunction readValidatedArray<T>(\n filePath: string,\n schema: { safeParse: (v: unknown) => { success: boolean; data?: T } }\n): T[] {\n if (!existsSync(filePath)) return [];\n try {\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\")) as unknown;\n if (!Array.isArray(raw)) return [];\n const result: T[] = [];\n for (const item of raw) {\n const parsed = schema.safeParse(item);\n if (parsed.success && parsed.data !== undefined) {\n result.push(parsed.data);\n }\n }\n return result;\n } catch {\n return [];\n }\n}\n\nfunction writeJsonArray<T>(filePath: string, data: T[]): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/**\n * Load calibration evidence and group by ruleId for the tuning agent.\n */\nexport function loadCalibrationEvidence(\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): CrossRunEvidence {\n const entries = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n const result: CrossRunEvidence = {};\n\n for (const entry of entries) {\n let group = result[entry.ruleId];\n if (!group) {\n group = {\n overscoredCount: 0,\n underscoredCount: 0,\n overscoredDifficulties: [],\n underscoredDifficulties: [],\n allPro: [],\n allCon: [],\n };\n result[entry.ruleId] = group;\n }\n\n if (entry.type === \"overscored\") {\n group.overscoredCount++;\n group.overscoredDifficulties.push(entry.actualDifficulty);\n } else {\n group.underscoredCount++;\n group.underscoredDifficulties.push(entry.actualDifficulty);\n }\n\n // Aggregate pro/con from enriched entries (deduplicated)\n if (entry.pro) {\n group.allPro ??= [];\n for (const p of entry.pro) {\n if (!group.allPro.includes(p)) group.allPro.push(p);\n }\n }\n if (entry.con) {\n group.allCon ??= [];\n for (const c of entry.con) {\n if (!group.allCon.includes(c)) group.allCon.push(c);\n }\n }\n // Keep last confidence/decision (most recent entry wins)\n if (entry.confidence) group.lastConfidence = entry.confidence;\n if (entry.decision) group.lastDecision = entry.decision;\n }\n\n return result;\n}\n\n/**\n * Minimum sample size before ratio-based confidence kicks in.\n * Below this threshold, confidence is \"insufficient\".\n * Lowered from 3→2: strip ablation deltas provide objective signal,\n * so fewer fixtures are needed for convergence (#194).\n */\nconst MIN_RATIO_SAMPLES = 2;\n\n/**\n * Difficulty dominance: pick the most frequent difficulty from a list.\n */\nfunction dominantDifficulty(difficulties: string[]): string {\n if (difficulties.length === 0) return \"moderate\";\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n let best = difficulties[0]!;\n let bestCount = 0;\n for (const [d, c] of Object.entries(counts)) {\n if (c > bestCount) {\n bestCount = c;\n best = d;\n }\n }\n return best;\n}\n\n/**\n * Compute a deterministic ratio summary from cross-run evidence for a single rule.\n * This pre-digests contradictory evidence into a clear signal so the Critic\n * doesn't have to do statistics — it just reads the conclusion.\n */\nexport function computeEvidenceRatio(group: CrossRunEvidenceGroup): EvidenceRatioSummary {\n const total = group.overscoredCount + group.underscoredCount;\n\n if (total === 0) {\n return {\n totalSamples: 0,\n overscoredCount: 0,\n underscoredCount: 0,\n overscoredRate: 0,\n underscoredRate: 0,\n dominantDirection: \"mixed\",\n dominantRate: 0,\n expectedDifficulty: \"moderate\",\n confidence: \"insufficient\",\n summary: \"No evidence available.\",\n };\n }\n\n const overscoredRate = group.overscoredCount / total;\n const underscoredRate = group.underscoredCount / total;\n\n // Determine dominant direction\n let dir: \"overscored\" | \"underscored\" | \"mixed\";\n let dominantRate: number;\n if (overscoredRate >= 0.6) {\n dir = \"overscored\";\n dominantRate = overscoredRate;\n } else if (underscoredRate >= 0.6) {\n dir = \"underscored\";\n dominantRate = underscoredRate;\n } else {\n dir = \"mixed\";\n dominantRate = Math.max(overscoredRate, underscoredRate);\n }\n\n // Expected difficulty from the dominant direction's difficulties\n const relevantDifficulties =\n dir === \"underscored\"\n ? group.underscoredDifficulties\n : dir === \"overscored\"\n ? group.overscoredDifficulties\n : [...group.overscoredDifficulties, ...group.underscoredDifficulties];\n const expectedDiff = dominantDifficulty(relevantDifficulties);\n\n // Confidence based on sample size + dominance clarity\n let confidence: \"high\" | \"medium\" | \"low\" | \"insufficient\";\n if (total < MIN_RATIO_SAMPLES) {\n confidence = \"insufficient\";\n } else if (dominantRate >= 0.7 && total >= 3) {\n confidence = \"high\";\n } else if (dominantRate >= 0.6 && total >= MIN_RATIO_SAMPLES) {\n confidence = \"medium\";\n } else {\n confidence = \"low\";\n }\n\n // Human-readable summary\n const pct = (r: number) => `${Math.round(r * 100)}%`;\n let summary: string;\n if (dir === \"mixed\") {\n summary = `Mixed signals: ${group.overscoredCount} overscored (${pct(overscoredRate)}) vs ${group.underscoredCount} underscored (${pct(underscoredRate)}) across ${total} fixtures. No clear direction.`;\n } else {\n summary = `${total} fixtures: ${dir} in ${dir === \"overscored\" ? group.overscoredCount : group.underscoredCount}/${total} (${pct(dominantRate)}). Expected difficulty: ${expectedDiff}. Confidence: ${confidence}.`;\n }\n\n return {\n totalSamples: total,\n overscoredCount: group.overscoredCount,\n underscoredCount: group.underscoredCount,\n overscoredRate: Math.round(overscoredRate * 1000) / 1000,\n underscoredRate: Math.round(underscoredRate * 1000) / 1000,\n dominantDirection: dir,\n dominantRate: Math.round(dominantRate * 1000) / 1000,\n expectedDifficulty: expectedDiff,\n confidence,\n summary,\n };\n}\n\n/**\n * Append new calibration evidence entries (overscored/underscored mismatches).\n *\n * Dedup policy: one entry per (ruleId, fixture) — last-write-wins within and across calls.\n * This is intentional: with strip-ablation (#194) each rule gets one objective delta per fixture,\n * so multiple entries for the same (ruleId, fixture) would be redundant.\n * Cross-run confidence in `computeEvidenceRatio` counts entries (=fixtures), not occurrences.\n */\nexport function appendCalibrationEvidence(\n entries: CalibrationEvidenceEntry[],\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (entries.length === 0) return;\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n // Same batch can repeat (ruleId, fixture); last entry wins (matches cross-call behavior)\n // Normalize ruleId/fixture to prevent bucket splitting from whitespace differences\n const incomingByKey = new Map<string, CalibrationEvidenceEntry>();\n for (const e of entries) {\n const normalized = { ...e, ruleId: e.ruleId.trim(), fixture: e.fixture.trim() };\n const k = `${normalized.ruleId}\\0${normalized.fixture}`;\n incomingByKey.set(k, normalized);\n }\n const mergedIncoming = [...incomingByKey.values()];\n const keys = new Set(incomingByKey.keys());\n const withoutDupes = existing.filter(\n (e) => !keys.has(`${e.ruleId.trim()}\\0${e.fixture.trim()}`),\n );\n withoutDupes.push(...mergedIncoming);\n writeJsonArray(evidencePath, withoutDupes);\n}\n\n/**\n * Remove entries for rules whose scores were applied/revised by the Arbitrator.\n * Prunes all fixtures for the given ruleIds — score changes are global.\n */\nexport function pruneCalibrationEvidence(\n appliedRuleIds: string[],\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (appliedRuleIds.length === 0) return;\n const ruleSet = new Set(appliedRuleIds.map((id) => id.trim()).filter((id) => id.length > 0));\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n const pruned = existing.filter((e) => !ruleSet.has(e.ruleId.trim()));\n writeJsonArray(evidencePath, pruned);\n}\n\n/**\n * Enrich existing calibration evidence entries with Critic's structured review data.\n * Matches by (ruleId, fixture) to avoid overwriting entries from other fixtures.\n * Entries without a matching review are left unchanged.\n */\nexport function enrichCalibrationEvidence(\n reviews: Array<{\n ruleId: string;\n confidence?: \"high\" | \"medium\" | \"low\";\n pro?: string[];\n con?: string[];\n decision?: \"APPROVE\" | \"REJECT\" | \"REVISE\" | \"HOLD\";\n }>,\n fixture: string,\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (reviews.length === 0) return;\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n if (existing.length === 0) return;\n\n const reviewByRule = new Map(reviews.map((r) => [r.ruleId.trim(), r]));\n const fixtureTrimmed = fixture.trim();\n\n let matchCount = 0;\n const enriched = existing.map((entry) => {\n if (entry.fixture.trim() !== fixtureTrimmed) return entry;\n const review = reviewByRule.get(entry.ruleId.trim());\n if (!review) return entry;\n matchCount++;\n return {\n ...entry,\n ...(review.confidence && { confidence: review.confidence }),\n ...(review.pro && { pro: review.pro }),\n ...(review.con && { con: review.con }),\n ...(review.decision && { decision: review.decision }),\n };\n });\n\n if (matchCount === 0) {\n console.warn(`[enrich] No entries matched fixture=\"${fixture}\" — evidence unchanged`);\n return;\n }\n writeJsonArray(evidencePath, enriched);\n}\n\n","import type { AnalysisFile, AnalysisNode, AnalysisNodeType } from \"../core/contracts/figma-node.js\";\nimport { analyzeFile } from \"../core/engine/rule-engine.js\";\nimport { RULE_CONFIGS } from \"../core/rules/rule-config.js\";\n\nimport type { CalibrationConfigInput } from \"./contracts/calibration.js\";\nimport { StripDeltasArraySchema, RuleImpactAssessmentSchema, UncoveredStrugglesInputSchema } from \"./contracts/conversion-agent.js\";\nimport { CalibrationConfigSchema } from \"./contracts/calibration.js\";\nimport type { NodeIssueSummary } from \"./contracts/analysis-agent.js\";\nimport type { ScoreReport } from \"../core/engine/scoring.js\";\n\nimport { runAnalysisAgent, extractRuleScores } from \"./analysis-agent.js\";\nimport { runEvaluationAgent } from \"./evaluation-agent.js\";\nimport { runTuningAgent } from \"./tuning-agent.js\";\nimport { generateCalibrationReport } from \"./report-generator.js\";\nimport {\n loadCalibrationEvidence,\n appendCalibrationEvidence,\n} from \"./evidence-collector.js\";\nimport type { CalibrationEvidenceEntry } from \"./evidence-collector.js\";\n\n/**\n * Normalize Converter's actualImpact (none/low/medium/high) to Difficulty enum (easy/moderate/hard/failed).\n * Falls back to \"moderate\" for unknown values.\n */\nfunction normalizeActualImpact(impact: string): string {\n const mapping: Record<string, string> = {\n none: \"easy\",\n low: \"easy\",\n easy: \"easy\",\n medium: \"moderate\",\n moderate: \"moderate\",\n high: \"hard\",\n hard: \"hard\",\n failed: \"failed\",\n };\n return mapping[impact] ?? \"moderate\";\n}\n\n/**\n * Calibration tier thresholds (percentage-based).\n * - \"full\": Converter + Measurements + Gap Analysis\n * - \"visual-only\": Converter + Measurements (Gap Analysis skipped)\n */\nexport const CALIBRATION_TIER_THRESHOLDS = {\n full: 90, // A or higher\n visualOnly: 0, // everything else — always run Converter\n} as const;\n\nexport type CalibrationTier = \"full\" | \"visual-only\";\n\n/**\n * Determine calibration tier from analysis percentage.\n */\nexport function determineCalibrationTier(percentage: number): CalibrationTier {\n if (percentage >= CALIBRATION_TIER_THRESHOLDS.full) return \"full\";\n return \"visual-only\";\n}\n\n/**\n * Map visual-compare similarity percentage to conversion difficulty.\n * Used by Converter and Evaluation agents.\n */\nexport const SIMILARITY_DIFFICULTY_THRESHOLDS = {\n easy: 90,\n moderate: 70,\n hard: 50,\n} as const;\n\nexport type ConversionDifficulty = \"easy\" | \"moderate\" | \"hard\" | \"failed\";\n\nexport function similarityToDifficulty(similarity: number): ConversionDifficulty {\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.easy) return \"easy\";\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.moderate) return \"moderate\";\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.hard) return \"hard\";\n return \"failed\";\n}\n\n/**\n * Node types that are pure graphics — not useful for code conversion\n */\nconst EXCLUDED_NODE_TYPES: Set<AnalysisNodeType> = new Set([\n \"VECTOR\",\n \"BOOLEAN_OPERATION\",\n \"STAR\",\n \"REGULAR_POLYGON\",\n \"ELLIPSE\",\n \"LINE\",\n]);\n\n/**\n * Find a node by ID in the tree\n */\nfunction findNode(root: AnalysisNode, nodeId: string): AnalysisNode | null {\n if (root.id === nodeId) return root;\n if (root.children) {\n for (const child of root.children) {\n const found = findNode(child, nodeId);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Check if a subtree contains at least one TEXT node\n */\nfunction hasTextDescendant(node: AnalysisNode): boolean {\n if (node.type === \"TEXT\") return true;\n if (node.children) {\n for (const child of node.children) {\n if (hasTextDescendant(child)) return true;\n }\n }\n return false;\n}\n\n/**\n * Minimum dimensions for conversion candidates\n */\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 200;\nconst FILTER_THRESHOLD = 500;\n\n/**\n * Node types eligible for code conversion\n */\nconst ELIGIBLE_NODE_TYPES: Set<AnalysisNodeType> = new Set([\n \"FRAME\",\n \"COMPONENT\",\n \"INSTANCE\",\n]);\n\nimport { isExcludedName } from \"../core/rules/node-semantics.js\";\n\n/**\n * Filter node summaries to meaningful conversion candidates.\n *\n * If summaries.length <= FILTER_THRESHOLD (500), all nodes pass (typical page size).\n * Otherwise, inclusion criteria:\n * - type is FRAME, COMPONENT, or INSTANCE\n * - width >= 200 AND height >= 200\n * - 3+ direct children\n * - at least one TEXT descendant (excludes pure icons/graphics)\n *\n * Exclusion criteria:\n * - pure graphic types (VECTOR, BOOLEAN_OPERATION, etc.)\n * - name contains \"icon\", \"ico\", \"badge\", or \"indicator\"\n */\nexport function filterConversionCandidates(\n summaries: NodeIssueSummary[],\n documentRoot: AnalysisNode\n): NodeIssueSummary[] {\n // Always exclude invisible nodes — can't screenshot for visual comparison\n const visibleSummaries = summaries.filter((summary) => {\n const node = findNode(documentRoot, summary.nodeId);\n return node ? node.visible !== false : false;\n });\n\n // Small trees: skip further filtering\n if (visibleSummaries.length <= FILTER_THRESHOLD) return visibleSummaries;\n\n // Large trees: filter to meaningful conversion candidates\n return visibleSummaries.filter((summary) => {\n const node = findNode(documentRoot, summary.nodeId);\n if (!node) return false;\n\n // Exclude pure graphic node types\n if (EXCLUDED_NODE_TYPES.has(node.type)) return false;\n\n // Only allow FRAME, COMPONENT, INSTANCE\n if (!ELIGIBLE_NODE_TYPES.has(node.type)) return false;\n\n // Exclude decorative/structural/overlay nodes by name\n if (isExcludedName(node.name)) return false;\n\n // Require minimum dimensions\n const bbox = node.absoluteBoundingBox;\n if (bbox && (bbox.width < MIN_WIDTH || bbox.height < MIN_HEIGHT)) return false;\n\n // Require 3+ direct children\n if (!node.children || node.children.length < 3) return false;\n\n // Require at least one TEXT descendant\n if (!hasTextDescendant(node)) return false;\n\n return true;\n });\n}\n\n// Reuse loader from core engine\nimport { loadFile as coreLoadFile } from \"../core/engine/loader.js\";\n\nasync function loadFile(\n input: string,\n token?: string\n): Promise<{ file: AnalysisFile; fileKey: string; nodeId: string | undefined }> {\n const { file, nodeId } = await coreLoadFile(input, token);\n return { file, fileKey: file.fileKey, nodeId };\n}\n\n/**\n * Build rule scores map from RULE_CONFIGS\n */\nfunction buildRuleScoresMap(): Record<string, { score: number; severity: string }> {\n const scores: Record<string, { score: number; severity: string }> = {};\n for (const [id, config] of Object.entries(RULE_CONFIGS)) {\n scores[id] = { score: config.score, severity: config.severity };\n }\n return scores;\n}\n\n/**\n * Run Step 1 only: analysis + save JSON output\n */\nexport async function runCalibrationAnalyze(\n config: CalibrationConfigInput\n): Promise<{\n analysisOutput: ReturnType<typeof runAnalysisAgent> extends infer T ? T : never;\n ruleScores: Record<string, { score: number; severity: string }>;\n fileKey: string;\n}> {\n const parsed = CalibrationConfigSchema.parse(config);\n const { file, fileKey, nodeId } = await loadFile(parsed.input, parsed.token);\n\n const analyzeOptions = nodeId ? { targetNodeId: nodeId } : {};\n const analysisResult = analyzeFile(file, analyzeOptions);\n\n const analysisOutput = runAnalysisAgent({ analysisResult });\n const ruleScores = {\n ...buildRuleScoresMap(),\n ...extractRuleScores(analysisResult),\n };\n\n return { analysisOutput, ruleScores, fileKey };\n}\n\n/**\n * Run Steps 3+4: evaluation + tuning from pre-computed analysis and conversion data\n */\nexport function runCalibrationEvaluate(\n analysisJson: {\n nodeIssueSummaries: NodeIssueSummary[];\n scoreReport: ScoreReport;\n fileKey: string;\n fileName: string;\n analyzedAt: string;\n nodeCount: number;\n issueCount: number;\n },\n conversionJson: Record<string, unknown>,\n ruleScores: Record<string, { score: number; severity: string }>,\n options?: { collectEvidence?: boolean | undefined; fixtureName?: string | undefined }\n) {\n // Support both formats:\n // Old: { records: [...], skippedNodeIds: [...] }\n // New: { rootNodeId, similarity, ruleImpactAssessment: [...], uncoveredStruggles: [...] }\n let conversionRecords: Array<{\n nodeId: string;\n nodePath: string;\n difficulty: string;\n ruleRelatedStruggles: Array<{ ruleId: string; description: string; actualImpact: string }>;\n uncoveredStruggles: Array<{ description: string; suggestedCategory: string; estimatedImpact: string }>;\n }>;\n let wholeDesign = false;\n\n if (Array.isArray(conversionJson[\"records\"])) {\n // Old per-node format\n conversionRecords = conversionJson[\"records\"] as typeof conversionRecords;\n } else {\n // New whole-design format — Zod-validate before use\n const assessmentParsed = RuleImpactAssessmentSchema.safeParse(conversionJson[\"ruleImpactAssessment\"]);\n if (assessmentParsed.success && assessmentParsed.data.length > 0) {\n wholeDesign = true;\n const assessment = assessmentParsed.data;\n const strugglesParsed = UncoveredStrugglesInputSchema.safeParse(conversionJson[\"uncoveredStruggles\"]);\n const struggles = strugglesParsed.success ? strugglesParsed.data : [];\n conversionRecords = [{\n nodeId: typeof conversionJson[\"rootNodeId\"] === \"string\" ? conversionJson[\"rootNodeId\"] : \"root\",\n nodePath: \"root\",\n difficulty: typeof conversionJson[\"difficulty\"] === \"string\" ? conversionJson[\"difficulty\"] : \"moderate\",\n ruleRelatedStruggles: assessment.map(a => ({\n ruleId: a.ruleId,\n description: a.description,\n actualImpact: normalizeActualImpact(a.actualImpact),\n })),\n uncoveredStruggles: struggles.map(s => ({\n ...s,\n estimatedImpact: normalizeActualImpact(s.estimatedImpact),\n })),\n }];\n } else {\n conversionRecords = [];\n }\n }\n\n // Extract responsive comparison data if available\n const responsiveDelta = typeof conversionJson[\"responsiveDelta\"] === \"number\"\n ? conversionJson[\"responsiveDelta\"] as number\n : null;\n\n // Extract strip ablation deltas if available (Zod-validated)\n let stripDeltas: Record<string, import(\"./contracts/evaluation-agent.js\").StripDeltaForEval> | undefined;\n {\n const parsed = StripDeltasArraySchema.safeParse(conversionJson[\"stripDeltas\"]);\n if (parsed.success && parsed.data.length > 0) {\n stripDeltas = {};\n for (const r of parsed.data) {\n stripDeltas[r.stripType] = {\n pixelDelta: r.delta,\n responsiveDelta: r.responsiveDelta ?? null,\n baselineInputTokens: r.baselineInputTokens ?? null,\n strippedInputTokens: r.strippedInputTokens ?? null,\n };\n }\n }\n }\n\n const evaluationOutput = runEvaluationAgent({\n nodeIssueSummaries: analysisJson.nodeIssueSummaries.map((s) => ({\n nodeId: s.nodeId,\n nodePath: s.nodePath,\n flaggedRuleIds: s.flaggedRuleIds,\n })),\n conversionRecords,\n ruleScores,\n responsiveDelta,\n stripDeltas,\n wholeDesign,\n });\n\n // Load prior evidence if collecting\n const priorEvidence = options?.collectEvidence\n ? loadCalibrationEvidence()\n : undefined;\n\n const tuningInput = {\n mismatches: evaluationOutput.mismatches,\n ruleScores,\n ...(priorEvidence ? { priorEvidence } : {}),\n };\n const tuningOutput = runTuningAgent(tuningInput);\n\n // Collect evidence from this run (non-fatal — pipeline continues on I/O failure)\n if (options?.collectEvidence) {\n try {\n const timestamp = new Date().toISOString();\n const fixture = options.fixtureName ?? analysisJson.fileKey;\n\n // Append calibration evidence (overscored/underscored)\n const calibrationEntries: CalibrationEvidenceEntry[] = [];\n for (const m of evaluationOutput.mismatches) {\n if ((m.type === \"overscored\" || m.type === \"underscored\") && m.ruleId) {\n calibrationEntries.push({\n ruleId: m.ruleId,\n type: m.type,\n actualDifficulty: m.actualDifficulty,\n fixture,\n timestamp,\n });\n }\n }\n appendCalibrationEvidence(calibrationEntries);\n\n } catch (err) {\n console.warn(\"[evidence] Failed to collect evidence (non-fatal):\", err);\n }\n }\n\n const report = generateCalibrationReport({\n fileKey: analysisJson.fileKey,\n fileName: analysisJson.fileName,\n analyzedAt: analysisJson.analyzedAt,\n nodeCount: analysisJson.nodeCount,\n issueCount: analysisJson.issueCount,\n convertedNodeCount: conversionRecords.length,\n skippedNodeCount: Array.isArray(conversionJson[\"skippedNodeIds\"]) ? (conversionJson[\"skippedNodeIds\"] as unknown[]).length : 0,\n scoreReport: analysisJson.scoreReport,\n mismatches: evaluationOutput.mismatches,\n validatedRules: evaluationOutput.validatedRules,\n adjustments: tuningOutput.adjustments,\n newRuleProposals: tuningOutput.newRuleProposals,\n });\n\n return {\n evaluationOutput,\n tuningOutput,\n report,\n };\n}\n\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport {\n runCalibrationAnalyze,\n filterConversionCandidates,\n determineCalibrationTier,\n} from \"../../../agents/orchestrator.js\";\n\ninterface CalibrateAnalyzeOptions {\n output?: string;\n runDir?: string;\n token?: string;\n targetNodeId?: string;\n}\n\nexport function registerCalibrateAnalyze(cli: CAC): void {\n cli\n .command(\n \"calibrate-analyze <input>\",\n \"Run calibration analysis and output JSON for conversion step\"\n )\n .option(\"--output <path>\", \"Output JSON path\", { default: \"logs/calibration/calibration-analysis.json\" })\n .option(\"--run-dir <path>\", \"Run directory (overrides --output, writes to <run-dir>/analysis.json)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--target-node-id <nodeId>\", \"Scope analysis to a specific node\")\n .action(async (input: string, options: CalibrateAnalyzeOptions) => {\n try {\n console.log(\"Running calibration analysis...\");\n\n const calibConfig = {\n input,\n maxConversionNodes: 20,\n samplingStrategy: \"top-issues\" as const,\n outputPath: \"logs/calibration/calibration-report.md\",\n ...(options.token && { token: options.token }),\n ...(options.targetNodeId && { targetNodeId: options.targetNodeId }),\n };\n\n const { analysisOutput, ruleScores, fileKey } =\n await runCalibrationAnalyze(calibConfig);\n\n // Filter out icon/graphic nodes that are not useful for code conversion\n const filteredSummaries = filterConversionCandidates(\n analysisOutput.nodeIssueSummaries,\n analysisOutput.analysisResult.file.document\n );\n\n const percentage = analysisOutput.scoreReport.overall.percentage;\n const calibrationTier = determineCalibrationTier(percentage);\n\n const outputData = {\n fileKey,\n fileName: analysisOutput.analysisResult.file.name,\n analyzedAt: analysisOutput.analysisResult.analyzedAt,\n nodeCount: analysisOutput.analysisResult.nodeCount,\n issueCount: analysisOutput.analysisResult.issues.length,\n calibrationTier,\n scoreReport: analysisOutput.scoreReport,\n nodeIssueSummaries: filteredSummaries,\n ruleScores,\n };\n\n const outputPath = options.runDir\n ? resolve(options.runDir, \"analysis.json\")\n : resolve(options.output ?? \"logs/calibration/calibration-analysis.json\");\n const outputDir = dirname(outputPath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n await writeFile(outputPath, JSON.stringify(outputData, null, 2), \"utf-8\");\n\n console.log(`\\nAnalysis complete.`);\n console.log(` Nodes: ${outputData.nodeCount}`);\n console.log(` Issues: ${outputData.issueCount}`);\n console.log(` Nodes with issues: ${outputData.nodeIssueSummaries.length}`);\n console.log(` Grade: ${outputData.scoreReport.overall.grade} (${percentage}%)`);\n console.log(` Calibration tier: ${calibrationTier}`);\n console.log(`\\nOutput saved: ${outputPath}`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { runCalibrationEvaluate } from \"../../../agents/orchestrator.js\";\n\ninterface CalibrateEvaluateOptions {\n output?: string;\n runDir?: string;\n}\n\nexport function registerCalibrateEvaluate(cli: CAC): void {\n cli\n .command(\n \"calibrate-evaluate [analysisJson] [conversionJson]\",\n \"Evaluate conversion results and generate calibration report\"\n )\n .option(\"--output <path>\", \"Report output path\")\n .option(\"--run-dir <path>\", \"Run directory (reads analysis.json + conversion.json, writes summary.md)\")\n .action(async (analysisJsonPath: string, conversionJsonPath: string, options: CalibrateEvaluateOptions) => {\n try {\n console.log(\"Running calibration evaluation...\");\n\n const analysisPath = options.runDir\n ? resolve(options.runDir, \"analysis.json\")\n : resolve(analysisJsonPath);\n const conversionPath = options.runDir\n ? resolve(options.runDir, \"conversion.json\")\n : resolve(conversionJsonPath);\n\n if (!existsSync(analysisPath)) {\n throw new Error(`Analysis file not found: ${analysisPath}`);\n }\n if (!existsSync(conversionPath)) {\n throw new Error(`Conversion file not found: ${conversionPath}`);\n }\n\n const { readFile } = await import(\"node:fs/promises\");\n const analysisData = JSON.parse(await readFile(analysisPath, \"utf-8\"));\n const conversionData = JSON.parse(await readFile(conversionPath, \"utf-8\"));\n\n // Derive fixture name from run-dir: <fixture-name>--<timestamp>\n let fixtureName: string | undefined;\n if (options.runDir) {\n const dirName = resolve(options.runDir).split(/[/\\\\]/).pop() ?? \"\";\n const idx = dirName.lastIndexOf(\"--\");\n fixtureName = idx === -1 ? dirName : dirName.slice(0, idx);\n }\n\n const { evaluationOutput, tuningOutput, report } = runCalibrationEvaluate(\n analysisData,\n conversionData,\n analysisData.ruleScores,\n { collectEvidence: !!options.runDir, ...(fixtureName ? { fixtureName } : {}) }\n );\n\n let outputPath: string;\n if (options.runDir) {\n outputPath = resolve(options.runDir, \"summary.md\");\n } else if (options.output) {\n outputPath = resolve(options.output);\n } else {\n const calNow = new Date();\n const calTs = `${calNow.getFullYear()}-${String(calNow.getMonth() + 1).padStart(2, \"0\")}-${String(calNow.getDate()).padStart(2, \"0\")}-${String(calNow.getHours()).padStart(2, \"0\")}-${String(calNow.getMinutes()).padStart(2, \"0\")}`;\n outputPath = resolve(`logs/calibration/calibration-${calTs}.md`);\n }\n const calOutputDir = dirname(outputPath);\n if (!existsSync(calOutputDir)) {\n mkdirSync(calOutputDir, { recursive: true });\n }\n await writeFile(outputPath, report, \"utf-8\");\n\n const mismatchCounts = {\n overscored: 0,\n underscored: 0,\n \"missing-rule\": 0,\n validated: 0,\n };\n for (const m of evaluationOutput.mismatches) {\n const key = m.type as keyof typeof mismatchCounts;\n mismatchCounts[key]++;\n }\n\n // Write proposed ruleIds for deterministic evidence gathering\n if (options.runDir && tuningOutput.adjustments.length > 0) {\n const proposedIds = tuningOutput.adjustments.map(\n (a: { ruleId: string }) => a.ruleId\n );\n const proposedPath = resolve(options.runDir, \"proposed-rules.json\");\n await writeFile(proposedPath, JSON.stringify(proposedIds) + \"\\n\", \"utf-8\");\n }\n\n console.log(`\\nEvaluation complete.`);\n console.log(` Validated: ${mismatchCounts.validated}`);\n console.log(` Overscored: ${mismatchCounts.overscored}`);\n console.log(` Underscored: ${mismatchCounts.underscored}`);\n console.log(` Missing rules: ${mismatchCounts[\"missing-rule\"]}`);\n console.log(` Score adjustments proposed: ${tuningOutput.adjustments.length}`);\n console.log(` New rule proposals: ${tuningOutput.newRuleProposals.length}`);\n console.log(`\\nReport saved: ${outputPath}`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { z } from \"zod\";\n\nexport const GapEntrySchema = z.object({\n category: z.string(),\n description: z.string(),\n pixelImpact: z.string().optional(),\n coveredByRule: z.string().nullable().optional(),\n coveredByExistingRule: z.boolean().optional(),\n existingRule: z.string().nullable().optional(),\n causedByInterpretation: z.boolean().optional(),\n actionable: z.boolean().optional(),\n suggestedRuleCategory: z.string().optional(),\n area: z.string().optional(),\n});\n\nexport type GapEntry = z.infer<typeof GapEntrySchema>;\n\nexport const GapAnalyzerOutputSchema = z.object({\n fixture: z.string().optional(),\n similarity: z.number().optional(),\n timestamp: z.string().optional(),\n gaps: z.array(GapEntrySchema),\n summary: z\n .object({\n totalGaps: z.number(),\n actionableGaps: z.number(),\n coveredByExistingRules: z.number(),\n newRuleCandidates: z.number(),\n renderingArtifacts: z.number(),\n })\n .optional(),\n newRuleSuggestions: z\n .array(\n z.object({\n ruleId: z.string(),\n rationale: z.string().optional(),\n })\n )\n .optional(),\n});\n\nexport type GapAnalyzerOutput = z.infer<typeof GapAnalyzerOutputSchema>;\n","import { readdirSync, readFileSync, existsSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { RULE_CONFIGS } from \"../core/rules/rule-config.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport { runCalibrationEvaluate } from \"./orchestrator.js\";\nimport { GapAnalyzerOutputSchema } from \"./contracts/gap-analyzer.js\";\nimport { loadCalibrationEvidence } from \"./evidence-collector.js\";\n\ntype CalibrationAnalysisJson = Parameters<typeof runCalibrationEvaluate>[0] & {\n ruleScores: Record<string, { score: number; severity: string }>;\n};\n\nexport interface GapRuleReportOptions {\n calibrationDir: string;\n minPatternRepeat: number;\n}\n\nexport interface GapRuleReportResult {\n markdown: string;\n runCount: number;\n gapRunCount: number;\n}\n\ninterface NormalizedGap {\n category: string;\n description: string;\n area?: string;\n coveredByExistingRule: boolean;\n existingRule: string | null;\n actionable: boolean;\n fixtureKey: string;\n}\n\ninterface ParsedGapFile {\n runDir: string;\n fixtureKey: string;\n similarity: number | undefined;\n gaps: NormalizedGap[];\n newRuleSuggestions: Array<{ ruleId: string; rationale?: string }>;\n}\n\nfunction fixtureKeyFromRunDir(runDir: string, raw: Record<string, unknown>): string {\n const fromJson =\n (typeof raw[\"fileKey\"] === \"string\" && raw[\"fileKey\"]) ||\n (typeof raw[\"fixture\"] === \"string\" && raw[\"fixture\"]);\n if (fromJson) return fromJson;\n // Extract fixture name from run dir name: <fixture-name>--<timestamp>\n const dirName = runDir.split(/[/\\\\]/).pop() ?? runDir;\n const idx = dirName.lastIndexOf(\"--\");\n return idx === -1 ? dirName : dirName.slice(0, idx);\n}\n\nfunction normalizeGapEntry(\n raw: Record<string, unknown>,\n fixtureKey: string\n): NormalizedGap | null {\n const category = typeof raw[\"category\"] === \"string\" ? raw[\"category\"] : \"unknown\";\n const description =\n typeof raw[\"description\"] === \"string\" ? raw[\"description\"] : \"\";\n const area = typeof raw[\"area\"] === \"string\" ? raw[\"area\"] : undefined;\n\n let covered = false;\n if (typeof raw[\"coveredByExistingRule\"] === \"boolean\") {\n covered = raw[\"coveredByExistingRule\"];\n } else if (raw[\"coveredByRule\"] === true) {\n covered = true;\n }\n\n let existingRule: string | null = null;\n if (typeof raw[\"existingRule\"] === \"string\") {\n existingRule = raw[\"existingRule\"];\n }\n\n const actionable = raw[\"actionable\"] !== false;\n\n if (!description && !area) return null;\n\n return {\n category,\n description,\n ...(area !== undefined ? { area } : {}),\n coveredByExistingRule: covered,\n existingRule,\n actionable,\n fixtureKey,\n };\n}\n\nfunction parseGapFile(runDir: string, gapsPath: string): ParsedGapFile | null {\n let raw: Record<string, unknown>;\n try {\n const parsed = JSON.parse(readFileSync(gapsPath, \"utf-8\")) as unknown;\n // Validate with Zod schema; fall back to best-effort parsing on failure\n const validation = GapAnalyzerOutputSchema.safeParse(parsed);\n if (validation.success) {\n raw = validation.data as unknown as Record<string, unknown>;\n } else {\n // Schema validation failed — use raw data with best-effort parsing\n raw = parsed as Record<string, unknown>;\n }\n } catch {\n return null;\n }\n\n const fixtureKey = fixtureKeyFromRunDir(runDir, raw);\n const gapsRaw = raw[\"gaps\"];\n const gaps: NormalizedGap[] = [];\n if (Array.isArray(gapsRaw)) {\n for (const g of gapsRaw) {\n if (!g || typeof g !== \"object\") continue;\n const n = normalizeGapEntry(g as Record<string, unknown>, fixtureKey);\n if (n) gaps.push(n);\n }\n }\n\n const newRuleSuggestions: Array<{ ruleId: string; rationale?: string }> = [];\n const sug = raw[\"newRuleSuggestions\"];\n if (Array.isArray(sug)) {\n for (const s of sug) {\n if (!s || typeof s !== \"object\") continue;\n const o = s as Record<string, unknown>;\n if (typeof o[\"ruleId\"] === \"string\") {\n const entry: { ruleId: string; rationale?: string } = { ruleId: o[\"ruleId\"] };\n if (typeof o[\"rationale\"] === \"string\") {\n entry.rationale = o[\"rationale\"];\n }\n newRuleSuggestions.push(entry);\n }\n }\n }\n\n return {\n runDir,\n fixtureKey,\n similarity: typeof raw[\"similarity\"] === \"number\" ? raw[\"similarity\"] : undefined,\n gaps,\n newRuleSuggestions,\n };\n}\n\nfunction patternKey(g: NormalizedGap): string {\n const label = (g.area ?? g.description).trim().slice(0, 120);\n return `${g.category}|${label.toLowerCase().replace(/\\s+/g, \" \")}`;\n}\n\n/**\n * List all run directories under the calibration dir.\n * Each run dir is expected to be `<name>--<timestamp>`.\n */\nfunction listRunDirs(calibrationDir: string): string[] {\n if (!existsSync(calibrationDir)) return [];\n return readdirSync(calibrationDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name.includes(\"--\"))\n .map((e) => join(calibrationDir, e.name))\n .sort();\n}\n\ninterface RunSnapshot {\n dir: string;\n label: string;\n analysis: CalibrationAnalysisJson;\n conversion: Record<string, unknown>;\n}\n\nfunction loadRunSnapshot(dir: string): RunSnapshot | null {\n const aPath = join(dir, \"analysis.json\");\n const cPath = join(dir, \"conversion.json\");\n if (!existsSync(aPath) || !existsSync(cPath)) return null;\n try {\n const analysis = JSON.parse(readFileSync(aPath, \"utf-8\")) as CalibrationAnalysisJson;\n const conversion = JSON.parse(readFileSync(cPath, \"utf-8\")) as Record<string, unknown>;\n if (!analysis.nodeIssueSummaries || !analysis.ruleScores) return null;\n const label = dir.split(/[/\\\\]/).pop() ?? dir;\n return { dir, label, analysis, conversion };\n } catch {\n return null;\n }\n}\n\nfunction enabledRuleIds(): RuleId[] {\n return (Object.keys(RULE_CONFIGS) as RuleId[]).filter(\n (id) => RULE_CONFIGS[id]?.enabled !== false\n );\n}\n\n/**\n * Aggregates gap data and calibration snapshots from run directories into a markdown report.\n */\nexport function generateGapRuleReport(options: GapRuleReportOptions): GapRuleReportResult {\n const calibrationDir = resolve(options.calibrationDir);\n const minRepeat = options.minPatternRepeat;\n\n const runDirs = listRunDirs(calibrationDir);\n\n // Parse gaps from each run directory\n const parsed: ParsedGapFile[] = [];\n for (const dir of runDirs) {\n const gapsPath = join(dir, \"gaps.json\");\n if (!existsSync(gapsPath) || !statSync(gapsPath).isFile()) continue;\n const g = parseGapFile(dir, gapsPath);\n if (g && (g.gaps.length > 0 || g.newRuleSuggestions.length > 0)) parsed.push(g);\n }\n\n const allGaps = parsed.flatMap((f) => f.gaps);\n const fixtureKeys = [...new Set(parsed.map((p) => p.fixtureKey))];\n const totalFixtures = fixtureKeys.length;\n\n const byCategory = new Map<string, number>();\n for (const g of allGaps) {\n byCategory.set(g.category, (byCategory.get(g.category) ?? 0) + 1);\n }\n\n const patternMap = new Map<\n string,\n { count: number; fixtures: Set<string>; sample: string; category: string }\n >();\n for (const g of allGaps) {\n const key = patternKey(g);\n const cur = patternMap.get(key);\n if (cur) {\n cur.count++;\n cur.fixtures.add(g.fixtureKey);\n } else {\n patternMap.set(key, {\n count: 1,\n fixtures: new Set([g.fixtureKey]),\n sample: g.description.slice(0, 200),\n category: g.category,\n });\n }\n }\n\n const repeatingPatterns = [...patternMap.entries()]\n .filter(([, v]) => v.fixtures.size >= minRepeat)\n .sort((a, b) => b[1].fixtures.size - a[1].fixtures.size);\n\n const existingRuleMentions = new Map<string, Set<string>>();\n for (const g of allGaps) {\n if (g.existingRule) {\n let set = existingRuleMentions.get(g.existingRule);\n if (!set) {\n set = new Set();\n existingRuleMentions.set(g.existingRule, set);\n }\n set.add(g.fixtureKey);\n }\n }\n\n const notCoveredActionable = allGaps.filter((g) => !g.coveredByExistingRule && g.actionable);\n const suggestionCounts = new Map<string, { count: number; fixtures: Set<string> }>();\n for (const f of parsed) {\n for (const s of f.newRuleSuggestions) {\n const id = s.ruleId.trim();\n if (!id) continue;\n const cur = suggestionCounts.get(id);\n if (cur) {\n cur.count++;\n cur.fixtures.add(f.fixtureKey);\n } else {\n suggestionCounts.set(id, { count: 1, fixtures: new Set([f.fixtureKey]) });\n }\n }\n }\n\n // Load run snapshots for score-vs-impact analysis\n const runs: RunSnapshot[] = [];\n for (const dir of runDirs) {\n const snap = loadRunSnapshot(dir);\n if (snap) runs.push(snap);\n }\n\n const flaggedRules = new Set<string>();\n const overscoredRuns = new Map<string, Set<number>>();\n const underscoredRuns = new Map<string, Set<number>>();\n const validatedRuns = new Map<string, Set<number>>();\n\n for (let i = 0; i < runs.length; i++) {\n const snap = runs[i];\n if (!snap) continue;\n for (const n of snap.analysis.nodeIssueSummaries) {\n for (const id of n.flaggedRuleIds) {\n flaggedRules.add(id);\n }\n }\n\n const a = snap.analysis;\n const { evaluationOutput } = runCalibrationEvaluate(\n {\n nodeIssueSummaries: a.nodeIssueSummaries,\n scoreReport: a.scoreReport,\n fileKey: a.fileKey,\n fileName: a.fileName,\n analyzedAt: a.analyzedAt,\n nodeCount: a.nodeCount,\n issueCount: a.issueCount,\n },\n snap.conversion,\n a.ruleScores\n );\n\n const seenO = new Set<string>();\n const seenU = new Set<string>();\n const seenV = new Set<string>();\n for (const m of evaluationOutput.mismatches) {\n if (!m.ruleId) continue;\n if (m.type === \"overscored\") {\n if (!seenO.has(m.ruleId)) {\n seenO.add(m.ruleId);\n let s = overscoredRuns.get(m.ruleId);\n if (!s) {\n s = new Set();\n overscoredRuns.set(m.ruleId, s);\n }\n s.add(i);\n }\n } else if (m.type === \"underscored\") {\n if (!seenU.has(m.ruleId)) {\n seenU.add(m.ruleId);\n let s = underscoredRuns.get(m.ruleId);\n if (!s) {\n s = new Set();\n underscoredRuns.set(m.ruleId, s);\n }\n s.add(i);\n }\n } else if (m.type === \"validated\") {\n if (!seenV.has(m.ruleId)) {\n seenV.add(m.ruleId);\n let s = validatedRuns.get(m.ruleId);\n if (!s) {\n s = new Set();\n validatedRuns.set(m.ruleId, s);\n }\n s.add(i);\n }\n }\n }\n }\n\n const nRuns = runs.length;\n const neverFlagged = enabledRuleIds().filter((id) => !flaggedRules.has(id));\n\n // Similarity summary per run\n const similaritySummary: Array<{ label: string; similarity: number | undefined }> = [];\n for (const f of parsed) {\n const dirName = f.runDir.split(/[/\\\\]/).pop() ?? f.runDir;\n similaritySummary.push({ label: dirName, similarity: f.similarity });\n }\n\n const lines: string[] = [];\n lines.push(\"# Gap-based rule review\");\n lines.push(\"\");\n lines.push(`Generated: ${new Date().toISOString()}`);\n lines.push(\"\");\n lines.push(\"## Summary\");\n lines.push(\"\");\n lines.push(`| Metric | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Run directories scanned | ${runDirs.length} |`);\n lines.push(`| Runs with gap data | ${parsed.length} |`);\n lines.push(`| Runs with analysis+conversion | ${nRuns} |`);\n lines.push(`| Distinct fixtures (from gaps) | ${totalFixtures} |`);\n lines.push(`| Total gap entries | ${allGaps.length} |`);\n lines.push(`| Actionable gaps not covered by existing rule | ${notCoveredActionable.length} |`);\n lines.push(\"\");\n\n if (similaritySummary.length > 0) {\n lines.push(\"## Similarity per run\");\n lines.push(\"\");\n lines.push(\"| Run | Similarity |\");\n lines.push(\"| --- | --- |\");\n for (const s of similaritySummary) {\n lines.push(`| ${s.label} | ${s.similarity != null ? `${s.similarity}%` : \"N/A\"} |`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"## Gaps by category\");\n lines.push(\"\");\n if (byCategory.size === 0) {\n lines.push(\"_No gap entries found._\");\n } else {\n lines.push(\"| Category | Count |\");\n lines.push(\"| --- | --- |\");\n for (const [k, v] of [...byCategory.entries()].sort((a, b) => b[1] - a[1])) {\n lines.push(`| ${k} | ${v} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(`## Repeating patterns (${minRepeat}+ fixtures)`);\n lines.push(\"\");\n lines.push(\n \"_Patterns use category + area/description. Review for **new rule** candidates when not covered by existing rules._\"\n );\n lines.push(\"\");\n if (repeatingPatterns.length === 0) {\n lines.push(`_No patterns appearing in at least ${minRepeat} distinct fixtures._`);\n } else {\n lines.push(\"| Pattern (category) | Fixtures | Sample |\");\n lines.push(\"| --- | --- | --- |\");\n for (const [, info] of repeatingPatterns) {\n const fx = [...info.fixtures].sort().join(\", \");\n const safe = info.sample.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n lines.push(`| ${info.category} | ${info.fixtures.size} (${fx}) | ${safe} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(\"## Existing rules mentioned in gaps\");\n lines.push(\"\");\n lines.push(\"_When a gap is attributed to an existing rule, which fixtures reported it._\");\n lines.push(\"\");\n if (existingRuleMentions.size === 0) {\n lines.push(\"_None._\");\n } else {\n lines.push(\"| Rule ID | Fixture count | Fixtures |\");\n lines.push(\"| --- | --- | --- |\");\n for (const [ruleId, set] of [...existingRuleMentions.entries()].sort(\n (a, b) => b[1].size - a[1].size\n )) {\n const fx = [...set].sort().join(\", \");\n lines.push(`| \\`${ruleId}\\` | ${set.size} | ${fx} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(\"## New rule candidates (from gap files)\");\n lines.push(\"\");\n const strongSuggestions = [...suggestionCounts.entries()].filter(\n ([, v]) => v.fixtures.size >= minRepeat\n );\n if (strongSuggestions.length === 0) {\n lines.push(`_No suggestion keys appearing in ${minRepeat}+ fixtures. Lower the threshold or add more gap data._`);\n } else {\n lines.push(\"| Candidate | Appearances | Fixtures |\");\n lines.push(\"| --- | --- | --- |\");\n for (const [id, v] of strongSuggestions.sort((a, b) => b[1].fixtures.size - a[1].fixtures.size)) {\n const fx = [...v.fixtures].sort().join(\", \");\n lines.push(`| ${id} | ${v.count} | ${fx} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(\"## Rule score vs conversion impact (from run snapshots)\");\n lines.push(\"\");\n if (nRuns === 0) {\n lines.push(\n \"_No runs with both `analysis.json` and `conversion.json`. Run calibration first to populate this section._\"\n );\n } else {\n lines.push(\n \"_Per run, `calibrate-evaluate`-style comparison: **overscored** means the rule penalty looks too harsh for actual impact; **underscored** means too lenient._\"\n );\n lines.push(\"\");\n lines.push(`| Rule ID | Overscored (runs) | Underscored (runs) | Validated (runs) |`);\n lines.push(\"| --- | --- | --- | --- |\");\n const ruleIds = new Set<string>([\n ...overscoredRuns.keys(),\n ...underscoredRuns.keys(),\n ...validatedRuns.keys(),\n ]);\n for (const id of [...ruleIds].sort()) {\n const o = overscoredRuns.get(id)?.size ?? 0;\n const u = underscoredRuns.get(id)?.size ?? 0;\n const val = validatedRuns.get(id)?.size ?? 0;\n lines.push(`| \\`${id}\\` | ${o}/${nRuns} | ${u}/${nRuns} | ${val}/${nRuns} |`);\n }\n lines.push(\"\");\n lines.push(\"**Heuristic:** many **overscored** rows with high similarity → consider lowering severity or score in `rule-config.ts`. Many **underscored** → consider raising.\");\n }\n lines.push(\"\");\n\n lines.push(\"## Enabled rules never flagged in any run\");\n lines.push(\"\");\n if (nRuns === 0) {\n lines.push(\"_Skipped (no run snapshots)._\");\n } else if (neverFlagged.length === 0) {\n lines.push(\"_Every enabled rule was flagged at least once across runs._\");\n } else {\n lines.push(\n `_These rules did not appear in \\`flaggedRuleIds\\` in any saved analysis. They may still be valuable for other designs._`\n );\n lines.push(\"\");\n for (const id of neverFlagged) {\n lines.push(`- \\`${id}\\``);\n }\n }\n lines.push(\"\");\n\n // Cross-run evidence from git-tracked files\n const calibrationEvidence = loadCalibrationEvidence();\n const calibrationEvidenceRules = Object.keys(calibrationEvidence);\n lines.push(\"## Cross-run calibration evidence (git-tracked)\");\n lines.push(\"\");\n if (calibrationEvidenceRules.length === 0) {\n lines.push(\"_No accumulated calibration evidence. Evidence is collected during `calibrate-evaluate --run-dir` runs._\");\n } else {\n lines.push(\"_Evidence persisted in `data/calibration-evidence.json` across sessions. Pruned when Arbitrator applies score changes._\");\n lines.push(\"\");\n lines.push(\"| Rule ID | Overscored | Underscored |\");\n lines.push(\"| --- | --- | --- |\");\n for (const ruleId of calibrationEvidenceRules.sort()) {\n const ev = calibrationEvidence[ruleId];\n if (!ev) continue;\n lines.push(`| \\`${ruleId}\\` | ${ev.overscoredCount} | ${ev.underscoredCount} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(\"## Next step (manual)\");\n lines.push(\"\");\n lines.push(\n \"Review this report. To add a new rule, implement it manually and re-run calibration for verification.\"\n );\n lines.push(\"\");\n\n return {\n markdown: lines.join(\"\\n\"),\n runCount: nRuns,\n gapRunCount: parsed.length,\n };\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { generateGapRuleReport } from \"../../../agents/gap-rule-report.js\";\n\ninterface CalibrateGapReportOptions {\n calibrationDir?: string;\n output?: string;\n minRepeat?: string;\n json?: boolean;\n}\n\nexport function registerCalibrateGapReport(cli: CAC): void {\n cli\n .command(\n \"calibrate-gap-report\",\n \"Aggregate gap data and calibration runs into a rule review report\"\n )\n .option(\"--calibration-dir <path>\", \"Calibration runs directory\", {\n default: \"logs/calibration\",\n })\n .option(\"--output <path>\", \"Markdown report path\", {\n default: \"logs/calibration/REPORT.md\",\n })\n .option(\"--min-repeat <n>\", \"Minimum distinct fixtures to treat as a repeating pattern\", {\n default: \"2\",\n })\n .option(\"--json\", \"Print JSON summary to stdout\")\n .action(async (options: CalibrateGapReportOptions) => {\n try {\n // In --json mode, send progress messages to stderr so stdout contains only valid JSON\n const log = options.json ? console.error.bind(console) : console.log.bind(console);\n\n const parsed = Number.parseInt(options.minRepeat ?? \"2\", 10);\n const minRepeat = Number.isNaN(parsed) ? 2 : Math.max(1, parsed);\n const result = generateGapRuleReport({\n calibrationDir: resolve(options.calibrationDir ?? \"logs/calibration\"),\n minPatternRepeat: minRepeat,\n });\n\n const outPath = resolve(options.output ?? \"logs/calibration/REPORT.md\");\n const outDir = dirname(outPath);\n if (!existsSync(outDir)) {\n mkdirSync(outDir, { recursive: true });\n }\n\n // Backup existing report with timestamp before overwriting\n if (existsSync(outPath)) {\n const { readFile: readFileAsync } = await import(\"node:fs/promises\");\n const existing = await readFileAsync(outPath, \"utf-8\");\n // Extract timestamp from the \"Generated:\" line\n const match = existing.match(/Generated:\\s*(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z)/);\n if (match?.[1]) {\n const ts = match[1].replace(/[:.]/g, \"-\").replace(\"T\", \"-\").replace(\"Z\", \"\");\n const backupPath = outPath.replace(/\\.md$/, `--${ts}.md`);\n await writeFile(backupPath, existing, \"utf-8\");\n log(` Previous report backed up: ${backupPath}`);\n }\n }\n\n await writeFile(outPath, result.markdown, \"utf-8\");\n\n log(\"Gap rule review report written.\");\n log(` Runs with gaps: ${result.gapRunCount}`);\n log(` Runs with snapshots: ${result.runCount}`);\n log(` Output: ${outPath}`);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n gapRunCount: result.gapRunCount,\n runCount: result.runCount,\n outputPath: outPath,\n },\n null,\n 2\n )\n );\n }\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\n\nimport { parseFigmaUrl } from \"../../../core/adapters/figma-url-parser.js\";\nimport { isFigmaUrl } from \"../../../core/engine/loader.js\";\nimport { getFigmaToken } from \"../../../core/engine/config-store.js\";\nimport { runCalibrationAnalyze } from \"../../../agents/orchestrator.js\";\n\ninterface CalibrateRunOptions {\n token?: string;\n maxNodes?: number;\n sampling?: string;\n}\n\nexport function registerCalibrateRun(cli: CAC): void {\n cli\n .command(\n \"calibrate-run <input>\",\n \"Run full calibration pipeline (analysis-only, conversion via /calibrate-loop)\"\n )\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--max-nodes <count>\", \"Max nodes to convert\", { default: 5 })\n .option(\"--sampling <strategy>\", \"Sampling strategy (all | top-issues | random)\", { default: \"top-issues\" })\n .action(async (input: string, options: CalibrateRunOptions) => {\n try {\n const figmaToken = options.token ?? getFigmaToken();\n\n if (isFigmaUrl(input) && !parseFigmaUrl(input).nodeId) {\n console.warn(\"\\nWarning: No node-id specified. Calibrating entire file may produce noisy results.\");\n console.warn(\"Tip: Add ?node-id=XXX to target a specific section.\\n\");\n }\n\n console.log(\"Running calibration pipeline (analysis-only)...\");\n console.log(` Input: ${input}`);\n console.log(\"\");\n\n const { analysisOutput } = await runCalibrationAnalyze({\n input,\n maxConversionNodes: options.maxNodes ?? 5,\n samplingStrategy: (options.sampling as \"all\" | \"top-issues\" | \"random\") ?? \"top-issues\",\n ...(figmaToken && { token: figmaToken }),\n });\n\n console.log(\"\\nCalibration complete (analysis-only).\");\n console.log(` Grade: ${analysisOutput.scoreReport.overall.grade} (${analysisOutput.scoreReport.overall.percentage}%)`);\n console.log(` Nodes with issues: ${analysisOutput.nodeIssueSummaries.length}`);\n console.log(\" Note: Use /calibrate-loop in Claude Code for full pipeline with visual comparison.\");\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync } from \"node:fs\";\nimport { resolve, join, basename } from \"node:path\";\nimport { z } from \"zod\";\n\nconst CALIBRATION_DIR = \"logs/calibration\";\n\nfunction getDateTimeString(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, \"0\");\n const day = String(now.getDate()).padStart(2, \"0\");\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n return `${year}-${month}-${day}-${hours}${minutes}`;\n}\n\n/**\n * Extract a short fixture name from a fixture path.\n * e.g. \"fixtures/http-design\" → \"http-design\"\n * \"fixtures/http-design/data.json\" → \"http-design\"\n */\nexport function extractFixtureName(fixturePath: string): string {\n // Remove trailing slash\n const cleaned = fixturePath.replace(/\\/+$/, \"\");\n const last = cleaned.split(\"/\").pop() ?? cleaned;\n // If pointing to data.json, use parent directory name\n if (last === \"data.json\") {\n const parts = cleaned.split(\"/\");\n return parts[parts.length - 2] ?? last;\n }\n return last.replace(/\\.json$/, \"\");\n}\n\n/**\n * Build a run directory name: `<name>--<timestamp>`\n * Double dash separates name from timestamp (names can contain single dashes).\n */\nfunction buildRunDirName(name: string, timestamp: string): string {\n return `${name}--${timestamp}`;\n}\n\n/**\n * Parse a run directory name into its components.\n * e.g. \"material3-kit--2026-03-24-0200\" → { name: \"material3-kit\", timestamp: \"2026-03-24-0200\" }\n */\nexport function parseRunDirName(dirName: string): { name: string; timestamp: string } {\n const idx = dirName.lastIndexOf(\"--\");\n if (idx === -1) {\n return { name: dirName, timestamp: \"\" };\n }\n return {\n name: dirName.slice(0, idx),\n timestamp: dirName.slice(idx + 2),\n };\n}\n\n/**\n * Create a calibration run directory and return its absolute path.\n * Format: `logs/calibration/<fixture-name>--<YYYY-MM-DD-HHMM>/`\n */\nexport function createCalibrationRunDir(fixtureName: string): string {\n const timestamp = getDateTimeString();\n const dirName = buildRunDirName(fixtureName, timestamp);\n const dirPath = resolve(CALIBRATION_DIR, dirName);\n mkdirSync(dirPath, { recursive: true });\n return dirPath;\n}\n\n/**\n * List all calibration run directories, sorted by name (oldest first).\n */\nexport function listCalibrationRuns(): string[] {\n const dir = resolve(CALIBRATION_DIR);\n if (!existsSync(dir)) return [];\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name.includes(\"--\"))\n .map((e) => join(dir, e.name))\n .sort();\n}\n\n// --- Fixture discovery ---\n\nconst DEFAULT_FIXTURES_DIR = \"fixtures\";\nconst DONE_DIR = \"done\";\n\n/**\n * List active fixture directories (those containing data.json, excluding done/).\n * Returns absolute paths sorted alphabetically.\n */\nexport function listActiveFixtures(fixturesDir: string = DEFAULT_FIXTURES_DIR): string[] {\n const dir = resolve(fixturesDir);\n if (!existsSync(dir)) return [];\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== DONE_DIR)\n .map((e) => join(dir, e.name))\n .filter((p) => existsSync(join(p, \"data.json\")))\n .sort();\n}\n\n/**\n * List done fixture directories.\n */\nexport function listDoneFixtures(fixturesDir: string = DEFAULT_FIXTURES_DIR): string[] {\n const doneDir = resolve(fixturesDir, DONE_DIR);\n if (!existsSync(doneDir)) return [];\n return readdirSync(doneDir, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => join(doneDir, e.name))\n .filter((p) => existsSync(join(p, \"data.json\")))\n .sort();\n}\n\n/**\n * Move a fixture to done/.\n * Returns the new path, or null if the fixture doesn't exist.\n */\nexport function moveFixtureToDone(fixturePath: string, fixturesDir: string = DEFAULT_FIXTURES_DIR): string | null {\n const src = resolve(fixturePath);\n if (!existsSync(src)) return null;\n const name = basename(src);\n const doneDir = resolve(fixturesDir, DONE_DIR);\n mkdirSync(doneDir, { recursive: true });\n const dest = join(doneDir, name);\n renameSync(src, dest);\n return dest;\n}\n\n// --- Debate result parsing (Zod-validated) ---\n\nconst DebateDecisionSchema = z.object({\n ruleId: z.string(),\n decision: z.string(),\n before: z.number().optional(),\n after: z.number().optional(),\n reason: z.string().optional(),\n}).passthrough();\n\nconst CriticReviewSchema = z.object({\n ruleId: z.string(),\n decision: z.string(),\n reason: z.string().optional(),\n revised: z.number().optional(),\n confidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n pro: z.array(z.string()).optional(),\n con: z.array(z.string()).optional(),\n}).passthrough();\n\nconst CriticSchema = z.object({\n summary: z.string(),\n reviews: z.array(CriticReviewSchema),\n}).passthrough();\n\nconst ArbitratorSchema = z.object({\n summary: z.string(),\n decisions: z.array(DebateDecisionSchema),\n newRuleProposals: z.array(z.unknown()).optional(),\n}).passthrough();\n\n/** stoppingReason canonical location: debate.json top level (not inside arbitrator) */\nconst DebateResultSchema = z.object({\n critic: CriticSchema.nullable().default(null),\n arbitrator: ArbitratorSchema.nullable().default(null),\n skipped: z.string().optional(),\n stoppingReason: z.string().optional(),\n}).passthrough();\n\n/** A single decision from the Arbitrator in debate.json. */\nexport type DebateDecision = z.infer<typeof DebateDecisionSchema>;\n\n/** Parsed debate.json structure from a calibration run. */\nexport type DebateResult = z.infer<typeof DebateResultSchema>;\n\n/**\n * Parse a debate.json file from a run directory.\n * Validates with Zod schema — returns null if file is missing or malformed.\n */\nexport function parseDebateResult(runDir: string): DebateResult | null {\n const debatePath = join(runDir, \"debate.json\");\n if (!existsSync(debatePath)) return null;\n try {\n const raw: unknown = JSON.parse(readFileSync(debatePath, \"utf-8\"));\n const result = DebateResultSchema.safeParse(raw);\n if (!result.success) {\n console.debug(`[parseDebateResult] invalid debate.json in ${runDir}:`, result.error.issues);\n return null;\n }\n return result.data;\n } catch (err) {\n console.debug(`[parseDebateResult] failed to read debate.json in ${runDir}:`, err);\n return null;\n }\n}\n\n/**\n * Extract ruleIds that were applied or revised by the Arbitrator.\n */\nexport function extractAppliedRuleIds(debate: DebateResult): string[] {\n if (!debate.arbitrator) return [];\n return debate.arbitrator.decisions\n .filter((d) => {\n const dec = d.decision.trim().toLowerCase();\n return dec === \"applied\" || dec === \"revised\";\n })\n .map((d) => d.ruleId.trim())\n .filter((id) => id.length > 0);\n}\n\n/**\n * Resolve the latest calibration run directory for a given fixture name.\n * Searches `logs/calibration/<name>--*` and returns the most recent (last sorted).\n * Returns null if no matching run exists.\n */\nexport function resolveLatestRunDir(fixtureName: string): string | null {\n const runs = listCalibrationRuns();\n const matching = runs.filter((runPath) => {\n const dirName = basename(runPath);\n const parsed = parseRunDirName(dirName);\n return parsed.name === fixtureName;\n });\n return matching.length > 0 ? matching[matching.length - 1]! : null;\n}\n\n/** Convergence summary with decision counts. */\nexport interface ConvergenceSummary {\n converged: boolean;\n mode: \"strict\" | \"lenient\";\n applied: number;\n revised: number;\n rejected: number;\n hold: number;\n kept: number;\n total: number;\n reason: string;\n}\n\n/**\n * Check convergence and return a detailed summary with decision counts.\n */\nexport function checkConvergence(runDir: string, options?: ConvergenceOptions): ConvergenceSummary {\n const mode = options?.lenient ? \"lenient\" : \"strict\";\n const debate = parseDebateResult(runDir);\n\n if (!debate) {\n return { converged: false, mode, applied: 0, revised: 0, rejected: 0, hold: 0, kept: 0, total: 0, reason: \"no debate.json found\" };\n }\n if (debate.skipped) {\n return { converged: true, mode, applied: 0, revised: 0, rejected: 0, hold: 0, kept: 0, total: 0, reason: debate.skipped };\n }\n if (!debate.arbitrator) {\n // Early-stop: Arbitrator skipped because all proposals rejected with high confidence\n if (debate.stoppingReason) {\n return { converged: true, mode, applied: 0, revised: 0, rejected: 0, hold: 0, kept: 0, total: 0, reason: `early-stop: ${debate.stoppingReason}` };\n }\n return { converged: false, mode, applied: 0, revised: 0, rejected: 0, hold: 0, kept: 0, total: 0, reason: \"no arbitrator result\" };\n }\n\n const decisions = debate.arbitrator.decisions;\n const applied = decisions.filter((d) => d.decision.trim().toLowerCase() === \"applied\").length;\n const revised = decisions.filter((d) => d.decision.trim().toLowerCase() === \"revised\").length;\n const rejected = decisions.filter((d) => d.decision.trim().toLowerCase() === \"rejected\").length;\n const hold = decisions.filter((d) => d.decision.trim().toLowerCase() === \"hold\").length;\n const kept = decisions.length - applied - revised - rejected - hold;\n const total = decisions.length;\n\n // hold = \"not enough confidence to decide\" → not converged (need more evidence)\n const converged = options?.lenient\n ? (applied + revised + hold) === 0\n : (applied + revised + hold) === 0 && rejected === 0;\n\n const parts: string[] = [];\n if (applied > 0) parts.push(`${applied} applied`);\n if (revised > 0) parts.push(`${revised} revised`);\n if (rejected > 0) parts.push(`${rejected} rejected`);\n if (hold > 0) parts.push(`${hold} hold`);\n if (kept > 0) parts.push(`${kept} kept`);\n const countsStr = parts.length > 0 ? parts.join(\", \") : \"no decisions\";\n const verdict = converged ? \"converged\" : \"not converged\";\n const reason = `${verdict} (${mode}) — ${countsStr} (${total} total)`;\n\n return { converged, mode, applied, revised, rejected, hold, kept, total, reason };\n}\n\n/** Options for convergence checking. */\nexport interface ConvergenceOptions {\n /**\n * When true, converged iff no applied/revised decisions (ignore rejected count).\n * Use when repeated reject loops block `fixture-done` but scores are stable (see issue #14).\n */\n lenient?: boolean | undefined;\n}\n\n/**\n * Check if a calibration run has converged.\n * Delegates to checkConvergence to avoid duplicating early-stop / hold logic.\n */\nexport function isConverged(runDir: string, options?: ConvergenceOptions): boolean {\n return checkConvergence(runDir, options).converged;\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\n\nexport const RUN_DIR_ARG_SCHEMA = z.string().trim().min(1, \"runDir is required\");\nexport const KEYWORD_ARG_SCHEMA = z.string().trim().min(1, \"keyword is required\");\n\n/**\n * Validate and resolve a run directory path.\n * Returns the resolved absolute path, or null if invalid/missing/not a directory.\n * Logs to stdout and returns null on failure (internal CLI convention).\n */\nexport function resolveRunDir(runDir: string): string | null {\n const parsed = RUN_DIR_ARG_SCHEMA.safeParse(runDir);\n if (!parsed.success) {\n console.log(`Invalid runDir: ${parsed.error.issues[0]?.message}`);\n return null;\n }\n const dir = resolve(parsed.data);\n try {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) {\n console.log(`Run directory not found or is not a directory: ${runDir}`);\n return null;\n }\n } catch {\n console.log(`Run directory not accessible: ${runDir}`);\n return null;\n }\n return dir;\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { parseDebateResult } from \"../../../agents/run-directory.js\";\nimport { loadCalibrationEvidence, computeEvidenceRatio } from \"../../../agents/evidence-collector.js\";\nimport type { EvidenceRatioSummary } from \"../../../agents/contracts/evidence.js\";\nimport { RULE_CONFIGS } from \"../../../core/rules/rule-config.js\";\nimport { resolveRunDir } from \"./cli-helpers.js\";\n\nconst KNOWN_RULE_IDS = new Set(Object.keys(RULE_CONFIGS));\n\n// ─── calibrate-gather-evidence ──────────────────────────────────────────────\n\nexport interface GatheredEvidence {\n ruleImpactAssessment: unknown[];\n uncoveredStruggles: unknown[];\n actionableGaps: unknown[];\n priorEvidence: Record<string, unknown>;\n evidenceRatios: Record<string, EvidenceRatioSummary>;\n}\n\n/**\n * Gather structured evidence for the Critic from run artifacts + cross-run data.\n * Pure data extraction — no LLM needed.\n */\nexport function gatherEvidence(runDir: string, proposedRuleIds: string[]): GatheredEvidence {\n const result: GatheredEvidence = {\n ruleImpactAssessment: [],\n uncoveredStruggles: [],\n actionableGaps: [],\n priorEvidence: {},\n evidenceRatios: {},\n };\n\n // 1. conversion.json → ruleImpactAssessment, uncoveredStruggles\n const convPath = join(runDir, \"conversion.json\");\n if (existsSync(convPath)) {\n try {\n const conv = JSON.parse(readFileSync(convPath, \"utf-8\")) as Record<string, unknown>;\n if (Array.isArray(conv[\"ruleImpactAssessment\"])) {\n result.ruleImpactAssessment = conv[\"ruleImpactAssessment\"];\n }\n if (Array.isArray(conv[\"uncoveredStruggles\"])) {\n result.uncoveredStruggles = conv[\"uncoveredStruggles\"];\n }\n } catch { /* ignore malformed */ }\n }\n\n // 2. gaps.json → actionable gaps\n const gapsPath = join(runDir, \"gaps.json\");\n if (existsSync(gapsPath)) {\n try {\n const gaps = JSON.parse(readFileSync(gapsPath, \"utf-8\")) as Record<string, unknown>;\n const gapList = Array.isArray(gaps[\"gaps\"]) ? gaps[\"gaps\"] : [];\n result.actionableGaps = gapList.filter(\n (g): g is Record<string, unknown> =>\n typeof g === \"object\" && g !== null && (g as Record<string, unknown>)[\"actionable\"] === true\n );\n } catch { /* ignore malformed */ }\n }\n\n // 3. Prior evidence filtered to proposed rules only + ratio summaries\n if (proposedRuleIds.length > 0) {\n const allEvidence = loadCalibrationEvidence();\n const ruleSet = new Set(proposedRuleIds.map((id) => id.trim()));\n for (const [ruleId, group] of Object.entries(allEvidence)) {\n if (ruleSet.has(ruleId)) {\n result.priorEvidence[ruleId] = group;\n result.evidenceRatios[ruleId] = computeEvidenceRatio(group);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Load proposed ruleIds from proposed-rules.json (written by calibrate-evaluate).\n * Falls back to regex extraction from summary.md if file doesn't exist.\n */\nexport function loadProposedRuleIds(runDir: string): string[] {\n // Preferred: deterministic list from calibrate-evaluate\n const proposedPath = join(runDir, \"proposed-rules.json\");\n if (existsSync(proposedPath)) {\n try {\n const raw: unknown = JSON.parse(readFileSync(proposedPath, \"utf-8\"));\n if (Array.isArray(raw)) return raw.filter((id): id is string => typeof id === \"string\");\n } catch { /* fall through to regex */ }\n }\n\n // Fallback: extract from summary.md, filtered to known rule IDs only\n const summaryPath = join(runDir, \"summary.md\");\n if (!existsSync(summaryPath)) return [];\n try {\n const content = readFileSync(summaryPath, \"utf-8\");\n const ids = new Set<string>();\n for (const match of content.matchAll(/`([a-z][\\w-]*)`/g)) {\n if (match[1] && KNOWN_RULE_IDS.has(match[1])) ids.add(match[1]);\n }\n return [...ids];\n } catch {\n return [];\n }\n}\n\nexport function registerGatherEvidence(cli: CAC): void {\n cli\n .command(\n \"calibrate-gather-evidence <runDir>\",\n \"Gather structured evidence for Critic from run artifacts + cross-run data\"\n )\n .action((runDir: string) => {\n const dir = resolveRunDir(runDir);\n if (!dir) return;\n\n const proposedRuleIds = loadProposedRuleIds(dir);\n const evidence = gatherEvidence(dir, proposedRuleIds);\n\n // Write to file for orchestrator to include in Critic prompt\n const outPath = join(dir, \"critic-evidence.json\");\n writeFileSync(outPath, JSON.stringify(evidence, null, 2) + \"\\n\", \"utf-8\");\n const ratioCount = Object.keys(evidence.evidenceRatios).length;\n console.log(`Gathered evidence: ${evidence.ruleImpactAssessment.length} impact assessments, ${evidence.actionableGaps.length} gaps, ${Object.keys(evidence.priorEvidence).length} prior rules (${ratioCount} with ratio summaries)`);\n console.log(`Written to ${outPath}`);\n });\n}\n\n// ─── calibrate-finalize-debate ──────────────────────────────────────────────\n\ninterface FinalizeResult {\n action: \"early-stop\" | \"continue\" | \"finalized\";\n stoppingReason?: string;\n}\n\nexport function registerFinalizeDebate(cli: CAC): void {\n cli\n .command(\n \"calibrate-finalize-debate <runDir>\",\n \"Check early-stop or determine stoppingReason after debate\"\n )\n .action((runDir: string) => {\n const dir = resolveRunDir(runDir);\n if (!dir) return;\n\n const debate = parseDebateResult(dir);\n if (!debate) {\n console.log(\"No debate.json found\");\n return;\n }\n\n const debatePath = join(dir, \"debate.json\");\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(readFileSync(debatePath, \"utf-8\")) as Record<string, unknown>;\n } catch {\n console.log(JSON.stringify({ action: \"continue\" }));\n return;\n }\n\n // Case 1: Critic done, no Arbitrator yet → check early-stop\n if (debate.critic && !debate.arbitrator) {\n const reviews = debate.critic.reviews;\n const allHighConfidenceReject = reviews.length > 0 && reviews.every((r) => {\n return r.decision.trim().toUpperCase() === \"REJECT\" && r.confidence === \"high\";\n });\n\n if (allHighConfidenceReject) {\n raw[\"stoppingReason\"] = \"all-high-confidence-reject\";\n writeFileSync(debatePath, JSON.stringify(raw, null, 2) + \"\\n\", \"utf-8\");\n const result: FinalizeResult = { action: \"early-stop\", stoppingReason: \"all-high-confidence-reject\" };\n console.log(JSON.stringify(result));\n // exit 0 = early-stop, orchestrator should skip Arbitrator\n return;\n }\n\n const result: FinalizeResult = { action: \"continue\" };\n console.log(JSON.stringify(result));\n // exit 0 but action=continue → orchestrator proceeds to Arbitrator\n return;\n }\n\n // Case 2: Both Critic and Arbitrator done → determine stoppingReason\n if (debate.arbitrator) {\n const decisions = debate.arbitrator.decisions;\n const allHold = decisions.length > 0 && decisions.every((d) =>\n d.decision.trim().toLowerCase() === \"hold\"\n );\n\n if (allHold) {\n raw[\"stoppingReason\"] = \"low-confidence-hold\";\n writeFileSync(debatePath, JSON.stringify(raw, null, 2) + \"\\n\", \"utf-8\");\n const result: FinalizeResult = { action: \"finalized\", stoppingReason: \"low-confidence-hold\" };\n console.log(JSON.stringify(result));\n return;\n }\n\n // Normal completion — no stoppingReason needed\n const result: FinalizeResult = { action: \"finalized\" };\n console.log(JSON.stringify(result));\n return;\n }\n\n // Fallback\n const result: FinalizeResult = { action: \"continue\" };\n console.log(JSON.stringify(result));\n });\n}\n","import { basename, resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\nimport { resolveRunDir } from \"./cli-helpers.js\";\n\nimport {\n listActiveFixtures,\n listDoneFixtures,\n moveFixtureToDone,\n parseDebateResult,\n parseRunDirName,\n extractAppliedRuleIds,\n extractFixtureName,\n resolveLatestRunDir,\n checkConvergence,\n} from \"../../../agents/run-directory.js\";\nimport {\n pruneCalibrationEvidence,\n enrichCalibrationEvidence,\n} from \"../../../agents/evidence-collector.js\";\n\nexport function registerFixtureManagement(cli: CAC): void {\n cli\n .command(\n \"fixture-list [fixturesDir]\",\n \"List active and done fixtures\"\n )\n .option(\"--json\", \"Output as JSON\")\n .action((fixturesDir: string | undefined, options: { json?: boolean }) => {\n const dir = fixturesDir ?? \"fixtures\";\n const active = listActiveFixtures(dir);\n const done = listDoneFixtures(dir);\n\n if (options.json) {\n console.log(JSON.stringify({ active, done }, null, 2));\n } else {\n console.log(`Active fixtures (${active.length}):`);\n for (const p of active) {\n console.log(` ${p}`);\n }\n console.log(`\\nDone fixtures (${done.length}):`);\n for (const p of done) {\n console.log(` ${p}`);\n }\n }\n });\n\n cli\n .command(\n \"fixture-done <fixturePath>\",\n \"Move a converged fixture to done/\"\n )\n .option(\"--fixtures-dir <path>\", \"Fixtures root directory\", { default: \"fixtures\" })\n .option(\"--force\", \"Skip convergence check\")\n .option(\"--run-dir <path>\", \"Run directory to check for convergence (auto-resolves latest if omitted)\")\n .option(\"--dry-run\", \"Show convergence judgment without moving files\")\n .option(\n \"--lenient-convergence\",\n \"Converged when no applied/revised decisions (ignore rejected; see calibration issue #14)\"\n )\n .action(\n (fixturePath: string, options: {\n fixturesDir?: string;\n force?: boolean;\n runDir?: string;\n dryRun?: boolean;\n lenientConvergence?: boolean;\n }) => {\n const fixtureName = extractFixtureName(fixturePath);\n\n // Resolve run directory: explicit --run-dir or auto-resolve latest\n let runDir = options.runDir ? resolve(options.runDir) : null;\n if (!runDir && !options.force) {\n const latest = resolveLatestRunDir(fixtureName);\n if (latest) {\n runDir = latest;\n console.log(`Auto-resolved latest run: ${runDir}`);\n }\n }\n\n if (!options.force) {\n if (!runDir) {\n console.error(`Error: no run directory found for fixture \"${fixtureName}\". Specify --run-dir, or use --force to skip check.`);\n process.exitCode = 1; return;\n }\n const summary = checkConvergence(runDir, { lenient: options.lenientConvergence });\n console.log(`\\nConvergence check (${summary.mode}):`);\n console.log(` ${summary.reason}`);\n if (summary.total > 0) {\n console.log(` applied=${summary.applied} revised=${summary.revised} rejected=${summary.rejected} kept=${summary.kept}`);\n }\n\n if (options.dryRun) {\n console.log(`\\n[dry-run] Would ${summary.converged ? \"move\" : \"NOT move\"} fixture: ${fixturePath}`);\n return;\n }\n\n if (!summary.converged) {\n console.error(`\\nError: fixture has not converged. Use --force to override or --lenient-convergence.`);\n process.exitCode = 1; return;\n }\n } else if (options.dryRun) {\n console.log(`[dry-run] --force: would move fixture without convergence check: ${fixturePath}`);\n return;\n }\n\n const dest = moveFixtureToDone(fixturePath, options.fixturesDir ?? \"fixtures\");\n if (dest) {\n console.log(`\\nMoved to: ${dest}`);\n } else {\n console.error(`Error: fixture not found: ${fixturePath}`);\n process.exitCode = 1;\n }\n });\n}\n\nexport function registerEvidenceEnrich(cli: CAC): void {\n cli\n .command(\n \"calibrate-enrich-evidence <runDir>\",\n \"Enrich evidence with Critic's pro/con/confidence from debate.json\"\n )\n .action((runDir: string) => {\n const resolvedDir = resolveRunDir(runDir);\n if (!resolvedDir) return;\n const debate = parseDebateResult(resolvedDir);\n if (!debate?.critic) {\n console.log(\"No critic reviews in debate.json — nothing to enrich.\");\n return;\n }\n\n // Extract fixture name from run directory (e.g. \"material3-kit--2026-03-26-0900\" → \"material3-kit\")\n const { name: fixture, timestamp } = parseRunDirName(basename(resolvedDir));\n if (!timestamp) {\n console.log(`Run directory \"${basename(resolvedDir)}\" does not match expected <name>--<timestamp> format`);\n return;\n }\n\n const reviews = debate.critic.reviews.map((r) => {\n const entry: Parameters<typeof enrichCalibrationEvidence>[0][number] = { ruleId: r.ruleId };\n if (r.confidence) entry.confidence = r.confidence;\n if (r.pro) entry.pro = r.pro;\n if (r.con) entry.con = r.con;\n const dec = r.decision.trim().toUpperCase();\n if (dec === \"APPROVE\" || dec === \"REJECT\" || dec === \"REVISE\" || dec === \"HOLD\") entry.decision = dec;\n return entry;\n });\n\n enrichCalibrationEvidence(reviews, fixture);\n console.log(`Enriched calibration evidence for fixture \"${fixture}\" with ${reviews.length} review(s)`);\n });\n}\n\nexport function registerEvidencePrune(cli: CAC): void {\n cli\n .command(\n \"calibrate-prune-evidence <runDir>\",\n \"Prune evidence for rules applied by the Arbitrator in the given run\"\n )\n .action((runDir: string) => {\n const resolvedDir = resolveRunDir(runDir);\n if (!resolvedDir) return;\n const debate = parseDebateResult(resolvedDir);\n if (!debate) {\n console.log(\"No debate.json found — nothing to prune.\");\n return;\n }\n\n const appliedIds = extractAppliedRuleIds(debate);\n if (appliedIds.length === 0) {\n console.log(\"No applied/revised rules — nothing to prune.\");\n return;\n }\n\n pruneCalibrationEvidence(appliedIds);\n console.log(`Pruned calibration evidence for ${appliedIds.length} rule(s): ${appliedIds.join(\", \")}`);\n });\n\n}","/**\n * Strip specific information types from design-tree text for ablation experiments.\n * Post-processes the generated text — does NOT modify design-tree.ts.\n *\n * Flow: generateDesignTree() → stripDesignTree() → send to LLM\n */\n\n/** All strip types available (including utility strips not used in experiments). */\nexport type DesignTreeStripType =\n | \"layout-direction-spacing\"\n | \"size-constraints\"\n | \"position-stacking\"\n | \"color-values\"\n | \"typography\"\n | \"shadows-effects\"\n | \"component-references\"\n | \"component-descriptions\"\n | \"node-names-hierarchy\"\n | \"overflow-text-behavior\"\n | \"hover-interaction-states\"\n | \"variable-references\"\n | \"style-references\";\n\n/**\n * Experiment-relevant strip types only.\n * Excludes trivially obvious types (color, typography, shadows, overflow, hover)\n * and no-op types (position-stacking, component-descriptions).\n */\nexport type DesignTreeInfoType =\n | \"layout-direction-spacing\"\n | \"size-constraints\"\n | \"component-references\"\n | \"node-names-hierarchy\"\n | \"variable-references\"\n | \"style-references\";\n\n/** All strip types (used for exhaustive testing). */\nexport const ALL_STRIP_TYPES: readonly DesignTreeStripType[] = [\n \"layout-direction-spacing\", \"size-constraints\", \"position-stacking\",\n \"color-values\", \"typography\", \"shadows-effects\", \"component-references\",\n \"component-descriptions\", \"node-names-hierarchy\", \"overflow-text-behavior\",\n \"hover-interaction-states\", \"variable-references\", \"style-references\",\n] as const;\n\n/**\n * Strip experiment types used in calibration ablation (six types).\n * Keep in sync with `StripTypeEnum` / `STRIP_TYPE_RULES` in the agents layer.\n * `size-constraints` pairs with responsive rules `missing-size-constraint`, `fixed-size-in-auto-layout`.\n */\nexport const DESIGN_TREE_INFO_TYPES: readonly DesignTreeInfoType[] = [\n \"layout-direction-spacing\",\n \"size-constraints\",\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n] as const;\n\n// --- Style property matchers ---\n\nconst LAYOUT_PROPS = new Set([\n \"display\",\n \"flex-direction\",\n \"flex-wrap\",\n \"gap\",\n \"row-gap\",\n \"column-gap\",\n \"justify-content\",\n \"align-items\",\n \"align-content\",\n \"padding\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"align-self\",\n]);\n\nconst SIZE_PROPS = new Set([\n \"min-width\",\n \"max-width\",\n \"min-height\",\n \"max-height\",\n \"flex-grow\",\n]);\n\nconst TYPOGRAPHY_PROPS = new Set([\n \"font-family\",\n \"font-weight\",\n \"font-size\",\n \"line-height\",\n \"letter-spacing\",\n \"text-align\",\n \"text-decoration\",\n]);\n\nconst SHADOW_PROPS = new Set([\n \"box-shadow\",\n \"opacity\",\n]);\n\n/** Get the CSS property name from a style segment like \"font-size: 16px\" */\nfunction getPropertyName(segment: string): string {\n const colonIdx = segment.indexOf(\":\");\n if (colonIdx === -1) return segment.trim();\n return segment.slice(0, colonIdx).trim();\n}\n\n/** Check if a style segment is a \"fill\" size (width: 100% or height: 100%) */\nfunction isFillSize(segment: string): boolean {\n const trimmed = segment.trim();\n return trimmed === \"width: 100%\" || trimmed === \"height: 100%\";\n}\n\n// --- Color replacement ---\n\nconst HEX_COLOR_RE = /#[0-9A-Fa-f]{6,8}/g;\nconst RGBA_RE = /rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(?:,\\s*[\\d.]+\\s*)?\\)/g;\nconst SVG_COLOR_ATTR_RE = /(fill|stroke)=\"(#[0-9A-Fa-f]{6,8})\"/g;\n\nfunction replaceColors(segment: string): string {\n let result = segment;\n result = result.replace(RGBA_RE, \"[COLOR]\");\n result = result.replace(HEX_COLOR_RE, \"[COLOR]\");\n return result;\n}\n\nfunction replaceColorsInSvg(svgContent: string): string {\n return svgContent.replace(SVG_COLOR_ATTR_RE, '$1=\"[COLOR]\"');\n}\n\n// --- Reference removal ---\n\nconst VAR_COMMENT_RE = /\\s*\\/\\*\\s*var:[^*]*\\*\\//g;\nconst TEXT_STYLE_COMMENT_RE = /\\s*\\/\\*\\s*text-style:[^*]*\\*\\//g;\n\nfunction removeVarRefs(segment: string): string {\n return segment.replace(VAR_COMMENT_RE, \"\").trim();\n}\n\nfunction removeStyleRefs(segment: string): string {\n return segment.replace(TEXT_STYLE_COMMENT_RE, \"\").trim();\n}\n\n\n// --- Line classification ---\n\ninterface ParsedStyleLine {\n indent: string;\n properties: string[];\n svgSegment: string | null;\n /** text: \"...\" content — always preserved, never stripped or split. */\n textSegment: string | null;\n}\n\n/** Extract `text: \"...\"` segment from raw style string, handling escaped quotes. */\nfunction extractTextSegment(raw: string): { textSegment: string | null; rest: string } {\n // Match text: \"...\" allowing escaped quotes inside\n const textMatch = raw.match(/(?:^|;\\s*)text:\\s*\"(?:[^\"\\\\]|\\\\.)*\"/);\n if (!textMatch) return { textSegment: null, rest: raw };\n const textSegment = textMatch[0].replace(/^;\\s*/, \"\").trim();\n const rest = raw.replace(textMatch[0], \"\").replace(/;\\s*$/, \"\").replace(/^;\\s*/, \"\");\n return { textSegment, rest };\n}\n\n/** Split a style line into prefix, individual properties, optional SVG tail, and protected text. */\nfunction parseStyleLine(line: string): ParsedStyleLine | null {\n const match = line.match(/^(\\s*)style:\\s*(.*)/s);\n if (!match) return null;\n const indent = match[1] ?? \"\";\n const raw = match[2] ?? \"\";\n\n // 1. Extract text: \"...\" first (protected from splitting)\n const { textSegment, rest: afterText } = extractTextSegment(raw);\n\n // 2. Separate SVG segment (always last, starts with \"svg: <\")\n let svgSegment: string | null = null;\n let propsRaw = afterText;\n const svgIdx = afterText.indexOf(\"svg: <\");\n if (svgIdx !== -1) {\n svgSegment = afterText.slice(svgIdx);\n propsRaw = afterText.slice(0, svgIdx).replace(/;\\s*$/, \"\");\n }\n\n // 3. Split remaining properties by \"; \"\n const properties = propsRaw\n ? propsRaw.split(\"; \").map((p) => p.trim()).filter(Boolean)\n : [];\n\n return { indent, properties, svgSegment, textSegment };\n}\n\n/** Reassemble a style line from parts. Returns null if no properties remain. */\nfunction reassembleStyleLine(parsed: ParsedStyleLine): string | null {\n const parts = [...parsed.properties];\n if (parsed.svgSegment) parts.push(parsed.svgSegment);\n if (parsed.textSegment) parts.push(parsed.textSegment);\n if (parts.length === 0) return null;\n return `${parsed.indent}style: ${parts.join(\"; \")}`;\n}\n\n// --- Per-type strip functions ---\n\nfunction stripLayoutSpacing(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n return !LAYOUT_PROPS.has(prop);\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripSizeConstraints(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n if (SIZE_PROPS.has(prop)) return false;\n if (isFillSize(p)) return false;\n return true;\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripColorValues(lines: string[]): string[] {\n return lines.map((line) => {\n // Handle [hover] lines — replace colors there too\n if (line.match(/^\\s*\\[hover\\]:/)) {\n return replaceColors(line);\n }\n\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n\n parsed.properties = parsed.properties.map((p) => {\n const prop = getPropertyName(p);\n // Don't touch image paths or text content\n if (prop === \"background-image\") return p;\n if (prop === \"content-image\") return p;\n if (prop === \"text\") return p;\n // Replace colors in background, color, border, box-shadow\n if ([\"background\", \"color\", \"border\", \"border-top\", \"border-right\",\n \"border-bottom\", \"border-left\", \"box-shadow\"].includes(prop)) {\n return replaceColors(p);\n }\n return p;\n });\n\n // Replace colors in SVG\n if (parsed.svgSegment) {\n parsed.svgSegment = replaceColorsInSvg(parsed.svgSegment);\n }\n\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripTypography(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n if (TYPOGRAPHY_PROPS.has(prop)) return false;\n if (p.trim().startsWith(\"/* text-style:\")) return false;\n return true;\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripShadowsEffects(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n return !SHADOW_PROPS.has(prop);\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n/** Header line pattern: {indent}Name (TYPE, WxH) with optional [component: ...] */\nconst HEADER_RE = /^(\\s*)(.+?)(\\s*\\([A-Z_]+,\\s*[\\d?]+x[\\d?]+\\).*)$/;\n\n/** Check if a line is a node header (not style/comment/component-properties/hover). */\nfunction isHeaderLine(line: string): boolean {\n if (line.trimStart().startsWith(\"style:\")) return false;\n if (line.trimStart().startsWith(\"[hover]:\")) return false;\n if (line.trimStart().startsWith(\"component-properties:\")) return false;\n if (line.startsWith(\"#\")) return false;\n return HEADER_RE.test(line);\n}\n\nfunction stripComponentReferences(lines: string[]): string[] {\n return lines\n .filter((line) => !line.match(/^\\s*component-properties:/))\n .map((line) => {\n if (isHeaderLine(line)) {\n return line.replace(/\\s*\\[component:[^\\]]*\\]$/, \"\");\n }\n return line;\n });\n}\n\nfunction stripNodeNames(lines: string[]): string[] {\n let counter = 0;\n return lines.map((line) => {\n if (!isHeaderLine(line)) return line;\n const match = line.match(HEADER_RE);\n if (match) {\n counter++;\n return `${match[1]}Node${counter}${match[3]}`;\n }\n return line;\n });\n}\n\nfunction stripOverflow(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) =>\n p.trim() !== \"overflow: hidden\"\n );\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripHoverStates(lines: string[]): string[] {\n return lines.filter((line) => !line.match(/^\\s*\\[hover\\]:/));\n}\n\n/** Strip variable reference comments only (keep text-style references). */\nfunction stripVariableReferences(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties\n .map((p) => removeVarRefs(p))\n .filter(Boolean);\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n/** Strip text-style comments only (keep variable references). */\nfunction stripStyleReferences(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties\n .map((p) => removeStyleRefs(p))\n .filter(Boolean);\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n// --- Main API ---\n\nconst STRIP_FUNCTIONS: Record<DesignTreeStripType, (lines: string[]) => string[]> = {\n \"layout-direction-spacing\": stripLayoutSpacing,\n \"size-constraints\": stripSizeConstraints,\n \"position-stacking\": (lines) => lines,\n \"color-values\": stripColorValues,\n \"typography\": stripTypography,\n \"shadows-effects\": stripShadowsEffects,\n \"component-references\": stripComponentReferences,\n \"component-descriptions\": (lines) => lines,\n \"node-names-hierarchy\": stripNodeNames,\n \"overflow-text-behavior\": stripOverflow,\n \"hover-interaction-states\": stripHoverStates,\n \"variable-references\": stripVariableReferences,\n \"style-references\": stripStyleReferences,\n};\n\n/**\n * Strip a specific information type from a design-tree text.\n * Returns a new string with the target information removed.\n */\nexport function stripDesignTree(tree: string, type: DesignTreeStripType): string {\n const lines = tree.split(\"\\n\");\n const stripped = STRIP_FUNCTIONS[type](lines);\n return stripped.join(\"\\n\");\n}\n","import { existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, join } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { stripDesignTree, DESIGN_TREE_INFO_TYPES, ALL_STRIP_TYPES } from \"../../../core/design-tree/strip.js\";\nimport type { DesignTreeStripType } from \"../../../core/design-tree/strip.js\";\n\nconst VALID_TYPES = new Set<string>(ALL_STRIP_TYPES);\n\nexport function registerDesignTreeStrip(cli: CAC): void {\n cli\n .command(\n \"design-tree-strip <input>\",\n \"[internal] Generate stripped design-tree variants for ablation\"\n )\n .option(\"--types <types>\", `Comma-separated strip types (default: all DESIGN_TREE_INFO_TYPES)`)\n .option(\"--output-dir <dir>\", \"Output directory for stripped files (required)\")\n .action(async (input: string, options: { types?: string; outputDir?: string }) => {\n try {\n if (!options.outputDir) {\n console.error(\"Error: --output-dir is required\");\n process.exitCode = 1;\n return;\n }\n\n const inputPath = resolve(input);\n if (!existsSync(inputPath)) {\n console.error(`Error: Input file not found: ${inputPath}`);\n process.exitCode = 1;\n return;\n }\n\n const designTree = readFileSync(inputPath, \"utf-8\");\n\n let types: DesignTreeStripType[];\n if (options.types) {\n const tokens = options.types.split(\",\").map(t => t.trim());\n const invalid = tokens.filter(t => !VALID_TYPES.has(t));\n if (invalid.length > 0) {\n console.error(`Error: Unknown strip type(s): ${invalid.join(\", \")}`);\n console.error(`Valid types: ${ALL_STRIP_TYPES.join(\", \")}`);\n process.exitCode = 1;\n return;\n }\n types = tokens as DesignTreeStripType[];\n } else {\n types = [...DESIGN_TREE_INFO_TYPES];\n }\n\n const outputDir = resolve(options.outputDir);\n mkdirSync(outputDir, { recursive: true });\n\n for (const type of types) {\n const stripped = stripDesignTree(designTree, type);\n const outputPath = join(outputDir, `${type}.txt`);\n await writeFile(outputPath, stripped, \"utf-8\");\n console.log(` ${type}.txt (${Math.round(Buffer.byteLength(stripped) / 1024)}KB)`);\n }\n\n console.log(`Stripped ${types.length} design-tree variants → ${outputDir}`);\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","/**\n * HTML extraction and processing utilities.\n * Shared by calibration pipeline and experiment scripts.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\n/**\n * Extract HTML from LLM markdown response text.\n * Tries three strategies: full document → body tag → largest block.\n */\nexport function extractHtml(text: string): { html: string; method: string } {\n const allBlocks = [...text.matchAll(/```(?:html|css|[a-z]*)?\\s*\\n([\\s\\S]*?)(?:```|$)/g)]\n .map((m) => m[1]?.trim() ?? \"\")\n .filter((block) => block.includes(\"<\") && block.length > 50);\n if (allBlocks.length === 0) return { html: \"\", method: \"none\" };\n const fullDoc = allBlocks.find((b) => /^<!doctype|^<html/i.test(b));\n if (fullDoc) return { html: fullDoc, method: \"doctype\" };\n const hasBody = allBlocks.find((b) => /<body/i.test(b));\n if (hasBody) return { html: hasBody, method: \"body\" };\n return { html: allBlocks.reduce((a, b) => (a.length >= b.length ? a : b)), method: \"largest\" };\n}\n\n/**\n * Remove scripts and event handlers from HTML for safe rendering.\n */\nexport function sanitizeHtml(html: string): string {\n let result = html;\n result = result.replace(/^\\/\\/\\s*filename:.*\\n/i, \"\");\n result = result.replace(/<script[\\s\\S]*?<\\/script>/gi, \"\");\n result = result.replace(/\\s+on\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\");\n result = result.replace(\n /\\s+(href|src|xlink:href)\\s*=\\s*(?:\"\\s*javascript:[^\"]*\"|'\\s*javascript:[^']*'|javascript:[^\\s>]+)/gi,\n (_, attr) => ` ${attr}=\"#\"`,\n );\n return result;\n}\n\n/**\n * Replace Google Fonts CDN links with a local Inter font-face declaration.\n */\nexport function injectLocalFont(html: string): string {\n const fontPath = resolve(\"assets/fonts/Inter.var.woff2\");\n if (!existsSync(fontPath)) return html;\n const fontUrl = pathToFileURL(fontPath).href;\n const fontCss = `@font-face { font-family: \"Inter\"; src: url(\"${fontUrl}\") format(\"woff2\"); font-weight: 100 900; }`;\n let result = html;\n result = result.replace(/<link[^>]*fonts\\.googleapis\\.com[^>]*>/gi, \"\");\n result = result.replace(/<link[^>]*fonts\\.gstatic\\.com[^>]*>/gi, \"\");\n if (result.includes(\"<style>\")) {\n result = result.replace(\"<style>\", `<style>\\n${fontCss}\\n`);\n } else if (result.includes(\"</head>\")) {\n result = result.replace(\"</head>\", `<style>${fontCss}</style>\\n</head>`);\n }\n return result;\n}\n\n/** Full pipeline: extract → sanitize → inject font */\nexport function processHtml(responseText: string): { html: string; method: string } {\n const { html: raw, method } = extractHtml(responseText);\n const html = injectLocalFont(sanitizeHtml(raw));\n return { html, method };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { sanitizeHtml, injectLocalFont } from \"../../../core/comparison/html-utils.js\";\n\nexport function registerHtmlPostprocess(cli: CAC): void {\n cli\n .command(\n \"html-postprocess <input>\",\n \"[internal] Sanitize HTML and inject local fonts\"\n )\n .option(\"--output <path>\", \"Output path (default: overwrite input)\")\n .action(async (input: string, options: { output?: string }) => {\n try {\n const inputPath = resolve(input);\n if (!existsSync(inputPath)) {\n console.error(`Error: Input file not found: ${inputPath}`);\n process.exitCode = 1;\n return;\n }\n\n const raw = readFileSync(inputPath, \"utf-8\");\n const html = injectLocalFont(sanitizeHtml(raw));\n\n const outputPath = options.output ? resolve(options.output) : inputPath;\n await writeFile(outputPath, html, \"utf-8\");\n\n console.log(JSON.stringify({\n inputPath,\n outputPath,\n inputBytes: Buffer.byteLength(raw, \"utf-8\"),\n outputBytes: Buffer.byteLength(html, \"utf-8\"),\n }));\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { computeCodeMetrics } from \"../../../core/comparison/visual-compare-helpers.js\";\n\nexport function registerCodeMetrics(cli: CAC): void {\n cli\n .command(\n \"code-metrics <input>\",\n \"[internal] Compute code metrics for an HTML file\"\n )\n .action((input: string) => {\n try {\n const inputPath = resolve(input);\n if (!existsSync(inputPath)) {\n console.error(`Error: Input file not found: ${inputPath}`);\n process.exitCode = 1;\n return;\n }\n\n const html = readFileSync(inputPath, \"utf-8\");\n const metrics = computeCodeMetrics(html);\n\n console.log(JSON.stringify(metrics));\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","#!/usr/bin/env node\nimport { createRequire } from \"node:module\";\nimport { config } from \"dotenv\";\nimport cac from \"cac\";\n\n// Load .env file (quiet: suppress dotenv's stdout banner)\nconfig({ quiet: true });\n\nimport {\n getTelemetryEnabled, getPosthogApiKey, getSentryDsn, getDeviceId,\n} from \"../core/engine/config-store.js\";\nimport { initMonitoring, shutdownMonitoring } from \"../core/monitoring/index.js\";\nimport { POSTHOG_API_KEY as BUILTIN_PH_KEY, SENTRY_DSN as BUILTIN_SENTRY_DSN } from \"../core/monitoring/keys.js\";\nimport { handleDocs } from \"./docs.js\";\n\n// Import rules to register them\nimport \"../core/rules/index.js\";\n\n// User-facing commands\nimport { registerAnalyze } from \"./commands/analyze.js\";\nimport { registerSaveFixture } from \"./commands/save-fixture.js\";\nimport { registerDesignTree } from \"./commands/design-tree.js\";\nimport { registerImplement } from \"./commands/implement.js\";\nimport { registerVisualCompare } from \"./commands/visual-compare.js\";\nimport { registerInit } from \"./commands/init.js\";\nimport { registerConfig } from \"./commands/config.js\";\nimport { registerListRules } from \"./commands/list-rules.js\";\nimport { registerPrompt } from \"./commands/prompt.js\";\n\n// Internal commands (used by subagents, hidden from user help)\nimport { registerCalibrateAnalyze } from \"./commands/internal/calibrate-analyze.js\";\nimport { registerCalibrateEvaluate } from \"./commands/internal/calibrate-evaluate.js\";\nimport { registerCalibrateGapReport } from \"./commands/internal/calibrate-gap-report.js\";\nimport { registerCalibrateRun } from \"./commands/internal/calibrate-run.js\";\nimport { registerGatherEvidence, registerFinalizeDebate } from \"./commands/internal/calibrate-debate.js\";\nimport { registerFixtureManagement, registerEvidenceEnrich, registerEvidencePrune } from \"./commands/internal/fixture-management.js\";\nimport { registerDesignTreeStrip } from \"./commands/internal/design-tree-strip.js\";\nimport { registerHtmlPostprocess } from \"./commands/internal/html-postprocess.js\";\nimport { registerCodeMetrics } from \"./commands/internal/code-metrics.js\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../../package.json\") as { version: string };\n\nconst cli = cac(\"canicode\");\n\n// Initialise monitoring (fire-and-forget, never blocks startup)\n{\n const monitoringConfig: Parameters<typeof initMonitoring>[0] = {\n environment: \"cli\",\n version: pkg.version,\n enabled: getTelemetryEnabled(),\n };\n const phKey = getPosthogApiKey() || BUILTIN_PH_KEY;\n if (phKey) monitoringConfig.posthogApiKey = phKey;\n const sDsn = getSentryDsn() || BUILTIN_SENTRY_DSN;\n if (sDsn) monitoringConfig.sentryDsn = sDsn;\n monitoringConfig.distinctId = getDeviceId();\n initMonitoring(monitoringConfig);\n}\n\nprocess.on(\"beforeExit\", () => {\n shutdownMonitoring();\n});\n\n// ============================================\n// User-facing commands\n// ============================================\nregisterAnalyze(cli);\nregisterSaveFixture(cli);\nregisterDesignTree(cli);\nregisterImplement(cli);\nregisterVisualCompare(cli);\nregisterInit(cli);\nregisterConfig(cli);\nregisterListRules(cli);\nregisterPrompt(cli);\n\n// ============================================\n// Internal commands (calibration & fixtures)\n// ============================================\nregisterCalibrateAnalyze(cli);\nregisterCalibrateEvaluate(cli);\nregisterCalibrateGapReport(cli);\nregisterCalibrateRun(cli);\nregisterGatherEvidence(cli);\nregisterFinalizeDebate(cli);\nregisterFixtureManagement(cli);\nregisterEvidenceEnrich(cli);\nregisterEvidencePrune(cli);\nregisterDesignTreeStrip(cli);\nregisterHtmlPostprocess(cli);\nregisterCodeMetrics(cli);\n\n// ============================================\n// Documentation command\n// ============================================\ncli\n .command(\"docs [topic]\", \"Show documentation (topics: setup, rules, config, visual-compare, design-tree)\")\n .action((topic?: string) => {\n handleDocs(topic);\n });\n\ncli.help((sections) => {\n sections.push(\n {\n title: \"\\nSetup\",\n body: ` canicode init --token <token> Save Figma token to ~/.canicode/`,\n },\n {\n title: \"\\nData source\",\n body: [\n ` --api Load via Figma REST API (needs FIGMA_TOKEN)`,\n ` --token <token> Figma API token (or use FIGMA_TOKEN env var)`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nCustomization\",\n body: ` --config <path> Override rule settings (see: canicode docs config)`,\n },\n {\n title: \"\\nExamples\",\n body: [\n ` $ canicode analyze \"https://www.figma.com/design/...\" --api`,\n ` $ canicode analyze \"https://www.figma.com/design/...\" --preset strict`,\n ` $ canicode analyze \"https://www.figma.com/design/...\" --config ./my-config.json`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nInstallation\",\n body: [\n ` CLI: npm install -g canicode`,\n ` MCP: claude mcp add canicode -- npx -y -p canicode canicode-mcp`,\n ` Skills: github.com/let-sunny/canicode`,\n ].join(\"\\n\"),\n },\n );\n});\ncli.version(pkg.version);\n\ncli.parse();\n"]}
1
+ {"version":3,"sources":["../../src/core/adapters/figma-client.ts","../../src/core/adapters/figma-transformer.ts","../../src/core/adapters/component-resolver.ts","../../src/core/design-tree/design-tree.ts","../../src/core/comparison/visual-compare-helpers.ts","../../src/core/comparison/visual-compare.ts","../../src/core/engine/config-store.ts","../../src/core/monitoring/events.ts","../../src/core/monitoring/capture.ts","../../src/core/monitoring/index.ts","../../src/core/monitoring/keys.ts","../../src/cli/docs.ts","../../src/core/rules/rule-config.ts","../../src/core/rules/rule-registry.ts","../../src/core/rules/node-semantics.ts","../../src/core/rules/rule-exceptions.ts","../../src/core/rules/rule-messages.ts","../../src/core/rules/structure/index.ts","../../src/core/rules/token/index.ts","../../src/core/contracts/category.ts","../../src/core/contracts/severity.ts","../../src/core/contracts/rule.ts","../../src/core/rules/component/index.ts","../../src/core/rules/naming/index.ts","../../src/core/rules/interaction/index.ts","../../src/core/engine/rule-engine.ts","../../src/core/engine/loader.ts","../../src/core/contracts/figma-node.ts","../../src/core/adapters/figma-file-loader.ts","../../src/core/adapters/figma-url-parser.ts","../../package.json","../../src/core/engine/scoring.ts","../../src/core/rules/config-loader.ts","../../src/core/ui-constants.ts","../../src/core/ui-helpers.ts","../../src/core/report-html/render.ts","../../src/core/report-html/index.ts","../../src/cli/helpers.ts","../../src/cli/commands/analyze.ts","../../src/cli/commands/save-fixture.ts","../../src/cli/commands/design-tree.ts","../../src/cli/commands/implement.ts","../../src/core/contracts/visual-compare.ts","../../src/cli/commands/visual-compare.ts","../../src/cli/commands/init.ts","../../src/cli/commands/config.ts","../../src/cli/commands/list-rules.ts","../../src/cli/commands/prompt.ts","../../src/agents/contracts/conversion-agent.ts","../../src/agents/contracts/calibration.ts","../../src/agents/analysis-agent.ts","../../src/core/design-tree/delta.ts","../../src/agents/evaluation-agent.ts","../../src/agents/tuning-agent.ts","../../src/agents/report-generator.ts","../../src/agents/contracts/evidence.ts","../../src/agents/evidence-collector.ts","../../src/agents/orchestrator.ts","../../src/cli/commands/internal/calibrate-analyze.ts","../../src/cli/commands/internal/calibrate-evaluate.ts","../../src/agents/contracts/gap-analyzer.ts","../../src/agents/gap-rule-report.ts","../../src/cli/commands/internal/calibrate-gap-report.ts","../../src/cli/commands/internal/calibrate-run.ts","../../src/agents/run-directory.ts","../../src/cli/commands/internal/cli-helpers.ts","../../src/cli/commands/internal/calibrate-debate.ts","../../src/cli/commands/internal/fixture-management.ts","../../src/core/design-tree/strip.ts","../../src/cli/commands/internal/design-tree-strip.ts","../../src/core/comparison/html-utils.ts","../../src/cli/commands/internal/html-postprocess.ts","../../src/cli/commands/internal/code-metrics.ts","../../src/cli/index.ts"],"names":["BATCH_SIZE","join","existsSync","readFileSync","resolve","statSync","width","height","mkdirSync","dirname","writeFileSync","PNG","config","require","z","response","file","componentDefs","interactionDests","version","readFile","esc","countNodes","cli","resolveComponentDefinitions","resolveInteractionDestinations","writeFile","FigmaClient","generateDesignTreeWithStats","readdirSync","copyFileSync","visualCompare","dominantDifficulty","loadFile","basename","result","createRequire","pkg"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;A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","file":"index.js","sourcesContent":["import type { GetFileResponse, Node } from \"@figma/rest-api-spec\";\n\nconst FIGMA_API_BASE = \"https://api.figma.com/v1\";\n\nexport interface GetFileNodesResponse {\n name: string;\n lastModified: string;\n version: string;\n nodes: Record<string, {\n document: Node;\n components: GetFileResponse[\"components\"];\n styles: GetFileResponse[\"styles\"];\n }>;\n}\n\nexport interface FigmaClientOptions {\n token: string;\n}\n\nexport class FigmaClient {\n private token: string;\n\n constructor(options: FigmaClientOptions) {\n this.token = options.token;\n }\n\n static fromEnv(): FigmaClient {\n const token = process.env[\"FIGMA_TOKEN\"];\n if (!token) {\n throw new FigmaClientError(\n \"FIGMA_TOKEN environment variable is not set\"\n );\n }\n return new FigmaClient({ token });\n }\n\n async getFile(fileKey: string): Promise<GetFileResponse> {\n const url = `${FIGMA_API_BASE}/files/${fileKey}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch file: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return response.json() as Promise<GetFileResponse>;\n }\n\n /**\n * Get rendered images for specific nodes\n * Returns a map of nodeId → image URL\n */\n async getNodeImages(\n fileKey: string,\n nodeIds: string[],\n options?: { format?: \"png\" | \"svg\" | \"jpg\"; scale?: number }\n ): Promise<Record<string, string | null>> {\n const format = options?.format ?? \"png\";\n const scale = options?.scale ?? 2;\n\n // Batch into chunks to avoid 414 URI Too Large\n const BATCH_SIZE = 50;\n const allImages: Record<string, string | null> = {};\n\n for (let i = 0; i < nodeIds.length; i += BATCH_SIZE) {\n const batch = nodeIds.slice(i, i + BATCH_SIZE);\n const ids = batch.join(\",\");\n const url = `${FIGMA_API_BASE}/images/${fileKey}?ids=${encodeURIComponent(ids)}&format=${format}&scale=${scale}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch images: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n const data = await response.json() as { images: Record<string, string | null> };\n for (const [nodeId, imageUrl] of Object.entries(data.images)) {\n allImages[nodeId] = imageUrl;\n }\n }\n\n return allImages;\n }\n\n /**\n * Get original image fill URLs by imageRef.\n * Returns a mapping of imageRef → download URL for all image fills in the file.\n */\n async getImageFills(fileKey: string): Promise<Record<string, string>> {\n const url = `${FIGMA_API_BASE}/files/${fileKey}/images`;\n const response = await fetch(url, {\n headers: { \"X-Figma-Token\": this.token },\n });\n if (!response.ok) {\n const error = await response.text().catch(() => \"\");\n throw new FigmaClientError(\n `Failed to fetch image fills: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n const data = await response.json() as { meta?: { images?: Record<string, string> } };\n return data.meta?.images ?? {};\n }\n\n /**\n * Download an image URL and return as base64\n */\n async fetchImageAsBase64(imageUrl: string): Promise<string> {\n const response = await fetch(imageUrl);\n if (!response.ok) {\n throw new FigmaClientError(\n `Failed to download image: ${response.status}`,\n response.status\n );\n }\n const buffer = await response.arrayBuffer();\n return Buffer.from(buffer).toString(\"base64\");\n }\n\n async getFileNodes(\n fileKey: string,\n nodeIds: string[]\n ): Promise<GetFileNodesResponse> {\n const ids = nodeIds.join(\",\");\n const url = `${FIGMA_API_BASE}/files/${fileKey}/nodes?ids=${encodeURIComponent(ids)}`;\n const response = await fetch(url, {\n headers: {\n \"X-Figma-Token\": this.token,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new FigmaClientError(\n `Failed to fetch nodes: ${response.status} ${response.statusText}`,\n response.status,\n error\n );\n }\n\n return response.json() as Promise<GetFileNodesResponse>;\n }\n}\n\nexport class FigmaClientError extends Error {\n constructor(\n message: string,\n public statusCode?: number,\n public responseBody?: unknown\n ) {\n super(message);\n this.name = \"FigmaClientError\";\n }\n}\n","import type { GetFileResponse, Node } from \"@figma/rest-api-spec\";\nimport type { GetFileNodesResponse } from \"./figma-client.js\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\n\n/**\n * Transform Figma API response to analysis types\n */\nexport function transformFigmaResponse(\n fileKey: string,\n response: GetFileResponse\n): AnalysisFile {\n return {\n fileKey,\n name: response.name,\n lastModified: response.lastModified,\n version: response.version,\n document: transformNode(response.document),\n components: transformComponents(response.components),\n styles: transformStyles(response.styles),\n };\n}\n\nfunction transformNode(node: Node): AnalysisNode {\n const base: AnalysisNode = {\n id: node.id,\n name: node.name,\n type: node.type as AnalysisNode[\"type\"],\n visible: \"visible\" in node ? (node.visible ?? true) : true,\n };\n\n // Layout properties\n if (\"layoutMode\" in node && node.layoutMode) {\n base.layoutMode = node.layoutMode as AnalysisNode[\"layoutMode\"];\n }\n if (\"layoutAlign\" in node && node.layoutAlign) {\n base.layoutAlign = node.layoutAlign as AnalysisNode[\"layoutAlign\"];\n }\n if (\"layoutPositioning\" in node && node.layoutPositioning) {\n base.layoutPositioning =\n node.layoutPositioning as AnalysisNode[\"layoutPositioning\"];\n }\n if (\"layoutSizingHorizontal\" in node && node.layoutSizingHorizontal) {\n base.layoutSizingHorizontal =\n node.layoutSizingHorizontal as AnalysisNode[\"layoutSizingHorizontal\"];\n }\n if (\"layoutSizingVertical\" in node && node.layoutSizingVertical) {\n base.layoutSizingVertical =\n node.layoutSizingVertical as AnalysisNode[\"layoutSizingVertical\"];\n }\n if (\"primaryAxisAlignItems\" in node) {\n base.primaryAxisAlignItems = node.primaryAxisAlignItems as string;\n }\n if (\"counterAxisAlignItems\" in node) {\n base.counterAxisAlignItems = node.counterAxisAlignItems as string;\n }\n if (\"itemSpacing\" in node) {\n base.itemSpacing = node.itemSpacing as number;\n }\n if (\"paddingLeft\" in node) {\n base.paddingLeft = node.paddingLeft as number;\n }\n if (\"paddingRight\" in node) {\n base.paddingRight = node.paddingRight as number;\n }\n if (\"paddingTop\" in node) {\n base.paddingTop = node.paddingTop as number;\n }\n if (\"paddingBottom\" in node) {\n base.paddingBottom = node.paddingBottom as number;\n }\n\n // Size constraints (responsive)\n if (\"minWidth\" in node && typeof node.minWidth === \"number\") {\n base.minWidth = node.minWidth;\n }\n if (\"maxWidth\" in node && typeof node.maxWidth === \"number\") {\n base.maxWidth = node.maxWidth;\n }\n if (\"minHeight\" in node && typeof node.minHeight === \"number\") {\n base.minHeight = node.minHeight;\n }\n if (\"maxHeight\" in node && typeof node.maxHeight === \"number\") {\n base.maxHeight = node.maxHeight;\n }\n if (\"layoutGrow\" in node && node.layoutGrow !== undefined) {\n base.layoutGrow = node.layoutGrow as 0 | 1;\n }\n if (\"constraints\" in node && node.constraints) {\n base.constraints = node.constraints as AnalysisNode[\"constraints\"];\n }\n\n // Wrap (flex-wrap)\n if (\"layoutWrap\" in node && node.layoutWrap) {\n base.layoutWrap = node.layoutWrap as AnalysisNode[\"layoutWrap\"];\n }\n if (\"counterAxisSpacing\" in node && typeof node.counterAxisSpacing === \"number\") {\n base.counterAxisSpacing = node.counterAxisSpacing;\n }\n if (\"counterAxisAlignContent\" in node && node.counterAxisAlignContent) {\n base.counterAxisAlignContent =\n node.counterAxisAlignContent as AnalysisNode[\"counterAxisAlignContent\"];\n }\n\n // Grid layout (container)\n if (\"gridRowCount\" in node && typeof node.gridRowCount === \"number\") {\n base.gridRowCount = node.gridRowCount;\n }\n if (\"gridColumnCount\" in node && typeof node.gridColumnCount === \"number\") {\n base.gridColumnCount = node.gridColumnCount;\n }\n if (\"gridRowGap\" in node && typeof node.gridRowGap === \"number\") {\n base.gridRowGap = node.gridRowGap;\n }\n if (\"gridColumnGap\" in node && typeof node.gridColumnGap === \"number\") {\n base.gridColumnGap = node.gridColumnGap;\n }\n if (\"gridColumnsSizing\" in node && typeof node.gridColumnsSizing === \"string\") {\n base.gridColumnsSizing = node.gridColumnsSizing;\n }\n if (\"gridRowsSizing\" in node && typeof node.gridRowsSizing === \"string\") {\n base.gridRowsSizing = node.gridRowsSizing;\n }\n\n // Grid layout (child)\n if (\"gridChildHorizontalAlign\" in node && node.gridChildHorizontalAlign) {\n base.gridChildHorizontalAlign =\n node.gridChildHorizontalAlign as AnalysisNode[\"gridChildHorizontalAlign\"];\n }\n if (\"gridChildVerticalAlign\" in node && node.gridChildVerticalAlign) {\n base.gridChildVerticalAlign =\n node.gridChildVerticalAlign as AnalysisNode[\"gridChildVerticalAlign\"];\n }\n if (\"gridRowSpan\" in node && typeof node.gridRowSpan === \"number\") {\n base.gridRowSpan = node.gridRowSpan;\n }\n if (\"gridColumnSpan\" in node && typeof node.gridColumnSpan === \"number\") {\n base.gridColumnSpan = node.gridColumnSpan;\n }\n if (\"gridRowAnchorIndex\" in node && typeof node.gridRowAnchorIndex === \"number\") {\n base.gridRowAnchorIndex = node.gridRowAnchorIndex;\n }\n if (\"gridColumnAnchorIndex\" in node && typeof node.gridColumnAnchorIndex === \"number\") {\n base.gridColumnAnchorIndex = node.gridColumnAnchorIndex;\n }\n\n // Overflow / clip\n if (\"clipsContent\" in node && typeof node.clipsContent === \"boolean\") {\n base.clipsContent = node.clipsContent;\n }\n if (\"overflowDirection\" in node && node.overflowDirection) {\n base.overflowDirection =\n node.overflowDirection as AnalysisNode[\"overflowDirection\"];\n }\n\n // Size/position\n if (\"absoluteBoundingBox\" in node && node.absoluteBoundingBox) {\n base.absoluteBoundingBox = node.absoluteBoundingBox;\n }\n\n // Component properties\n if (\"componentId\" in node) {\n base.componentId = node.componentId as string;\n }\n if (\"componentPropertyDefinitions\" in node) {\n base.componentPropertyDefinitions =\n node.componentPropertyDefinitions as Record<string, unknown>;\n }\n if (\"componentProperties\" in node) {\n base.componentProperties = node.componentProperties as Record<\n string,\n unknown\n >;\n }\n\n // Style properties\n if (\"styles\" in node) {\n base.styles = node.styles as Record<string, string>;\n }\n if (\"fills\" in node) {\n base.fills = node.fills as unknown[];\n }\n if (\"strokes\" in node) {\n base.strokes = node.strokes as unknown[];\n }\n if (\"strokeWeight\" in node && typeof node.strokeWeight === \"number\") {\n base.strokeWeight = node.strokeWeight;\n }\n if (\"individualStrokeWeights\" in node && node.individualStrokeWeights) {\n base.individualStrokeWeights = node.individualStrokeWeights as Record<string, number>;\n }\n if (\"effects\" in node) {\n base.effects = node.effects as unknown[];\n }\n if (\"cornerRadius\" in node && typeof node.cornerRadius === \"number\") {\n base.cornerRadius = node.cornerRadius;\n }\n if (\"opacity\" in node && typeof node.opacity === \"number\" && node.opacity < 1) {\n base.opacity = node.opacity;\n }\n\n // Variable bindings\n if (\"boundVariables\" in node && node.boundVariables) {\n base.boundVariables = node.boundVariables as Record<string, unknown>;\n }\n\n // Text properties\n if (\"characters\" in node) {\n base.characters = node.characters as string;\n }\n if (\"style\" in node) {\n base.style = node.style as Record<string, unknown>;\n }\n if (\"textTruncation\" in node && (node.textTruncation === \"DISABLED\" || node.textTruncation === \"ENDING\")) {\n base.textTruncation = node.textTruncation;\n }\n if (\"maxLines\" in node && typeof node.maxLines === \"number\") {\n base.maxLines = node.maxLines;\n }\n\n // Handoff status\n if (\"devStatus\" in node && node.devStatus) {\n base.devStatus = node.devStatus as AnalysisNode[\"devStatus\"];\n }\n\n // Prototype interactions\n if (\"interactions\" in node && Array.isArray(node.interactions) && node.interactions.length > 0) {\n base.interactions = node.interactions;\n }\n\n // Recursively transform children\n if (\"children\" in node && Array.isArray(node.children)) {\n base.children = node.children.map(transformNode);\n }\n\n return base;\n}\n\n/**\n * Transform Figma /v1/files/{key}/nodes response to analysis types.\n * Returns the first node's subtree as the document.\n */\nexport function transformFileNodesResponse(\n fileKey: string,\n response: GetFileNodesResponse\n): AnalysisFile {\n const entries = Object.values(response.nodes);\n const first = entries[0];\n if (!first)\n throw new Error(\n \"No nodes returned from Figma API — the node-id in the URL may be invalid or deleted. \" +\n \"Try selecting the frame in Figma and copying the link again.\"\n );\n\n return {\n fileKey,\n name: response.name,\n lastModified: response.lastModified,\n version: response.version,\n document: transformNode(first.document),\n components: transformComponents(first.components),\n styles: transformStyles(first.styles),\n };\n}\n\n/**\n * Transform component master nodes from a /v1/files/{key}/nodes response.\n * Each requested node ID is transformed into an AnalysisNode if present.\n */\nexport function transformComponentMasterNodes(\n response: GetFileNodesResponse,\n requestedIds: string[]\n): Record<string, AnalysisNode> {\n const result: Record<string, AnalysisNode> = {};\n for (const id of requestedIds) {\n const entry = response.nodes[id];\n if (entry?.document) {\n result[id] = transformNode(entry.document);\n }\n }\n return result;\n}\n\nfunction transformComponents(\n components: GetFileResponse[\"components\"]\n): AnalysisFile[\"components\"] {\n const result: AnalysisFile[\"components\"] = {};\n for (const [id, component] of Object.entries(components)) {\n result[id] = {\n key: component.key,\n name: component.name,\n description: component.description,\n };\n }\n return result;\n}\n\nfunction transformStyles(\n styles: GetFileResponse[\"styles\"]\n): AnalysisFile[\"styles\"] {\n const result: AnalysisFile[\"styles\"] = {};\n for (const [id, style] of Object.entries(styles)) {\n result[id] = {\n key: style.key,\n name: style.name,\n styleType: style.styleType,\n };\n }\n return result;\n}\n","import type { FigmaClient } from \"./figma-client.js\";\nimport type { AnalysisNode } from \"../contracts/figma-node.js\";\nimport { transformComponentMasterNodes } from \"./figma-transformer.js\";\n\nconst BATCH_SIZE = 50;\n\n/**\n * Recursively collect all unique componentId values from INSTANCE nodes.\n */\nexport function collectComponentIds(node: AnalysisNode): Set<string> {\n const ids = new Set<string>();\n\n function walk(n: AnalysisNode): void {\n if (n.type === \"INSTANCE\" && n.componentId) {\n ids.add(n.componentId);\n }\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n }\n\n walk(node);\n return ids;\n}\n\n/**\n * Recursively collect all unique interaction destination IDs from nodes.\n * These are the node IDs that interactions (e.g., ON_HOVER → CHANGE_TO) point to.\n */\nexport function collectInteractionDestinationIds(node: AnalysisNode): Set<string> {\n const ids = new Set<string>();\n\n function walk(n: AnalysisNode): void {\n if (n.interactions && Array.isArray(n.interactions)) {\n for (const interaction of n.interactions) {\n const i = interaction as {\n trigger?: { type?: string };\n actions?: Array<{ destinationId?: string; navigation?: string }>;\n };\n if (i.trigger?.type === \"ON_HOVER\" && i.actions) {\n for (const action of i.actions) {\n if (action.navigation === \"CHANGE_TO\" && action.destinationId) {\n ids.add(action.destinationId);\n }\n }\n }\n }\n }\n if (n.children) {\n for (const child of n.children) {\n walk(child);\n }\n }\n }\n\n walk(node);\n return ids;\n}\n\n/**\n * Resolve component master node trees via multi-pass fetching.\n *\n * Pass 1: collect component IDs from the document tree, fetch their masters.\n * Pass 2+: collect component IDs from fetched masters that were not in previous passes.\n * Repeats up to maxPasses (default 2).\n *\n * Batches API calls at BATCH_SIZE IDs per request.\n * Skips IDs that return null (e.g. external library components).\n */\nexport async function resolveComponentDefinitions(\n client: FigmaClient,\n fileKey: string,\n document: AnalysisNode,\n maxPasses = 2\n): Promise<Record<string, AnalysisNode>> {\n const allDefinitions: Record<string, AnalysisNode> = {};\n const resolvedIds = new Set<string>();\n\n // Pass 1: collect from the original document\n let pendingIds = collectComponentIds(document);\n\n for (let pass = 0; pass < maxPasses; pass++) {\n // Filter out already-resolved IDs\n const idsToFetch = [...pendingIds].filter((id) => !resolvedIds.has(id));\n if (idsToFetch.length === 0) break;\n\n // Fetch in batches\n for (let i = 0; i < idsToFetch.length; i += BATCH_SIZE) {\n const batch = idsToFetch.slice(i, i + BATCH_SIZE);\n try {\n const response = await client.getFileNodes(fileKey, batch);\n const transformed = transformComponentMasterNodes(response, batch);\n for (const [id, node] of Object.entries(transformed)) {\n allDefinitions[id] = node;\n }\n } catch (err) {\n // Skip failed batches (e.g. external library components)\n console.debug(`[component-resolver] batch fetch failed (${batch.length} ids):`, err);\n }\n }\n\n // Mark all attempted IDs as resolved (even if they failed/returned null)\n for (const id of idsToFetch) {\n resolvedIds.add(id);\n }\n\n // Collect new IDs only from masters fetched in this pass (not all accumulated)\n pendingIds = new Set<string>();\n for (const id of idsToFetch) {\n const node = allDefinitions[id];\n if (node) {\n for (const nestedId of collectComponentIds(node)) {\n if (!resolvedIds.has(nestedId)) {\n pendingIds.add(nestedId);\n }\n }\n }\n }\n }\n\n return allDefinitions;\n}\n\n/**\n * Resolve interaction destination nodes (e.g., hover variants).\n *\n * Collects all destinationId values from interactions in the document,\n * excludes those already in componentDefinitions, and fetches them.\n */\nexport async function resolveInteractionDestinations(\n client: FigmaClient,\n fileKey: string,\n document: AnalysisNode,\n existingDefinitions?: Record<string, AnalysisNode>,\n): Promise<Record<string, AnalysisNode>> {\n const destIds = collectInteractionDestinationIds(document);\n if (destIds.size === 0) return {};\n\n const allDestinations: Record<string, AnalysisNode> = {};\n const idsToFetch: string[] = [];\n\n for (const id of destIds) {\n const existing = existingDefinitions?.[id];\n if (existing) {\n allDestinations[id] = existing;\n } else {\n idsToFetch.push(id);\n }\n }\n\n if (idsToFetch.length === 0) return allDestinations;\n\n for (let i = 0; i < idsToFetch.length; i += BATCH_SIZE) {\n const batch = idsToFetch.slice(i, i + BATCH_SIZE);\n try {\n const response = await client.getFileNodes(fileKey, batch);\n const transformed = transformComponentMasterNodes(response, batch);\n for (const [id, node] of Object.entries(transformed)) {\n allDestinations[id] = node;\n }\n } catch (err) {\n console.debug(`[component-resolver] interaction destination fetch failed (${batch.length} ids):`, err);\n }\n }\n\n return allDestinations;\n}\n","/**\n * Extract a DOM-like design tree from AnalysisFile.\n * Converts Figma node tree to a concise text format with inline CSS styles.\n * AI reads this 1:1 to generate HTML+CSS — no information loss, 50-100x smaller.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\n\n/** Convert Figma RGBA color object to CSS hex string. */\nfunction rgbaToHex(color: { r?: number; g?: number; b?: number; a?: number }): string | null {\n if (!color) return null;\n const r = Math.round((color.r ?? 0) * 255);\n const g = Math.round((color.g ?? 0) * 255);\n const b = Math.round((color.b ?? 0) * 255);\n return `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b.toString(16).padStart(2, \"0\")}`.toUpperCase();\n}\n\ninterface FillInfo {\n color: string | null;\n hasImage: boolean;\n imageScaleMode: string | null;\n}\n\n/** Extract fill color and IMAGE presence from a node, skipping invisible fills. */\nfunction getFillInfo(node: AnalysisNode): FillInfo {\n const result: FillInfo = { color: null, hasImage: false, imageScaleMode: null };\n if (!node.fills || !Array.isArray(node.fills)) return result;\n for (const fill of node.fills) {\n const f = fill as {\n type?: string;\n visible?: boolean;\n color?: { r?: number; g?: number; b?: number; a?: number };\n opacity?: number;\n boundVariables?: { color?: { id?: string } };\n scaleMode?: string;\n };\n // Skip invisible fills\n if (f.visible === false) continue;\n if (f.type === \"SOLID\" && f.color) {\n const opacity = f.opacity ?? f.color.a ?? 1;\n let colorValue: string;\n if (opacity < 1) {\n const r = Math.round((f.color.r ?? 0) * 255);\n const g = Math.round((f.color.g ?? 0) * 255);\n const b = Math.round((f.color.b ?? 0) * 255);\n colorValue = `rgba(${r}, ${g}, ${b}, ${opacity})`;\n } else {\n colorValue = rgbaToHex(f.color) ?? \"#000\";\n }\n // Append variable reference if available\n if (f.boundVariables?.color?.id) {\n result.color = `${colorValue} /* var:${f.boundVariables.color.id} */`;\n } else {\n result.color = colorValue;\n }\n } else if (f.type === \"IMAGE\") {\n result.hasImage = true;\n result.imageScaleMode = f.scaleMode ?? null;\n }\n }\n return result;\n}\n\n/** @deprecated Use getFillInfo instead for full fill details */\nfunction getFill(node: AnalysisNode): string | null {\n return getFillInfo(node).color;\n}\n\n/** Extract the first solid stroke color as a CSS hex string. */\nfunction getStroke(node: AnalysisNode): string | null {\n if (!node.strokes || !Array.isArray(node.strokes)) return null;\n for (const stroke of node.strokes) {\n const s = stroke as { type?: string; color?: { r?: number; g?: number; b?: number } };\n if (s.type === \"SOLID\" && s.color) return rgbaToHex(s.color);\n }\n return null;\n}\n\n/** Extract the first visible shadow effect as a CSS box-shadow value. */\nfunction getShadow(node: AnalysisNode): string | null {\n if (!node.effects || !Array.isArray(node.effects)) return null;\n for (const effect of node.effects) {\n const e = effect as {\n type?: string;\n visible?: boolean;\n color?: { r?: number; g?: number; b?: number };\n offset?: { x?: number; y?: number };\n radius?: number;\n };\n if ((e.type === \"DROP_SHADOW\" || e.type === \"INNER_SHADOW\") && e.visible !== false) {\n const c = e.color ? rgbaToHex(e.color) : \"#000\";\n const ox = e.offset?.x ?? 0;\n const oy = e.offset?.y ?? 0;\n return `${ox}px ${oy}px ${e.radius ?? 0}px ${c}`;\n }\n }\n return null;\n}\n\n/** Map Figma alignment values to CSS flexbox equivalents. */\nfunction mapAlign(figmaAlign: string): string {\n const map: Record<string, string> = {\n MIN: \"flex-start\",\n CENTER: \"center\",\n MAX: \"flex-end\",\n SPACE_BETWEEN: \"space-between\",\n };\n return map[figmaAlign] ?? figmaAlign;\n}\n\n/** Map Figma text horizontal alignment to CSS text-align. */\nfunction mapTextAlignHorizontal(figmaAlign: string): string {\n const map: Record<string, string> = {\n LEFT: \"left\",\n CENTER: \"center\",\n RIGHT: \"right\",\n JUSTIFIED: \"justify\",\n };\n return map[figmaAlign] ?? figmaAlign.toLowerCase();\n}\n\n/** Map Figma text vertical alignment to CSS flex align-items. */\nfunction mapTextAlignVertical(figmaAlign: string): string {\n const map: Record<string, string> = {\n TOP: \"flex-start\",\n CENTER: \"center\",\n BOTTOM: \"flex-end\",\n };\n return map[figmaAlign] ?? figmaAlign.toLowerCase();\n}\n\n/** Get variable reference comment from boundVariables if available. */\nfunction getVarRef(node: AnalysisNode, prop: string): string {\n const bv = node.boundVariables as Record<string, unknown> | undefined;\n if (!bv) return \"\";\n const ref = bv[prop];\n if (!ref) return \"\";\n if (typeof ref === \"object\" && ref !== null && \"id\" in ref) {\n return ` /* var:${(ref as { id: string }).id} */`;\n }\n return \"\";\n}\n\n/** Get first variable ref among multiple properties. */\nfunction getFirstVarRef(node: AnalysisNode, props: string[]): string {\n for (const prop of props) {\n const ref = getVarRef(node, prop);\n if (ref) return ref;\n }\n return \"\";\n}\n\n/** Format instance component property values for AI hints. */\nfunction formatComponentProperties(node: AnalysisNode): string | null {\n if (!node.componentProperties || typeof node.componentProperties !== \"object\") return null;\n const entries = Object.entries(node.componentProperties)\n .map(([name, value]) => {\n const v = value as { value?: unknown };\n const raw = typeof v?.value === \"string\" ? v.value : JSON.stringify(v?.value ?? \"\");\n return `${name}=${raw}`;\n });\n if (entries.length === 0) return null;\n return entries.join(\", \");\n}\n\n/** Extract key visual styles from a node for hover diff comparison. */\nfunction extractVisualStyles(node: AnalysisNode): Record<string, string> {\n const styles: Record<string, string> = {};\n const fillInfo = getFillInfo(node);\n if (fillInfo.color && node.type !== \"TEXT\") styles[\"background\"] = fillInfo.color;\n const stroke = getStroke(node);\n if (stroke) styles[\"border-color\"] = stroke;\n if (node.cornerRadius) styles[\"border-radius\"] = `${node.cornerRadius}px`;\n if (node.opacity !== undefined && node.opacity < 1) styles[\"opacity\"] = `${Math.round(node.opacity * 100) / 100}`;\n const shadow = getShadow(node);\n if (shadow) styles[\"box-shadow\"] = shadow;\n // Text color\n if (node.type === \"TEXT\") {\n const textColor = getFill(node);\n if (textColor) styles[\"color\"] = textColor;\n }\n return styles;\n}\n\nconst HOVER_STYLE_DEFAULTS: Record<string, string> = {\n background: \"transparent\",\n \"border-color\": \"transparent\",\n \"border-radius\": \"0px\",\n opacity: \"1\",\n \"box-shadow\": \"none\",\n color: \"inherit\",\n};\n\nfunction getHoverResetValue(styleKey: string): string {\n return HOVER_STYLE_DEFAULTS[styleKey] ?? \"initial\";\n}\n\nfunction appendStyleDiffs(\n currentStyles: Record<string, string>,\n hoverStyles: Record<string, string>,\n diffs: string[],\n namePrefix?: string,\n): void {\n const styleKeys = new Set([...Object.keys(currentStyles), ...Object.keys(hoverStyles)]);\n for (const key of styleKeys) {\n const currentValue = currentStyles[key];\n const hoverValue = hoverStyles[key] ?? getHoverResetValue(key);\n if (currentValue !== hoverValue) {\n const prefix = namePrefix ? `${namePrefix}: ` : \"\";\n diffs.push(`${prefix}${key}: ${hoverValue}`);\n }\n }\n}\n\nfunction getChildStableKey(node: AnalysisNode): string | null {\n // Prefer name over id: variant children share the same name but have different ids\n if (node.name) return `name:${node.name}`;\n return node.id ?? null;\n}\n\n/** Compute style diff between current node and its hover variant. */\nfunction computeHoverDiff(\n currentNode: AnalysisNode,\n hoverNode: AnalysisNode,\n): string | null {\n const current = extractVisualStyles(currentNode);\n const hover = extractVisualStyles(hoverNode);\n const diffs: string[] = [];\n appendStyleDiffs(current, hover, diffs);\n // Check children for text/color changes (first level only)\n if (currentNode.children && hoverNode.children) {\n const hoverByStableKey = new Map<string, AnalysisNode>();\n const hoverUnmatchedByIndex: AnalysisNode[] = [];\n\n for (const child of hoverNode.children) {\n const key = getChildStableKey(child);\n if (key) {\n // Keep the first occurrence to reduce noisy collisions.\n if (!hoverByStableKey.has(key)) hoverByStableKey.set(key, child);\n } else {\n hoverUnmatchedByIndex.push(child);\n }\n }\n\n let unkeyedIdx = 0;\n for (let i = 0; i < currentNode.children.length; i++) {\n const cc = currentNode.children[i];\n if (!cc) continue;\n\n const stableKey = getChildStableKey(cc);\n let hc: AnalysisNode | undefined;\n if (stableKey) {\n hc = hoverByStableKey.get(stableKey);\n } else {\n hc = hoverUnmatchedByIndex[unkeyedIdx];\n unkeyedIdx++;\n }\n if (!hc) continue;\n const ccStyles = extractVisualStyles(cc);\n const hcStyles = extractVisualStyles(hc);\n appendStyleDiffs(ccStyles, hcStyles, diffs, cc.name);\n }\n }\n return diffs.length > 0 ? diffs.join(\"; \") : null;\n}\n\n/** Render a single node and its children as indented design-tree text. */\nfunction renderNode(\n node: AnalysisNode,\n indent: number,\n vectorDir?: string,\n components?: AnalysisFile[\"components\"],\n imageMapping?: Record<string, string>,\n vectorMapping?: Record<string, string>,\n fileStyles?: AnalysisFile[\"styles\"],\n interactionDests?: Record<string, AnalysisNode>,\n parentBBox?: { x: number; y: number; width: number; height: number },\n): string {\n if (node.visible === false) return \"\";\n\n const prefix = \" \".repeat(indent);\n const lines: string[] = [];\n\n // Header — annotate INSTANCE nodes with component name\n const bbox = node.absoluteBoundingBox;\n const w = bbox ? Math.round(bbox.width) : \"?\";\n const h = bbox ? Math.round(bbox.height) : \"?\";\n let header = `${prefix}${node.name} (${node.type}, ${w}x${h})`;\n if (node.type === \"INSTANCE\" && node.componentId && components) {\n const comp = components[node.componentId];\n if (comp) {\n header += ` [component: ${comp.name}]`;\n }\n }\n lines.push(header);\n if (node.type === \"INSTANCE\") {\n const componentProps = formatComponentProperties(node);\n if (componentProps) {\n lines.push(`${prefix} component-properties: ${componentProps}`);\n }\n }\n\n // Styles\n const styles: string[] = [];\n\n // Layout\n if (node.layoutMode && node.layoutMode !== \"NONE\") {\n if (node.layoutMode === \"GRID\") {\n styles.push(`display: grid`);\n if (node.gridColumnsSizing) styles.push(`grid-template-columns: ${node.gridColumnsSizing}`);\n if (node.gridRowsSizing) styles.push(`grid-template-rows: ${node.gridRowsSizing}`);\n if (node.gridColumnGap != null && node.gridRowGap != null) {\n styles.push(`gap: ${node.gridRowGap}px ${node.gridColumnGap}px`);\n } else if (node.gridRowGap != null) {\n styles.push(`row-gap: ${node.gridRowGap}px`);\n } else if (node.gridColumnGap != null) {\n styles.push(`column-gap: ${node.gridColumnGap}px`);\n } else if (node.itemSpacing != null) {\n styles.push(`gap: ${node.itemSpacing}px`);\n }\n } else {\n const dir = node.layoutMode === \"VERTICAL\" ? \"column\" : \"row\";\n styles.push(`display: flex; flex-direction: ${dir}`);\n if (node.layoutWrap === \"WRAP\") styles.push(`flex-wrap: wrap`);\n if (node.itemSpacing != null) {\n const mainGap = node.layoutMode === \"VERTICAL\" ? \"row-gap\" : \"column-gap\";\n styles.push(`${mainGap}: ${node.itemSpacing}px${getVarRef(node, \"itemSpacing\")}`);\n }\n if (node.counterAxisSpacing != null) {\n const crossGap = node.layoutMode === \"VERTICAL\" ? \"column-gap\" : \"row-gap\";\n styles.push(`${crossGap}: ${node.counterAxisSpacing}px${getVarRef(node, \"counterAxisSpacing\")}`);\n }\n if (node.primaryAxisAlignItems) styles.push(`justify-content: ${mapAlign(node.primaryAxisAlignItems)}`);\n // Figma default is MIN (flex-start), CSS default is stretch — emit explicitly\n styles.push(`align-items: ${mapAlign(node.counterAxisAlignItems ?? \"MIN\")}`);\n if (node.counterAxisAlignContent && node.counterAxisAlignContent !== \"AUTO\") {\n styles.push(`align-content: ${mapAlign(node.counterAxisAlignContent)}`);\n }\n }\n }\n // Child self-alignment in auto-layout\n if (node.layoutAlign && node.layoutAlign !== \"INHERIT\") {\n styles.push(`align-self: ${mapAlign(node.layoutAlign)}`);\n }\n if (node.layoutGrow === 1) {\n styles.push(\"flex-grow: 1\");\n }\n\n // Absolute positioning (child placed outside normal auto-layout flow)\n if (node.layoutPositioning === \"ABSOLUTE\") {\n styles.push(\"position: absolute\");\n if (parentBBox && node.absoluteBoundingBox) {\n const top = Math.round(node.absoluteBoundingBox.y - parentBBox.y);\n const left = Math.round(node.absoluteBoundingBox.x - parentBBox.x);\n styles.push(`top: ${top}px`);\n styles.push(`left: ${left}px`);\n }\n }\n // If any child is absolute, parent needs position: relative (but not if already absolute)\n if (node.layoutPositioning !== \"ABSOLUTE\" && node.children?.some((c) => c.layoutPositioning === \"ABSOLUTE\")) {\n styles.push(\"position: relative\");\n }\n\n // Padding\n const pt = node.paddingTop ?? 0;\n const pr = node.paddingRight ?? 0;\n const pb = node.paddingBottom ?? 0;\n const pl = node.paddingLeft ?? 0;\n if (pt || pr || pb || pl) {\n const padRef = getFirstVarRef(node, [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"]);\n styles.push(`padding: ${pt}px ${pr}px ${pb}px ${pl}px${padRef}`);\n }\n\n // Sizing — FILL = stretch to parent. If flex-grow is already set, skip width: 100% (redundant + breaks wrap layouts)\n if (node.layoutSizingHorizontal === \"FILL\" && node.layoutGrow !== 1) styles.push(\"width: 100%\");\n if (node.layoutSizingVertical === \"FILL\") styles.push(\"height: 100%\");\n\n // Fill (not for TEXT — text fill is color)\n const fillInfo = getFillInfo(node);\n if (fillInfo.color && node.type !== \"TEXT\") styles.push(`background: ${fillInfo.color}`);\n if (fillInfo.hasImage) {\n const hasChildren = node.children && node.children.length > 0;\n const mappedFile = imageMapping?.[node.id];\n if (mappedFile) {\n if (hasChildren) {\n // Background image: node has children on top → CSS background-image\n styles.push(`background-image: url(images/${mappedFile})`);\n styles.push(\"background-position: center\");\n styles.push(\"background-repeat: no-repeat\");\n if (fillInfo.imageScaleMode === \"FIT\") {\n styles.push(\"background-size: contain\");\n } else if (fillInfo.imageScaleMode === \"FILL\") {\n styles.push(\"background-size: cover\");\n }\n } else {\n // Content image: leaf node → <img> tag\n styles.push(`content-image: url(images/${mappedFile})`);\n if (fillInfo.imageScaleMode === \"FIT\") {\n styles.push(\"object-fit: contain\");\n } else if (fillInfo.imageScaleMode === \"FILL\") {\n styles.push(\"object-fit: cover\");\n }\n }\n } else {\n styles.push(hasChildren ? \"background-image: [IMAGE]\" : \"content-image: [IMAGE]\");\n }\n }\n\n // Border — respect per-side stroke weights\n const stroke = getStroke(node);\n if (stroke) {\n const isw = node.individualStrokeWeights as\n | { top?: number; right?: number; bottom?: number; left?: number }\n | undefined;\n const sw = (node.strokeWeight as number | undefined) ?? 1;\n if (isw) {\n const strokeRef = getFirstVarRef(node, [\"individualStrokeWeights\", \"strokes\"]);\n if (isw.top) styles.push(`border-top: ${isw.top}px solid ${stroke}${strokeRef}`);\n if (isw.right) styles.push(`border-right: ${isw.right}px solid ${stroke}${strokeRef}`);\n if (isw.bottom) styles.push(`border-bottom: ${isw.bottom}px solid ${stroke}${strokeRef}`);\n if (isw.left) styles.push(`border-left: ${isw.left}px solid ${stroke}${strokeRef}`);\n } else {\n styles.push(`border: ${sw}px solid ${stroke}${getVarRef(node, \"strokes\")}`);\n }\n }\n\n // Border radius\n if (node.cornerRadius) {\n const radiusRef = getVarRef(node, \"rectangleCornerRadii\");\n styles.push(`border-radius: ${node.cornerRadius}px${radiusRef}`);\n }\n\n // Shadow\n const shadow = getShadow(node);\n if (shadow) styles.push(`box-shadow: ${shadow}`);\n\n // Overflow\n if (node.clipsContent) styles.push(\"overflow: hidden\");\n\n // Opacity\n if (node.opacity !== undefined && node.opacity < 1) {\n styles.push(`opacity: ${Math.round(node.opacity * 100) / 100}`);\n }\n\n // Min/max constraints\n if (node.minWidth !== undefined) styles.push(`min-width: ${Math.round(node.minWidth)}px`);\n if (node.maxWidth !== undefined) styles.push(`max-width: ${Math.round(node.maxWidth)}px`);\n if (node.minHeight !== undefined) styles.push(`min-height: ${Math.round(node.minHeight)}px`);\n if (node.maxHeight !== undefined) styles.push(`max-height: ${Math.round(node.maxHeight)}px`);\n\n // Typography\n if (node.type === \"TEXT\" && node.style) {\n // Add text style name if available\n const nodeStyles = node.styles as Record<string, string> | undefined;\n const textStyleId = nodeStyles?.[\"text\"];\n if (textStyleId && fileStyles) {\n const styleInfo = fileStyles[textStyleId] as { name?: string } | undefined;\n if (styleInfo?.name) {\n styles.push(`/* text-style: ${styleInfo.name} */`);\n }\n }\n\n const s = node.style as Record<string, unknown>;\n if (s[\"fontFamily\"]) styles.push(`font-family: \"${s[\"fontFamily\"]}\"${getVarRef(node, \"fontFamily\")}`);\n if (s[\"fontWeight\"]) styles.push(`font-weight: ${s[\"fontWeight\"]}${getVarRef(node, \"fontWeight\")}`);\n if (s[\"fontSize\"]) styles.push(`font-size: ${s[\"fontSize\"]}px${getVarRef(node, \"fontSize\")}`);\n if (s[\"lineHeightPx\"]) {\n const lh = s[\"lineHeightPx\"] as number;\n styles.push(`line-height: ${Math.round(lh * 100) / 100}px`);\n }\n if (s[\"letterSpacing\"]) {\n const ls = s[\"letterSpacing\"] as number;\n styles.push(`letter-spacing: ${Math.round(ls * 100) / 100}px`);\n }\n if (s[\"textDecoration\"]) {\n const td = (s[\"textDecoration\"] as string).toLowerCase();\n if (td !== \"none\") styles.push(`text-decoration: ${td}`);\n }\n if (s[\"textAlignHorizontal\"]) {\n styles.push(`text-align: ${mapTextAlignHorizontal(String(s[\"textAlignHorizontal\"]))}`);\n }\n if (s[\"textAlignVertical\"] && s[\"textAlignVertical\"] !== \"TOP\") {\n // CSS has no direct text vertical-align in a text box; emit flex hint.\n // TOP is the default — only emit for CENTER/BOTTOM.\n styles.push(\"display: flex\");\n styles.push(`align-items: ${mapTextAlignVertical(String(s[\"textAlignVertical\"]))}`);\n }\n\n const textColor = getFill(node);\n if (textColor) styles.push(`color: ${textColor}`);\n\n // Text auto-resize behavior\n const textAutoResize = s[\"textAutoResize\"] as string | undefined;\n if (textAutoResize === \"WIDTH_AND_HEIGHT\") {\n styles.push(\"text-resize: auto\");\n } else if (textAutoResize === \"HEIGHT\") {\n styles.push(\"text-resize: fixed-height\");\n } else if (textAutoResize === \"TRUNCATE\") {\n styles.push(\"text-resize: truncate\");\n styles.push(\"text-overflow: ellipsis\");\n if (node.maxLines != null) {\n styles.push(`max-lines: ${node.maxLines}`);\n }\n }\n\n // Text truncation (when textAutoResize is not TRUNCATE but truncation is set)\n if (textAutoResize !== \"TRUNCATE\" && node.textTruncation === \"ENDING\") {\n styles.push(\"text-overflow: ellipsis\");\n if (node.maxLines != null) {\n styles.push(`max-lines: ${node.maxLines}`);\n }\n }\n\n // Paragraph spacing\n const paragraphSpacing = s[\"paragraphSpacing\"] as number | undefined;\n if (paragraphSpacing) {\n styles.push(`paragraph-spacing: ${paragraphSpacing}px`);\n }\n }\n\n // Text content\n if (node.type === \"TEXT\" && node.characters) {\n styles.push(`text: \"${node.characters.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\n/g, \"\\\\n\").replace(/\\r/g, \"\\\\r\").replace(/\"/g, '\\\\\"')}\"`);\n }\n\n // Vector SVG inline (when vector dir with downloaded SVGs is available)\n if (node.type === \"VECTOR\" && vectorDir) {\n const mappedFile = vectorMapping?.[node.id];\n const svgPath = mappedFile\n ? join(vectorDir, mappedFile)\n : join(vectorDir, `${node.id.replace(/:/g, \"-\")}.svg`); // fallback to legacy ID-based naming\n if (existsSync(svgPath)) {\n const svg = readFileSync(svgPath, \"utf-8\").trim().replace(/\\n\\s*/g, \" \");\n styles.push(`svg: ${svg}`);\n }\n }\n\n if (styles.length > 0) {\n lines.push(`${prefix} style: ${styles.join(\"; \")}`);\n }\n\n // Interaction states (hover)\n if (node.interactions && interactionDests) {\n for (const interaction of node.interactions) {\n const i = interaction as {\n trigger?: { type?: string };\n actions?: Array<{ destinationId?: string; navigation?: string }>;\n };\n if (i.trigger?.type === \"ON_HOVER\" && i.actions) {\n for (const action of i.actions) {\n if (action.destinationId && action.navigation === \"CHANGE_TO\") {\n const hoverNode = interactionDests[action.destinationId];\n if (hoverNode) {\n const diff = computeHoverDiff(node, hoverNode);\n if (diff) {\n lines.push(`${prefix} [hover]: ${diff}`);\n }\n }\n }\n }\n }\n }\n }\n\n // Children\n if (node.children) {\n for (const child of node.children) {\n const childOutput = renderNode(child, indent + 1, vectorDir, components, imageMapping, vectorMapping, fileStyles, interactionDests, node.absoluteBoundingBox ?? undefined);\n if (childOutput) lines.push(childOutput);\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/** Options for design tree generation. */\nexport interface DesignTreeOptions {\n /** Directory containing <nodeId>.svg files for VECTOR nodes */\n vectorDir?: string;\n /** Directory containing downloaded PNGs and mapping.json for IMAGE fill nodes */\n imageDir?: string;\n}\n\n/**\n * Generate a design tree string from an AnalysisFile.\n */\nexport interface DesignTreeResult {\n /** The design tree text */\n tree: string;\n /** Estimated token count (~4 chars per token for mixed code/text) */\n estimatedTokens: number;\n /** Raw byte size */\n bytes: number;\n}\n\n/**\n * Generate a design tree string from an AnalysisFile.\n */\nexport function generateDesignTree(file: AnalysisFile, options?: DesignTreeOptions): string {\n return generateDesignTreeWithStats(file, options).tree;\n}\n\n/**\n * Generate a design tree with token/size statistics.\n * Use this when you need to measure token consumption for AI context budget.\n */\nexport function generateDesignTreeWithStats(file: AnalysisFile, options?: DesignTreeOptions): DesignTreeResult {\n const root = file.document;\n const w = root.absoluteBoundingBox ? Math.round(root.absoluteBoundingBox.width) : 0;\n const h = root.absoluteBoundingBox ? Math.round(root.absoluteBoundingBox.height) : 0;\n\n // Load image mapping once if imageDir is provided\n let imageMapping: Record<string, string> | undefined;\n if (options?.imageDir) {\n const mappingPath = join(options.imageDir, \"mapping.json\");\n if (existsSync(mappingPath)) {\n try {\n imageMapping = JSON.parse(readFileSync(mappingPath, \"utf-8\")) as Record<string, string>;\n } catch { /* ignore malformed mapping */ }\n }\n }\n\n // Load vector mapping once if vectorDir is provided\n let vectorMapping: Record<string, string> | undefined;\n if (options?.vectorDir) {\n const mappingPath = join(options.vectorDir, \"mapping.json\");\n if (existsSync(mappingPath)) {\n try {\n vectorMapping = JSON.parse(readFileSync(mappingPath, \"utf-8\")) as Record<string, string>;\n } catch { /* ignore malformed mapping */ }\n }\n }\n\n const tree = renderNode(root, 0, options?.vectorDir, file.components, imageMapping, vectorMapping, file.styles, file.interactionDestinations);\n\n const result = [\n \"# Design Tree\",\n `# Root: ${w}px x ${h}px`,\n \"# Each node shows: name (TYPE, WxH) followed by CSS-like styles\",\n \"# Reproduce this tree as HTML. Each node = one HTML element.\",\n \"# Every style value is from Figma data — use exactly as shown.\",\n \"\",\n tree,\n ].join(\"\\n\");\n\n const bytes = Buffer.byteLength(result, \"utf-8\");\n // ~4 chars per token for mixed code/text (conservative estimate)\n const estimatedTokens = Math.ceil(result.length / 4);\n\n return { tree: result, estimatedTokens, bytes };\n}\n","/**\n * Pure helper functions extracted from visual-compare.ts.\n * These have no side effects beyond file I/O and can be tested directly.\n */\n\nimport { writeFileSync, readFileSync, mkdirSync, statSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport pixelmatch from \"pixelmatch\";\nimport { PNG } from \"pngjs\";\n\n/** Directory used for caching Figma screenshots. */\nexport const FIGMA_CACHE_DIR = \"/tmp/canicode-figma-cache\";\n\n/**\n * Known @1x screenshot widths from fixture convention.\n * Screenshots at these widths are captured at 1x scale (pixel width = logical width).\n * All other widths are assumed @2x (e.g., 2400px PNG = 1200px logical).\n */\nexport const KNOWN_1X_WIDTHS = [1920, 768];\n\n/**\n * Infer the export scale of a fixture screenshot based on its pixel width.\n * Uses KNOWN_1X_WIDTHS convention: 1920/768 = @1x, others = @2x.\n */\nexport function inferExportScale(pngWidth: number): number {\n return KNOWN_1X_WIDTHS.includes(pngWidth) ? 1 : 2;\n}\n\n/** Cache time-to-live: 1 hour. */\nexport const FIGMA_CACHE_TTL_MS = 60 * 60 * 1000;\n\n/**\n * Tolerance for detecting integer scale factors (@2x, @3x).\n * Broader tolerance because render/rounding errors accumulate at higher scales.\n */\nexport const SCALE_ROUNDING_TOLERANCE = 0.08;\n\n/**\n * Tolerance for detecting 1x (unity) scale.\n * Tighter to avoid false positives — misidentifying a scaled PNG as 1x.\n */\nexport const UNITY_SCALE_TOLERANCE = 0.02;\n\n/**\n * Get the cache path for a given fileKey + nodeId combination.\n */\nexport function getFigmaCachePath(fileKey: string, nodeId: string, scale: number): string {\n // Sanitize nodeId for use as filename (replace : with -)\n const safeNodeId = nodeId.replace(/:/g, \"-\");\n return resolve(FIGMA_CACHE_DIR, `${fileKey}_${safeNodeId}@${scale}x.png`);\n}\n\n/**\n * Check if a cached Figma screenshot exists and is still fresh (within TTL).\n */\nexport function isCacheFresh(cachePath: string): boolean {\n try {\n const stats = statSync(cachePath);\n return Date.now() - stats.mtimeMs < FIGMA_CACHE_TTL_MS;\n } catch {\n // File doesn't exist or was removed between check and stat (TOCTOU safe)\n return false;\n }\n}\n\n/**\n * Infer device pixel ratio so the Playwright screenshot matches Figma PNG pixel dimensions.\n */\nexport function inferDeviceScaleFactor(\n pngW: number,\n pngH: number,\n logicalW: number,\n logicalH: number,\n fallback: number,\n): number {\n if (logicalW <= 0 || logicalH <= 0) return 1;\n const sx = pngW / logicalW;\n const sy = pngH / logicalH;\n const rounded = Math.round((sx + sy) / 2);\n if (rounded >= 2 && Math.abs(sx - rounded) < SCALE_ROUNDING_TOLERANCE && Math.abs(sy - rounded) < SCALE_ROUNDING_TOLERANCE) {\n return rounded;\n }\n if (Math.abs(sx - 1) < UNITY_SCALE_TOLERANCE && Math.abs(sy - 1) < UNITY_SCALE_TOLERANCE) return 1;\n return fallback >= 2 ? fallback : Math.max(1, Math.round(sx));\n}\n\n/**\n * Pad a PNG to target dimensions with a high-contrast fill color (magenta #FF00FF).\n * Unlike resize, padding preserves original pixels 1:1 and guarantees that\n * any size difference is counted as mismatched pixels by pixelmatch.\n *\n * Note: If both images contain magenta in the padded area, those pixels\n * will match — extremely rare in real designs but theoretically possible.\n */\nexport function padPng(png: PNG, targetWidth: number, targetHeight: number): PNG {\n const padded = new PNG({ width: targetWidth, height: targetHeight });\n // Fill entire canvas with magenta (FF00FF) — guaranteed to differ from any real content\n for (let i = 0; i < padded.data.length; i += 4) {\n padded.data[i] = 255; // R\n padded.data[i + 1] = 0; // G\n padded.data[i + 2] = 255; // B\n padded.data[i + 3] = 255; // A\n }\n // Copy original pixels into top-left corner\n for (let y = 0; y < png.height; y++) {\n for (let x = 0; x < png.width; x++) {\n const srcIdx = (y * png.width + x) * 4;\n const dstIdx = (y * targetWidth + x) * 4;\n padded.data[dstIdx] = png.data[srcIdx]!;\n padded.data[dstIdx + 1] = png.data[srcIdx + 1]!;\n padded.data[dstIdx + 2] = png.data[srcIdx + 2]!;\n padded.data[dstIdx + 3] = png.data[srcIdx + 3]!;\n }\n }\n return padded;\n}\n\n/** Options for screenshot comparison. */\nexport interface CompareOptions {\n /** How to handle size mismatches: \"pad\" (magenta fill) or \"crop\" (min dimensions). Default: \"pad\". */\n sizeMismatch?: \"pad\" | \"crop\";\n /** pixelmatch threshold (0-1). Default: 0.1. */\n threshold?: number;\n}\n\n/**\n * Crop a PNG to target dimensions (top-left corner preserved).\n */\nexport function cropPng(png: PNG, targetWidth: number, targetHeight: number): PNG {\n const cropped = new PNG({ width: targetWidth, height: targetHeight });\n for (let y = 0; y < targetHeight; y++) {\n png.data.copy(cropped.data, y * targetWidth * 4, y * png.width * 4, y * png.width * 4 + targetWidth * 4);\n }\n return cropped;\n}\n\n/**\n * Compare two PNG files using pixelmatch.\n */\nexport function compareScreenshots(\n path1: string,\n path2: string,\n diffOutputPath: string,\n options?: CompareOptions,\n): { similarity: number; diffPixels: number; totalPixels: number; width: number; height: number } {\n const sizeMismatch = options?.sizeMismatch ?? \"pad\";\n const threshold = options?.threshold ?? 0.1;\n const raw1 = PNG.sync.read(readFileSync(path1));\n const raw2 = PNG.sync.read(readFileSync(path2));\n\n let img1: PNG = raw1;\n let img2: PNG = raw2;\n\n // Size mismatch — normalize to same dimensions\n if (raw1.width !== raw2.width || raw1.height !== raw2.height) {\n if (sizeMismatch === \"crop\") {\n const width = Math.min(raw1.width, raw2.width);\n const height = Math.min(raw1.height, raw2.height);\n img1 = cropPng(raw1, width, height);\n img2 = cropPng(raw2, width, height);\n } else {\n const width = Math.max(raw1.width, raw2.width);\n const height = Math.max(raw1.height, raw2.height);\n img1 = padPng(raw1, width, height);\n img2 = padPng(raw2, width, height);\n }\n }\n\n const { width, height } = img1;\n const diff = new PNG({ width, height });\n const diffPixels = pixelmatch(img1.data, img2.data, diff.data, width, height, { threshold });\n\n mkdirSync(dirname(diffOutputPath), { recursive: true });\n writeFileSync(diffOutputPath, PNG.sync.write(diff));\n\n const totalPixels = width * height;\n const similarity = diffPixels === 0 ? 100 : Math.floor((1 - diffPixels / totalPixels) * 100);\n\n return { similarity, diffPixels, totalPixels, width, height };\n}\n\n// ── Root width expansion (for responsive comparison) ─────────────────────\n\n/**\n * Replace fixed root-element widths in HTML with fluid values so the layout\n * can expand to fill a wider viewport.\n *\n * Targets the first CSS rule that sets a pixel `width` on the root container\n * (commonly `.root`, `body > div`, etc.) and replaces it with `width: 100%`.\n * Also removes `min-width` pixel constraints.\n *\n * Originally from `src/experiments/ablation/run-condition.ts`.\n */\nexport function expandRootWidth(html: string): string {\n const styleMatch = html.match(/<style[\\s\\S]*?<\\/style>/i);\n if (!styleMatch) return html;\n\n const style = styleMatch[0];\n // Find the first CSS rule block (the root element's rule)\n const firstRuleMatch = style.match(/([^{}]*\\{)([^}]*)\\}/);\n if (!firstRuleMatch) return html;\n\n const rulePrefix = firstRuleMatch[1]!; // e.g. \".root {\"\n const ruleBody = firstRuleMatch[2]!; // e.g. \" width: 375px; min-width: 375px; \"\n\n // Replace width and min-width only inside the first rule\n const newBody = ruleBody\n .replace(/(?<![-\\w])width:\\s*\\d+px/, \"width: 100%\")\n .replace(/min-width:\\s*\\d+px/g, \"min-width: 0\");\n\n const newRule = `${rulePrefix}${newBody}}`;\n const newStyle = style.replace(firstRuleMatch[0], newRule);\n return html.replace(style, newStyle);\n}\n\n// ── Code metrics (shared with ablation helpers) ─────────────────────────\n\n/** Count unique CSS class selectors in an HTML string's <style> block. */\nexport function countCssClasses(html: string): number {\n const styleMatch = html.match(/<style[\\s\\S]*?<\\/style>/i);\n if (!styleMatch) return 0;\n const classes = styleMatch[0].match(/\\.[a-zA-Z][\\w-]*\\s*[{,:]/g);\n return new Set(classes?.map((c) => c.replace(/\\s*[{,:]$/, \"\"))).size;\n}\n\n/** Count unique CSS custom property definitions in an HTML string's <style> block. */\nexport function countCssVariables(html: string): number {\n const styleMatch = html.match(/<style[\\s\\S]*?<\\/style>/i);\n if (!styleMatch) return 0;\n const vars = styleMatch[0].match(/--[\\w-]+\\s*:/g);\n return new Set(vars?.map((v) => v.replace(/\\s*:$/, \"\"))).size;\n}\n\n/** Compute code metrics from an HTML string. */\nexport function computeCodeMetrics(html: string): {\n htmlBytes: number;\n htmlLines: number;\n cssClassCount: number;\n cssVariableCount: number;\n} {\n return {\n htmlBytes: Buffer.byteLength(html, \"utf-8\"),\n htmlLines: html.split(\"\\n\").length,\n cssClassCount: countCssClasses(html),\n cssVariableCount: countCssVariables(html),\n };\n}\n","/**\n * Visual comparison: renders HTML code with Playwright, fetches Figma screenshot,\n * and computes pixel-level similarity using pixelmatch.\n */\n\nimport { writeFileSync, readFileSync, mkdirSync, existsSync, copyFileSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport { PNG } from \"pngjs\";\nimport {\n FIGMA_CACHE_DIR,\n getFigmaCachePath,\n isCacheFresh,\n inferDeviceScaleFactor,\n inferExportScale,\n compareScreenshots,\n expandRootWidth,\n type CompareOptions,\n} from \"./visual-compare-helpers.js\";\n\n/** Result of a visual comparison between Figma design and rendered code. */\nexport interface VisualCompareResult {\n similarity: number;\n diffPixels: number;\n totalPixels: number;\n width: number;\n height: number;\n figmaScreenshotPath: string;\n codeScreenshotPath: string;\n diffPath: string;\n}\n\n/** Options for the visual comparison pipeline. */\nexport interface VisualCompareOptions {\n figmaUrl: string;\n figmaToken: string;\n codePath: string;\n outputDir?: string | undefined;\n /**\n * Logical CSS viewport (CSS pixels). Omit a dimension to infer from the Figma PNG\n * using `figmaExportScale`. When the whole object is omitted, both dimensions are inferred.\n */\n viewport?: { width?: number; height?: number } | undefined;\n /**\n * Figma Images API `scale` and assumed scale for fixture `figma.png` (e.g. from `save-fixture`).\n * Default 2 matches REST exports and avoids comparing a @2x PNG against a 1× Playwright capture.\n */\n figmaExportScale?: number | undefined;\n /**\n * Path to a local Figma screenshot file. When provided, skips URL-based fetch\n * and uses this file directly as the ground truth. Useful for responsive comparison\n * where multiple fixture screenshots exist at different viewports.\n */\n figmaScreenshotPath?: string | undefined;\n /**\n * When true, replace the root element's fixed pixel width with `width: 100%`\n * before rendering. This allows the layout to expand to fill the viewport,\n * which is needed for responsive comparison (e.g., 375px design rendered at 768px).\n */\n expandRoot?: boolean | undefined;\n}\n\n/**\n * Fetch Figma node screenshot via REST API, with file-based caching.\n * Cache key: fileKey + nodeId. Cache location: /tmp/canicode-figma-cache/. TTL: 1 hour.\n */\nasync function fetchFigmaScreenshot(\n fileKey: string,\n nodeId: string,\n token: string,\n outputPath: string,\n scale: number,\n): Promise<void> {\n const cachePath = getFigmaCachePath(fileKey, nodeId, scale);\n\n // Return cached version if fresh\n if (isCacheFresh(cachePath)) {\n mkdirSync(dirname(outputPath), { recursive: true });\n copyFileSync(cachePath, outputPath);\n return;\n }\n\n const res = await fetch(\n `https://api.figma.com/v1/images/${fileKey}?ids=${nodeId}&format=png&scale=${scale}`,\n { headers: { \"X-Figma-Token\": token } },\n );\n if (!res.ok) throw new Error(`Figma Images API: ${res.status} ${res.statusText}`);\n\n const data = (await res.json()) as { images: Record<string, string | null> };\n const imgUrl = data.images[nodeId];\n if (!imgUrl) throw new Error(`No image returned for node ${nodeId}`);\n\n const imgRes = await fetch(imgUrl);\n if (!imgRes.ok) throw new Error(`Failed to download Figma screenshot: ${imgRes.status}`);\n\n const buffer = Buffer.from(await imgRes.arrayBuffer());\n\n // Write to output path\n mkdirSync(dirname(outputPath), { recursive: true });\n writeFileSync(outputPath, buffer);\n\n // Save to cache\n mkdirSync(FIGMA_CACHE_DIR, { recursive: true });\n writeFileSync(cachePath, buffer);\n}\n\n/**\n * Render HTML file with Playwright and take a screenshot.\n * @param deviceScaleFactor - Pass 2 when the Figma reference is @2x and `viewport` is logical CSS size.\n */\nexport async function renderCodeScreenshot(\n codePath: string,\n outputPath: string,\n logicalViewport: { width: number; height: number },\n deviceScaleFactor: number = 1,\n): Promise<void> {\n // Dynamic import — playwright is an optional dependency\n const { chromium } = await import(\"playwright\");\n const browser = await chromium.launch();\n try {\n const context = await browser.newContext({\n viewport: logicalViewport,\n deviceScaleFactor,\n });\n const page = await context.newPage();\n\n await page.goto(`file://${resolve(codePath)}`, {\n waitUntil: \"networkidle\",\n timeout: 30_000,\n });\n await page.waitForTimeout(1000);\n\n // Capture only the first child element (the design root), not the full body/viewport\n const root = page.locator(\"body > *:first-child\");\n if (await root.count() > 0) {\n await root.screenshot({ path: outputPath });\n } else {\n await page.screenshot({ path: outputPath });\n }\n } finally {\n await browser.close();\n }\n}\n\n/**\n * Run full visual comparison pipeline.\n */\nexport async function visualCompare(options: VisualCompareOptions): Promise<VisualCompareResult> {\n const outputDir = options.outputDir ?? \"/tmp/canicode-visual-compare\";\n const figmaScreenshotPath = resolve(outputDir, \"figma.png\");\n const codeScreenshotPath = resolve(outputDir, \"code.png\");\n const diffPath = resolve(outputDir, \"diff.png\");\n\n // Parse Figma URL\n const urlMatch = options.figmaUrl.match(/\\/design\\/([^/]+)\\//);\n const fileKey = urlMatch?.[1];\n if (!fileKey) throw new Error(\"Invalid Figma URL — could not extract file key\");\n\n const nodeIdMatch = options.figmaUrl.match(/node-id=([^&\\s]+)/);\n const nodeId = nodeIdMatch?.[1]?.replace(/-/g, \":\");\n if (!nodeId) throw new Error(\"Invalid Figma URL — missing node-id\");\n\n // Step 1: Figma screenshot — use local file if provided, otherwise fetch via API\n if (options.figmaScreenshotPath) {\n if (!existsSync(options.figmaScreenshotPath)) {\n throw new Error(`Figma screenshot not found: ${options.figmaScreenshotPath}`);\n }\n mkdirSync(dirname(figmaScreenshotPath), { recursive: true });\n copyFileSync(options.figmaScreenshotPath, figmaScreenshotPath);\n } else if (!existsSync(figmaScreenshotPath)) {\n const fetchScale = options.figmaExportScale ?? 2;\n await fetchFigmaScreenshot(fileKey, nodeId, options.figmaToken, figmaScreenshotPath, fetchScale);\n if (!existsSync(figmaScreenshotPath)) {\n throw new Error(`Figma screenshot was not created at expected path: ${figmaScreenshotPath}`);\n }\n }\n\n // Step 2: Logical viewport + deviceScaleFactor so code.png matches figma.png pixels (@2x, etc.)\n const figmaPng = PNG.sync.read(readFileSync(figmaScreenshotPath));\n // Auto-detect export scale from PNG width when using local screenshot (KNOWN_1X_WIDTHS convention)\n const exportScale = options.figmaExportScale ?? inferExportScale(figmaPng.width);\n const hasViewportOverride = options.viewport !== undefined;\n let logicalW: number;\n let logicalH: number;\n let deviceScaleFactor: number;\n\n if (!hasViewportOverride) {\n logicalW = Math.max(1, Math.round(figmaPng.width / exportScale));\n logicalH = Math.max(1, Math.round(figmaPng.height / exportScale));\n deviceScaleFactor = exportScale;\n } else {\n logicalW =\n options.viewport!.width ?? Math.max(1, Math.round(figmaPng.width / exportScale));\n logicalH =\n options.viewport!.height ?? Math.max(1, Math.round(figmaPng.height / exportScale));\n deviceScaleFactor = inferDeviceScaleFactor(\n figmaPng.width,\n figmaPng.height,\n logicalW,\n logicalH,\n exportScale,\n );\n }\n\n // Step 3: Render code screenshot at matching physical resolution\n let renderPath = options.codePath;\n if (options.expandRoot) {\n const originalHtml = readFileSync(resolve(options.codePath), \"utf-8\");\n const expandedHtml = expandRootWidth(originalHtml);\n renderPath = resolve(outputDir, \"code-expanded.html\");\n writeFileSync(renderPath, expandedHtml);\n }\n await renderCodeScreenshot(\n renderPath,\n codeScreenshotPath,\n { width: logicalW, height: logicalH },\n deviceScaleFactor,\n );\n\n // Validate both screenshots exist before comparing\n if (!existsSync(codeScreenshotPath)) {\n throw new Error(`Code screenshot was not created at expected path: ${codeScreenshotPath}`);\n }\n\n // Compare\n const result = compareScreenshots(figmaScreenshotPath, codeScreenshotPath, diffPath);\n\n return {\n ...result,\n figmaScreenshotPath,\n codeScreenshotPath,\n diffPath,\n };\n}\n\n/** Options for renderAndCompare. */\nexport interface RenderAndCompareOptions {\n /** How to handle size mismatches. Default: \"pad\". */\n sizeMismatch?: CompareOptions[\"sizeMismatch\"];\n /** Output file suffix (e.g. \"baseline\", \"stripped-layout\"). */\n suffix?: string;\n /** pixelmatch threshold. Default: 0.1. */\n threshold?: number;\n /** Replace root element's fixed width with 100% before rendering. */\n expandRoot?: boolean;\n}\n\n/**\n * Render HTML → screenshot, then compare against a Figma screenshot.\n * Handles export scale inference and size normalization.\n *\n * Extracted from ablation helpers to be shared by calibration + experiments.\n */\nexport async function renderAndCompare(\n htmlPath: string,\n figmaScreenshotPath: string,\n outputDir: string,\n options?: RenderAndCompareOptions,\n): Promise<{ similarity: number }> {\n const suffix = options?.suffix ?? \"output\";\n const sizeMismatch = options?.sizeMismatch ?? \"pad\";\n const threshold = options?.threshold;\n\n const figmaImage = PNG.sync.read(readFileSync(figmaScreenshotPath));\n const figmaWidth = figmaImage.width;\n const exportScale = inferExportScale(figmaWidth);\n const logicalW = Math.max(1, Math.round(figmaWidth / exportScale));\n const logicalH = Math.max(1, Math.round(figmaImage.height / exportScale));\n\n let renderHtmlPath = htmlPath;\n if (options?.expandRoot) {\n const originalHtml = readFileSync(resolve(htmlPath), \"utf-8\");\n const expandedHtml = expandRootWidth(originalHtml);\n renderHtmlPath = resolve(outputDir, `code-expanded-${suffix}.html`);\n writeFileSync(renderHtmlPath, expandedHtml);\n }\n const codePngPath = resolve(outputDir, `code-${suffix}.png`);\n await renderCodeScreenshot(renderHtmlPath, codePngPath, { width: logicalW, height: logicalH }, exportScale);\n\n const figmaCopyPath = resolve(outputDir, `figma-${suffix}.png`);\n copyFileSync(figmaScreenshotPath, figmaCopyPath);\n\n const diffPath = resolve(outputDir, `diff-${suffix}.png`);\n const compareOpts: CompareOptions = { sizeMismatch };\n if (threshold !== undefined) compareOpts.threshold = threshold;\n return compareScreenshots(figmaCopyPath, codePngPath, diffPath, compareOpts);\n}\n","import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { randomUUID } from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst AIREADY_DIR = join(homedir(), \".canicode\");\nconst CONFIG_PATH = join(AIREADY_DIR, \"config.json\");\nconst REPORTS_DIR = join(AIREADY_DIR, \"reports\");\n\ninterface AireadyConfig {\n figmaToken?: string;\n telemetry?: boolean;\n posthogApiKey?: string;\n sentryDsn?: string;\n deviceId?: string;\n}\n\nfunction hardenPermissions(path: string, mode: number): void {\n if (process.platform !== \"win32\") {\n chmodSync(path, mode);\n }\n}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true, mode: 0o700 });\n }\n hardenPermissions(dir, 0o700);\n}\n\nexport function readConfig(): AireadyConfig {\n if (!existsSync(CONFIG_PATH)) {\n return {};\n }\n try {\n const raw = readFileSync(CONFIG_PATH, \"utf-8\");\n return JSON.parse(raw) as AireadyConfig;\n } catch {\n return {};\n }\n}\n\nexport function writeConfig(config: AireadyConfig): void {\n ensureDir(AIREADY_DIR);\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n encoding: \"utf-8\",\n mode: 0o600,\n });\n hardenPermissions(CONFIG_PATH, 0o600);\n}\n\nexport function getFigmaToken(): string | undefined {\n // Priority: env var > config file\n return process.env[\"FIGMA_TOKEN\"] ?? readConfig().figmaToken;\n}\n\nexport function setFigmaToken(token: string): void {\n const config = readConfig();\n config.figmaToken = token;\n writeConfig(config);\n}\n\nexport function hasConfig(): boolean {\n return existsSync(CONFIG_PATH);\n}\n\nexport function getConfigPath(): string {\n return CONFIG_PATH;\n}\n\nexport function getReportsDir(): string {\n return REPORTS_DIR;\n}\n\nexport function ensureReportsDir(): void {\n ensureDir(AIREADY_DIR);\n ensureDir(REPORTS_DIR);\n}\n\nexport function getTelemetryEnabled(): boolean {\n return readConfig().telemetry !== false;\n}\n\nexport function setTelemetryEnabled(enabled: boolean): void {\n const config = readConfig();\n config.telemetry = enabled;\n writeConfig(config);\n}\n\nexport function getPosthogApiKey(): string | undefined {\n return process.env[\"POSTHOG_API_KEY\"] ?? readConfig().posthogApiKey;\n}\n\nexport function getSentryDsn(): string | undefined {\n return process.env[\"SENTRY_DSN\"] ?? readConfig().sentryDsn;\n}\n\n/**\n * Get or create a stable anonymous device ID for telemetry.\n * Stored in ~/.canicode/config.json, persists across sessions.\n */\nexport function getDeviceId(): string {\n const config = readConfig();\n if (config.deviceId) return config.deviceId;\n\n const id = randomUUID();\n config.deviceId = id;\n writeConfig(config);\n return id;\n}\n\n/**\n * Initialize canicode: write config + create reports dir\n */\nexport function initAiready(token: string): void {\n setFigmaToken(token);\n ensureReportsDir();\n}\n","/**\n * Typed event definitions for PostHog analytics.\n * All events are prefixed with `cic_` (CanICode) to distinguish\n * from noise/spam in PostHog dashboards.\n *\n * Only event metadata is tracked — no design data, tokens, or file contents.\n */\n\n/** Event name prefix — use this to filter genuine events in PostHog */\nexport const EVENT_PREFIX = \"cic_\";\n\nexport const EVENTS = {\n // Analysis\n ANALYSIS_STARTED: `${EVENT_PREFIX}analysis_started`,\n ANALYSIS_COMPLETED: `${EVENT_PREFIX}analysis_completed`,\n ANALYSIS_FAILED: `${EVENT_PREFIX}analysis_failed`,\n\n // Report\n REPORT_GENERATED: `${EVENT_PREFIX}report_generated`,\n COMMENT_POSTED: `${EVENT_PREFIX}comment_posted`,\n COMMENT_FAILED: `${EVENT_PREFIX}comment_failed`,\n\n // MCP\n MCP_TOOL_CALLED: `${EVENT_PREFIX}mcp_tool_called`,\n\n // CLI\n CLI_COMMAND: `${EVENT_PREFIX}cli_command`,\n CLI_INIT: `${EVENT_PREFIX}cli_init`,\n} as const;\n\nexport type EventName = (typeof EVENTS)[keyof typeof EVENTS];\n","/**\n * Unified fetch-based monitoring capture for all environments (CLI, MCP, browser, plugin).\n *\n * No external dependencies — uses native `fetch` (Node 18+ / browser).\n * All operations are fire-and-forget; never throws.\n */\n\nimport type { MonitoringConfig } from \"./types.js\";\n\nlet monitoringEnabled = false;\nlet posthogApiKey: string | undefined;\nlet sentryDsn: string | undefined;\nlet distinctId = \"anonymous\";\nlet environment = \"unknown\";\nlet version = \"unknown\";\nlet commonProps: Record<string, unknown> = {};\n\n/** Generate a simple UUID v4 (no crypto dependency needed for monitoring) */\nfunction uuid4(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/** Parse Sentry DSN into components */\nfunction parseSentryDsn(dsn: string): { key: string; host: string; projectId: string } | null {\n try {\n // DSN format: https://{key}@{host}/{projectId}\n const url = new URL(dsn);\n const key = url.username;\n const projectId = url.pathname.slice(1); // remove leading /\n const host = url.protocol + \"//\" + url.host;\n if (!key || !projectId) return null;\n return { key, host, projectId };\n } catch {\n return null;\n }\n}\n\nexport function initCapture(config: MonitoringConfig): void {\n if (config.enabled === false) return;\n if (!config.posthogApiKey && !config.sentryDsn) return;\n\n monitoringEnabled = true;\n posthogApiKey = config.posthogApiKey;\n sentryDsn = config.sentryDsn;\n distinctId = config.distinctId ?? \"anonymous\";\n environment = config.environment ?? \"unknown\";\n version = config.version ?? \"unknown\";\n commonProps = {\n _sdk: \"canicode\",\n _sdk_version: version,\n _env: environment,\n };\n}\n\nexport function captureEvent(event: string, properties?: Record<string, unknown>): void {\n if (!monitoringEnabled || !posthogApiKey) return;\n\n try {\n fetch(\"https://us.i.posthog.com/i/v0/e/\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n api_key: posthogApiKey,\n event,\n distinct_id: distinctId,\n properties: { ...commonProps, ...properties },\n timestamp: new Date().toISOString(),\n }),\n }).catch(() => {});\n } catch {\n // never throw from monitoring\n }\n}\n\nexport function captureError(error: Error, context?: Record<string, unknown>): void {\n if (!monitoringEnabled) return;\n\n // Send to Sentry via envelope API\n if (sentryDsn) {\n const parsed = parseSentryDsn(sentryDsn);\n if (parsed) {\n try {\n const eventId = uuid4();\n const envelope = [\n JSON.stringify({ event_id: eventId, sent_at: new Date().toISOString(), dsn: sentryDsn }),\n JSON.stringify({ type: \"event\", content_type: \"application/json\" }),\n JSON.stringify({\n event_id: eventId,\n exception: { values: [{ type: error.name, value: error.message }] },\n platform: \"node\",\n environment,\n release: `canicode@${version}`,\n timestamp: Date.now() / 1000,\n extra: context,\n }),\n ].join(\"\\n\");\n\n fetch(`${parsed.host}/api/${parsed.projectId}/envelope/`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-sentry-envelope\",\n \"X-Sentry-Auth\": `Sentry sentry_version=7, sentry_key=${parsed.key}`,\n },\n body: envelope,\n }).catch(() => {});\n } catch {\n // never throw from monitoring\n }\n }\n }\n\n // Also send to PostHog as error event\n captureEvent(\"cic_error\", { error: error.message, ...context });\n}\n\nexport function shutdownCapture(): void {\n monitoringEnabled = false;\n posthogApiKey = undefined;\n sentryDsn = undefined;\n distinctId = \"anonymous\";\n environment = \"unknown\";\n version = \"unknown\";\n commonProps = {};\n}\n","/**\n * Shared monitoring module that works across CLI, MCP, and browser environments.\n *\n * Key design principles:\n * - If no API keys are configured, all functions are silent no-ops\n * - All tracking is fire-and-forget (never blocks or throws)\n * - Zero external dependencies — uses native fetch (Node 18+ / browser)\n * - CLI users can opt out via `canicode config --no-telemetry`\n * - No design data, tokens, or file contents are ever sent\n */\n\nexport type { MonitoringConfig } from \"./types.js\";\nexport { EVENTS } from \"./events.js\";\nexport type { EventName } from \"./events.js\";\n\nimport type { MonitoringConfig } from \"./types.js\";\nimport { initCapture, captureEvent, captureError, shutdownCapture } from \"./capture.js\";\n\n/**\n * Initialise monitoring for the current environment.\n * Safe to call multiple times — subsequent calls are ignored.\n */\nexport function initMonitoring(config: MonitoringConfig): void {\n initCapture(config);\n}\n\n/**\n * Track an analytics event. Fire-and-forget; never throws.\n */\nexport function trackEvent(event: string, properties?: Record<string, unknown>): void {\n try {\n captureEvent(event, properties);\n } catch {\n // never throw from monitoring\n }\n}\n\n/**\n * Track an error. Fire-and-forget; never throws.\n */\nexport function trackError(error: Error, context?: Record<string, unknown>): void {\n try {\n captureError(error, context);\n } catch {\n // never throw from monitoring\n }\n}\n\n/**\n * Shut down monitoring. Call before process exit.\n */\nexport function shutdownMonitoring(): void {\n try {\n shutdownCapture();\n } catch {\n // never throw from monitoring\n }\n}\n","/**\n * Monitoring keys injected at build time via tsup `define`.\n * These are replaced with actual values during CI builds.\n * Locally they default to empty strings (monitoring disabled).\n */\n\ndeclare const __POSTHOG_API_KEY__: string;\ndeclare const __SENTRY_DSN__: string;\n\nexport const POSTHOG_API_KEY: string =\n typeof __POSTHOG_API_KEY__ !== \"undefined\" ? __POSTHOG_API_KEY__ : \"\";\nexport const SENTRY_DSN: string =\n typeof __SENTRY_DSN__ !== \"undefined\" ? __SENTRY_DSN__ : \"\";\n","/**\n * Built-in documentation for canicode CLI\n */\n\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../../package.json\") as { version: string };\n\n/** Print the docs index with available topics. */\nexport function printDocsIndex(): void {\n console.log(`\nCANICODE DOCUMENTATION (v${pkg.version})\n\n canicode docs setup Full setup guide (CLI, MCP, Skills)\n canicode docs config Config override guide + example\n canicode docs implement Design-to-code package guide\n canicode docs scoring Scoring model explanation\n\nFull documentation: github.com/let-sunny/canicode#readme\n`.trimStart());\n}\n\n/** Print the setup guide (CLI, MCP, Skills). */\nexport function printDocsSetup(): void {\n console.log(`\nCANICODE SETUP GUIDE\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n 1. CLI (REST API)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Install:\n npm install -g canicode\n\n Setup:\n canicode init --token figd_xxxxxxxxxxxxx\n (saved to ~/.canicode/config.json, reports go to ~/.canicode/reports/)\n\n Use:\n canicode analyze \"https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\"\n (opens report in browser automatically, use --no-open to disable)\n\n Options:\n --preset strict|relaxed|dev-friendly|ai-ready\n --config ./my-config.json\n --no-open Don't open report in browser\n\n Output:\n ~/.canicode/reports/report-YYYY-MM-DD-HH-mm-<filekey>.html\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n 2. CLAUDE CODE SKILL (requires FIGMA_TOKEN)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Setup:\n cp -r .claude/skills/canicode /your-project/.claude/skills/\n\n Use (in Claude Code):\n /canicode https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n TOKEN PRIORITY\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n 1. --token flag (one-time override)\n 2. FIGMA_TOKEN env var (CI/CD)\n 3. ~/.canicode/config.json (canicode init)\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n WHICH ONE SHOULD I USE?\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n CI/CD, automation -> CLI + FIGMA_TOKEN env var\n Claude Code (full) -> canicode MCP server + FIGMA_TOKEN\n Claude Code (light) -> /canicode skill + FIGMA_TOKEN\n In Figma -> Figma Plugin\n Browser -> Web App (GitHub Pages)\n Quick trial, offline -> CLI + JSON fixtures\n`.trimStart());\n}\n\n/** Print config override guide with examples. */\nexport function printDocsConfig(): void {\n console.log(`\nCONFIG GUIDE\n\nOverride canicode's default rule scores, severity, and filters.\n\nSTRUCTURE\n - excludeNodeTypes: node types to skip (e.g. VECTOR, BOOLEAN_OPERATION)\n - excludeNodeNames: name patterns to skip (e.g. icon, ico)\n - gridBase: spacing grid unit, default 4\n - rules: per-rule overrides (score, severity, enabled)\n\nEXAMPLE\n {\n \"excludeNodeTypes\": [],\n \"excludeNodeNames\": [],\n \"gridBase\": 2,\n \"rules\": {\n \"no-auto-layout\": { \"score\": -15, \"severity\": \"blocking\" },\n \"raw-value\": { \"score\": -5 },\n \"non-semantic-name\": { \"enabled\": false }\n }\n }\n\nUSAGE\n canicode analyze <url> --config ./my-config.json\n\n Full guide: docs/CUSTOMIZATION.md\n Examples: examples/config.json\n`.trimStart());\n}\n\nfunction printDocsVisualCompare(): void {\n console.log(`\nVISUAL COMPARE — Pixel-level comparison between Figma and AI-generated code\n\nUSAGE\n canicode visual-compare ./index.html --figma-url 'https://www.figma.com/design/ABC/File?node-id=1-234'\n\nOPTIONS\n --figma-url <url> Figma URL with node-id (required)\n --token <token> Figma API token (or FIGMA_TOKEN env var)\n --output <dir> Output directory (default: /tmp/canicode-visual-compare)\n --width <px> Logical viewport width in CSS px (omit = infer from Figma PNG ÷ export scale)\n --height <px> Logical viewport height in CSS px (omit = infer from Figma PNG ÷ export scale)\n --figma-scale <n> Figma Images API scale (default: 2, matches save-fixture @2x PNGs)\n\nOUTPUT FILES\n /tmp/canicode-visual-compare/\n figma.png Figma screenshot (default scale=2)\n code.png Playwright render (devicePixelRatio matched to export scale)\n diff.png Pixel diff (red = different pixels)\n\nJSON OUTPUT (stdout)\n {\n \"similarity\": 87, // 0-100%\n \"diffPixels\": 1340,\n \"totalPixels\": 102400,\n \"width\": 800,\n \"height\": 600,\n \"figmaScreenshot\": \"/tmp/.../figma.png\",\n \"codeScreenshot\": \"/tmp/.../code.png\",\n \"diff\": \"/tmp/.../diff.png\"\n }\n\nHOW IT WORKS\n 1. Fetches Figma screenshot via REST API (default scale=2)\n 2. Infers logical CSS viewport (PNG size ÷ scale) unless --width/--height are set\n 3. Renders HTML in Playwright with matching devicePixelRatio so code.png matches figma.png pixels\n 4. Compares pixel-by-pixel with pixelmatch (threshold: 0.1)\n 5. Returns similarity % and diff image\n\nREQUIREMENTS\n npx playwright install chromium\n Figma API token with read access\n`.trimStart());\n}\n\nfunction printDocsDesignTree(): void {\n console.log(`\nDESIGN TREE — Generate DOM-like design tree from Figma fixture\n\nUSAGE\n canicode design-tree ./fixtures/design\n canicode design-tree ./fixtures/design --output tree.txt\n canicode design-tree \"https://www.figma.com/design/ABC/File?node-id=1-234\"\n\nOPTIONS\n --token <token> Figma API token (for URL input)\n --output <path> Output file (default: stdout)\n\nOUTPUT FORMAT\n Each node = one line: name (TYPE, WxH) + CSS-ready styles\n Indentation shows parent-child relationships\n\n Hero Form (INSTANCE, 375x960)\n style: display: flex; flex-direction: column; gap: 32px; background: #F5F5F5\n Title (TEXT, 117x58)\n style: font-family: \"Inter\"; font-size: 48px; color: #2C2C2C; text: \"Title\"\n\nUSE CASES\n Feed to AI for code generation (4KB vs 250KB raw JSON)\n Calibration pipeline (Converter uses this)\n Quick design structure inspection\n`.trimStart());\n}\n\n/** Print the implement command guide. */\nexport function printDocsImplement(): void {\n console.log(`\nDESIGN-TO-CODE IMPLEMENTATION GUIDE\n\nPrepare everything an AI needs to implement a Figma design as code.\n\nUSAGE\n canicode implement <figma-url-or-fixture> [options]\n\nOPTIONS\n --prompt <path> Custom prompt file (default: built-in HTML+CSS)\n --image-scale <n> Image export scale: 2 for PC (default), 3 for mobile\n --output <dir> Output directory (default: ./canicode-implement/)\n --token <token> Figma API token (for live URLs)\n\nOUTPUT\n canicode-implement/\n analysis.json Analysis report with issues and scores\n design-tree.txt DOM-like tree with CSS styles (~N tokens)\n images/ PNG assets with human-readable names (hero-banner@2x.png)\n vectors/ SVG assets for vector nodes\n PROMPT.md Stack-specific code generation prompt\n\nWORKFLOW\n 1. Run: canicode implement ./my-fixture --prompt ./my-react-prompt.md\n 2. Feed design-tree.txt + PROMPT.md to your AI assistant\n 3. AI generates code matching the design pixel-perfectly\n 4. Verify with: canicode visual-compare ./output.html --figma-url <url>\n\nCUSTOM PROMPT\n Default prompt generates HTML+CSS. For your own stack:\n 1. Write a prompt file (e.g. my-react-prompt.md)\n 2. Pass it: canicode implement ./fixture --prompt ./my-react-prompt.md\n The design-tree.txt format is stack-agnostic — your prompt just needs\n to describe how to convert it to your target framework.\n\nIMAGE SCALE\n --image-scale 2 PC/desktop (default) — @2x retina\n --image-scale 3 Mobile — @3x retina\n SVG vectors are scale-independent and always included.\n`.trimStart());\n}\n\n/** Print the scoring model summary with pointer to full docs. */\nexport function printDocsScoring(): void {\n console.log(`\nSCORING MODEL\n\n Score = density (70%) + diversity (30%), averaged across 6 categories.\n\n Severity weights:\n blocking 3.0x | risk 2.0x | missing-info 1.0x | suggestion 0.5x\n\n Grades: S(95) A+(90) A(85) B+(80) B(75) C+(70) C(65) D(50) F(<50)\n Floor: 5% minimum.\n\n Full documentation: https://github.com/let-sunny/canicode/wiki/Scoring-Model\n`.trimStart());\n}\n\nconst DOCS_TOPICS: Record<string, () => void> = {\n setup: printDocsSetup,\n install: printDocsSetup, // alias\n config: printDocsConfig,\n implement: printDocsImplement,\n scoring: printDocsScoring,\n \"visual-compare\": printDocsVisualCompare,\n \"design-tree\": printDocsDesignTree,\n};\n\n/** Route docs command to the appropriate topic handler. */\nexport function handleDocs(topic?: string): void {\n if (!topic) {\n printDocsIndex();\n return;\n }\n\n const handler = DOCS_TOPICS[topic];\n if (handler) {\n handler();\n } else {\n console.error(`Unknown docs topic: ${topic}`);\n console.error(`Available topics: ${Object.keys(DOCS_TOPICS).join(\", \")}`);\n process.exitCode = 1;\n }\n}\n","import type { Category } from \"../contracts/category.js\";\nimport type { RuleConfig, RuleId } from \"../contracts/rule.js\";\n\n/**\n * Maps each rule ID to its category.\n * Categories are based on ablation experiment data (PR #149, #150):\n * - pixel-critical: ΔV ≥ 5% — layout info removal directly degrades pixel accuracy\n * - responsive-critical: ΔV ≥ 15% at expanded viewport — size info critical for responsive\n * - code-quality: ΔV ≈ 0% but CSS classes -8~15 — affects code structure, not pixels\n * - token-management: raw values without design tokens — wrong input = wrong output\n * - semantic: ΔV < 2%, negligible code difference — naming and semantic issues\n */\nexport const RULE_ID_CATEGORY: Record<RuleId, Category> = {\n // Pixel Critical\n \"no-auto-layout\": \"pixel-critical\",\n \"absolute-position-in-auto-layout\": \"pixel-critical\",\n \"non-layout-container\": \"pixel-critical\",\n // Responsive Critical\n \"fixed-size-in-auto-layout\": \"responsive-critical\",\n \"missing-size-constraint\": \"responsive-critical\",\n // Code Quality\n \"missing-component\": \"code-quality\",\n \"detached-instance\": \"code-quality\",\n \"variant-structure-mismatch\": \"code-quality\",\n \"deep-nesting\": \"code-quality\",\n // Token Management\n \"raw-value\": \"token-management\",\n \"irregular-spacing\": \"token-management\",\n // Interaction\n \"missing-interaction-state\": \"interaction\",\n \"missing-prototype\": \"interaction\",\n // Semantic\n \"non-standard-naming\": \"semantic\",\n \"non-semantic-name\": \"semantic\",\n \"inconsistent-naming-convention\": \"semantic\",\n};\n\n/**\n * Central configuration for all rules.\n * Scores based on ablation experiment + AI implementation interview (#200):\n * - pixel-critical: -10 ~ -7 (layout strip caused ΔV +5.4%)\n * - responsive-critical: -8 ~ -6 (size-constraints ΔV +15.9% at responsive viewports)\n * - code-quality: -7 ~ -3 (CSS classes -8~15, no pixel impact)\n * - token-management: -5 ~ -4 (wrong input = wrong output, irregular spacing actively causes errors)\n * - interaction: -1 (uncalibrated — no metric to validate, kept minimal #210)\n * - semantic: -4 ~ -1 (non-semantic-name upgraded per interview — causes actual implementation errors)\n *\n * Category weights removed (#196) — overall score is simple average of categories.\n */\nexport const RULE_CONFIGS: Record<RuleId, RuleConfig> = {\n // ── Pixel Critical ──\n \"no-auto-layout\": {\n severity: \"blocking\",\n score: -10,\n depthWeight: 1.5,\n enabled: true,\n },\n \"absolute-position-in-auto-layout\": {\n severity: \"blocking\",\n score: -7,\n depthWeight: 1.3,\n enabled: true,\n },\n \"non-layout-container\": {\n severity: \"blocking\",\n score: -8,\n depthWeight: 1.2,\n enabled: true,\n },\n\n // ── Responsive Critical ──\n \"fixed-size-in-auto-layout\": {\n severity: \"risk\",\n score: -6,\n enabled: true,\n },\n \"missing-size-constraint\": {\n severity: \"risk\",\n score: -8,\n enabled: true,\n },\n\n // ── Code Quality ──\n \"missing-component\": {\n severity: \"risk\",\n score: -7,\n enabled: true,\n options: {\n minRepetitions: 2,\n structureMinRepetitions: 2,\n maxFingerprintDepth: 3,\n },\n },\n \"detached-instance\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"variant-structure-mismatch\": {\n severity: \"risk\",\n score: -6,\n enabled: true,\n },\n \"deep-nesting\": {\n severity: \"risk\",\n score: -3,\n enabled: true,\n options: {\n maxDepth: 5,\n },\n },\n\n // ── Token Management ──\n \"raw-value\": {\n severity: \"missing-info\",\n score: -4,\n enabled: true,\n },\n \"irregular-spacing\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n options: {\n gridBase: 2,\n },\n },\n\n // ── Interaction ──\n \"missing-interaction-state\": {\n severity: \"suggestion\",\n score: -1, // uncalibrated: no metric to validate score (#210), kept at -1 to preserve category visibility\n enabled: true,\n },\n \"missing-prototype\": {\n severity: \"missing-info\",\n score: -3,\n enabled: false, // disabled: interactionDestinations data missing from fixtures (#139)\n },\n\n // ── Semantic ──\n \"non-standard-naming\": {\n severity: \"suggestion\",\n score: -3, // higher than other naming rules: non-standard state names break interaction detection pipeline\n enabled: true,\n },\n \"non-semantic-name\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"inconsistent-naming-convention\": {\n severity: \"suggestion\",\n score: -1,\n enabled: true,\n },\n};\n\n/**\n * Preset types for different analysis modes\n */\nexport type Preset = \"relaxed\" | \"dev-friendly\" | \"ai-ready\" | \"strict\";\n\n/**\n * Get rule configs with preset applied\n */\nexport function getConfigsWithPreset(\n preset: Preset\n): Record<RuleId, RuleConfig> {\n const configs = { ...RULE_CONFIGS };\n\n switch (preset) {\n case \"relaxed\":\n // Disable blocking rules, reduce scores\n for (const [id, config] of Object.entries(configs)) {\n if (config.severity === \"blocking\") {\n configs[id as RuleId] = {\n ...config,\n severity: \"risk\",\n score: Math.round(config.score * 0.5),\n };\n }\n }\n break;\n\n case \"dev-friendly\":\n // Focus on pixel-critical and responsive-critical issues\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n const category = RULE_ID_CATEGORY[ruleId];\n if (category !== \"pixel-critical\" && category !== \"responsive-critical\") {\n configs[ruleId] = { ...config, enabled: false };\n }\n }\n break;\n\n case \"ai-ready\":\n // Boost pixel-critical and token-management rules\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n const category = RULE_ID_CATEGORY[ruleId];\n if (category === \"pixel-critical\" || category === \"token-management\") {\n configs[ruleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n }\n break;\n\n case \"strict\":\n // Increase scores but respect disabled rules\n for (const [id, config] of Object.entries(configs)) {\n configs[id as RuleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n break;\n }\n\n return configs;\n}\n\n/**\n * Get option value for a rule with type safety\n */\nexport function getRuleOption<T>(\n ruleId: RuleId,\n optionKey: string,\n defaultValue: T\n): T {\n const config = RULE_CONFIGS[ruleId];\n if (!config.options) return defaultValue;\n const value = config.options[optionKey];\n return (value as T) ?? defaultValue;\n}\n","import type { Rule, RuleConfig, RuleId } from \"../contracts/rule.js\";\nimport type { Category } from \"../contracts/category.js\";\nimport { RULE_CONFIGS } from \"./rule-config.js\";\n\n/**\n * Registry for all rules\n */\nclass RuleRegistry {\n private rules: Map<RuleId, Rule> = new Map();\n\n /**\n * Register a rule\n */\n register(rule: Rule): void {\n this.rules.set(rule.definition.id as RuleId, rule);\n }\n\n /**\n * Get a rule by ID\n */\n get(id: RuleId): Rule | undefined {\n return this.rules.get(id);\n }\n\n /**\n * Get all registered rules\n */\n getAll(): Rule[] {\n return Array.from(this.rules.values());\n }\n\n /**\n * Get rules by category\n */\n getByCategory(category: Category): Rule[] {\n return this.getAll().filter((rule) => rule.definition.category === category);\n }\n\n /**\n * Get enabled rules with their configs\n */\n getEnabled(configs: Record<RuleId, RuleConfig> = RULE_CONFIGS): Rule[] {\n return this.getAll().filter((rule) => {\n const config = configs[rule.definition.id as RuleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Get config for a rule\n */\n getConfig(\n id: RuleId,\n configs: Record<RuleId, RuleConfig> = RULE_CONFIGS\n ): RuleConfig {\n return configs[id];\n }\n\n /**\n * Check if a rule is registered\n */\n has(id: RuleId): boolean {\n return this.rules.has(id);\n }\n\n /**\n * Get count of registered rules\n */\n get size(): number {\n return this.rules.size;\n }\n}\n\n/**\n * Global rule registry instance\n */\nexport const ruleRegistry = new RuleRegistry();\n\n/**\n * Helper to create and register a rule\n */\nexport function defineRule(rule: Rule): Rule {\n ruleRegistry.register(rule);\n return rule;\n}\n","/**\n * Centralized node semantic classification.\n * All \"what is this node?\" logic lives here so rules share the same predicates.\n *\n * Categories:\n * - Container: layout containers (frame, group, component, instance)\n * - Visual: decorative/graphic elements (vector, shape, image)\n * - Interactive: user-interactable elements (button, link, tab, input, toggle)\n * - Overlay: elements that open on top (modal, drawer, dropdown)\n * - Carousel: elements that slide/swipe (carousel, slider, gallery)\n * - Token: style/variable binding checks\n * - Naming: name pattern classification\n */\n\nimport type { AnalysisNode } from \"../contracts/figma-node.js\";\n\n// ── Container classification ─────────────────────────────────────────────────\n\nexport function isContainerNode(node: AnalysisNode): boolean {\n return node.type === \"FRAME\" || node.type === \"GROUP\" || node.type === \"COMPONENT\" || node.type === \"INSTANCE\";\n}\n\nexport function hasAutoLayout(node: AnalysisNode): boolean {\n return node.layoutMode !== undefined && node.layoutMode !== \"NONE\";\n}\n\nexport function hasTextContent(node: AnalysisNode): boolean {\n return node.type === \"TEXT\" || (node.children?.some((c) => c.type === \"TEXT\") ?? false);\n}\n\nexport function hasOverlappingBounds(a: AnalysisNode, b: AnalysisNode): boolean {\n const boxA = a.absoluteBoundingBox;\n const boxB = b.absoluteBoundingBox;\n\n if (!boxA || !boxB) return false;\n\n return !(\n boxA.x + boxA.width <= boxB.x ||\n boxB.x + boxB.width <= boxA.x ||\n boxA.y + boxA.height <= boxB.y ||\n boxB.y + boxB.height <= boxA.y\n );\n}\n\n// ── Visual classification ────────────────────────────────────────────────────\n\nconst VISUAL_LEAF_TYPES = new Set([\n \"VECTOR\", \"BOOLEAN_OPERATION\", \"ELLIPSE\", \"LINE\", \"STAR\", \"REGULAR_POLYGON\", \"RECTANGLE\",\n]);\n\nexport function isVisualLeafType(type: string): boolean {\n return VISUAL_LEAF_TYPES.has(type);\n}\n\nexport function hasImageFill(node: AnalysisNode): boolean {\n if (!Array.isArray(node.fills)) return false;\n return node.fills.some(\n (fill) =>\n typeof fill === \"object\" &&\n fill !== null &&\n (fill as { type?: unknown }).type === \"IMAGE\",\n );\n}\n\nexport function isVisualOnlyNode(node: AnalysisNode): boolean {\n if (VISUAL_LEAF_TYPES.has(node.type)) return true;\n const hasOnlyVisualChildren =\n node.children !== undefined &&\n node.children.length > 0 &&\n node.children.every((c) => VISUAL_LEAF_TYPES.has(c.type));\n // Image fill only counts as visual-only when there are no content children\n if (hasImageFill(node) && (!node.children || node.children.length === 0 || hasOnlyVisualChildren)) {\n return true;\n }\n if (hasOnlyVisualChildren) return true;\n return false;\n}\n\n// ── Interactive classification ───────────────────────────────────────────────\n\nexport type StatefulComponentType = \"button\" | \"link\" | \"tab\" | \"input\" | \"toggle\";\n\n/** Name patterns → interactive type mapping */\nexport const STATEFUL_PATTERNS: Array<{ pattern: RegExp; type: StatefulComponentType }> = [\n { pattern: /\\b(btn|button|cta)\\b/i, type: \"button\" },\n { pattern: /\\b(link|anchor)\\b/i, type: \"link\" },\n { pattern: /\\b(tab|tabs)\\b/i, type: \"tab\" },\n { pattern: /\\b(nav|navigation|menu|navbar)\\b/i, type: \"tab\" },\n { pattern: /\\b(input|text-?field|search-?bar|textarea)\\b/i, type: \"input\" },\n { pattern: /\\b(select|dropdown|combo-?box)\\b/i, type: \"input\" },\n { pattern: /\\b(toggle|switch|checkbox|radio)\\b/i, type: \"toggle\" },\n];\n\nexport function getStatefulComponentType(node: AnalysisNode): StatefulComponentType | null {\n if (!node.name) return null;\n for (const entry of STATEFUL_PATTERNS) {\n if (entry.pattern.test(node.name)) return entry.type;\n }\n return null;\n}\n\nexport function isStatefulComponent(node: AnalysisNode): boolean {\n return getStatefulComponentType(node) !== null;\n}\n\n/**\n * Standard state names across web + mobile platforms.\n * Used by missing-interaction-state (to detect presence) and\n * non-standard-naming (to flag non-standard names).\n *\n * Sources:\n * - CSS: :hover, :active, :focus, :disabled, :enabled — https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/Pseudo-classes\n * - Material Design 3: Hovered, Focused, Pressed, Dragged — https://m3.material.io/foundations/interaction/states\n * - UIKit: highlighted, selected, disabled, focused — https://developer.apple.com/documentation/uikit/uicontrol/state\n */\nexport const STANDARD_STATE_NAMES = new Set([\n // CSS pseudo-classes (web)\n \"default\", \"hover\", \"active\", \"focus\", \"focused\", \"disabled\", \"enabled\",\n // Material Design 3 (Android)\n \"pressed\", \"dragged\",\n // UIKit (iOS)\n \"highlighted\",\n // Common\n \"selected\",\n]);\n\n/**\n * Patterns that look like state names but aren't in the standard set.\n * Maps common non-standard names to their standard equivalent for suggestions.\n */\nexport const STATE_NAME_SUGGESTIONS: Record<string, string> = {\n on: \"active\",\n off: \"default\",\n clicked: \"pressed\",\n tapped: \"pressed\",\n inactive: \"disabled\",\n normal: \"default\",\n rest: \"default\",\n hovered: \"hover\",\n activated: \"active\",\n checked: \"selected\",\n unchecked: \"default\",\n};\n\n/** Pattern to detect state-like variant option names (broad match) */\nexport const STATE_LIKE_PATTERN = /\\b(on|off|clicked|tapped|inactive|normal|rest|hovered|activated|checked|unchecked)\\b/i;\n\n// ── Overlay / Carousel patterns ──────────────────────────────────────────────\n\n/** Elements that open on top of current view */\nexport const OVERLAY_PATTERN = /\\b(dropdown|select|combo-?box|popover|accordion|drawer|modal|bottom-?sheet|sheet|sidebar|panel|dialog|popup|toast)\\b/i;\n\n/** Elements that swipe/slide between items */\nexport const CAROUSEL_PATTERN = /\\b(carousel|slider|swiper|slide-?show|gallery)\\b/i;\n\nexport function isOverlayNode(node: AnalysisNode): boolean {\n return node.name !== undefined && OVERLAY_PATTERN.test(node.name);\n}\n\nexport function isCarouselNode(node: AnalysisNode): boolean {\n return node.name !== undefined && CAROUSEL_PATTERN.test(node.name);\n}\n\n// ── Token classification ─────────────────────────────────────────────────────\n\nexport function hasStyleReference(node: AnalysisNode, styleType: string): boolean {\n return node.styles !== undefined && styleType in node.styles;\n}\n\nexport function hasBoundVariable(node: AnalysisNode, key: string): boolean {\n return node.boundVariables !== undefined && key in node.boundVariables;\n}\n\n// ── Naming patterns ──────────────────────────────────────────────────────────\n\n/** Figma default name patterns (Frame 1, Group 2, etc.) */\nexport const DEFAULT_NAME_PATTERNS = [\n /^Frame\\s*\\d*$/i,\n /^Group\\s*\\d*$/i,\n /^Rectangle\\s*\\d*$/i,\n /^Ellipse\\s*\\d*$/i,\n /^Vector\\s*\\d*$/i,\n /^Line\\s*\\d*$/i,\n /^Text\\s*\\d*$/i,\n /^Image\\s*\\d*$/i,\n /^Component\\s*\\d*$/i,\n /^Instance\\s*\\d*$/i,\n];\n\nexport function isDefaultName(name: string): boolean {\n return DEFAULT_NAME_PATTERNS.some((pattern) => pattern.test(name));\n}\n\n/** Shape-only non-semantic names */\nexport const NON_SEMANTIC_NAMES = [\n \"rectangle\", \"ellipse\", \"vector\", \"line\", \"polygon\",\n \"star\", \"path\", \"shape\", \"image\", \"fill\", \"stroke\",\n];\n\nexport function isNonSemanticName(name: string): boolean {\n return NON_SEMANTIC_NAMES.includes(name.toLowerCase().trim());\n}\n\n// ── Exclusion ────────────────────────────────────────────────────────────────\n\nexport const EXCLUDED_NAME_PATTERN = /(badge|close|dismiss|overlay|float|fab|dot|indicator|corner|decoration|tag|status|notification|icon|ico|image|asset|filter|dim|dimmed|bg|background|logo|avatar|divider|separator|nav|navigation|gnb|header|footer|sidebar|toolbar|modal|dialog|popup|toast|tooltip|dropdown|menu|sticky|spinner|loader|cursor|cta|chatbot|thumb|thumbnail|tabbar|tab-bar|statusbar|status-bar)/i;\n\nexport function isExcludedName(name: string): boolean {\n return EXCLUDED_NAME_PATTERN.test(name);\n}\n","import type { AnalysisNode } from \"../contracts/figma-node.js\";\nimport type { RuleContext } from \"../contracts/rule.js\";\nimport { isVisualLeafType, isVisualOnlyNode, isExcludedName } from \"./node-semantics.js\";\n\n// ============================================\n// Auto-layout exceptions\n// ============================================\n\n/** Frames that don't need auto-layout (only visual-leaf children like icon paths) */\nexport function isAutoLayoutExempt(node: AnalysisNode): boolean {\n if (\n node.children &&\n node.children.length > 0 &&\n node.children.every((c) => isVisualLeafType(c.type))\n ) return true;\n\n return false;\n}\n\n// ============================================\n// Absolute-position exceptions\n// ============================================\n\n/** Nodes that are allowed to use absolute positioning inside auto-layout */\nexport function isAbsolutePositionExempt(node: AnalysisNode): boolean {\n if (isVisualOnlyNode(node)) return true;\n\n // Intentional name patterns (badge, close, overlay, etc.)\n if (isExcludedName(node.name)) return true;\n\n return false;\n}\n\n// ============================================\n// Size-constraint exceptions\n// ============================================\n\n/** Nodes that don't need maxWidth even with FILL sizing */\nexport function isSizeConstraintExempt(node: AnalysisNode, context: RuleContext): boolean {\n // Already has maxWidth\n if (node.maxWidth !== undefined) return true;\n\n // Parent already has maxWidth — parent constrains the stretch\n if (context.parent?.maxWidth !== undefined) return true;\n\n // Root-level frames — they represent the screen itself\n if (context.depth <= 1) return true;\n\n return false;\n}\n\n// ============================================\n// Fixed-size exceptions\n// ============================================\n\n/** Nodes that are allowed to use fixed sizing inside auto-layout */\nexport function isFixedSizeExempt(node: AnalysisNode): boolean {\n // Visual-only nodes (icons, images, shapes) — intentionally fixed\n if (isVisualOnlyNode(node)) return true;\n\n // Excluded names (nav, header, etc.)\n if (isExcludedName(node.name)) return true;\n\n return false;\n}\n","/**\n * Centralized rule violation messages.\n * All message text lives here so CLI, web, plugin, and MCP share the same strings.\n *\n * Each message function returns { message, suggestion, guide? }:\n * - message: what's wrong (node-specific, dynamic)\n * - suggestion: how to fix it (node-specific, dynamic)\n * - guide: exemption hint (optional, when the rule auto-excludes certain cases)\n */\n\n// ── Message return type ─────────────────────────────────────────────────────\n\nexport interface ViolationMsg {\n message: string;\n suggestion: string;\n guide?: string;\n}\n\n// ── Sub-type definitions ─────────────────────────────────────────────────────\n\nexport type RawValueSubType = \"color\" | \"font\" | \"shadow\" | \"opacity\" | \"spacing\";\nexport type NoAutoLayoutSubType = \"overlapping\" | \"nested\" | \"basic\";\nexport type FixedSizeSubType = \"both-axes\" | \"horizontal\";\nexport type MissingComponentSubType = \"unused-component\" | \"name-repetition\" | \"structure-repetition\" | \"style-override\";\n\n// ── raw-value ────────────────────────────────────────────────────────────────\n\nexport const rawValueMsg = {\n color: (name: string, hex: string): ViolationMsg => ({\n message: `\"${name}\" uses raw fill color ${hex} without style or variable`,\n suggestion: `Bind to a color token`,\n }),\n font: (name: string, fontDesc: string): ViolationMsg => ({\n message: `\"${name}\" uses raw font${fontDesc} without text style`,\n suggestion: `Apply a text style`,\n }),\n shadow: (name: string, shadowType: string, details: string): ViolationMsg => ({\n message: `\"${name}\" has ${shadowType}${details} without effect style`,\n suggestion: `Apply an effect style`,\n }),\n opacity: (name: string, pct: number): ViolationMsg => ({\n message: `\"${name}\" uses raw opacity (${pct}%) without a variable binding`,\n suggestion: `Bind opacity to a variable`,\n }),\n spacing: (name: string, label: string, value: number): ViolationMsg => ({\n message: `\"${name}\" uses raw ${label} (${value}px) without a variable binding`,\n suggestion: `Bind spacing to a variable`,\n }),\n};\n\n// ── irregular-spacing ────────────────────────────────────────────────────────\n\nexport type IrregularSpacingSubType = \"padding\" | \"gap\";\n\nexport const irregularSpacingMsg = (name: string, spacing: number, gridBase: number, nearest: number): ViolationMsg => ({\n message: `\"${name}\" has spacing ${spacing}px not on ${gridBase}pt grid`,\n suggestion: `Round to nearest ${gridBase}pt multiple (${nearest}px)`,\n});\n\n// ── no-auto-layout ───────────────────────────────────────────────────────────\n\nexport const noAutoLayoutMsg = {\n overlapping: (name: string): ViolationMsg => ({\n message: `\"${name}\" has overlapping children without Auto Layout`,\n suggestion: `Apply auto-layout to separate overlapping children`,\n guide: `If this is an intentional overlay (e.g., badge on avatar), this can be ignored`,\n }),\n nested: (name: string): ViolationMsg => ({\n message: `\"${name}\" has nested containers without layout hints`,\n suggestion: `Apply auto-layout to organize nested containers`,\n guide: `Icon wrappers containing only vectors are automatically excluded`,\n }),\n basic: (name: string, arrangement: string, directionHint: string): ViolationMsg => ({\n message: `Frame \"${name}\" has no auto-layout${arrangement}`,\n suggestion: directionHint ? `Apply ${directionHint} auto-layout` : `Apply auto-layout`,\n guide: `Single-child wrappers and icon containers are automatically excluded`,\n }),\n};\n\n// ── absolute-position-in-auto-layout ─────────────────────────────────────────\n\nexport const absolutePositionMsg = (name: string, parentName: string): ViolationMsg => ({\n message: `\"${name}\" uses absolute positioning inside Auto Layout parent \"${parentName}\"`,\n suggestion: `Remove absolute positioning or restructure outside the auto-layout parent`,\n guide: `If this is a badge or overlay, name it with \"badge\", \"overlay\", or \"icon\" to auto-exclude`,\n});\n\n// ── fixed-size-in-auto-layout ────────────────────────────────────────────────\n\nexport const fixedSizeMsg = {\n bothAxes: (name: string, width: number, height: number): ViolationMsg => ({\n message: `Container \"${name}\" (${width}×${height}) uses fixed size on both axes inside auto-layout`,\n suggestion: `Set at least one axis to HUG or FILL`,\n }),\n horizontal: (name: string, width: number): ViolationMsg => ({\n message: `\"${name}\" has fixed width (${width}px) inside auto-layout`,\n suggestion: `Set horizontal sizing to FILL`,\n }),\n};\n\n// ── missing-size-constraint ──────────────────────────────────────────────────\n\nexport type MissingSizeConstraintSubType = \"max-width\" | \"min-width\" | \"wrap\" | \"grid\";\n\nexport const missingSizeConstraintMsg = {\n maxWidth: (name: string, currentWidth: string): ViolationMsg => ({\n message: `\"${name}\" uses FILL width (currently ${currentWidth}) without max-width`,\n suggestion: `Add maxWidth to prevent stretching on large screens`,\n }),\n minWidth: (name: string, currentWidth: string): ViolationMsg => ({\n message: `\"${name}\" uses FILL width (currently ${currentWidth}) without min-width`,\n suggestion: `Add minWidth to prevent collapsing on small screens`,\n }),\n wrap: (name: string): ViolationMsg => ({\n message: `\"${name}\" is in a wrap container without min-width`,\n suggestion: `Add minWidth to control when wrapping occurs`,\n }),\n grid: (name: string): ViolationMsg => ({\n message: `\"${name}\" is in a grid layout without size constraints`,\n suggestion: `Add min/max-width for proper column sizing`,\n }),\n};\n\n// ── non-layout-container (was group-usage) ───────────────────────────────────\n\nexport type NonLayoutContainerSubType = \"group\" | \"section\";\n\nexport const nonLayoutContainerMsg = {\n group: (name: string): ViolationMsg => ({\n message: `\"${name}\" is a Group`,\n suggestion: `Convert to Frame and apply auto-layout`,\n }),\n section: (name: string): ViolationMsg => ({\n message: `\"${name}\" is a Section used as layout container`,\n suggestion: `Convert to Frame and apply auto-layout`,\n }),\n};\n\n// ── deep-nesting ─────────────────────────────────────────────────────────────\n\nexport const deepNestingMsg = (name: string, depth: number, maxDepth: number): ViolationMsg => ({\n message: `\"${name}\" is nested ${depth} levels deep within its component (max: ${maxDepth})`,\n suggestion: `Extract into a sub-component to reduce depth`,\n});\n\n// ── missing-component ────────────────────────────────────────────────────────\n\nexport const missingComponentMsg = {\n unusedComponent: (componentName: string, count: number): ViolationMsg => ({\n message: `Component \"${componentName}\" exists but ${count} repeated frames found instead of instances`,\n suggestion: `Replace frames with component instances`,\n }),\n nameRepetition: (name: string, count: number): ViolationMsg => ({\n message: `\"${name}\" appears ${count} times`,\n suggestion: `Extract as a reusable component`,\n }),\n structureRepetition: (name: string, siblingCount: number): ViolationMsg => ({\n message: `\"${name}\" and ${siblingCount} sibling frame(s) share the same internal structure`,\n suggestion: `Extract a shared component from the repeated structure`,\n }),\n styleOverride: (componentName: string, overrides: string[]): ViolationMsg => ({\n message: `\"${componentName}\" instance has style overrides (${overrides.join(\", \")})`,\n suggestion: `Create a new variant for this style combination`,\n }),\n};\n\n// ── detached-instance ────────────────────────────────────────────────────────\n\nexport const detachedInstanceMsg = (name: string, componentName: string): ViolationMsg => ({\n message: `\"${name}\" may be a detached instance of component \"${componentName}\"`,\n suggestion: `Restore as an instance of \"${componentName}\" or create a new variant`,\n});\n\n// ── variant-structure-mismatch ───────────────────────────────────────────────\n\nexport const variantStructureMismatchMsg = (name: string, mismatchCount: number, totalVariants: number): ViolationMsg => ({\n message: `\"${name}\" has ${mismatchCount}/${totalVariants} variants with different child structures`,\n suggestion: `Unify variant structures using visibility toggles for optional elements`,\n});\n\n// ── non-standard-naming ──────────────────────────────────────────────────────\n\nexport type NonStandardNamingSubType = \"state-name\";\n\nexport const nonStandardNamingMsg = {\n stateName: (name: string, nonStandard: string, suggested: string): ViolationMsg => ({\n message: `\"${name}\" has non-standard state name \"${nonStandard}\"`,\n suggestion: `Use \"${suggested}\" for dev-friendly naming`,\n }),\n};\n\n// ── non-semantic-name (merged: default-name + non-semantic-name) ─────────────\n\nexport type NonSemanticNameSubType = \"frame\" | \"group\" | \"vector\" | \"shape\" | \"text\" | \"image\" | \"component\" | \"instance\" | \"shape-name\";\n\nconst DEFAULT_NAME_SUBTYPE_MAP: Record<string, NonSemanticNameSubType> = {\n FRAME: \"frame\",\n GROUP: \"group\",\n RECTANGLE: \"shape\",\n ELLIPSE: \"shape\",\n VECTOR: \"vector\",\n LINE: \"vector\",\n STAR: \"shape\",\n REGULAR_POLYGON: \"shape\",\n TEXT: \"text\",\n IMAGE: \"image\",\n COMPONENT: \"component\",\n COMPONENT_SET: \"component\",\n INSTANCE: \"instance\",\n};\n\nexport function getDefaultNameSubType(nodeType: string): NonSemanticNameSubType {\n return DEFAULT_NAME_SUBTYPE_MAP[nodeType] ?? \"frame\";\n}\n\nconst NON_SEMANTIC_EXAMPLES: Record<string, string> = {\n FRAME: '\"Header\", \"ProductCard\", \"Sidebar\"',\n GROUP: '\"NavItems\", \"ButtonGroup\", \"CardContent\"',\n VECTOR: '\"ArrowIcon\", \"CheckMark\", \"LogoSymbol\"',\n LINE: '\"Divider\", \"Separator\", \"Underline\"',\n RECTANGLE: '\"Background\", \"Divider\", \"Overlay\"',\n ELLIPSE: '\"AvatarShape\", \"StatusDot\", \"Badge\"',\n STAR: '\"RatingIcon\", \"FavoriteIcon\", \"StarBadge\"',\n REGULAR_POLYGON: '\"PlayIcon\", \"WarningIcon\", \"ShapeDecor\"',\n TEXT: '\"PageTitle\", \"Description\", \"Price\"',\n IMAGE: '\"Avatar\", \"ProductPhoto\", \"Banner\"',\n COMPONENT: '\"PrimaryButton\", \"InputField\", \"CardTemplate\"',\n COMPONENT_SET: '\"Button\", \"Input\", \"Card\"',\n INSTANCE: '\"CloseButton\", \"UserAvatar\", \"StarIcon\"',\n};\n\nexport const nonSemanticNameMsg = (type: string, name: string): ViolationMsg => {\n const examples = NON_SEMANTIC_EXAMPLES[type] ?? '\"Header\", \"ProductCard\", \"Icon\"';\n return {\n message: `${type} \"${name}\" is a non-semantic name`,\n suggestion: `Rename to describe its role (e.g., ${examples})`,\n };\n};\n\n// ── missing-interaction-state ─────────────────────────────────────────────────\n\nexport type MissingInteractionStateSubType = \"hover\" | \"disabled\" | \"active\" | \"focus\";\n\nexport const missingInteractionStateMsg = {\n hover: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Hover state variant`,\n suggestion: `Add a State=Hover variant`,\n }),\n disabled: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Disabled state variant`,\n suggestion: `Add a State=Disabled variant`,\n }),\n active: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Active state variant`,\n suggestion: `Add a State=Active variant`,\n }),\n focus: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks interactive but has no Focus state variant`,\n suggestion: `Add a State=Focus variant`,\n }),\n};\n\n// ── missing-prototype ─────────────────────────────────────────────────────────\n\nexport type MissingPrototypeSubType = \"button\" | \"navigation\" | \"tab\" | \"overlay\" | \"carousel\" | \"input\" | \"toggle\";\n\nexport const missingPrototypeMsg = {\n button: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a button but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define the click behavior`,\n }),\n navigation: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a navigation link but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define the destination`,\n }),\n tab: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a tab but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define tab switching behavior`,\n }),\n overlay: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like an overlay trigger but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define open/close behavior`,\n }),\n carousel: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a carousel but has no interaction prototype`,\n suggestion: `Add an ON_CLICK or ON_DRAG interaction to define slide navigation`,\n }),\n input: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like an input but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define focus/interaction behavior`,\n }),\n toggle: (name: string): ViolationMsg => ({\n message: `\"${name}\" looks like a toggle but has no click prototype`,\n suggestion: `Add an ON_CLICK interaction to define on/off behavior`,\n }),\n};\n\n// ── inconsistent-naming-convention ───────────────────────────────────────────\n\nexport const inconsistentNamingMsg = (name: string, nodeConvention: string, dominantConvention: string, suggested: string): ViolationMsg => ({\n message: `\"${name}\" uses ${nodeConvention} while siblings use ${dominantConvention}`,\n suggestion: `Rename to \"${suggested}\"`,\n guide: `This checks sibling layers at the same level — you don't have to follow the exact suggestion, just keep naming consistent across siblings`,\n});\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { isAutoLayoutExempt, isAbsolutePositionExempt, isSizeConstraintExempt, isFixedSizeExempt } from \"../rule-exceptions.js\";\nimport { noAutoLayoutMsg, absolutePositionMsg, fixedSizeMsg, missingSizeConstraintMsg, nonLayoutContainerMsg, deepNestingMsg } from \"../rule-messages.js\";\nimport { isContainerNode, hasAutoLayout, hasTextContent, hasOverlappingBounds } from \"../node-semantics.js\";\n\n// ============================================\n// no-auto-layout (merged: absorbs ambiguous-structure + missing-layout-hint)\n// ============================================\n\nconst noAutoLayoutDef: RuleDefinition = {\n id: \"no-auto-layout\",\n name: \"No Auto Layout\",\n category: \"pixel-critical\",\n why: \"Without Auto Layout, AI must guess positioning from absolute coordinates instead of reading explicit layout rules\",\n impact: \"Generated code uses hardcoded positions that break on any content or screen size change\",\n fix: \"Apply Auto Layout to create clear, explicit structure — enables AI to generate flexbox/grid instead of absolute positioning\",\n};\n\nconst noAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!isContainerNode(node)) return null;\n if (hasAutoLayout(node)) return null;\n if (!node.children || node.children.length === 0) return null;\n\n if (isAutoLayoutExempt(node)) return null;\n\n // Priority 1: Check for overlapping visible children (ambiguous-structure)\n if (node.children.length >= 2) {\n for (let i = 0; i < node.children.length; i++) {\n for (let j = i + 1; j < node.children.length; j++) {\n const childA = node.children[i];\n const childB = node.children[j];\n if (!childA || !childB) continue;\n\n if (hasOverlappingBounds(childA, childB)) {\n if (childA.visible !== false && childB.visible !== false) {\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"overlapping\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.overlapping(node.name),\n };\n }\n }\n }\n }\n }\n\n // Priority 2: Check for nested containers without layout hints (missing-layout-hint)\n if (node.children.length >= 2) {\n const nestedContainers = node.children.filter((c) => isContainerNode(c));\n if (nestedContainers.length >= 2) {\n const withoutLayout = nestedContainers.filter((c) => !hasAutoLayout(c));\n if (withoutLayout.length >= 2) {\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"nested\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.nested(node.name),\n };\n }\n }\n }\n\n // Priority 3: Basic no-auto-layout check (FRAME only)\n if (node.type !== \"FRAME\") return null;\n\n const childCount = node.children?.length ?? 0;\n let directionHint = \"\";\n if (node.children && node.children.length >= 2) {\n const boxes = node.children.filter(c => c.absoluteBoundingBox).map(c => c.absoluteBoundingBox!);\n if (boxes.length >= 2) {\n const yRange = Math.max(...boxes.map(b => b.y)) - Math.min(...boxes.map(b => b.y));\n const xRange = Math.max(...boxes.map(b => b.x)) - Math.min(...boxes.map(b => b.x));\n directionHint = yRange > xRange ? \"VERTICAL\" : \"HORIZONTAL\";\n }\n }\n\n const arrangement = directionHint\n ? ` (${childCount} children arranged ${directionHint.toLowerCase()}ly)`\n : childCount > 0 ? ` (${childCount} children)` : \"\";\n\n return {\n ruleId: noAutoLayoutDef.id,\n subType: \"basic\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...noAutoLayoutMsg.basic(node.name, arrangement, directionHint),\n };\n};\n\nexport const noAutoLayout = defineRule({\n definition: noAutoLayoutDef,\n check: noAutoLayoutCheck,\n});\n\n// ============================================\n// absolute-position-in-auto-layout\n// ============================================\n\nconst absolutePositionInAutoLayoutDef: RuleDefinition = {\n id: \"absolute-position-in-auto-layout\",\n name: \"Absolute Position in Auto Layout\",\n category: \"pixel-critical\",\n why: \"Absolute positioning inside Auto Layout contradicts the parent's layout rules — AI sees conflicting instructions\",\n impact: \"AI must decide whether to follow the parent's flexbox or the child's absolute position — often gets it wrong\",\n fix: \"Remove absolute positioning or use proper Auto Layout alignment\",\n};\n\nconst absolutePositionInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (node.layoutPositioning !== \"ABSOLUTE\") return null;\n\n if (isAbsolutePositionExempt(node)) return null;\n\n return {\n ruleId: absolutePositionInAutoLayoutDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...absolutePositionMsg(node.name, context.parent.name),\n };\n};\n\nexport const absolutePositionInAutoLayout = defineRule({\n definition: absolutePositionInAutoLayoutDef,\n check: absolutePositionInAutoLayoutCheck,\n});\n\n// ============================================\n// fixed-size-in-auto-layout (merged: absorbs fixed-width-in-responsive-context)\n// ============================================\n\nconst fixedSizeInAutoLayoutDef: RuleDefinition = {\n id: \"fixed-size-in-auto-layout\",\n name: \"Fixed Size in Auto Layout\",\n category: \"responsive-critical\",\n why: \"Fixed sizing inside Auto Layout contradicts the flexible layout intent\",\n impact: \"AI generates a rigid element inside a flex container — the layout won't respond to content changes\",\n fix: \"Use 'Hug' or 'Fill' for at least one axis. Both-axes FIXED → layout completely rigid; horizontal-only FIXED → width won't adapt to parent resize\",\n};\n\nconst fixedSizeInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (!isContainerNode(node)) return null;\n if (!node.absoluteBoundingBox) return null;\n\n if (isFixedSizeExempt(node)) return null;\n\n const { width, height } = node.absoluteBoundingBox;\n\n // Check both axes FIXED (stronger case)\n const hFixed =\n node.layoutSizingHorizontal === \"FIXED\" || node.layoutSizingHorizontal === undefined;\n const vFixed =\n node.layoutSizingVertical === \"FIXED\" || node.layoutSizingVertical === undefined;\n\n if (hFixed && vFixed) {\n // Skip if it has its own auto-layout\n if (node.layoutMode && node.layoutMode !== \"NONE\") return null;\n\n return {\n ruleId: fixedSizeInAutoLayoutDef.id,\n subType: \"both-axes\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...fixedSizeMsg.bothAxes(node.name, width, height),\n };\n }\n\n // Check horizontal-only FIXED (lighter case, from fixed-width-in-responsive-context)\n if (hFixed && !vFixed) {\n // Use layoutSizingHorizontal if available (accurate)\n if (node.layoutSizingHorizontal) {\n if (node.layoutSizingHorizontal !== \"FIXED\") return null;\n } else {\n // Fallback: STRETCH means fill, skip\n if (node.layoutAlign === \"STRETCH\") return null;\n if (node.layoutAlign !== \"INHERIT\") return null;\n }\n\n return {\n ruleId: fixedSizeInAutoLayoutDef.id,\n subType: \"horizontal\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...fixedSizeMsg.horizontal(node.name, width),\n };\n }\n\n return null;\n};\n\nexport const fixedSizeInAutoLayout = defineRule({\n definition: fixedSizeInAutoLayoutDef,\n check: fixedSizeInAutoLayoutCheck,\n});\n\n// ============================================\n// missing-size-constraint (merged: missing-min-width + missing-max-width)\n// ============================================\n\nconst missingSizeConstraintDef: RuleDefinition = {\n id: \"missing-size-constraint\",\n name: \"Missing Size Constraint\",\n category: \"responsive-critical\",\n why: \"Without min/max-width, AI has no bounds — generated code may collapse or stretch indefinitely\",\n impact: \"Content becomes unreadable or invisible at extreme screen sizes\",\n fix: \"Set min-width and/or max-width so AI can generate proper size constraints\",\n};\n\nconst missingSizeConstraintCheck: RuleCheckFn = (node, context) => {\n // Only check containers and text-containing nodes\n if (!isContainerNode(node) && !hasTextContent(node)) return null;\n // Skip if not in Auto Layout context\n if (!context.parent || !hasAutoLayout(context.parent)) return null;\n\n const nodePath = context.path.join(\" > \");\n\n // Check 1: wrap parent → FILL children need min-width\n if (context.parent.layoutWrap === \"WRAP\" && node.layoutSizingHorizontal === \"FILL\" && node.minWidth === undefined) {\n return {\n ruleId: missingSizeConstraintDef.id,\n subType: \"wrap\" as const,\n nodeId: node.id,\n nodePath,\n ...missingSizeConstraintMsg.wrap(node.name),\n };\n }\n\n // Check 2: grid parent → FILL children need size constraints\n if (context.parent.layoutMode === \"GRID\" && node.layoutSizingHorizontal === \"FILL\" && node.minWidth === undefined && node.maxWidth === undefined) {\n return {\n ruleId: missingSizeConstraintDef.id,\n subType: \"grid\" as const,\n nodeId: node.id,\n nodePath,\n ...missingSizeConstraintMsg.grid(node.name),\n };\n }\n\n // Check 3: FILL containers need max-width\n if (node.layoutSizingHorizontal === \"FILL\") {\n if (isSizeConstraintExempt(node, context)) return null;\n\n const currentWidth = node.absoluteBoundingBox ? `${node.absoluteBoundingBox.width}px` : \"unknown\";\n return {\n ruleId: missingSizeConstraintDef.id,\n subType: \"max-width\" as const,\n nodeId: node.id,\n nodePath,\n ...missingSizeConstraintMsg.maxWidth(node.name, currentWidth),\n };\n }\n\n return null;\n};\n\nexport const missingSizeConstraint = defineRule({\n definition: missingSizeConstraintDef,\n check: missingSizeConstraintCheck,\n});\n\n// ============================================\n// non-layout-container (was group-usage — now also catches Section)\n// ============================================\n\nconst nonLayoutContainerDef: RuleDefinition = {\n id: \"non-layout-container\",\n name: \"Non-Layout Container\",\n category: \"pixel-critical\",\n why: \"Groups and Sections lack proper layout rules — AI sees children with absolute coordinates but no container logic\",\n impact: \"AI wraps elements in a plain div with no spacing/alignment, producing fragile layouts\",\n fix: \"Convert to Frame with Auto Layout so AI can generate proper flex/grid containers\",\n};\n\nconst nonLayoutContainerCheck: RuleCheckFn = (node, context) => {\n if (node.type === \"GROUP\") {\n return {\n ruleId: nonLayoutContainerDef.id,\n subType: \"group\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonLayoutContainerMsg.group(node.name),\n };\n }\n\n if (node.type === \"SECTION\") {\n return {\n ruleId: nonLayoutContainerDef.id,\n subType: \"section\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonLayoutContainerMsg.section(node.name),\n };\n }\n\n return null;\n};\n\nexport const nonLayoutContainer = defineRule({\n definition: nonLayoutContainerDef,\n check: nonLayoutContainerCheck,\n});\n\n// ============================================\n// deep-nesting\n// ============================================\n\nconst deepNestingDef: RuleDefinition = {\n id: \"deep-nesting\",\n name: \"Deep Nesting\",\n category: \"code-quality\",\n why: \"Deep nesting consumes AI context exponentially — each level adds indentation and structural overhead\",\n impact: \"AI may lose track of parent-child relationships in deeply nested trees, producing wrong layout hierarchy\",\n fix: \"Flatten the structure by extracting deeply nested groups into sub-components\",\n};\n\nconst deepNestingCheck: RuleCheckFn = (node, context, options) => {\n const maxDepth = (options?.[\"maxDepth\"] as number) ?? getRuleOption(\"deep-nesting\", \"maxDepth\", 5);\n\n if (context.componentDepth < maxDepth) return null;\n if (!isContainerNode(node)) return null;\n\n return {\n ruleId: deepNestingDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...deepNestingMsg(node.name, context.componentDepth, maxDepth),\n };\n};\n\nexport const deepNesting = defineRule({\n definition: deepNestingDef,\n check: deepNestingCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { rawValueMsg, irregularSpacingMsg } from \"../rule-messages.js\";\nimport { hasStyleReference, hasBoundVariable } from \"../node-semantics.js\";\n\nfunction isOnGrid(value: number, gridBase: number): boolean {\n return value % gridBase === 0;\n}\n\n// ============================================\n// raw-value (merged: raw-color + raw-font + raw-shadow + raw-opacity + raw-spacing)\n// ============================================\n\nconst rawValueDef: RuleDefinition = {\n id: \"raw-value\",\n name: \"Raw Value\",\n category: \"token-management\",\n why: \"Values without design tokens or variables must be reproduced exactly per node — one typo means a visible difference\",\n impact: \"AI cannot reference a shared token, so each raw value is an independent source of error across large pages\",\n fix: \"Use design tokens or variables (color styles, text styles, effect styles, opacity/spacing variables) so values are referenceable\",\n};\n\nconst rawValueCheck: RuleCheckFn = (node, context) => {\n const nodePath = context.path.join(\" > \");\n\n // Check 1: Raw fill color\n if (node.fills && Array.isArray(node.fills) && node.fills.length > 0) {\n if (!hasStyleReference(node, \"fill\") && !hasBoundVariable(node, \"fills\")) {\n for (const fill of node.fills) {\n const fillObj = fill as Record<string, unknown>;\n if (fillObj[\"type\"] === \"SOLID\" && fillObj[\"color\"]) {\n const c = fillObj[\"color\"] as Record<string, number>;\n const hex = `#${Math.round((c[\"r\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}${Math.round((c[\"g\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}${Math.round((c[\"b\"] ?? 0) * 255).toString(16).padStart(2, \"0\")}`.toUpperCase();\n return {\n ruleId: rawValueDef.id,\n subType: \"color\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.color(node.name, hex),\n };\n }\n }\n }\n }\n\n // Check 2: Raw font (TEXT nodes without text style)\n if (node.type === \"TEXT\") {\n if (\n !hasStyleReference(node, \"text\") &&\n (!hasBoundVariable(node, \"fontFamily\") || !hasBoundVariable(node, \"fontSize\"))\n ) {\n const fontParts: string[] = [];\n const s = node.style;\n if (s) {\n if (s[\"fontFamily\"]) fontParts.push(String(s[\"fontFamily\"]));\n if (s[\"fontSize\"]) fontParts.push(`${s[\"fontSize\"]}px`);\n if (s[\"fontWeight\"]) fontParts.push(String(s[\"fontWeight\"]));\n }\n const fontDesc = fontParts.length > 0 ? ` (${fontParts.join(\" \")})` : \"\";\n return {\n ruleId: rawValueDef.id,\n subType: \"font\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.font(node.name, fontDesc),\n };\n }\n }\n\n // Check 3: Raw shadow (effects without effect style)\n if (node.effects && Array.isArray(node.effects) && node.effects.length > 0) {\n if (!hasStyleReference(node, \"effect\")) {\n for (const effect of node.effects) {\n const effectObj = effect as Record<string, unknown>;\n if (effectObj[\"type\"] === \"DROP_SHADOW\" || effectObj[\"type\"] === \"INNER_SHADOW\") {\n const shadowType = effectObj[\"type\"] === \"DROP_SHADOW\" ? \"drop shadow\" : \"inner shadow\";\n const offset = effectObj[\"offset\"] as Record<string, number> | undefined;\n const radius = effectObj[\"radius\"] as number | undefined;\n const detailParts: string[] = [];\n if (offset) detailParts.push(`offset ${Math.round(offset[\"x\"] ?? 0)},${Math.round(offset[\"y\"] ?? 0)}`);\n if (radius !== undefined) detailParts.push(`blur ${Math.round(radius)}`);\n const details = detailParts.length > 0 ? ` (${detailParts.join(\" \")})` : \"\";\n return {\n ruleId: rawValueDef.id,\n subType: \"shadow\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.shadow(node.name, shadowType, details),\n };\n }\n }\n }\n }\n\n // Check 4: Raw opacity (non-default opacity without variable)\n if (node.opacity !== undefined && node.opacity < 1 && !hasBoundVariable(node, \"opacity\")) {\n return {\n ruleId: rawValueDef.id,\n subType: \"opacity\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.opacity(node.name, Math.round(node.opacity * 100)),\n };\n }\n\n // Check 5: Raw spacing (padding/gap without variable binding)\n const spacingKeys = [\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\", \"itemSpacing\"] as const;\n for (const key of spacingKeys) {\n const value = node[key];\n if (value !== undefined && value > 0 && !hasBoundVariable(node, key)) {\n const label = key === \"itemSpacing\" ? \"gap\" : key.replace(\"padding\", \"padding-\").toLowerCase();\n return {\n ruleId: rawValueDef.id,\n subType: \"spacing\" as const,\n nodeId: node.id,\n nodePath,\n ...rawValueMsg.spacing(node.name, label, value),\n };\n }\n }\n\n return null;\n};\n\nexport const rawValue = defineRule({\n definition: rawValueDef,\n check: rawValueCheck,\n});\n\n// ============================================\n// irregular-spacing (merged: inconsistent-spacing + magic-number-spacing)\n// ============================================\n\nconst irregularSpacingDef: RuleDefinition = {\n id: \"irregular-spacing\",\n name: \"Irregular Spacing\",\n category: \"token-management\",\n why: \"Off-grid or arbitrary spacing values force AI to handle many unique values instead of a predictable pattern\",\n impact: \"Higher chance of pixel-level differences when AI substitutes nearby round values\",\n fix: \"Align spacing to the design system grid (e.g., 4pt/8pt increments) for predictable implementation\",\n};\n\nconst irregularSpacingCheck: RuleCheckFn = (node, context, options) => {\n const configuredGridBase = (options?.[\"gridBase\"] as number) ?? getRuleOption(\"irregular-spacing\", \"gridBase\", 4);\n const gridBase = Number.isFinite(configuredGridBase) && configuredGridBase > 0 ? configuredGridBase : 4;\n\n const spacingEntries: Array<{ value: number; subType: \"padding\" | \"gap\" }> = [];\n for (const key of [\"paddingLeft\", \"paddingRight\", \"paddingTop\", \"paddingBottom\"] as const) {\n const v = node[key];\n if (v !== undefined && v > 0) spacingEntries.push({ value: v, subType: \"padding\" });\n }\n if (node.itemSpacing !== undefined && node.itemSpacing > 0) {\n spacingEntries.push({ value: node.itemSpacing, subType: \"gap\" });\n }\n\n // Allow small intentional values\n const commonValues = [1, 2];\n\n for (const entry of spacingEntries) {\n if (commonValues.includes(entry.value)) continue;\n if (!isOnGrid(entry.value, gridBase)) {\n return {\n ruleId: irregularSpacingDef.id,\n subType: entry.subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...irregularSpacingMsg(node.name, entry.value, gridBase, Math.round(entry.value / gridBase) * gridBase),\n };\n }\n }\n\n return null;\n};\n\nexport const irregularSpacing = defineRule({\n definition: irregularSpacingDef,\n check: irregularSpacingCheck,\n});\n","import { z } from \"zod\";\n\nexport const CategorySchema = z.enum([\n \"pixel-critical\",\n \"responsive-critical\",\n \"code-quality\",\n \"token-management\",\n \"semantic\",\n \"interaction\",\n]);\n\nexport type Category = z.infer<typeof CategorySchema>;\n\nexport const CATEGORIES = CategorySchema.options;\n\nexport const CATEGORY_LABELS: Record<Category, string> = {\n \"pixel-critical\": \"Pixel Critical\",\n \"responsive-critical\": \"Responsive Critical\",\n \"code-quality\": \"Code Quality\",\n \"token-management\": \"Token Management\",\n \"semantic\": \"Semantic\",\n \"interaction\": \"Interaction\",\n};\n","import { z } from \"zod\";\n\nexport const SeveritySchema = z.enum([\n \"blocking\",\n \"risk\",\n \"missing-info\",\n \"suggestion\",\n]);\n\nexport type Severity = z.infer<typeof SeveritySchema>;\n\nexport const SEVERITY_WEIGHT: Record<Severity, number> = {\n blocking: 10,\n risk: 5,\n \"missing-info\": 2,\n suggestion: 1,\n};\n\nexport const SEVERITY_LABELS: Record<Severity, string> = {\n blocking: \"Blocking\",\n risk: \"Risk\",\n \"missing-info\": \"Missing Info\",\n suggestion: \"Suggestion\",\n};\n","import { z } from \"zod\";\nimport { CategorySchema, type Category } from \"./category.js\";\nimport { SeveritySchema } from \"./severity.js\";\nimport type { AnalysisFile, AnalysisNode } from \"./figma-node.js\";\n\n/**\n * Rule definition - static metadata (does not change)\n */\nexport const RuleDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n category: CategorySchema,\n why: z.string(),\n impact: z.string(),\n fix: z.string(),\n});\n\nexport type RuleDefinition = z.infer<typeof RuleDefinitionSchema>;\n\n/**\n * Rule config - adjustable settings (can be modified via presets)\n */\nexport const RuleConfigSchema = z.object({\n severity: SeveritySchema,\n score: z.number().int().max(0),\n depthWeight: z.number().min(1).max(2).optional(),\n enabled: z.boolean().default(true),\n options: z.record(z.string(), z.unknown()).optional(),\n});\n\nexport type RuleConfig = z.infer<typeof RuleConfigSchema>;\n\n/**\n * Context passed to rule check functions\n */\nexport interface RuleContext {\n file: AnalysisFile;\n parent?: AnalysisNode | undefined;\n depth: number;\n /** Depth relative to the nearest COMPONENT/INSTANCE ancestor. Resets at component boundaries. */\n componentDepth: number;\n maxDepth: number;\n path: string[];\n /** Ancestor node types from root to parent (excludes current node). */\n ancestorTypes: string[];\n siblings?: AnalysisNode[] | undefined;\n /** Per-analysis shared state. Created fresh for each analysis run, eliminating module-level mutable state. */\n analysisState: Map<string, unknown>;\n}\n\n/**\n * Get or initialize per-analysis state for a rule.\n * Each key gets its own lazily-initialized state that persists for the duration of one analysis run.\n */\nexport function getAnalysisState<T>(context: RuleContext, key: string, init: () => T): T {\n if (context.analysisState.has(key)) {\n return context.analysisState.get(key) as T;\n }\n const value = init();\n context.analysisState.set(key, value);\n return value;\n}\n\n/**\n * Rule violation result from check function\n */\nexport interface RuleViolation {\n ruleId: string;\n subType?: string;\n nodeId: string;\n nodePath: string;\n message: string;\n suggestion: string;\n guide?: string;\n}\n\n/**\n * Rule check function signature\n */\nexport type RuleCheckFn = (\n node: AnalysisNode,\n context: RuleContext,\n options?: Record<string, unknown>\n) => RuleViolation | null;\n\n/**\n * Complete rule with definition, config, and check function\n */\nexport interface Rule {\n definition: RuleDefinition;\n check: RuleCheckFn;\n}\n\n/**\n * Rule ID type for type safety\n */\nexport type RuleId =\n // Pixel Critical — layout issues that directly affect pixel accuracy (ΔV ≥ 5%)\n | \"no-auto-layout\"\n | \"absolute-position-in-auto-layout\"\n | \"non-layout-container\"\n // Responsive Critical — size issues that break at different viewports (ΔV ≥ 15%)\n | \"fixed-size-in-auto-layout\"\n | \"missing-size-constraint\"\n // Code Quality — structural issues affecting code reuse (ΔV ≈ 0%, CSS classes -8~15)\n | \"missing-component\"\n | \"detached-instance\"\n | \"variant-structure-mismatch\"\n | \"deep-nesting\"\n // Token Management — raw values without design tokens\n | \"raw-value\"\n | \"irregular-spacing\"\n // Interaction — missing state variants and prototype links for interactive components\n | \"missing-interaction-state\"\n | \"missing-prototype\"\n // Semantic — naming issues with negligible pixel impact (ΔV < 2%)\n | \"non-standard-naming\"\n | \"non-semantic-name\"\n | \"inconsistent-naming-convention\";\n\n/**\n * Categories that support depthWeight\n */\nexport const DEPTH_WEIGHT_CATEGORIES: Category[] = [\"pixel-critical\", \"responsive-critical\"];\n\n/**\n * Check if a category supports depth weighting\n */\nexport function supportsDepthWeight(category: Category): boolean {\n return DEPTH_WEIGHT_CATEGORIES.includes(category);\n}\n","import type { RuleCheckFn, RuleDefinition, RuleContext } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\nimport { missingComponentMsg, detachedInstanceMsg, variantStructureMismatchMsg } from \"../rule-messages.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\n\n/** Style properties to compare between master and instance. */\nconst STYLE_COMPARE_KEYS = [\"fills\", \"strokes\", \"effects\", \"cornerRadius\", \"strokeWeight\", \"individualStrokeWeights\"] as const;\n\n/**\n * Detect style overrides between a component master and an instance.\n * Returns list of property names that differ.\n */\nfunction detectStyleOverrides(master: AnalysisNode, instance: AnalysisNode): string[] {\n const overrides: string[] = [];\n for (const key of STYLE_COMPARE_KEYS) {\n const masterVal = master[key];\n const instanceVal = instance[key];\n // Both undefined/null → no override\n if (masterVal == null && instanceVal == null) continue;\n // One exists, other doesn't → override\n if (masterVal == null || instanceVal == null) {\n overrides.push(key);\n continue;\n }\n // Deep compare via JSON\n if (JSON.stringify(masterVal) !== JSON.stringify(instanceVal)) {\n overrides.push(key);\n }\n }\n return overrides;\n}\n\n/**\n * Collect all frame names in the file for duplicate detection\n */\nfunction collectFrameNames(\n node: AnalysisNode,\n names: Map<string, string[]> = new Map()\n): Map<string, string[]> {\n if (node.type === \"FRAME\" && node.name) {\n const existing = names.get(node.name) ?? [];\n existing.push(node.id);\n names.set(node.name, existing);\n }\n\n if (node.children) {\n for (const child of node.children) {\n collectFrameNames(child, names);\n }\n }\n\n return names;\n}\n\n/**\n * Build a structural fingerprint for a node.\n * The fingerprint encodes type, layoutMode, and child types recursively up to maxDepth.\n */\nfunction buildFingerprint(node: AnalysisNode, depth: number): string {\n if (depth <= 0 || !node.children || node.children.length === 0) {\n return `${node.type}:${node.layoutMode ?? \"NONE\"}`;\n }\n\n const childFingerprints = node.children\n .map((child) => buildFingerprint(child, depth - 1))\n .join(\",\");\n\n return `${node.type}:${node.layoutMode ?? \"NONE\"}:[${childFingerprints}]`;\n}\n\n/**\n * Check if the node is inside an INSTANCE subtree.\n * Walks the full ancestor type chain to detect INSTANCE at any level.\n */\nfunction isInsideInstance(context: {\n ancestorTypes: string[];\n}): boolean {\n return context.ancestorTypes.includes(\"INSTANCE\");\n}\n\n\n\n// ============================================\n// missing-component (unified 4-stage rule)\n// ============================================\n\n/** State keys for per-analysis deduplication via RuleContext.analysisState */\nconst SEEN_STAGE1_KEY = \"missing-component:seenStage1ComponentNames\";\nconst SEEN_STAGE4_KEY = \"missing-component:seenStage4ComponentIds\";\n\nfunction getSeenStage1(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_STAGE1_KEY, () => new Set<string>());\n}\n\nfunction getSeenStage4(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_STAGE4_KEY, () => new Set<string>());\n}\n\nconst missingComponentDef: RuleDefinition = {\n id: \"missing-component\",\n name: \"Missing Component\",\n category: \"code-quality\",\n why: \"Repeated structures, unused components, and divergent instance overrides indicate missing or underutilized components. This inflates AI token consumption and forces manual maintenance.\",\n impact: \"AI code generators reproduce each repeated frame independently instead of emitting a reusable component. Divergent instance overrides produce inconsistent implementations.\",\n fix: \"Create components from repeated structures, use instances instead of duplicated frames, and create variants for instances with significantly different overrides.\",\n};\n\nconst missingComponentCheck: RuleCheckFn = (node, context, options) => {\n // ========================================\n // FRAME stages (1, 2, 3) — ordered by priority\n // ========================================\n if (node.type === \"FRAME\") {\n // Stage 1: Component exists but not used — FRAME name matches a component in metadata AND frame is repeated\n const components = context.file.components;\n const matchingComponent = Object.values(components).find(\n (c) => c.name.toLowerCase() === node.name.toLowerCase()\n );\n\n // Collect frame names once for Stage 1 and Stage 2\n const frameNames = collectFrameNames(context.file.document);\n const sameNameFrames = frameNames.get(node.name);\n const firstFrame = sameNameFrames?.[0];\n\n if (matchingComponent) {\n const seenStage1 = getSeenStage1(context);\n if (\n sameNameFrames &&\n firstFrame !== undefined &&\n sameNameFrames.length >= 2 &&\n !seenStage1.has(node.name.toLowerCase()) &&\n firstFrame === node.id\n ) {\n seenStage1.add(node.name.toLowerCase());\n return {\n ruleId: missingComponentDef.id,\n subType: \"unused-component\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.unusedComponent(matchingComponent.name, sameNameFrames.length),\n };\n }\n }\n\n // Stage 2: Name-based repetition (existing logic)\n const minRepetitions =\n (options?.[\"minRepetitions\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"minRepetitions\", 3);\n\n if (sameNameFrames && firstFrame !== undefined && sameNameFrames.length >= minRepetitions) {\n if (firstFrame === node.id) {\n return {\n ruleId: missingComponentDef.id,\n subType: \"name-repetition\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.nameRepetition(node.name, sameNameFrames.length),\n };\n }\n }\n\n // Stage 3: Structure-based repetition (absorbed from repeated-frame-structure)\n // Skip if node is inside an INSTANCE subtree\n if (isInsideInstance(context)) return null;\n\n // Skip if parent is COMPONENT_SET\n if (context.parent?.type === \"COMPONENT_SET\") return null;\n\n // Skip if node has no children\n if (!node.children || node.children.length === 0) return null;\n\n const structureMinRepetitions =\n (options?.[\"structureMinRepetitions\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"structureMinRepetitions\", 2);\n\n const maxFingerprintDepth =\n (options?.[\"maxFingerprintDepth\"] as number | undefined) ??\n getRuleOption(\"missing-component\", \"maxFingerprintDepth\", 3);\n\n // Compute fingerprint for this node\n const fingerprint = buildFingerprint(node, maxFingerprintDepth);\n\n // Access siblings (may be undefined)\n const siblings = context.siblings ?? [];\n\n // Filter siblings to qualifying frames (type === FRAME, not inside INSTANCE, has children)\n const qualifyingSiblings = siblings.filter(\n (s) =>\n s.type === \"FRAME\" &&\n s.children !== undefined &&\n s.children.length > 0\n );\n\n // Count siblings (including self) sharing the same fingerprint\n const matchingNodes = qualifyingSiblings.filter(\n (s) => buildFingerprint(s, maxFingerprintDepth) === fingerprint\n );\n\n // Ensure self is counted (it should be in siblings, but add a guard)\n const selfIsInSiblings = qualifyingSiblings.some((s) => s.id === node.id);\n const count = selfIsInSiblings\n ? matchingNodes.length\n : matchingNodes.length + 1;\n\n if (count >= structureMinRepetitions) {\n // Only emit for the first sibling (by array order) with this fingerprint\n const firstMatch = qualifyingSiblings.find(\n (s) => buildFingerprint(s, maxFingerprintDepth) === fingerprint\n );\n\n // If self is not in siblings list, treat self as first match when no earlier match exists\n const firstMatchId = firstMatch?.id ?? node.id;\n if (firstMatchId === node.id) {\n return {\n ruleId: missingComponentDef.id,\n subType: \"structure-repetition\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.structureRepetition(node.name, count - 1),\n };\n }\n }\n\n return null;\n }\n\n // ========================================\n // Stage 4: Instance style override detection\n // Compares instance styles against component master.\n // Any style override (fills, strokes, effects, cornerRadius) means\n // the designer should use a variant instead.\n // ========================================\n if (node.type === \"INSTANCE\" && node.componentId) {\n const seenStage4 = getSeenStage4(context);\n if (seenStage4.has(node.componentId)) return null;\n\n const componentDefs = context.file.componentDefinitions;\n if (!componentDefs) return null;\n\n const master = componentDefs[node.componentId];\n if (!master) return null;\n\n // Compare style properties between master and instance\n const overrides = detectStyleOverrides(master, node);\n if (overrides.length > 0) {\n // Only mark as seen when we actually flag — allows other instances to be checked\n seenStage4.add(node.componentId);\n const componentMeta = context.file.components[node.componentId];\n const componentName = componentMeta?.name ?? node.name;\n\n return {\n ruleId: missingComponentDef.id,\n subType: \"style-override\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingComponentMsg.styleOverride(componentName, overrides),\n };\n }\n return null;\n }\n\n return null;\n};\n\nexport const missingComponent = defineRule({\n definition: missingComponentDef,\n check: missingComponentCheck,\n});\n\n// ============================================\n// detached-instance\n// ============================================\n\nconst detachedInstanceDef: RuleDefinition = {\n id: \"detached-instance\",\n name: \"Detached Instance\",\n category: \"code-quality\",\n why: \"Detached instances lose component relationship — AI sees a one-off frame instead of a reusable component reference\",\n impact: \"AI generates duplicate code instead of reusing the component, inflating output and causing inconsistencies\",\n fix: \"Reset the instance or create a new variant if customization is needed\",\n};\n\nconst detachedInstanceCheck: RuleCheckFn = (node, context) => {\n // A detached instance would be a FRAME that was once an INSTANCE\n // This is hard to detect without historical data\n // Heuristic: Frame with a name that looks like it came from a component\n if (node.type !== \"FRAME\") return null;\n\n // Check if there's a component in the file with a matching name (word boundary)\n const components = context.file.components;\n\n for (const [, component] of Object.entries(components)) {\n const pattern = new RegExp(`\\\\b${component.name.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")}\\\\b`);\n if (pattern.test(node.name)) {\n // This frame might be a detached instance of this component\n return {\n ruleId: detachedInstanceDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...detachedInstanceMsg(node.name, component.name),\n };\n }\n }\n\n return null;\n};\n\nexport const detachedInstance = defineRule({\n definition: detachedInstanceDef,\n check: detachedInstanceCheck,\n});\n\n// ============================================\n// variant-structure-mismatch\n// ============================================\n\nconst variantStructureMismatchDef: RuleDefinition = {\n id: \"variant-structure-mismatch\",\n name: \"Variant Structure Mismatch\",\n category: \"code-quality\",\n why: \"Variants with different child structures prevent AI from creating a unified component template\",\n impact: \"AI must generate separate implementations for each variant instead of a single parameterized component\",\n fix: \"Ensure all variants share the same child structure, using visibility toggles for optional elements\",\n};\n\nconst variantStructureMismatchCheck: RuleCheckFn = (node, context) => {\n // Only COMPONENT_SET\n if (node.type !== \"COMPONENT_SET\") return null;\n if (!node.children?.length || node.children.length < 2) return null;\n\n // Build fingerprint for each variant child\n const fingerprints = node.children\n .filter(child => child.type === \"COMPONENT\")\n .map(child => buildFingerprint(child, 2));\n\n if (fingerprints.length < 2) return null;\n\n // Compare all fingerprints to the first one\n const base = fingerprints[0];\n const mismatched = fingerprints.filter(fp => fp !== base);\n\n if (mismatched.length === 0) return null;\n\n const mismatchCount = mismatched.length;\n const totalVariants = fingerprints.length;\n\n return {\n ruleId: variantStructureMismatchDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...variantStructureMismatchMsg(node.name, mismatchCount, totalVariants),\n };\n};\n\nexport const variantStructureMismatch = defineRule({\n definition: variantStructureMismatchDef,\n check: variantStructureMismatchCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getDefaultNameSubType, nonSemanticNameMsg, inconsistentNamingMsg, nonStandardNamingMsg } from \"../rule-messages.js\";\nimport { isExcludedName, isDefaultName, isNonSemanticName, STANDARD_STATE_NAMES, STATE_NAME_SUGGESTIONS, STATE_LIKE_PATTERN } from \"../node-semantics.js\";\n\nfunction detectNamingConvention(name: string): string | null {\n if (/^[a-z]+(-[a-z]+)*$/.test(name)) return \"kebab-case\";\n if (/^[a-z]+(_[a-z]+)*$/.test(name)) return \"snake_case\";\n if (/^[a-z]+([A-Z][a-z]*)*$/.test(name)) return \"camelCase\";\n if (/^[A-Z][a-z]+([A-Z][a-z]*)*$/.test(name)) return \"PascalCase\";\n if (/^[A-Z]+(_[A-Z]+)*$/.test(name)) return \"SCREAMING_SNAKE_CASE\";\n if (/\\s/.test(name)) return \"Title Case\";\n return null;\n}\n\n/** Single capitalized word is compatible with both PascalCase and Title Case */\nfunction isCompatible(nodeConvention: string, dominantConvention: string, name: string): boolean {\n if (!/^[A-Z][a-z]+$/.test(name)) return false;\n const pair = new Set([nodeConvention, dominantConvention]);\n return pair.has(\"PascalCase\") && pair.has(\"Title Case\");\n}\n\n/** Split a name into words regardless of convention */\nfunction splitWords(name: string): string[] {\n // Title Case / space-separated\n if (/\\s/.test(name)) return name.split(/\\s+/);\n // SCREAMING_SNAKE_CASE or snake_case\n if (name.includes(\"_\")) return name.split(\"_\");\n // kebab-case\n if (name.includes(\"-\")) return name.split(\"-\");\n // camelCase / PascalCase — split on uppercase boundaries (including acronym runs)\n return name\n .replace(/([a-z0-9])([A-Z])/g, \"$1\\0$2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1\\0$2\")\n .split(\"\\0\");\n}\n\n/** Convert a name to the target convention */\nfunction convertName(name: string, target: string): string {\n const words = splitWords(name);\n switch (target) {\n case \"kebab-case\":\n return words.map(w => w.toLowerCase()).join(\"-\");\n case \"snake_case\":\n return words.map(w => w.toLowerCase()).join(\"_\");\n case \"camelCase\":\n return words.map((w, i) => i === 0 ? w.toLowerCase() : w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\"\");\n case \"PascalCase\":\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\"\");\n case \"SCREAMING_SNAKE_CASE\":\n return words.map(w => w.toUpperCase()).join(\"_\");\n case \"Title Case\":\n return words.map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(\" \");\n default:\n return name;\n }\n}\n\n// ============================================\n// non-semantic-name (merged: default-name + non-semantic-name)\n// ============================================\n\nconst nonSemanticNameDef: RuleDefinition = {\n id: \"non-semantic-name\",\n name: \"Non-Semantic Name\",\n category: \"semantic\",\n why: \"Default or shape names give AI no semantic context — it cannot choose appropriate HTML tags or class names\",\n impact: \"AI generates generic <div> wrappers instead of semantic elements like <header>, <nav>, <article>\",\n fix: \"Rename with a descriptive, purpose-driven name (e.g., 'Header', 'ProductCard', 'Divider')\",\n};\n\nconst nonSemanticNameCheck: RuleCheckFn = (node, context) => {\n if (!node.name) return null;\n if (isExcludedName(node.name)) return null;\n\n // Check 1: Figma default names (Frame 1, Group 2, etc.)\n if (isDefaultName(node.name)) {\n return {\n ruleId: nonSemanticNameDef.id,\n subType: getDefaultNameSubType(node.type),\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonSemanticNameMsg(node.type, node.name),\n };\n }\n\n // Check 2: Shape-only names (rectangle, ellipse, vector, etc.)\n if (isNonSemanticName(node.name)) {\n // Allow shape names for actual shape primitives at leaf level\n if (!node.children || node.children.length === 0) {\n const shapeTypes = [\"RECTANGLE\", \"ELLIPSE\", \"VECTOR\", \"LINE\", \"STAR\", \"REGULAR_POLYGON\"];\n if (shapeTypes.includes(node.type)) return null;\n }\n\n return {\n ruleId: nonSemanticNameDef.id,\n subType: \"shape-name\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonSemanticNameMsg(node.type, node.name),\n };\n }\n\n return null;\n};\n\nexport const nonSemanticName = defineRule({\n definition: nonSemanticNameDef,\n check: nonSemanticNameCheck,\n});\n\n// ============================================\n// inconsistent-naming-convention\n// ============================================\n\nconst inconsistentNamingConventionDef: RuleDefinition = {\n id: \"inconsistent-naming-convention\",\n name: \"Inconsistent Naming Convention\",\n category: \"semantic\",\n why: \"Mixed naming conventions (camelCase + kebab-case + Title Case) at the same level confuse AI pattern recognition\",\n impact: \"AI generates inconsistent class/component names, making the codebase harder to maintain\",\n fix: \"Pick one convention for sibling elements (e.g., kebab-case: 'product-card', or PascalCase: 'ProductCard') — AI maps names to CSS classes and component names, so mixed conventions produce inconsistent code\",\n};\n\nconst inconsistentNamingConventionCheck: RuleCheckFn = (node, context) => {\n if (!context.siblings || context.siblings.length < 2) return null;\n\n // Detect conventions used by siblings\n const conventions = new Map<string, number>();\n let ambiguousPascalCount = 0;\n\n for (const sibling of context.siblings) {\n if (!sibling.name) continue;\n const convention = detectNamingConvention(sibling.name);\n if (convention) {\n conventions.set(convention, (conventions.get(convention) ?? 0) + 1);\n if (convention === \"PascalCase\" && /^[A-Z][a-z]+$/.test(sibling.name)) {\n ambiguousPascalCount++;\n }\n }\n }\n\n // Single capitalized words (Header, Footer) are detected as PascalCase but are\n // equally valid as Title Case. When both conventions appear, discount these\n // ambiguous names so they don't bias the dominant convention toward PascalCase.\n if (conventions.has(\"PascalCase\") && conventions.has(\"Title Case\") && ambiguousPascalCount > 0) {\n const adjusted = (conventions.get(\"PascalCase\") ?? 0) - ambiguousPascalCount;\n if (adjusted <= 0) {\n conventions.delete(\"PascalCase\");\n } else {\n conventions.set(\"PascalCase\", adjusted);\n }\n }\n\n // Skip if we can't detect clear conventions\n if (conventions.size < 2) return null;\n\n // Find the dominant convention\n let dominantConvention = \"\";\n let maxCount = 0;\n for (const [convention, count] of conventions) {\n if (count > maxCount) {\n maxCount = count;\n dominantConvention = convention;\n }\n }\n\n // Check if current node violates the dominant convention\n const nodeConvention = detectNamingConvention(node.name);\n if (nodeConvention && nodeConvention !== dominantConvention && maxCount >= 2) {\n // Single capitalized word is compatible with both PascalCase and Title Case\n if (isCompatible(nodeConvention, dominantConvention, node.name)) return null;\n\n const suggested = convertName(node.name, dominantConvention);\n return {\n ruleId: inconsistentNamingConventionDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...inconsistentNamingMsg(node.name, nodeConvention, dominantConvention, suggested),\n };\n }\n\n return null;\n};\n\nexport const inconsistentNamingConvention = defineRule({\n definition: inconsistentNamingConventionDef,\n check: inconsistentNamingConventionCheck,\n});\n\n// ============================================\n// non-standard-naming\n// ============================================\n\nconst nonStandardNamingDef: RuleDefinition = {\n id: \"non-standard-naming\",\n name: \"Non-Standard Naming\",\n category: \"semantic\",\n why: \"Non-standard state names prevent interaction rules from detecting state variants — AI cannot generate correct :hover/:active/:disabled styles\",\n impact: \"Interaction state detection fails, resulting in static UI with no state transitions\",\n fix: \"Use platform-standard state names: default, hover, active, pressed, selected, highlighted, disabled, enabled, focus, focused, dragged\",\n};\n\nconst nonStandardNamingCheck: RuleCheckFn = (node, context) => {\n // Only check COMPONENT_SET (variant container)\n if (node.type !== \"COMPONENT_SET\") return null;\n if (!node.componentPropertyDefinitions) return null;\n\n for (const prop of Object.values(node.componentPropertyDefinitions)) {\n const p = prop as Record<string, unknown>;\n if (p[\"type\"] !== \"VARIANT\") continue;\n const options = p[\"variantOptions\"];\n if (!Array.isArray(options)) continue;\n\n for (const opt of options) {\n if (typeof opt !== \"string\") continue;\n const lower = opt.toLowerCase().trim();\n\n // Skip if it's a standard name\n if (STANDARD_STATE_NAMES.has(lower)) continue;\n\n // Check if it matches a known non-standard state name\n if (STATE_LIKE_PATTERN.test(opt)) {\n const suggestion = STATE_NAME_SUGGESTIONS[lower];\n if (suggestion) {\n return {\n ruleId: nonStandardNamingDef.id,\n subType: \"state-name\" as const,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...nonStandardNamingMsg.stateName(node.name, opt, suggestion),\n };\n }\n }\n }\n }\n\n return null;\n};\n\nexport const nonStandardNaming = defineRule({\n definition: nonStandardNamingDef,\n check: nonStandardNamingCheck,\n});\n\n","import type { RuleCheckFn, RuleDefinition, RuleContext } from \"../../contracts/rule.js\";\nimport { getAnalysisState } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport type { MissingInteractionStateSubType, MissingPrototypeSubType } from \"../rule-messages.js\";\nimport { missingInteractionStateMsg, missingPrototypeMsg } from \"../rule-messages.js\";\nimport { getStatefulComponentType, isOverlayNode, isCarouselNode, type StatefulComponentType } from \"../node-semantics.js\";\n\n/** Expected state variants by interactive type */\nconst EXPECTED_STATES: Record<StatefulComponentType, MissingInteractionStateSubType[]> = {\n button: [\"hover\", \"active\", \"disabled\"],\n link: [\"hover\"],\n tab: [\"hover\", \"active\"],\n input: [\"focus\", \"disabled\"],\n toggle: [\"disabled\"],\n};\n\n/** State name patterns — web + mobile platform standard names */\nconst STATE_PATTERNS: Record<MissingInteractionStateSubType, RegExp> = {\n hover: /\\bhover\\b/i,\n disabled: /\\bdisabled\\b/i,\n active: /\\b(active|pressed|selected|highlighted)\\b/i,\n focus: /\\bfocus(ed)?\\b/i,\n};\n\n// ============================================\n// Helpers\n// ============================================\n\n/** Dedup key: emit at most one violation per componentId + subType */\nconst SEEN_KEY = \"missing-interaction-state:seen\";\n\nfunction getSeen(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_KEY, () => new Set<string>());\n}\n\n/**\n * Check if a state variant exists via componentPropertyDefinitions.\n * Looks for VARIANT type properties where variantOptions contain the state name.\n */\nfunction hasStateInVariantProps(node: AnalysisNode, statePattern: RegExp): boolean {\n if (!node.componentPropertyDefinitions) return false;\n for (const prop of Object.values(node.componentPropertyDefinitions)) {\n const p = prop as Record<string, unknown>;\n if (p[\"type\"] !== \"VARIANT\") continue;\n const options = p[\"variantOptions\"];\n if (!Array.isArray(options)) continue;\n if (options.some((opt) => typeof opt === \"string\" && statePattern.test(opt))) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Check if a state variant exists via component master's componentPropertyDefinitions.\n * Falls back to componentDefinitions (fetched masters) when the instance itself\n * doesn't carry the property definitions.\n */\nfunction hasStateInComponentMaster(\n node: AnalysisNode,\n context: RuleContext,\n statePattern: RegExp,\n): boolean {\n if (!node.componentId) return false;\n const defs = context.file.componentDefinitions;\n if (!defs) return false;\n const master = defs[node.componentId];\n if (!master) return false;\n return hasStateInVariantProps(master, statePattern);\n}\n\n// ============================================\n// missing-interaction-state\n// ============================================\n\nconst missingInteractionStateDef: RuleDefinition = {\n id: \"missing-interaction-state\",\n name: \"Missing Interaction State\",\n category: \"interaction\",\n why: \"Interactive components without state variants force AI to guess hover/focus/disabled appearances — or skip them entirely\",\n impact: \"Generated code has no :hover, :focus, or :disabled styles, making the UI feel static and unresponsive\",\n fix: \"Add state variants (Hover, Disabled, Focus, Active) to interactive components in Figma\",\n};\n\nconst missingInteractionStateCheck: RuleCheckFn = (node, context) => {\n // Only check component instances and components\n if (node.type !== \"INSTANCE\" && node.type !== \"COMPONENT\") return null;\n\n const interactiveType = getStatefulComponentType(node);\n if (!interactiveType) return null;\n\n const expectedStates = EXPECTED_STATES[interactiveType];\n if (!expectedStates) return null;\n\n const seen = getSeen(context);\n const nodePath = context.path.join(\" > \");\n\n for (const state of expectedStates) {\n const dedupeKey = `${node.componentId ?? node.id}:${state}`;\n if (seen.has(dedupeKey)) continue;\n\n const pattern = STATE_PATTERNS[state];\n\n // Check variant properties on instance\n if (hasStateInVariantProps(node, pattern)) continue;\n\n // Check variant properties on component master (fetched definitions)\n if (hasStateInComponentMaster(node, context, pattern)) continue;\n\n // Missing state — report first missing one\n seen.add(dedupeKey);\n return {\n ruleId: missingInteractionStateDef.id,\n subType: state,\n nodeId: node.id,\n nodePath,\n ...missingInteractionStateMsg[state](node.name),\n };\n }\n\n return null;\n};\n\nexport const missingInteractionState = defineRule({\n definition: missingInteractionStateDef,\n check: missingInteractionStateCheck,\n});\n\n// ============================================\n// missing-prototype\n// ============================================\n\n/** Interactive types that need click prototype */\nconst PROTOTYPE_TYPES: Record<StatefulComponentType, MissingPrototypeSubType> = {\n button: \"button\",\n link: \"navigation\",\n tab: \"tab\",\n input: \"input\",\n toggle: \"toggle\",\n};\n\nfunction getPrototypeSubType(node: AnalysisNode): MissingPrototypeSubType | null {\n // Check overlay/carousel first — select/dropdown are classified as \"input\" in\n // STATEFUL_PATTERNS but need \"overlay\" subType for prototype checks\n if (isOverlayNode(node)) return \"overlay\";\n if (isCarouselNode(node)) return \"carousel\";\n const interactiveType = getStatefulComponentType(node);\n if (interactiveType) {\n const mapped = PROTOTYPE_TYPES[interactiveType];\n if (mapped) return mapped;\n }\n return null;\n}\n\nfunction hasInteractionTrigger(node: AnalysisNode, triggerType: string): boolean {\n if (!node.interactions || !Array.isArray(node.interactions)) return false;\n return node.interactions.some((interaction) => {\n const i = interaction as { trigger?: { type?: string } };\n return i.trigger?.type === triggerType;\n });\n}\n\n/** Check if node (or its component master) has any of the given trigger types */\nfunction hasAnyInteraction(node: AnalysisNode, context: RuleContext, triggers: string[]): boolean {\n for (const trigger of triggers) {\n if (hasInteractionTrigger(node, trigger)) return true;\n }\n // INSTANCE nodes don't inherit interactions from master — check master fallback\n if (node.componentId && context.file.componentDefinitions) {\n const master = context.file.componentDefinitions[node.componentId];\n if (master) {\n for (const trigger of triggers) {\n if (hasInteractionTrigger(master, trigger)) return true;\n }\n }\n }\n return false;\n}\n\n/** Trigger types to check per subType */\nconst PROTOTYPE_TRIGGERS: Record<string, string[]> = {\n carousel: [\"ON_CLICK\", \"ON_DRAG\"],\n};\n\nconst DEFAULT_TRIGGERS = [\"ON_CLICK\"];\n\nconst missingPrototypeDef: RuleDefinition = {\n id: \"missing-prototype\",\n name: \"Missing Prototype\",\n category: \"interaction\",\n why: \"Interactive elements without prototype interactions give AI no information about navigation or behavior\",\n impact: \"AI cannot generate interaction handlers, routing, or state changes — interactive elements become static\",\n fix: \"Add prototype interactions (ON_CLICK, ON_DRAG) to define navigation targets or state changes\",\n};\n\nconst SEEN_PROTO_KEY = \"missing-prototype:seen\";\n\nfunction getSeenProto(context: RuleContext): Set<string> {\n return getAnalysisState(context, SEEN_PROTO_KEY, () => new Set<string>());\n}\n\nconst missingPrototypeCheck: RuleCheckFn = (node, context) => {\n if (node.type !== \"INSTANCE\" && node.type !== \"COMPONENT\" && node.type !== \"FRAME\") return null;\n\n const subType = getPrototypeSubType(node);\n if (!subType) return null;\n\n // Already has relevant interaction (click, or drag for carousel)\n const triggers = PROTOTYPE_TRIGGERS[subType] ?? DEFAULT_TRIGGERS;\n if (hasAnyInteraction(node, context, triggers)) return null;\n\n // Dedup per componentId + subType\n const seen = getSeenProto(context);\n const dedupeKey = `${node.componentId ?? node.id}:${subType}`;\n if (seen.has(dedupeKey)) return null;\n seen.add(dedupeKey);\n\n return {\n ruleId: missingPrototypeDef.id,\n subType,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n ...missingPrototypeMsg[subType](node.name),\n };\n};\n\nexport const missingPrototype = defineRule({\n definition: missingPrototypeDef,\n check: missingPrototypeCheck,\n});\n","import type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport type {\n Rule,\n RuleConfig,\n RuleContext,\n RuleId,\n RuleViolation,\n} from \"../contracts/rule.js\";\nimport { supportsDepthWeight } from \"../contracts/rule.js\";\nimport { ruleRegistry } from \"../rules/rule-registry.js\";\nimport { RULE_CONFIGS } from \"../rules/rule-config.js\";\n\n/**\n * Analysis issue with calculated score and metadata\n */\nexport interface AnalysisIssue {\n violation: RuleViolation;\n rule: Rule;\n config: RuleConfig;\n depth: number;\n maxDepth: number;\n calculatedScore: number;\n}\n\n/**\n * Information about a rule that threw during analysis\n */\nexport interface RuleFailure {\n ruleId: string;\n nodeName: string;\n nodeId: string;\n error: string;\n}\n\n/**\n * Analysis result from the rule engine\n */\nexport interface AnalysisResult {\n file: AnalysisFile;\n issues: AnalysisIssue[];\n failedRules: RuleFailure[];\n maxDepth: number;\n nodeCount: number;\n analyzedAt: string;\n}\n\n/**\n * Options for the rule engine\n */\nexport interface RuleEngineOptions {\n configs?: Record<RuleId, RuleConfig>;\n enabledRules?: RuleId[];\n disabledRules?: RuleId[];\n targetNodeId?: string;\n excludeNodeNames?: string[];\n excludeNodeTypes?: string[];\n}\n\n/**\n * Calculate the maximum depth of a node tree\n */\nfunction calculateMaxDepth(node: AnalysisNode, currentDepth = 0): number {\n if (!node.children || node.children.length === 0) {\n return currentDepth;\n }\n\n let maxChildDepth = currentDepth;\n for (const child of node.children) {\n const childDepth = calculateMaxDepth(child, currentDepth + 1);\n if (childDepth > maxChildDepth) {\n maxChildDepth = childDepth;\n }\n }\n\n return maxChildDepth;\n}\n\n/**\n * Count total nodes in a tree\n */\nfunction countNodes(node: AnalysisNode): number {\n let count = 1;\n if (node.children) {\n for (const child of node.children) {\n count += countNodes(child);\n }\n }\n return count;\n}\n\n/**\n * Find a node by ID in the tree\n */\nfunction findNodeById(node: AnalysisNode, nodeId: string): AnalysisNode | null {\n // Figma node IDs use \":\" separator, URL uses \"-\"\n const normalizedId = nodeId.replace(/-/g, \":\");\n\n if (node.id === normalizedId) {\n return node;\n }\n\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, nodeId);\n if (found) return found;\n }\n }\n\n return null;\n}\n\n/**\n * Calculate depth weight multiplier for a rule\n * Higher values (closer to 1.5x) at root level, 1.0x at leaf level\n */\nfunction calcDepthWeight(\n depth: number,\n maxDepth: number,\n depthWeight?: number\n): number {\n if (!depthWeight || depthWeight <= 1) return 1;\n if (maxDepth === 0) return depthWeight;\n\n // Linear interpolation: depthWeight at depth 0, 1.0 at maxDepth\n const ratio = depth / maxDepth;\n return depthWeight - (depthWeight - 1) * ratio;\n}\n\n/**\n * Rule engine for analyzing Figma files\n */\nexport class RuleEngine {\n private configs: Record<RuleId, RuleConfig>;\n private enabledRuleIds: Set<RuleId> | null;\n private disabledRuleIds: Set<RuleId>;\n private targetNodeId: string | undefined;\n private excludeNamePattern: RegExp | null;\n private excludeNodeTypes: Set<string> | null;\n\n constructor(options: RuleEngineOptions = {}) {\n this.configs = options.configs ?? RULE_CONFIGS;\n this.enabledRuleIds = options.enabledRules\n ? new Set(options.enabledRules)\n : null;\n this.disabledRuleIds = new Set(options.disabledRules ?? []);\n this.targetNodeId = options.targetNodeId;\n this.excludeNamePattern = options.excludeNodeNames && options.excludeNodeNames.length > 0\n ? new RegExp(`\\\\b(${options.excludeNodeNames.join(\"|\")})\\\\b`, \"i\")\n : null;\n this.excludeNodeTypes = options.excludeNodeTypes && options.excludeNodeTypes.length > 0\n ? new Set(options.excludeNodeTypes)\n : null;\n }\n\n /**\n * Analyze a Figma file and return issues\n */\n analyze(file: AnalysisFile): AnalysisResult {\n // Fresh per-analysis state — eliminates module-level mutable state in rules\n const analysisState = new Map<string, unknown>();\n\n // Find target node if specified\n let rootNode = file.document;\n if (this.targetNodeId) {\n const targetNode = findNodeById(file.document, this.targetNodeId);\n if (!targetNode) {\n throw new Error(`Node not found: ${this.targetNodeId}`);\n }\n rootNode = targetNode;\n }\n\n // Calculate max depth before analysis\n const maxDepth = calculateMaxDepth(rootNode);\n const nodeCount = countNodes(rootNode);\n\n const issues: AnalysisIssue[] = [];\n const failedRules: RuleFailure[] = [];\n const enabledRules = this.getEnabledRules();\n\n // Traverse the tree and run rules on each node\n this.traverseAndCheck(\n rootNode,\n file,\n enabledRules,\n maxDepth,\n issues,\n failedRules,\n 0,\n [],\n [],\n 0,\n analysisState,\n undefined,\n undefined\n );\n\n return {\n file,\n issues,\n failedRules,\n maxDepth,\n nodeCount,\n analyzedAt: new Date().toISOString(),\n };\n }\n\n /**\n * Get rules that should be run based on configuration\n */\n private getEnabledRules(): Rule[] {\n return ruleRegistry.getAll().filter((rule) => {\n const ruleId = rule.definition.id as RuleId;\n\n // Check if explicitly disabled\n if (this.disabledRuleIds.has(ruleId)) return false;\n\n // Check if we have an explicit enable list\n if (this.enabledRuleIds && !this.enabledRuleIds.has(ruleId)) return false;\n\n // Check config enabled status\n const config = this.configs[ruleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Recursively traverse the tree and run rules\n */\n private traverseAndCheck(\n node: AnalysisNode,\n file: AnalysisFile,\n rules: Rule[],\n maxDepth: number,\n issues: AnalysisIssue[],\n failedRules: RuleFailure[],\n depth: number,\n path: string[],\n ancestorTypes: string[],\n componentDepth: number,\n analysisState: Map<string, unknown>,\n parent?: AnalysisNode,\n siblings?: AnalysisNode[]\n ): void {\n const nodePath = [...path, node.name];\n\n // Reset componentDepth at component boundaries\n const isComponentBoundary = node.type === \"COMPONENT\" || node.type === \"COMPONENT_SET\" || node.type === \"INSTANCE\";\n const currentComponentDepth = isComponentBoundary ? 0 : componentDepth;\n\n // Skip nodes matching excluded types or name patterns\n if (this.excludeNodeTypes && this.excludeNodeTypes.has(node.type)) {\n return;\n }\n if (this.excludeNamePattern && this.excludeNamePattern.test(node.name)) {\n return;\n }\n\n // Build context for this node\n const context: RuleContext = {\n file,\n parent,\n depth,\n componentDepth: currentComponentDepth,\n maxDepth,\n path: nodePath,\n ancestorTypes,\n siblings,\n analysisState,\n };\n\n // Run each rule on this node\n for (const rule of rules) {\n const ruleId = rule.definition.id as RuleId;\n const config = this.configs[ruleId];\n const options = config?.options;\n\n try {\n const violation = rule.check(node, context, options);\n\n if (violation) {\n // Calculate score with depth weight if applicable\n let calculatedScore = config.score;\n\n if (\n supportsDepthWeight(rule.definition.category) &&\n config.depthWeight\n ) {\n const weight = calcDepthWeight(depth, maxDepth, config.depthWeight);\n calculatedScore = Math.round(config.score * weight);\n }\n\n issues.push({\n violation,\n rule,\n config,\n depth,\n maxDepth,\n calculatedScore,\n });\n }\n } catch (error) {\n // Track failure and continue — never let one rule break the whole analysis\n failedRules.push({\n ruleId,\n nodeName: node.name,\n nodeId: node.id,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Recurse into children\n if (node.children && node.children.length > 0) {\n const childAncestorTypes = [...ancestorTypes, node.type];\n for (const child of node.children) {\n this.traverseAndCheck(\n child,\n file,\n rules,\n maxDepth,\n issues,\n failedRules,\n depth + 1,\n nodePath,\n childAncestorTypes,\n currentComponentDepth + 1,\n analysisState,\n node,\n node.children\n );\n }\n }\n }\n}\n\n/**\n * Create a rule engine with default configuration\n */\nexport function createRuleEngine(options?: RuleEngineOptions): RuleEngine {\n return new RuleEngine(options);\n}\n\n/**\n * Convenience function to analyze a file with default settings\n */\nexport function analyzeFile(\n file: AnalysisFile,\n options?: RuleEngineOptions\n): AnalysisResult {\n const engine = createRuleEngine(options);\n return engine.analyze(file);\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { resolve, join } from \"node:path\";\nimport { FigmaClient } from \"../adapters/figma-client.js\";\nimport { resolveComponentDefinitions, resolveInteractionDestinations } from \"../adapters/component-resolver.js\";\nimport { loadFigmaFileFromJson } from \"../adapters/figma-file-loader.js\";\nimport { transformFigmaResponse, transformFileNodesResponse } from \"../adapters/figma-transformer.js\";\nimport { parseFigmaUrl } from \"../adapters/figma-url-parser.js\";\nimport { getFigmaToken } from \"./config-store.js\";\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\n\nexport interface LoadResult {\n file: AnalysisFile;\n nodeId?: string | undefined;\n}\n\n/** Check if input string is a Figma URL. */\nexport function isFigmaUrl(input: string): boolean {\n return input.includes(\"figma.com/\");\n}\n\n/** Check if input string is a JSON file path. */\nexport function isJsonFile(input: string): boolean {\n return input.endsWith(\".json\");\n}\n\n/**\n * Check if input is a fixture directory (contains data.json).\n */\nexport function isFixtureDir(input: string): boolean {\n const resolved = resolve(input);\n if (!existsSync(resolved)) return false;\n try {\n if (!statSync(resolved).isDirectory()) return false;\n } catch {\n return false;\n }\n return existsSync(join(resolved, \"data.json\"));\n}\n\n/**\n * Resolve fixture input to data.json path.\n * Input: fixtures/name/ or fixtures/name → fixtures/name/data.json\n */\nexport function resolveFixturePath(input: string): string {\n if (isJsonFile(input)) return resolve(input);\n return resolve(join(input, \"data.json\"));\n}\n\n/**\n * Load a Figma file from a URL, JSON file, or fixture directory.\n * Resolves component master node trees for accurate analysis.\n */\nexport async function loadFile(\n input: string,\n token?: string,\n): Promise<LoadResult> {\n if (isJsonFile(input) || isFixtureDir(input)) {\n const filePath = resolveFixturePath(input);\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n console.error(`Loading from JSON: ${filePath}`);\n return { file: await loadFigmaFileFromJson(filePath) };\n }\n\n if (isFigmaUrl(input)) {\n const { fileKey, nodeId } = parseFigmaUrl(input);\n return loadFromApi(fileKey, nodeId, token);\n }\n\n throw new Error(\n `Invalid input: ${input}. Provide a Figma URL or fixture directory path.`\n );\n}\n\nasync function loadFromApi(\n fileKey: string,\n nodeId: string | undefined,\n token?: string\n): Promise<LoadResult> {\n console.error(`Fetching from Figma REST API: ${fileKey}`);\n if (nodeId) {\n console.error(`Target node: ${nodeId}`);\n }\n\n const figmaToken = token ?? getFigmaToken();\n if (!figmaToken) {\n throw new Error(\n \"Figma token required. Run 'canicode init --token YOUR_TOKEN' or set FIGMA_TOKEN env var.\"\n );\n }\n\n const client = new FigmaClient({ token: figmaToken });\n\n if (nodeId) {\n // Fetch only the target node subtree — faster, less rate limit impact\n const response = await client.getFileNodes(fileKey, [nodeId.replace(/-/g, \":\")]);\n const file = transformFileNodesResponse(fileKey, response);\n\n // Resolve component master node trees for accurate analysis\n const componentDefs = await resolveComponentDefinitions(client, fileKey, file.document);\n if (Object.keys(componentDefs).length > 0) {\n file.componentDefinitions = componentDefs;\n }\n\n // Resolve interaction destination nodes (e.g., hover variants)\n const interactionDests = await resolveInteractionDestinations(client, fileKey, file.document, file.componentDefinitions);\n if (Object.keys(interactionDests).length > 0) {\n file.interactionDestinations = interactionDests;\n }\n\n return { file, nodeId };\n }\n\n const response = await client.getFile(fileKey);\n const file = transformFigmaResponse(fileKey, response);\n\n // Full file fetch may still miss component masters from external libraries\n const componentDefs = await resolveComponentDefinitions(client, fileKey, file.document);\n if (Object.keys(componentDefs).length > 0) {\n file.componentDefinitions = componentDefs;\n }\n\n // Resolve interaction destination nodes (e.g., hover variants)\n const interactionDests = await resolveInteractionDestinations(client, fileKey, file.document, file.componentDefinitions);\n if (Object.keys(interactionDests).length > 0) {\n file.interactionDestinations = interactionDests;\n }\n\n return { file, nodeId };\n}\n","import { z } from \"zod\";\n\n/**\n * Figma node types required for analysis\n * See @figma/rest-api-spec for full API types\n */\n\nexport const AnalysisNodeTypeSchema = z.enum([\n \"DOCUMENT\",\n \"CANVAS\",\n \"FRAME\",\n \"GROUP\",\n \"SECTION\",\n \"COMPONENT\",\n \"COMPONENT_SET\",\n \"INSTANCE\",\n \"RECTANGLE\",\n \"ELLIPSE\",\n \"VECTOR\",\n \"TEXT\",\n \"LINE\",\n \"BOOLEAN_OPERATION\",\n \"STAR\",\n \"REGULAR_POLYGON\",\n \"SLICE\",\n \"STICKY\",\n \"SHAPE_WITH_TEXT\",\n \"CONNECTOR\",\n \"WIDGET\",\n \"EMBED\",\n \"LINK_UNFURL\",\n \"TABLE\",\n \"TABLE_CELL\",\n \"SLOT\",\n]);\n\nexport type AnalysisNodeType = z.infer<typeof AnalysisNodeTypeSchema>;\n\nexport const LayoutModeSchema = z.enum([\"NONE\", \"HORIZONTAL\", \"VERTICAL\", \"GRID\"]);\nexport type LayoutMode = z.infer<typeof LayoutModeSchema>;\n\nexport const LayoutAlignSchema = z.enum([\"MIN\", \"CENTER\", \"MAX\", \"STRETCH\", \"INHERIT\"]);\nexport type LayoutAlign = z.infer<typeof LayoutAlignSchema>;\n\nexport const LayoutPositioningSchema = z.enum([\"AUTO\", \"ABSOLUTE\"]);\nexport type LayoutPositioning = z.infer<typeof LayoutPositioningSchema>;\n\nexport const LayoutConstraintSchema = z.object({\n horizontal: z.enum([\"LEFT\", \"RIGHT\", \"CENTER\", \"LEFT_RIGHT\", \"SCALE\"]),\n vertical: z.enum([\"TOP\", \"BOTTOM\", \"CENTER\", \"TOP_BOTTOM\", \"SCALE\"]),\n});\nexport type LayoutConstraint = z.infer<typeof LayoutConstraintSchema>;\n\nexport const LayoutWrapSchema = z.enum([\"NO_WRAP\", \"WRAP\"]);\nexport type LayoutWrap = z.infer<typeof LayoutWrapSchema>;\n\nexport const OverflowDirectionSchema = z.enum([\n \"HORIZONTAL_SCROLLING\",\n \"VERTICAL_SCROLLING\",\n \"HORIZONTAL_AND_VERTICAL_SCROLLING\",\n \"NONE\",\n]);\nexport type OverflowDirection = z.infer<typeof OverflowDirectionSchema>;\n\nexport const GridChildAlignSchema = z.enum([\"AUTO\", \"MIN\", \"CENTER\", \"MAX\"]);\nexport type GridChildAlign = z.infer<typeof GridChildAlignSchema>;\n\n/**\n * Lightweight FigmaNode type for analysis\n * Contains only properties needed by rules\n */\nconst BaseAnalysisNodeSchema = z.object({\n // Basic identification\n id: z.string(),\n name: z.string(),\n type: AnalysisNodeTypeSchema,\n visible: z.boolean().default(true),\n\n // Layout analysis\n layoutMode: LayoutModeSchema.optional(),\n layoutAlign: LayoutAlignSchema.optional(),\n layoutPositioning: LayoutPositioningSchema.optional(),\n layoutSizingHorizontal: z.enum([\"FIXED\", \"HUG\", \"FILL\"]).optional(),\n layoutSizingVertical: z.enum([\"FIXED\", \"HUG\", \"FILL\"]).optional(),\n primaryAxisAlignItems: z.string().optional(),\n counterAxisAlignItems: z.string().optional(),\n itemSpacing: z.number().optional(),\n paddingLeft: z.number().optional(),\n paddingRight: z.number().optional(),\n paddingTop: z.number().optional(),\n paddingBottom: z.number().optional(),\n\n // Size constraints (responsive)\n minWidth: z.number().optional(),\n maxWidth: z.number().optional(),\n minHeight: z.number().optional(),\n maxHeight: z.number().optional(),\n layoutGrow: z.union([z.literal(0), z.literal(1)]).optional(),\n constraints: LayoutConstraintSchema.optional(),\n\n // Wrap (flex-wrap)\n layoutWrap: LayoutWrapSchema.optional(),\n counterAxisSpacing: z.number().optional(),\n counterAxisAlignContent: z.enum([\"AUTO\", \"SPACE_BETWEEN\"]).optional(),\n\n // Grid layout (container)\n gridRowCount: z.number().optional(),\n gridColumnCount: z.number().optional(),\n gridRowGap: z.number().optional(),\n gridColumnGap: z.number().optional(),\n gridColumnsSizing: z.string().optional(),\n gridRowsSizing: z.string().optional(),\n\n // Grid layout (child)\n gridChildHorizontalAlign: GridChildAlignSchema.optional(),\n gridChildVerticalAlign: GridChildAlignSchema.optional(),\n gridRowSpan: z.number().optional(),\n gridColumnSpan: z.number().optional(),\n gridRowAnchorIndex: z.number().optional(),\n gridColumnAnchorIndex: z.number().optional(),\n\n // Overflow / clip\n clipsContent: z.boolean().optional(),\n overflowDirection: OverflowDirectionSchema.optional(),\n\n // Size/position analysis\n absoluteBoundingBox: z\n .object({\n x: z.number(),\n y: z.number(),\n width: z.number(),\n height: z.number(),\n })\n .nullable()\n .optional(),\n\n // Component analysis\n componentId: z.string().optional(),\n componentPropertyDefinitions: z.record(z.string(), z.unknown()).optional(),\n componentProperties: z.record(z.string(), z.unknown()).optional(),\n\n // Style/token analysis\n styles: z.record(z.string(), z.string()).optional(),\n fills: z.array(z.unknown()).optional(),\n strokes: z.array(z.unknown()).optional(),\n strokeWeight: z.number().optional(),\n individualStrokeWeights: z.record(z.string(), z.number()).optional(),\n effects: z.array(z.unknown()).optional(),\n cornerRadius: z.number().optional(),\n opacity: z.number().optional(),\n\n // Variable binding analysis (design tokens)\n boundVariables: z.record(z.string(), z.unknown()).optional(),\n\n // Text analysis\n characters: z.string().optional(),\n style: z.record(z.string(), z.unknown()).optional(),\n textTruncation: z.enum([\"DISABLED\", \"ENDING\"]).optional(),\n maxLines: z.number().optional(),\n\n // Handoff analysis\n devStatus: z\n .object({\n type: z.enum([\"NONE\", \"READY_FOR_DEV\", \"COMPLETED\"]),\n description: z.string().optional(),\n })\n .optional(),\n\n // Prototype interactions\n interactions: z.array(z.unknown()).optional(),\n\n // Naming analysis metadata\n isAsset: z.boolean().optional(),\n});\n\nexport type AnalysisNode = z.infer<typeof BaseAnalysisNodeSchema> & {\n children?: AnalysisNode[] | undefined;\n};\n\nexport const AnalysisNodeSchema: z.ZodType<AnalysisNode> =\n BaseAnalysisNodeSchema.extend({\n children: z.lazy(() => AnalysisNodeSchema.array().optional()),\n }) as z.ZodType<AnalysisNode>;\n\n/**\n * Figma file metadata for analysis\n */\nexport const AnalysisFileSchema = z.object({\n fileKey: z.string(),\n name: z.string(),\n lastModified: z.string(),\n version: z.string(),\n sourceUrl: z.string().optional(),\n document: AnalysisNodeSchema,\n components: z.record(\n z.string(),\n z.object({\n key: z.string(),\n name: z.string(),\n description: z.string(),\n })\n ),\n componentDefinitions: z.record(z.string(), AnalysisNodeSchema).optional(),\n interactionDestinations: z.record(z.string(), AnalysisNodeSchema).optional(),\n styles: z.record(\n z.string(),\n z.object({\n key: z.string(),\n name: z.string(),\n styleType: z.string(),\n })\n ),\n});\n\nexport type AnalysisFile = z.infer<typeof AnalysisFileSchema>;\n","import { readFile } from \"node:fs/promises\";\nimport { basename, dirname } from \"node:path\";\nimport type { GetFileResponse } from \"@figma/rest-api-spec\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport { AnalysisNodeSchema } from \"../contracts/figma-node.js\";\nimport { transformFigmaResponse } from \"./figma-transformer.js\";\n\n/**\n * Extract fileKey from fixture path.\n * - fixtures/name/data.json → name (directory-based fixture)\n * - fixtures/name.json → name (legacy flat fixture)\n */\nfunction extractFileKey(filePath: string): string {\n const fileName = basename(filePath, \".json\");\n if (fileName === \"data\") {\n // Directory-based fixture: use parent directory name\n return basename(dirname(filePath));\n }\n return fileName;\n}\n\n/**\n * Load Figma data from a JSON file\n * For MVP testing and fixture support\n */\nexport async function loadFigmaFileFromJson(\n filePath: string\n): Promise<AnalysisFile> {\n const content = await readFile(filePath, \"utf-8\");\n const data = JSON.parse(content) as GetFileResponse & {\n componentDefinitions?: Record<string, unknown>;\n interactionDestinations?: Record<string, unknown>;\n };\n\n const fileKey = extractFileKey(filePath);\n\n const file = transformFigmaResponse(fileKey, data);\n\n // Preserve componentDefinitions from previously-saved fixtures\n if (data.componentDefinitions) {\n const parsed: Record<string, AnalysisNode> = {};\n for (const [id, raw] of Object.entries(data.componentDefinitions)) {\n const result = AnalysisNodeSchema.safeParse(raw);\n if (result.success) {\n parsed[id] = result.data;\n } else {\n console.debug(`[figma-file-loader] componentDefinitions[${id}] failed validation:`, result.error.issues);\n }\n }\n if (Object.keys(parsed).length > 0) {\n file.componentDefinitions = parsed;\n }\n }\n\n // Preserve interactionDestinations from previously-saved fixtures\n if (data.interactionDestinations) {\n const parsed: Record<string, AnalysisNode> = {};\n for (const [id, raw] of Object.entries(data.interactionDestinations)) {\n const result = AnalysisNodeSchema.safeParse(raw);\n if (result.success) {\n parsed[id] = result.data;\n } else {\n console.debug(`[figma-file-loader] interactionDestinations[${id}] failed validation:`, result.error.issues);\n }\n }\n if (Object.keys(parsed).length > 0) {\n file.interactionDestinations = parsed;\n }\n }\n\n return file;\n}\n\n/**\n * Parse Figma data from a JSON string\n */\nexport function parseFigmaJson(\n json: string,\n fileKey: string\n): AnalysisFile {\n const data = JSON.parse(json) as GetFileResponse;\n return transformFigmaResponse(fileKey, data);\n}\n\nexport class FigmaFileLoadError extends Error {\n constructor(message: string, public filePath?: string) {\n super(message);\n this.name = \"FigmaFileLoadError\";\n }\n}\n","import { z } from \"zod\";\n\nexport const FigmaUrlInfoSchema = z.object({\n fileKey: z.string(),\n nodeId: z.string().optional(),\n fileName: z.string().optional(),\n});\n\nexport type FigmaUrlInfo = z.infer<typeof FigmaUrlInfoSchema>;\n\nconst FIGMA_URL_PATTERNS = [\n // https://www.figma.com/design/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/design\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n // https://www.figma.com/file/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/file\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n // https://www.figma.com/proto/FILE_KEY/FILE_NAME?node-id=NODE_ID\n /figma\\.com\\/proto\\/([a-zA-Z0-9]+)(?:\\/([^?]+))?(?:\\?.*node-id=([^&]+))?/,\n];\n\nexport function parseFigmaUrl(url: string): FigmaUrlInfo {\n for (const pattern of FIGMA_URL_PATTERNS) {\n const match = url.match(pattern);\n if (match) {\n const [, fileKey, fileName, nodeId] = match;\n if (!fileKey) {\n throw new FigmaUrlParseError(`Invalid Figma URL: missing file key`);\n }\n return {\n fileKey,\n fileName: fileName ? decodeURIComponent(fileName) : undefined,\n nodeId: nodeId ? decodeURIComponent(nodeId) : undefined,\n };\n }\n }\n\n throw new FigmaUrlParseError(\n `Invalid Figma URL format. Expected: https://www.figma.com/design/FILE_KEY/...`\n );\n}\n\nexport class FigmaUrlParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FigmaUrlParseError\";\n }\n}\n\n/**\n * Extract the commentable node ID from a potentially nested instance path.\n * Instance-internal IDs like \"I3010:7457;1442:7704\" use semicolons to\n * separate path segments. The Figma Comments API only accepts simple IDs\n * (e.g. \"3010:7457\"), so we take the first segment and strip the \"I\" prefix.\n */\nexport function toCommentableNodeId(nodeId: string): string {\n const firstSegment = nodeId.split(\";\")[0]!;\n return firstSegment.replace(/^I/, \"\");\n}\n\nexport function buildFigmaDeepLink(fileKey: string, nodeId: string): string {\n // Strip instance-internal path to top-level node:\n // \"I175:7425;1442:7704\" → \"175:7425\" → \"175-7425\"\n const topNodeId = toCommentableNodeId(nodeId).replace(/:/g, \"-\");\n return `https://www.figma.com/design/${fileKey}?node-id=${topNodeId}`;\n}\n","{\n \"name\": \"canicode\",\n \"version\": \"0.9.1\",\n \"mcpName\": \"io.github.let-sunny/canicode\",\n \"description\": \"Score your Figma designs with AI-calibrated rules. CLI + MCP server.\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"canicode\": \"dist/cli/index.js\",\n \"canicode-mcp\": \"dist/mcp/server.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"scripts\": {\n \"build\": \"tsup --config tsup.config.ts\",\n \"build:web\": \"bash scripts/build-web.sh\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest\",\n \"test:run\": \"vitest run\",\n \"lint\": \"tsc --noEmit\",\n \"build:plugin\": \"bash scripts/build-plugin.sh\",\n \"sync-docs\": \"tsx scripts/sync-rule-docs.ts\",\n \"clean\": \"rm -rf dist\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"docs/CUSTOMIZATION.md\",\n \".claude/skills/design-to-code/PROMPT.md\"\n ],\n \"keywords\": [\n \"figma\",\n \"design\",\n \"analysis\",\n \"cli\",\n \"mcp\",\n \"readiness\",\n \"ai\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/let-sunny/canicode.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/let-sunny/canicode/issues\"\n },\n \"homepage\": \"https://github.com/let-sunny/canicode\",\n \"author\": \"minseon\",\n \"license\": \"MIT\",\n \"pnpm\": {\n \"overrides\": {\n \"picomatch\": \"4.0.4\",\n \"path-to-regexp\": \"8.4.0\"\n }\n },\n \"packageManager\": \"pnpm@10.32.1\",\n \"engines\": {\n \"node\": \">=22\"\n },\n \"dependencies\": {\n \"@figma/rest-api-spec\": \"^0.36.0\",\n \"@modelcontextprotocol/sdk\": \"^1.27.1\",\n \"cac\": \"^7.0.0\",\n \"dotenv\": \"^17.3.1\",\n \"pixelmatch\": \"^7.1.0\",\n \"pngjs\": \"^7.0.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@anthropic-ai/sdk\": \"^0.80.0\",\n \"@figma/plugin-typings\": \"^1.123.0\",\n \"@types/node\": \"^25.5.0\",\n \"@types/pngjs\": \"^6.0.5\",\n \"playwright\": \"^1.58.2\",\n \"tsup\": \"^8.5.1\",\n \"tsx\": \"^4.19.0\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.0\"\n }\n}\n","import type { Category } from \"../contracts/category.js\";\nimport { CATEGORIES, CATEGORY_LABELS } from \"../contracts/category.js\";\nimport type { RuleId, RuleConfig } from \"../contracts/rule.js\";\nimport type { Severity } from \"../contracts/severity.js\";\nimport type { AnalysisResult } from \"./rule-engine.js\";\nimport { RULE_CONFIGS, RULE_ID_CATEGORY } from \"../rules/rule-config.js\";\nimport { version as VERSION } from \"../../../package.json\";\n\n/**\n * Score breakdown for a single category\n */\nexport interface CategoryScoreResult {\n category: Category;\n score: number;\n maxScore: number;\n percentage: number;\n issueCount: number;\n uniqueRuleCount: number;\n weightedIssueCount: number;\n densityScore: number;\n diversityScore: number;\n bySeverity: Record<Severity, number>;\n}\n\n/**\n * Overall score report\n */\nexport interface ScoreReport {\n overall: {\n score: number;\n maxScore: number;\n percentage: number;\n grade: Grade;\n };\n byCategory: Record<Category, CategoryScoreResult>;\n summary: {\n totalIssues: number;\n blocking: number;\n risk: number;\n missingInfo: number;\n suggestion: number;\n nodeCount: number;\n };\n}\n\n/**\n * Grade levels based on percentage\n */\nexport type Grade = \"S\" | \"A+\" | \"A\" | \"B+\" | \"B\" | \"C+\" | \"C\" | \"D\" | \"F\";\n\n/**\n * Density weighting uses per-rule base |score| with sqrt damping (#226).\n *\n * Previously, each issue's |calculatedScore| was summed linearly — a rule\n * triggering N times contributed N× its score. This over-penalized designs\n * with many instances of the same issue (e.g., raw-value ×79 = -316 weight),\n * causing most real files to score Grade D/F with no differentiation.\n *\n * Now: same rule triggered N times contributes |score| × sqrt(N).\n * raw-value ×79 = 4 × sqrt(79) ≈ 36 instead of 316.\n * At low counts sqrt ≈ linear (sqrt(1)=1, sqrt(4)=2), preserving sensitivity.\n * At high counts the curve flattens — 79th occurrence adds ~0.2 vs 1st adding 4.\n *\n * Category weights removed (#196) — overall score is simple average of categories.\n * Category importance is already encoded in rule scores (pixel-critical -10\n * vs semantic -4), so per-category weighting is unnecessary.\n */\n\n/**\n * Compute sum of |score| for all rules in each category from a given config map.\n * Used as denominator for severity-weighted diversity scoring.\n * Must use the same preset-adjusted config map that produced the analysis issues,\n * otherwise diversity ratios will be incorrect.\n */\nfunction computeTotalScorePerCategory(\n configs: Record<RuleId, RuleConfig>\n): Record<Category, number> {\n const totals = Object.fromEntries(\n CATEGORIES.map(c => [c, 0])\n ) as Record<Category, number>;\n\n for (const [id, config] of Object.entries(configs)) {\n const category = RULE_ID_CATEGORY[id as RuleId];\n if (category && config.enabled) {\n totals[category] += Math.abs(config.score);\n }\n }\n\n return totals;\n}\n\n/**\n * Score composition weights (initial intuition, pending calibration validation).\n *\n * Density (0.7): \"how many issues per node\" — measures issue volume relative to design size.\n * Designs with many issues per node are harder to implement accurately.\n *\n * Diversity (0.3): \"how many different rule types triggered\" — measures issue breadth.\n * A design that triggers 1 rule 50 times is easier to fix than one triggering 10 different rules.\n *\n * The 70:30 ratio prioritizes volume over variety. Rationale: a design with a single\n * systemic problem (e.g., all frames missing auto-layout) is still very hard to implement,\n * even though diversity is low. Density captures this; diversity adds a penalty for\n * designs with scattered, unrelated issues.\n *\n * Status: initial values. To be validated via /calibrate-loop against visual-compare results.\n */\nconst DENSITY_WEIGHT = 0.7;\nconst DIVERSITY_WEIGHT = 0.3;\n\n/**\n * Minimum score floor.\n * Even the worst design gets 5% instead of 0%. Rationale: a score of 0 implies\n * \"completely unimplementable\", but any Figma file with visible nodes provides\n * some structural information. The floor also avoids demoralizing UX — seeing 0%\n * feels like the tool failed, not that the design needs improvement.\n */\nconst SCORE_FLOOR = 5;\n\n/**\n * Calculate grade from percentage.\n * Thresholds follow a 5-point interval pattern (95/90/85/80/75/70/65) with a wider\n * gap for D (50-64) and F (<50). This mirrors academic grading conventions where\n * the top tiers are tightly spaced and the failing range is broad.\n */\nfunction calculateGrade(percentage: number): Grade {\n if (percentage >= 95) return \"S\";\n if (percentage >= 90) return \"A+\";\n if (percentage >= 85) return \"A\";\n if (percentage >= 80) return \"B+\";\n if (percentage >= 75) return \"B\";\n if (percentage >= 70) return \"C+\";\n if (percentage >= 65) return \"C\";\n if (percentage >= 50) return \"D\";\n return \"F\";\n}\n\n/**\n * Convert grade to a CSS-safe class name suffix\n * e.g. \"A+\" -> \"Aplus\", \"B+\" -> \"Bplus\", \"C+\" -> \"Cplus\"\n */\nexport function gradeToClassName(grade: Grade): string {\n return grade.replace(\"+\", \"plus\");\n}\n\n/**\n * Clamp a value between min and max\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Calculate scores from analysis result using density + diversity scoring\n *\n * Density Score = 100 - (weighted issue count / node count) * 100\n * Diversity Score = (1 - weighted triggered rule scores / total category scores) * 100\n * Final Score = density * 0.7 + diversity * 0.3\n *\n * @param result Analysis result with issues\n * @param configs Optional preset-adjusted config map used to produce the issues.\n * If not provided, diversity totals are reconstructed from issue.config values.\n */\nexport function calculateScores(\n result: AnalysisResult,\n configs?: Record<RuleId, RuleConfig>\n): ScoreReport {\n const categoryScores = initializeCategoryScores();\n const nodeCount = result.nodeCount;\n\n // Track unique rules and their base |score| per category\n const uniqueRulesPerCategory = new Map<Category, Set<string>>();\n const ruleScorePerCategory = new Map<Category, Map<string, number>>();\n // Track issue counts per rule per category for sqrt damping (#226)\n const ruleIssueCountPerCategory = new Map<Category, Map<string, number>>();\n for (const category of CATEGORIES) {\n uniqueRulesPerCategory.set(category, new Set());\n ruleScorePerCategory.set(category, new Map());\n ruleIssueCountPerCategory.set(category, new Map());\n }\n\n // Compute totals from the config map.\n // If configs provided: use preset-adjusted totals (recommended when using presets).\n // If not: fall back to static RULE_CONFIGS — only correct when issues were\n // produced with default RULE_CONFIGS, otherwise diversity ratios will be skewed.\n const totalScorePerCategory = computeTotalScorePerCategory(configs ?? RULE_CONFIGS);\n\n // Count issues by severity per category and track unique rules with scores\n for (const issue of result.issues) {\n const category = issue.rule.definition.category;\n const severity = issue.config.severity;\n const ruleId = issue.rule.definition.id;\n\n categoryScores[category].issueCount++;\n categoryScores[category].bySeverity[severity]++;\n uniqueRulesPerCategory.get(category)!.add(ruleId);\n ruleScorePerCategory.get(category)!.set(ruleId, Math.abs(issue.config.score));\n // Accumulate per-rule issue count (using |calculatedScore| as weight unit)\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n ruleCountMap.set(ruleId, (ruleCountMap.get(ruleId) ?? 0) + 1);\n }\n\n // Compute weightedIssueCount with sqrt damping per rule (#226).\n // Same rule triggered N times contributes |score| × sqrt(N) instead of |score| × N.\n // Rationale: 79 raw-value issues represent one systemic problem, not 79× the difficulty.\n // First few occurrences identify the problem; subsequent ones have diminishing impact.\n // At low counts sqrt ≈ linear (sqrt(1)=1, sqrt(4)=2), preserving sensitivity for rare issues.\n for (const category of CATEGORIES) {\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n const ruleScoreMap = ruleScorePerCategory.get(category)!;\n let dampedWeight = 0;\n for (const [ruleId, count] of ruleCountMap) {\n const ruleScore = ruleScoreMap.get(ruleId) ?? 0;\n dampedWeight += ruleScore * Math.sqrt(count);\n }\n categoryScores[category].weightedIssueCount = dampedWeight;\n }\n\n // Calculate percentage for each category based on density + diversity\n for (const category of CATEGORIES) {\n const catScore = categoryScores[category];\n const uniqueRules = uniqueRulesPerCategory.get(category)!;\n\n catScore.uniqueRuleCount = uniqueRules.size;\n\n // Density score: lower density = higher score\n let densityScore = 100;\n if (nodeCount > 0 && catScore.issueCount > 0) {\n const density = catScore.weightedIssueCount / nodeCount;\n densityScore = clamp(Math.round(100 - density * 100), 0, 100);\n }\n catScore.densityScore = densityScore;\n\n // Diversity score: weighted by base rule |score| (config.score, not calculatedScore).\n // Uses base score intentionally — diversity measures \"what types of problems exist\",\n // not \"where they occur\". depthWeight affects density (volume penalty) but not diversity\n // (breadth penalty). A blocking rule (score -10) penalizes diversity more than a\n // suggestion (score -1), so low-severity-only designs correctly get high diversity scores.\n let diversityScore = 100;\n if (catScore.issueCount > 0) {\n const ruleScores = ruleScorePerCategory.get(category)!;\n const weightedTriggered = Array.from(ruleScores.values()).reduce((sum, s) => sum + s, 0);\n const weightedTotal = totalScorePerCategory[category];\n const diversityRatio = weightedTotal > 0 ? weightedTriggered / weightedTotal : 0;\n diversityScore = clamp(Math.round((1 - diversityRatio) * 100), 0, 100);\n }\n catScore.diversityScore = diversityScore;\n\n // Combined score with floor\n const combinedScore = densityScore * DENSITY_WEIGHT + diversityScore * DIVERSITY_WEIGHT;\n catScore.percentage = catScore.issueCount > 0\n ? clamp(Math.round(combinedScore), SCORE_FLOOR, 100)\n : 100;\n\n catScore.score = catScore.percentage;\n catScore.maxScore = 100;\n }\n\n // Calculate overall score as simple average of categories\n // Category importance is already encoded in rule scores (weight baked in),\n // so no per-category weighting is needed.\n let categorySum = 0;\n for (const category of CATEGORIES) {\n categorySum += categoryScores[category].percentage;\n }\n\n const overallPercentage = CATEGORIES.length > 0\n ? Math.round(categorySum / CATEGORIES.length)\n : 100;\n\n // Count issues by severity\n const summary = {\n totalIssues: result.issues.length,\n blocking: 0,\n risk: 0,\n missingInfo: 0,\n suggestion: 0,\n nodeCount,\n };\n\n for (const issue of result.issues) {\n switch (issue.config.severity) {\n case \"blocking\":\n summary.blocking++;\n break;\n case \"risk\":\n summary.risk++;\n break;\n case \"missing-info\":\n summary.missingInfo++;\n break;\n case \"suggestion\":\n summary.suggestion++;\n break;\n }\n }\n\n return {\n overall: {\n score: overallPercentage,\n maxScore: 100,\n percentage: overallPercentage,\n grade: calculateGrade(overallPercentage),\n },\n byCategory: categoryScores,\n summary,\n };\n}\n\n/**\n * Initialize empty category scores\n */\nfunction initializeCategoryScores(): Record<Category, CategoryScoreResult> {\n const scores: Partial<Record<Category, CategoryScoreResult>> = {};\n\n for (const category of CATEGORIES) {\n scores[category] = {\n category,\n score: 100,\n maxScore: 100,\n percentage: 100,\n issueCount: 0,\n uniqueRuleCount: 0,\n weightedIssueCount: 0,\n densityScore: 100,\n diversityScore: 100,\n bySeverity: {\n blocking: 0,\n risk: 0,\n \"missing-info\": 0,\n suggestion: 0,\n },\n };\n }\n\n return scores as Record<Category, CategoryScoreResult>;\n}\n\n/**\n * Format score report as a summary string\n */\nexport function formatScoreSummary(report: ScoreReport): string {\n const lines: string[] = [];\n\n lines.push(`Overall: ${report.overall.grade} (${report.overall.percentage}%)`);\n lines.push(\"\");\n lines.push(\"By Category:\");\n\n for (const category of CATEGORIES) {\n const cat = report.byCategory[category];\n lines.push(` ${category}: ${cat.percentage}% (${cat.issueCount} issues, ${cat.uniqueRuleCount} rules)`);\n }\n\n lines.push(\"\");\n lines.push(\"Issues:\");\n lines.push(` Blocking: ${report.summary.blocking}`);\n lines.push(` Risk: ${report.summary.risk}`);\n lines.push(` Missing Info: ${report.summary.missingInfo}`);\n lines.push(` Suggestion: ${report.summary.suggestion}`);\n lines.push(` Total: ${report.summary.totalIssues}`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get category label for display\n */\nexport function getCategoryLabel(category: Category): string {\n return CATEGORY_LABELS[category];\n}\n\n/**\n * Get severity label for display\n */\nexport function getSeverityLabel(severity: Severity): string {\n const labels: Record<Severity, string> = {\n blocking: \"Blocking\",\n risk: \"Risk\",\n \"missing-info\": \"Missing Info\",\n suggestion: \"Suggestion\",\n };\n return labels[severity];\n}\n\n/**\n * Build a JSON-serializable analysis result summary.\n * Shared by CLI (--json) and MCP server (analyze tool response).\n */\nexport function buildResultJson(\n fileName: string,\n result: AnalysisResult,\n scores: ScoreReport,\n options?: { fileKey?: string },\n): Record<string, unknown> {\n const issuesByRule: Record<string, number> = {};\n for (const issue of result.issues) {\n const id = issue.violation.ruleId;\n issuesByRule[id] = (issuesByRule[id] ?? 0) + 1;\n }\n\n const issues = result.issues.map((issue) => ({\n ruleId: issue.violation.ruleId,\n ...(issue.violation.subType && { subType: issue.violation.subType }),\n severity: issue.config.severity,\n nodeId: issue.violation.nodeId,\n nodePath: issue.violation.nodePath,\n message: issue.violation.message,\n }));\n\n const json: Record<string, unknown> = {\n version: VERSION,\n analyzedAt: result.analyzedAt,\n ...(options?.fileKey && { fileKey: options.fileKey }),\n fileName,\n nodeCount: result.nodeCount,\n maxDepth: result.maxDepth,\n issueCount: result.issues.length,\n scores: {\n overall: scores.overall,\n categories: scores.byCategory,\n },\n issuesByRule,\n issues,\n summary: formatScoreSummary(scores),\n };\n\n if (result.failedRules.length > 0) {\n json[\"failedRules\"] = result.failedRules;\n }\n\n return json;\n}","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { SeveritySchema } from \"../contracts/severity.js\";\nimport type { RuleConfig } from \"../contracts/rule.js\";\nimport { RULE_CONFIGS } from \"./rule-config.js\";\n\nconst VALID_RULE_IDS = new Set(Object.keys(RULE_CONFIGS));\n\nconst RuleOverrideSchema = z.object({\n score: z.number().int().max(0).optional(),\n severity: SeveritySchema.optional(),\n enabled: z.boolean().optional(),\n});\n\nconst ConfigFileSchema = z.object({\n excludeNodeTypes: z.array(z.string()).optional(),\n excludeNodeNames: z.array(z.string()).optional(),\n gridBase: z.number().int().positive().optional(),\n rules: z.record(z.string(), RuleOverrideSchema)\n .superRefine((rules, ctx) => {\n const unknown = Object.keys(rules).filter((id) => !VALID_RULE_IDS.has(id));\n if (unknown.length > 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Unknown rule ID(s): ${unknown.join(\", \")}. Valid IDs: ${[...VALID_RULE_IDS].join(\", \")}`,\n });\n }\n })\n .optional(),\n});\n\nexport type ConfigFile = z.infer<typeof ConfigFileSchema>;\n\nexport async function loadConfigFile(filePath: string): Promise<ConfigFile> {\n const absPath = resolve(filePath);\n const raw = await readFile(absPath, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n return ConfigFileSchema.parse(parsed);\n}\n\n/**\n * Merge config overrides into the base rule configs\n */\nexport function mergeConfigs(\n base: Record<string, RuleConfig>,\n overrides: ConfigFile,\n): Record<string, RuleConfig> {\n const merged = { ...base };\n\n // Apply global gridBase to relevant rules\n if (overrides.gridBase !== undefined) {\n for (const [id, config] of Object.entries(merged)) {\n if (config.options && \"gridBase\" in config.options) {\n merged[id] = {\n ...config,\n options: { ...config.options, gridBase: overrides.gridBase },\n };\n }\n }\n }\n\n // Apply per-rule overrides\n if (overrides.rules) {\n for (const [ruleId, override] of Object.entries(overrides.rules)) {\n const existing = merged[ruleId];\n if (existing) {\n merged[ruleId] = {\n ...existing,\n ...(override.score !== undefined && { score: override.score }),\n ...(override.severity !== undefined && { severity: override.severity }),\n ...(override.enabled !== undefined && { enabled: override.enabled }),\n };\n }\n }\n }\n\n return merged;\n}\n","// Shared UI constants — single source of truth for report-html (Node) and app/shared (browser)\n\nimport type { Category } from \"./contracts/category.js\";\nimport type { Severity } from \"./contracts/severity.js\";\n\n// Re-export category/severity constants that already exist\nexport { CATEGORIES, CATEGORY_LABELS } from \"./contracts/category.js\";\nexport { SEVERITY_LABELS } from \"./contracts/severity.js\";\n\n// Gauge geometry\nexport const GAUGE_R = 54;\nexport const GAUGE_C = Math.round(2 * Math.PI * GAUGE_R); // ~339\n\nexport const CATEGORY_DESCRIPTIONS: Record<Category, string> = {\n \"pixel-critical\":\n \"Auto Layout, absolute positioning, group usage — layout issues that directly affect pixel accuracy\",\n \"responsive-critical\":\n \"Fixed sizing, size constraints, responsive behavior — issues that break at different viewports\",\n \"code-quality\":\n \"Component reuse, detached instances, variant structure, nesting depth\",\n \"token-management\":\n \"Design token binding for colors, fonts, shadows, opacity, spacing grid\",\n \"interaction\":\n \"State variants for interactive components — hover, disabled, active, focus\",\n \"semantic\":\n \"Semantic layer names, naming conventions, default names\",\n};\n\nexport const SEVERITY_ORDER: Severity[] = [\n \"blocking\",\n \"risk\",\n \"missing-info\",\n \"suggestion\",\n];\n","// Shared UI helper functions — single source of truth for report-html (Node) and app/shared (browser)\n// All functions here must be pure (no Node.js or DOM dependencies)\n\nimport type { Severity } from \"./contracts/severity.js\";\nimport { GAUGE_R, GAUGE_C } from \"./ui-constants.js\";\n\n/** Map a percentage score to a color hex string */\nexport function gaugeColor(pct: number): string {\n if (pct >= 75) return \"#22c55e\";\n if (pct >= 50) return \"#f59e0b\";\n return \"#ef4444\";\n}\n\n/** Map a percentage score to a color class name (green/amber/red) */\nexport function scoreClass(pct: number): string {\n if (pct >= 75) return \"green\";\n if (pct >= 50) return \"amber\";\n return \"red\";\n}\n\n/** Escape HTML special characters — works in both Node.js and browser */\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#039;\");\n}\n\n\n/** Severity to CSS modifier class (used with .rpt-dot, .rpt-issue-score) */\nexport function severityDot(sev: Severity): string {\n const map: Record<Severity, string> = {\n blocking: \"sev-blocking\",\n risk: \"sev-risk\",\n \"missing-info\": \"sev-missing\",\n suggestion: \"sev-suggestion\",\n };\n return map[sev];\n}\n\n/** Severity to CSS modifier class (used with .rpt-issue-score) */\nexport function severityBadge(sev: Severity): string {\n const map: Record<Severity, string> = {\n blocking: \"sev-blocking\",\n risk: \"sev-risk\",\n \"missing-info\": \"sev-missing\",\n suggestion: \"sev-suggestion\",\n };\n return map[sev];\n}\n\n/** Score percentage to CSS modifier class (used with .rpt-badge) */\nexport function scoreBadgeStyle(pct: number): string {\n if (pct >= 75) return \"score-green\";\n if (pct >= 50) return \"score-amber\";\n return \"score-red\";\n}\n\n/** Render a circular gauge SVG string — works in both Node.js and browser */\nexport function renderGaugeSvg(\n pct: number,\n size: number,\n strokeW: number,\n grade?: string\n): string {\n const offset = GAUGE_C * (1 - pct / 100);\n const color = gaugeColor(pct);\n if (grade) {\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" class=\"gauge-svg\">\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke-width=\"${strokeW}\" stroke=\"#e4e4e7\" />\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"${strokeW}\" stroke-linecap=\"round\" stroke-dasharray=\"${GAUGE_C}\" stroke-dashoffset=\"${offset}\" transform=\"rotate(-90 60 60)\" class=\"gauge-fill\" />\n <text x=\"60\" y=\"60\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"currentColor\" font-size=\"48\" font-weight=\"700\" font-family=\"Inter,-apple-system,sans-serif\">${escapeHtml(grade)}</text>\n </svg>`;\n }\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" class=\"gauge-svg\">\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke-width=\"${strokeW}\" stroke=\"#e4e4e7\" />\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"${strokeW}\" stroke-linecap=\"round\" stroke-dasharray=\"${GAUGE_C}\" stroke-dashoffset=\"${offset}\" transform=\"rotate(-90 60 60)\" class=\"gauge-fill\" />\n <text x=\"60\" y=\"62\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"currentColor\" font-size=\"28\" font-weight=\"700\" font-family=\"Inter,-apple-system,sans-serif\">${pct}</text>\n </svg>`;\n}\n","/**\n * Pure template functions for report HTML rendering.\n * No Node.js dependencies — usable in browser via CanICode.* globals.\n *\n * Single source of truth for all report UI:\n * - CLI: generateHtmlReport() wraps with <html> shell\n * - Web app: CanICode.renderReportBody() → innerHTML\n * - Figma plugin: CanICode.renderReportBody() → innerHTML\n *\n * Layout: category tabs → rule sections (static info) → node accordion (dynamic info)\n * Styled via self-contained CSS (app/shared/styles.css) — no Tailwind dependency.\n */\n\nimport type { Category } from \"../contracts/category.js\";\nimport type { AnalysisIssue } from \"../engine/rule-engine.js\";\nimport type { ScoreReport } from \"../engine/scoring.js\";\nimport { version as VERSION } from \"../../../package.json\";\nimport { buildFigmaDeepLink } from \"../adapters/figma-url-parser.js\";\nimport {\n CATEGORIES,\n CATEGORY_LABELS,\n} from \"../ui-constants.js\";\nimport {\n escapeHtml,\n severityDot,\n severityBadge,\n renderGaugeSvg,\n} from \"../ui-helpers.js\";\n\n// ---- Data interface ----\n\nexport interface ReportData {\n fileName: string;\n fileKey: string;\n scores: ScoreReport;\n issues: AnalysisIssue[];\n nodeCount: number;\n maxDepth: number;\n figmaToken?: string;\n}\n\n/** Issues grouped by rule within a category */\ninterface RuleGroup {\n ruleId: string;\n ruleName: string;\n severity: string;\n severityClass: string;\n why: string;\n impact: string;\n fix: string;\n issues: AnalysisIssue[];\n totalScore: number;\n}\n\n// ---- Main render ----\n\n/**\n * Render the report body content (everything inside <main>).\n * Does NOT include <html>, <head>, <body> — caller wraps as needed.\n */\nexport function renderReportBody(data: ReportData): string {\n const { scores, issues, fileKey, figmaToken } = data;\n const issuesByCategory = groupIssuesByCategory(issues);\n const ruleOpportunities = getTopRules(issues, 5);\n\n return `\n <!-- Overall Score -->\n <section class=\"rpt-overall\">\n ${renderGaugeSvg(scores.overall.percentage, 200, 10, scores.overall.grade)}\n <div class=\"rpt-score\">\n <span class=\"rpt-score-value\">${scores.overall.percentage}</span>\n <span class=\"rpt-score-max\">/ 100</span>\n </div>\n <p class=\"rpt-score-label\">Overall Score</p>\n </section>\n\n <!-- Category Gauges -->\n <section class=\"card rpt-gauges\">\n <div class=\"rpt-gauges-grid\">\n${CATEGORIES.map((cat) => {\n const cs = scores.byCategory[cat];\n return ` <button type=\"button\" class=\"rpt-gauge-item\" data-tab=\"${cat}\">\n ${renderGaugeSvg(cs.percentage, 100, 7)}\n <span class=\"rpt-gauge-label\">${CATEGORY_LABELS[cat]}</span>\n <span class=\"rpt-gauge-count\">${cs.issueCount} issues</span>\n </button>`;\n }).join(\"\\n\")}\n </div>\n </section>\n\n <!-- Issue Summary -->\n <section class=\"card rpt-summary\">\n <div class=\"rpt-summary-inner\">\n ${renderSummaryDot(\"sev-blocking\", scores.summary.blocking, \"Blocking\")}\n ${renderSummaryDot(\"sev-risk\", scores.summary.risk, \"Risk\")}\n ${renderSummaryDot(\"sev-missing\", scores.summary.missingInfo, \"Missing Info\")}\n ${renderSummaryDot(\"sev-suggestion\", scores.summary.suggestion, \"Suggestion\")}\n <div class=\"rpt-summary-total\">\n <span class=\"rpt-summary-count\">${scores.summary.totalIssues}</span>\n <span class=\"rpt-summary-label\">Total</span>\n </div>\n </div>\n </section>\n\n${ruleOpportunities.length > 0 ? renderOpportunities(ruleOpportunities) : \"\"}\n\n <!-- Category Tabs -->\n <div class=\"rpt-tabs\">\n <div class=\"rpt-tab-list\" role=\"tablist\">\n${CATEGORIES.map((cat, i) => {\n const cs = scores.byCategory[cat];\n return ` <button type=\"button\" role=\"tab\" class=\"rpt-tab${i === 0 ? \" active\" : \"\"}\" data-tab=\"${cat}\" aria-selected=\"${i === 0}\">${CATEGORY_LABELS[cat]} <span class=\"rpt-tab-count\">${cs.issueCount}</span></button>`;\n }).join(\"\\n\")}\n </div>\n\n${CATEGORIES.map((cat, i) => {\n const catIssues = issuesByCategory.get(cat) ?? [];\n const ruleGroups = groupIssuesByRule(catIssues);\n return ` <div class=\"rpt-tab-panel${i === 0 ? \" active\" : \"\"}\" data-panel=\"${cat}\" role=\"tabpanel\">\n${ruleGroups.length === 0\n ? ' <div class=\"rpt-cat-empty\">No issues found</div>'\n : ruleGroups.map(rg => renderRuleSection(rg, fileKey, figmaToken)).join(\"\\n\")\n}\n </div>`;\n }).join(\"\\n\")}\n </div>\n\n <!-- Footer -->\n <footer class=\"rpt-footer\">\n <p class=\"rpt-footer-main\"><strong>CanICode</strong> <span style=\"opacity:0.5\">v${VERSION}</span></p>\n <p class=\"rpt-footer-meta\">${new Date().toLocaleString()} · ${data.nodeCount} nodes · Max depth ${data.maxDepth}</p>\n <p class=\"rpt-footer-links\"><a href=\"https://github.com/let-sunny/canicode/issues\" target=\"_blank\" rel=\"noopener\">Feedback</a> <span style=\"opacity:0.3\">&middot;</span> <a href=\"https://github.com/let-sunny/canicode/discussions/new?category=share-your-figma\" target=\"_blank\" rel=\"noopener\">Share your Figma</a></p>\n </footer>`;\n}\n\n// ---- Components ----\n\nexport function renderSummaryDot(sevClass: string, count: number, label: string): string {\n return `<div class=\"rpt-summary-item\">\n <span class=\"rpt-dot ${sevClass}\"></span>\n <span class=\"rpt-summary-count\">${count}</span>\n <span class=\"rpt-summary-label\">${label}</span>\n </div>`;\n}\n\nexport function renderOpportunities(ruleGroups: RuleGroup[]): string {\n const maxAbs = ruleGroups.reduce((m, rg) => Math.max(m, Math.abs(rg.totalScore)), 1);\n return `\n <!-- Opportunities -->\n <section class=\"card rpt-opps\">\n <div class=\"rpt-opps-header\">\n <h2 class=\"rpt-opps-title\">\n <span class=\"rpt-dot sev-blocking\"></span>\n Opportunities\n </h2>\n <p class=\"rpt-opps-desc\">Top impact rules — fix these first for the biggest improvement.</p>\n </div>\n <div class=\"rpt-opps-list\">\n${ruleGroups.map(rg => {\n const barW = Math.round((Math.abs(rg.totalScore) / maxAbs) * 100);\n const cat = rg.issues[0]?.rule.definition.category ?? \"\";\n return ` <div class=\"rpt-opps-item\" data-opp-rule=\"${esc(rg.ruleId)}\" data-opp-cat=\"${cat}\" style=\"cursor:pointer\">\n <div class=\"rpt-opps-info\">\n <div class=\"rpt-opps-name\">${esc(rg.ruleName)}</div>\n <div class=\"rpt-opps-msg\">${rg.issues.length} issues</div>\n </div>\n <div class=\"rpt-opps-bar-wrap\">\n <div class=\"rpt-opps-bar\">\n <div class=\"rpt-opps-bar-fill\" style=\"width:${barW}%\"></div>\n </div>\n <span class=\"rpt-opps-score\">${rg.totalScore}</span>\n </div>\n </div>`;\n }).join(\"\\n\")}\n </div>\n </section>`;\n}\n\nexport function renderRuleSection(\n rg: RuleGroup,\n fileKey: string,\n figmaToken?: string\n): string {\n const isOpen = rg.severity === \"blocking\" || rg.severity === \"risk\";\n return ` <details class=\"card rpt-rule\" data-rule=\"${esc(rg.ruleId)}\"${isOpen ? \" open\" : \"\"}>\n <summary class=\"rpt-rule-header\">\n <span class=\"rpt-badge score-red\">${rg.totalScore}</span>\n <span class=\"rpt-rule-title\">\n <span class=\"rpt-rule-name\">${esc(rg.ruleName)}</span>\n <span class=\"rpt-rule-meta\">\n <span class=\"rpt-dot-sm ${rg.severityClass}\"></span>\n ${esc(rg.severity)} · ${rg.issues.length} issues\n </span>\n <span class=\"rpt-rule-info\">\n <span class=\"rpt-rule-info-line\"><strong>Why:</strong> ${esc(rg.why)}</span>\n <span class=\"rpt-rule-info-line\"><strong>Impact:</strong> ${esc(rg.impact)}</span>\n <span class=\"rpt-rule-info-line\"><strong>Fix:</strong> ${esc(rg.fix)}</span>\n </span>\n </span>\n <svg class=\"rpt-rule-chevron no-print\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M19 9l-7 7-7-7\"/></svg>\n </summary>\n <div class=\"rpt-rule-issues\">\n${rg.issues.map(issue => renderIssueRow(issue, fileKey, figmaToken)).join(\"\\n\")}\n </div>\n </details>`;\n}\n\nexport function renderIssueRow(\n issue: AnalysisIssue,\n fileKey: string,\n figmaToken?: string\n): string {\n const sev = issue.config.severity;\n const v = issue.violation;\n const link = buildFigmaDeepLink(fileKey, v.nodeId);\n\n return ` <details class=\"rpt-issue\">\n <summary class=\"rpt-issue-header\">\n <span class=\"rpt-issue-msg\">${esc(v.message)}</span>\n <span class=\"rpt-issue-score ${severityBadge(sev)}\">${issue.calculatedScore}</span>\n </summary>\n <div class=\"rpt-issue-body\">\n <div class=\"rpt-issue-suggestion\">${esc(v.suggestion)}</div>${v.guide ? `\n <div class=\"rpt-issue-guide\">${esc(v.guide)}</div>` : \"\"}\n <div class=\"rpt-issue-path\">${esc(v.nodePath)}</div>\n <div class=\"rpt-issue-actions no-print\">\n <a href=\"${link}\" target=\"_blank\" rel=\"noopener\" data-node-id=\"${esc(v.nodeId)}\" class=\"rpt-btn\">Go to node <span>→</span></a>${figmaToken ? `\n <button onclick=\"postComment(this)\" data-file-key=\"${esc(fileKey)}\" data-node-id=\"${esc(v.nodeId)}\" data-message=\"${esc(v.message)} — ${esc(v.suggestion)}\" class=\"rpt-btn\">Comment on Figma</button>` : \"\"}\n </div>\n </div>\n </details>`;\n}\n\n// ---- Interactions ----\n\n/**\n * Initialize tab switching + navigation for a rendered report.\n * Call after inserting renderReportBody() HTML into a container.\n * Uses 'any' to avoid DOM type dependency (this file targets Node.js).\n */\nexport function initReportInteractions(container: any): void {\n // Remove previous handler if re-initialized (e.g., re-analysis)\n if (container._rptHandler) {\n container.removeEventListener(\"click\", container._rptHandler);\n }\n function activate(cat: string, scrollTo: boolean) {\n container.querySelectorAll(\".rpt-tab\").forEach((t: any) => {\n const active = t.dataset.tab === cat;\n t.classList.toggle(\"active\", active);\n t.setAttribute(\"aria-selected\", String(active));\n });\n container.querySelectorAll(\".rpt-tab-panel\").forEach((p: any) => {\n p.classList.toggle(\"active\", p.dataset.panel === cat);\n });\n if (scrollTo) {\n const tabList = container.querySelector(\".rpt-tab-list\");\n if (tabList) tabList.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n }\n function focusRule(ruleId: string) {\n const el = container.querySelector('[data-rule=\"' + ruleId + '\"]');\n if (el) {\n el.open = true;\n setTimeout(() => el.scrollIntoView({ behavior: \"smooth\", block: \"start\" }), 50);\n }\n }\n const handler = (e: any) => {\n const tab = e.target.closest(\"[data-tab]\");\n if (tab) {\n const isGauge = tab.classList.contains(\"rpt-gauge-item\");\n activate(tab.dataset.tab ?? \"\", isGauge);\n return;\n }\n const opp = e.target.closest(\"[data-opp-rule]\");\n if (opp) {\n const cat = opp.dataset.oppCat ?? \"\";\n const rule = opp.dataset.oppRule ?? \"\";\n if (cat) activate(cat, false);\n setTimeout(() => focusRule(rule), 50);\n }\n };\n container._rptHandler = handler;\n container.addEventListener(\"click\", handler);\n}\n\n// ---- Utils ----\n\n/** Get top N rules by total score impact */\nfunction getTopRules(issues: AnalysisIssue[], limit: number): RuleGroup[] {\n const byRule = new Map<string, RuleGroup>();\n for (const issue of issues) {\n const id = issue.rule.definition.id;\n let group = byRule.get(id);\n if (!group) {\n const def = issue.rule.definition;\n group = {\n ruleId: id,\n ruleName: def.name,\n severity: issue.config.severity,\n severityClass: severityDot(issue.config.severity),\n why: def.why,\n impact: def.impact,\n fix: def.fix,\n issues: [],\n totalScore: 0,\n };\n byRule.set(id, group);\n }\n group.issues.push(issue);\n group.totalScore += issue.calculatedScore;\n }\n return [...byRule.values()]\n .sort((a, b) => a.totalScore - b.totalScore)\n .slice(0, limit);\n}\n\nfunction groupIssuesByCategory(issues: AnalysisIssue[]): Map<Category, AnalysisIssue[]> {\n const grouped = new Map<Category, AnalysisIssue[]>();\n for (const category of CATEGORIES) grouped.set(category, []);\n for (const issue of issues) grouped.get(issue.rule.definition.category)!.push(issue);\n return grouped;\n}\n\n/** Group issues by rule within a category, sorted by severity then score */\nfunction groupIssuesByRule(issues: AnalysisIssue[]): RuleGroup[] {\n const byRule = new Map<string, RuleGroup>();\n for (const issue of issues) {\n const id = issue.rule.definition.id;\n let group = byRule.get(id);\n if (!group) {\n const def = issue.rule.definition;\n group = {\n ruleId: id,\n ruleName: def.name,\n severity: issue.config.severity,\n severityClass: severityDot(issue.config.severity),\n why: def.why,\n impact: def.impact,\n fix: def.fix,\n issues: [],\n totalScore: 0,\n };\n byRule.set(id, group);\n }\n group.issues.push(issue);\n group.totalScore += issue.calculatedScore;\n }\n\n const SEVERITY_RANK: Record<string, number> = { blocking: 0, risk: 1, \"missing-info\": 2, suggestion: 3 };\n return [...byRule.values()].sort((a, b) => {\n const sevDiff = (SEVERITY_RANK[a.severity] ?? 4) - (SEVERITY_RANK[b.severity] ?? 4);\n return sevDiff !== 0 ? sevDiff : a.totalScore - b.totalScore;\n });\n}\n\nconst esc = escapeHtml;\n","// Report HTML module — full page generation for CLI\n// Rendering logic lives in render.ts (shared with web/plugin)\n\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\nimport type { AnalysisResult } from \"../engine/rule-engine.js\";\nimport type { ScoreReport } from \"../engine/scoring.js\";\nimport { escapeHtml } from \"../ui-helpers.js\";\nimport { renderReportBody, initReportInteractions } from \"./render.js\";\nimport type { ReportData } from \"./render.js\";\n\ndeclare const __REPORT_CSS__: string;\nconst reportCss: string = __REPORT_CSS__;\n\nexport type { ReportData } from \"./render.js\";\nexport { renderReportBody, initReportInteractions } from \"./render.js\";\n\nexport interface NodeScreenshot {\n nodeId: string;\n nodePath: string;\n screenshotBase64: string;\n issueCount: number;\n topSeverity: string;\n}\n\nexport interface HtmlReportOptions {\n nodeScreenshots?: NodeScreenshot[];\n figmaToken?: string | undefined;\n}\n\nconst esc = escapeHtml;\n\n/**\n * Generate a complete standalone HTML report page.\n * Used by CLI — opens in browser.\n */\nexport function generateHtmlReport(\n file: AnalysisFile,\n result: AnalysisResult,\n scores: ScoreReport,\n options?: HtmlReportOptions\n): string {\n const figmaToken = options?.figmaToken;\n\n const data: ReportData = {\n fileName: file.name,\n fileKey: file.fileKey,\n scores,\n issues: result.issues,\n nodeCount: result.nodeCount,\n maxDepth: result.maxDepth,\n ...(figmaToken && { figmaToken }),\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 <title>CanICode Report — ${esc(file.name)}</title>\n <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap\" rel=\"stylesheet\">\n <style>\n${reportCss}\n .cli-topbar {\n background: #09090b; color: white;\n border-bottom: 1px solid #27272a;\n }\n .cli-topbar-inner {\n max-width: 960px; margin: 0 auto;\n padding: 12px 24px;\n display: flex; align-items: center; gap: 16px;\n }\n .cli-topbar-logo { font-weight: 600; font-size: 14px; letter-spacing: -0.01em; }\n .cli-topbar-file { color: #a1a1aa; font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n .cli-topbar-date { margin-left: auto; color: #71717a; font-size: 12px; }\n .cli-main { max-width: 960px; margin: 0 auto; padding: 0 24px 64px; }\n @media print {\n .cli-topbar { position: static !important; background: white !important; color: var(--fg) !important; }\n .cli-topbar-file { color: var(--fg-muted) !important; }\n }\n </style>\n</head>\n<body>\n\n <!-- Top Bar -->\n <header class=\"cli-topbar\">\n <div class=\"cli-topbar-inner\">\n <span class=\"cli-topbar-logo\">CanICode</span>\n <span class=\"cli-topbar-file\">${esc(file.name)}</span>\n <span class=\"cli-topbar-date no-print\">${new Date().toLocaleDateString()}</span>\n </div>\n </header>\n\n <main class=\"cli-main\">\n${renderReportBody(data)}\n </main>\n\n <script>(${String(initReportInteractions)})(document.querySelector('.cli-main'));</script>\n${figmaToken ? renderFigmaCommentScript(figmaToken) : \"\"}\n</body>\n</html>`;\n}\n\nfunction renderFigmaCommentScript(figmaToken: string): string {\n return ` <script>\n const FIGMA_TOKEN = '${figmaToken}';\n async function postComment(btn) {\n const fileKey = btn.dataset.fileKey;\n const nodeId = btn.dataset.nodeId.replace(/-/g, ':');\n const commentNodeId = nodeId.split(';')[0].replace(/^I/, '');\n const message = btn.dataset.message;\n const commentBody = '[CanICode] ' + message;\n btn.disabled = true;\n btn.textContent = 'Sending...';\n btn.title = '';\n try {\n const res = await fetch('https://api.figma.com/v1/files/' + fileKey + '/comments', {\n method: 'POST',\n headers: { 'X-FIGMA-TOKEN': FIGMA_TOKEN, 'Content-Type': 'application/json' },\n body: JSON.stringify({ message: commentBody, client_meta: { node_id: commentNodeId, node_offset: { x: 0, y: 0 } } }),\n });\n if (!res.ok) {\n const errBody = await res.text().catch(() => '');\n const errMsg = res.status === 400 ? 'Bad request' : res.status === 403 ? 'Token lacks file access' : res.status === 404 ? 'File not found' : res.status === 429 ? 'Rate limited' : 'HTTP ' + res.status;\n throw new Error(errMsg + (errBody ? ': ' + errBody.slice(0, 100) : ''));\n }\n btn.textContent = 'Sent';\n btn.classList.remove('rpt-btn-fail');\n btn.classList.add('rpt-btn-ok');\n } catch (e) {\n btn.textContent = 'Failed';\n btn.title = e.message || String(e);\n btn.classList.remove('rpt-btn-ok');\n btn.classList.add('rpt-btn-fail');\n btn.disabled = false;\n }\n }\n </script>`;\n}\n","import type { AnalysisFile, AnalysisNode } from \"../core/contracts/figma-node.js\";\n\nexport const MAX_NODES_WITHOUT_SCOPE = 500;\n\n/**\n * Find all FRAME/COMPONENT nodes with 50-500 nodes in their subtree,\n * then pick one at random. Used to auto-scope fixture analysis.\n */\nexport function pickRandomScope(root: AnalysisFile[\"document\"]): AnalysisFile[\"document\"] | null {\n const candidates: AnalysisFile[\"document\"][] = [];\n\n function collect(node: AnalysisFile[\"document\"]): void {\n const isContainer = node.type === \"FRAME\" || node.type === \"COMPONENT\" || node.type === \"SECTION\";\n if (isContainer) {\n const size = countNodes(node);\n if (size >= 50 && size <= 500) {\n candidates.push(node);\n }\n }\n if (\"children\" in node && node.children) {\n for (const child of node.children) {\n collect(child);\n }\n }\n }\n\n collect(root);\n if (candidates.length === 0) return null;\n const idx = Math.floor(Math.random() * candidates.length);\n return candidates[idx] ?? null;\n}\n\nexport function collectVectorNodeIds(node: { id: string; type: string; children?: readonly unknown[] | undefined }): string[] {\n const ids: string[] = [];\n if (node.type === \"VECTOR\") ids.push(node.id);\n if (node.children) {\n for (const child of node.children) {\n ids.push(...collectVectorNodeIds(child as typeof node));\n }\n }\n return ids;\n}\n\nexport function collectVectorNodes(node: { id: string; name: string; type: string; children?: readonly unknown[] | undefined }, parentName?: string): Array<{ id: string; name: string }> {\n const nodes: Array<{ id: string; name: string }> = [];\n if (node.type === \"VECTOR\") {\n // Include parent name for unique filenames (all vectors are often named \"Icon\")\n const qualifiedName = parentName ? `${parentName}-${node.name}` : node.name;\n nodes.push({ id: node.id, name: qualifiedName });\n }\n if (node.children) {\n for (const child of node.children) {\n nodes.push(...collectVectorNodes(child as typeof node, node.name));\n }\n }\n return nodes;\n}\n\nexport function collectImageNodes(node: AnalysisNode): Array<{ id: string; name: string; imageRef?: string }> {\n const nodes: Array<{ id: string; name: string; imageRef?: string }> = [];\n function walk(n: AnalysisNode): void {\n if (n.fills && Array.isArray(n.fills)) {\n for (const fill of n.fills) {\n const f = fill as { type?: string; imageRef?: string };\n if (f.type === \"IMAGE\") {\n if (f.imageRef) {\n nodes.push({ id: n.id, name: n.name, imageRef: f.imageRef });\n } else {\n nodes.push({ id: n.id, name: n.name });\n }\n break;\n }\n }\n }\n if (n.children) {\n for (const child of n.children) walk(child);\n }\n }\n walk(node);\n return nodes;\n}\n\nexport function sanitizeFilename(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n || \"image\";\n}\n\nexport function countNodes(node: { children?: readonly unknown[] | undefined }): number {\n let count = 1;\n if (node.children) {\n for (const child of node.children) {\n count += countNodes(child as { children?: readonly unknown[] | undefined });\n }\n }\n return count;\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport type { RuleConfig, RuleId } from \"../../core/contracts/rule.js\";\nimport { analyzeFile } from \"../../core/engine/rule-engine.js\";\nimport { loadFile, isJsonFile, isFixtureDir } from \"../../core/engine/loader.js\";\nimport {\n getFigmaToken, getReportsDir, ensureReportsDir,\n} from \"../../core/engine/config-store.js\";\nimport { calculateScores, formatScoreSummary, buildResultJson } from \"../../core/engine/scoring.js\";\nimport { getConfigsWithPreset, RULE_CONFIGS } from \"../../core/rules/rule-config.js\";\nimport { loadConfigFile, mergeConfigs } from \"../../core/rules/config-loader.js\";\nimport { generateHtmlReport } from \"../../core/report-html/index.js\";\nimport { trackEvent, trackError, EVENTS } from \"../../core/monitoring/index.js\";\nimport { pickRandomScope, countNodes, MAX_NODES_WITHOUT_SCOPE } from \"../helpers.js\";\n\nconst AnalyzeOptionsSchema = z.object({\n preset: z.enum([\"relaxed\", \"dev-friendly\", \"ai-ready\", \"strict\"]).optional(),\n output: z.string().optional(),\n token: z.string().optional(),\n api: z.boolean().optional(),\n screenshot: z.boolean().optional(),\n config: z.string().optional(),\n noOpen: z.boolean().optional(),\n json: z.boolean().optional(),\n});\n\n\nexport function registerAnalyze(cli: CAC): void {\n cli\n .command(\"analyze <input>\", \"Analyze a Figma file or JSON fixture\")\n .option(\"--preset <preset>\", \"Analysis preset (relaxed | dev-friendly | ai-ready | strict)\")\n .option(\"--output <path>\", \"HTML report output path\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--api\", \"Load via Figma REST API (requires FIGMA_TOKEN)\")\n .option(\"--screenshot\", \"Include screenshot comparison in report (requires ANTHROPIC_API_KEY)\")\n .option(\"--config <path>\", \"Path to config JSON file (override rule scores/settings)\")\n .option(\"--no-open\", \"Don't open report in browser after analysis\")\n .option(\"--json\", \"Output JSON results to stdout (same format as MCP)\")\n .example(\" canicode analyze https://www.figma.com/design/ABC123/MyDesign\")\n .example(\" canicode analyze https://www.figma.com/design/ABC123/MyDesign --api --token YOUR_TOKEN\")\n .example(\" canicode analyze ./fixtures/my-design --output report.html\")\n .example(\" canicode analyze ./fixtures/my-design --config ./my-config.json\")\n .action(async (input: string, rawOptions: Record<string, unknown>) => {\n const parseResult = AnalyzeOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => `--${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n const analysisStart = Date.now();\n trackEvent(EVENTS.ANALYSIS_STARTED, { source: isJsonFile(input) || isFixtureDir(input) ? \"fixture\" : \"figma\" });\n // In --json mode, send progress messages to stderr so stdout contains only valid JSON\n const log = options.json ? console.error.bind(console) : console.log.bind(console);\n try {\n // Check init\n if (!options.token && !getFigmaToken() && !isJsonFile(input) && !isFixtureDir(input)) {\n throw new Error(\n \"canicode is not configured. Run 'canicode init --token YOUR_TOKEN' first.\"\n );\n }\n\n // Validate --screenshot requirements\n if (options.screenshot) {\n const anthropicKey = process.env[\"ANTHROPIC_API_KEY\"];\n if (!anthropicKey) {\n throw new Error(\n \"ANTHROPIC_API_KEY required for --screenshot mode. Set it in .env or environment.\"\n );\n }\n log(\"Screenshot comparison mode enabled (coming soon).\\n\");\n }\n\n // Load file\n const { file, nodeId } = await loadFile(input, options.token);\n\n // Scope enforcement for large files\n const totalNodes = countNodes(file.document);\n let effectiveNodeId = nodeId;\n\n if (!effectiveNodeId && totalNodes > MAX_NODES_WITHOUT_SCOPE) {\n if (isJsonFile(input) || isFixtureDir(input)) {\n // Fixture: auto-pick a random suitable FRAME\n const picked = pickRandomScope(file.document);\n if (picked) {\n effectiveNodeId = picked.id;\n log(`\\nAuto-scoped to \"${picked.name}\" (${picked.id}, ${countNodes(picked)} nodes) — file too large (${totalNodes} nodes) for unscoped analysis.`);\n } else {\n console.warn(`\\nWarning: Could not find a suitable scope in fixture. Analyzing all ${totalNodes} nodes.`);\n }\n } else {\n // Figma URL: require explicit node-id\n throw new Error(\n `Too many nodes (${totalNodes}) for unscoped analysis. ` +\n `Max ${MAX_NODES_WITHOUT_SCOPE} nodes without a node-id scope.\\n\\n` +\n `Add ?node-id=XXX to the Figma URL to target a specific section.\\n` +\n `Example: canicode analyze \"https://www.figma.com/design/.../MyDesign?node-id=1-234\"`\n );\n }\n }\n if (!effectiveNodeId && totalNodes > 100) {\n console.warn(`\\nWarning: Analyzing ${totalNodes} nodes without scope. Results may be noisy.`);\n console.warn(\"Tip: Add ?node-id=XXX to analyze a specific section.\\n\");\n }\n\n log(`\\nAnalyzing: ${file.name}`);\n log(`Nodes: ${totalNodes}`);\n\n // Build rule configs: start from preset or defaults\n let configs: Record<string, RuleConfig> = options.preset\n ? { ...getConfigsWithPreset(options.preset) }\n : { ...RULE_CONFIGS };\n\n // Load and merge config file overrides\n let excludeNodeNames: string[] | undefined;\n let excludeNodeTypes: string[] | undefined;\n\n if (options.config) {\n const configFile = await loadConfigFile(options.config);\n configs = mergeConfigs(configs, configFile);\n excludeNodeNames = configFile.excludeNodeNames;\n excludeNodeTypes = configFile.excludeNodeTypes;\n log(`Config loaded: ${options.config}`);\n }\n\n // Build analysis options\n const analyzeOptions = {\n configs: configs as Record<RuleId, RuleConfig>,\n ...(effectiveNodeId && { targetNodeId: effectiveNodeId }),\n ...(excludeNodeNames && { excludeNodeNames }),\n ...(excludeNodeTypes && { excludeNodeTypes }),\n };\n\n // Run analysis\n const result = analyzeFile(file, analyzeOptions);\n log(`Nodes: ${result.nodeCount} (max depth: ${result.maxDepth})`);\n\n // Calculate scores using the same preset-adjusted configs\n const scores = calculateScores(result, configs as Record<RuleId, RuleConfig>);\n\n // JSON output mode — only JSON goes to stdout; exit code still applies\n if (options.json) {\n console.log(JSON.stringify(buildResultJson(file.name, result, scores, { fileKey: file.fileKey }), null, 2));\n if (scores.overall.grade === \"F\") {\n process.exitCode = 1;\n }\n return;\n }\n\n // Print summary to terminal\n console.log(\"\\n\" + \"=\".repeat(50));\n console.log(formatScoreSummary(scores));\n console.log(\"=\".repeat(50));\n\n // Generate HTML report\n const now = new Date();\n const ts = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}-${String(now.getDate()).padStart(2, \"0\")}-${String(now.getHours()).padStart(2, \"0\")}-${String(now.getMinutes()).padStart(2, \"0\")}`;\n let outputPath: string;\n\n if (options.output) {\n outputPath = resolve(options.output);\n const outputDir = dirname(outputPath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n } else {\n ensureReportsDir();\n outputPath = resolve(getReportsDir(), `report-${ts}-${file.fileKey}.html`);\n }\n\n const figmaToken = options.token ?? getFigmaToken();\n const html = generateHtmlReport(file, result, scores, { figmaToken });\n await writeFile(outputPath, html, \"utf-8\");\n console.log(`\\nReport saved: ${outputPath}`);\n\n trackEvent(EVENTS.ANALYSIS_COMPLETED, {\n nodeCount: result.nodeCount,\n issueCount: result.issues.length,\n grade: scores.overall.grade,\n percentage: scores.overall.percentage,\n duration: Date.now() - analysisStart,\n });\n trackEvent(EVENTS.REPORT_GENERATED, { format: \"html\" });\n\n // Open in browser unless --no-open\n if (!options.noOpen) {\n const { exec } = await import(\"node:child_process\");\n const cmd = process.platform === \"darwin\" ? \"open\" : process.platform === \"win32\" ? \"start\" : \"xdg-open\";\n exec(`${cmd} \"${outputPath}\"`);\n }\n\n // Exit with error code if grade is F\n if (scores.overall.grade === \"F\") {\n process.exitCode = 1;\n }\n } catch (error) {\n trackError(\n error instanceof Error ? error : new Error(String(error)),\n { command: \"analyze\", input },\n );\n trackEvent(EVENTS.ANALYSIS_FAILED, {\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - analysisStart,\n });\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport { parseFigmaUrl } from \"../../core/adapters/figma-url-parser.js\";\nimport { loadFile, isFigmaUrl } from \"../../core/engine/loader.js\";\nimport { getFigmaToken } from \"../../core/engine/config-store.js\";\nimport { collectVectorNodes, collectImageNodes, sanitizeFilename, countNodes } from \"../helpers.js\";\n\nconst SaveFixtureOptionsSchema = z.object({\n output: z.string().optional(),\n api: z.boolean().optional(),\n token: z.string().optional(),\n imageScale: z.string().optional(),\n name: z.string().optional(),\n});\n\n\nexport function registerSaveFixture(cli: CAC): void {\n cli\n .command(\n \"save-fixture <input>\",\n \"Save Figma design as a fixture directory for offline analysis\"\n )\n .option(\"--output <path>\", \"Output directory (default: fixtures/<name>/)\")\n .option(\"--name <name>\", \"Fixture name (default: extracted from URL)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--image-scale <n>\", \"Image export scale: 2 for PC (default), 3 for mobile\")\n .example(\" canicode save-fixture https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\")\n .example(\" canicode save-fixture https://www.figma.com/design/ABC123/MyDesign?node-id=1-234 --image-scale 3\")\n .action(async (input: string, rawOptions: Record<string, unknown>) => {\n try {\n const parseResult = SaveFixtureOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => `--${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n\n if (!isFigmaUrl(input)) {\n throw new Error(\"save-fixture requires a Figma URL as input.\");\n }\n\n // Validate --image-scale early (before any file I/O)\n if (options.imageScale !== undefined) {\n const scale = Number(options.imageScale);\n if (!Number.isFinite(scale) || scale < 1 || scale > 4) {\n console.error(\"Error: --image-scale must be 1-4 (2 for PC, 3 for mobile)\");\n process.exit(1);\n }\n }\n\n if (!parseFigmaUrl(input).nodeId) {\n console.warn(\"\\nWarning: No node-id specified. Saving entire file as fixture.\");\n console.warn(\"Tip: Add ?node-id=XXX to save a specific section.\\n\");\n }\n\n const { file } = await loadFile(input, options.token);\n file.sourceUrl = input;\n\n const fixtureName = options.name ?? file.fileKey;\n const fixtureDir = resolve(options.output ?? `fixtures/${fixtureName}`);\n mkdirSync(fixtureDir, { recursive: true });\n\n // 0. Resolve component master node trees\n const figmaTokenForComponents = options.token ?? getFigmaToken();\n if (figmaTokenForComponents) {\n const { FigmaClient: FC } = await import(\"../../core/adapters/figma-client.js\");\n const { resolveComponentDefinitions, resolveInteractionDestinations } = await import(\"../../core/adapters/component-resolver.js\");\n const componentClient = new FC({ token: figmaTokenForComponents });\n try {\n const definitions = await resolveComponentDefinitions(componentClient, file.fileKey, file.document);\n const count = Object.keys(definitions).length;\n if (count > 0) {\n file.componentDefinitions = definitions;\n console.log(`Resolved ${count} component master node tree(s)`);\n }\n // Resolve interaction destinations (hover variants, etc.)\n const interactionDests = await resolveInteractionDestinations(componentClient, file.fileKey, file.document, file.componentDefinitions);\n const destCount = Object.keys(interactionDests).length;\n if (destCount > 0) {\n file.interactionDestinations = interactionDests;\n console.log(`Resolved ${destCount} interaction destination(s)`);\n }\n } catch {\n console.warn(\"Warning: failed to resolve component definitions (continuing)\");\n }\n }\n\n // 1. Save data.json\n const dataPath = resolve(fixtureDir, \"data.json\");\n await writeFile(dataPath, JSON.stringify(file, null, 2), \"utf-8\");\n console.log(`Fixture saved: ${fixtureDir}/`);\n console.log(` data.json: ${file.name} (${countNodes(file.document)} nodes)`);\n\n // 2. Download screenshot\n const figmaToken = options.token ?? getFigmaToken();\n if (figmaToken) {\n const { FigmaClient } = await import(\"../../core/adapters/figma-client.js\");\n const client = new FigmaClient({ token: figmaToken });\n const { nodeId } = parseFigmaUrl(input);\n const rootNodeId = nodeId?.replace(/-/g, \":\") ?? file.document.id;\n\n try {\n const imageUrls = await client.getNodeImages(file.fileKey, [rootNodeId], { format: \"png\", scale: 2 });\n const url = imageUrls[rootNodeId];\n if (url) {\n const resp = await fetch(url);\n if (resp.ok) {\n const buffer = Buffer.from(await resp.arrayBuffer());\n const { writeFile: writeFileSync } = await import(\"node:fs/promises\");\n await writeFileSync(resolve(fixtureDir, \"screenshot.png\"), buffer);\n console.log(` screenshot.png: saved`);\n }\n }\n } catch {\n console.warn(\" screenshot.png: failed to download (continuing)\");\n }\n\n // 3. Download SVGs for VECTOR nodes\n const vectorNodes = collectVectorNodes(file.document);\n if (vectorNodes.length > 0) {\n const vectorDir = resolve(fixtureDir, \"vectors\");\n mkdirSync(vectorDir, { recursive: true });\n\n const svgUrls = await client.getNodeImages(\n file.fileKey,\n vectorNodes.map(n => n.id),\n { format: \"svg\" },\n );\n // Build mapping + download in a single pass to keep filenames consistent\n const mapping: Record<string, string> = {};\n const usedNames = new Map<string, number>();\n let downloaded = 0;\n for (const { id, name } of vectorNodes) {\n let base = sanitizeFilename(name);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n if (count > 0) base = `${base}-${count + 1}`;\n const filename = `${base}.svg`;\n mapping[id] = filename;\n const svgUrl = svgUrls[id];\n if (!svgUrl) continue;\n try {\n const resp = await fetch(svgUrl);\n if (resp.ok) {\n const svg = await resp.text();\n await writeFile(resolve(vectorDir, filename), svg, \"utf-8\");\n downloaded++;\n }\n } catch {\n // Skip failed downloads\n }\n }\n await writeFile(resolve(vectorDir, \"mapping.json\"), JSON.stringify(mapping, null, 2), \"utf-8\");\n\n console.log(` vectors/: ${downloaded}/${vectorNodes.length} SVGs`);\n }\n\n // 4. Download PNGs for IMAGE fill nodes\n const imageNodes = collectImageNodes(file.document);\n if (imageNodes.length > 0) {\n const imgScale = options.imageScale !== undefined ? Number(options.imageScale) : 2;\n\n const imageDir = resolve(fixtureDir, \"images\");\n mkdirSync(imageDir, { recursive: true });\n\n // Use image fills API to get original images (not node renders which include children)\n const imageFills = await client.getImageFills(file.fileKey);\n\n const usedNames = new Map<string, number>();\n const mapping: Record<string, string> = {};\n let imgDownloaded = 0;\n for (const { id, name, imageRef } of imageNodes) {\n let base = sanitizeFilename(name);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n if (count > 0) base = `${base}-${count + 1}`;\n const filename = `${base}@${imgScale}x.png`;\n mapping[id] = filename;\n if (!imageRef) continue;\n const imgUrl = imageFills[imageRef];\n if (!imgUrl) continue;\n try {\n const resp = await fetch(imgUrl);\n if (resp.ok) {\n const buf = Buffer.from(await resp.arrayBuffer());\n await writeFile(resolve(imageDir, filename), buf);\n imgDownloaded++;\n }\n } catch {\n // Skip failed downloads\n }\n }\n await writeFile(\n resolve(imageDir, \"mapping.json\"),\n JSON.stringify(mapping, null, 2),\n \"utf-8\"\n );\n\n console.log(` images/: ${imgDownloaded}/${imageNodes.length} PNGs (@${imgScale}x)`);\n }\n }\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { loadFile, isJsonFile } from \"../../core/engine/loader.js\";\n\nexport function registerDesignTree(cli: CAC): void {\n cli\n .command(\n \"design-tree <input>\",\n \"Generate a DOM-like design tree from a Figma file or fixture\"\n )\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--output <path>\", \"Output file path (default: stdout)\")\n .option(\"--vector-dir <path>\", \"Directory with SVG files for VECTOR nodes (auto-detected from fixture path)\")\n .option(\"--image-dir <path>\", \"Directory with image PNGs for IMAGE fill nodes (auto-detected from fixture path)\")\n .example(\" canicode design-tree ./fixtures/my-design\")\n .example(\" canicode design-tree https://www.figma.com/design/ABC/File?node-id=1-234 --output tree.txt\")\n .action(async (input: string, options: { token?: string; output?: string; vectorDir?: string; imageDir?: string }) => {\n try {\n const { file } = await loadFile(input, options.token);\n\n const fixtureBase = isJsonFile(input) ? dirname(resolve(input)) : resolve(input);\n\n // Auto-detect vector dir from fixture path\n let vectorDir = options.vectorDir;\n if (!vectorDir) {\n const autoDir = resolve(fixtureBase, \"vectors\");\n if (existsSync(autoDir)) vectorDir = autoDir;\n }\n\n // Auto-detect image dir from fixture path\n let imageDir = options.imageDir;\n if (!imageDir) {\n const autoDir = resolve(fixtureBase, \"images\");\n if (existsSync(autoDir)) imageDir = autoDir;\n }\n\n const { generateDesignTreeWithStats } = await import(\"../../core/design-tree/design-tree.js\");\n const treeOptions = {\n ...(vectorDir ? { vectorDir } : {}),\n ...(imageDir ? { imageDir } : {}),\n };\n const stats = generateDesignTreeWithStats(file, treeOptions);\n\n if (options.output) {\n const outputDir = dirname(resolve(options.output));\n if (!existsSync(outputDir)) mkdirSync(outputDir, { recursive: true });\n const { writeFile: writeFileAsync } = await import(\"node:fs/promises\");\n await writeFileAsync(resolve(options.output), stats.tree, \"utf-8\");\n console.log(`Design tree saved: ${resolve(options.output)} (${Math.round(stats.bytes / 1024)}KB, ~${stats.estimatedTokens} tokens)`);\n } else {\n console.log(stats.tree);\n }\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport { parseFigmaUrl } from \"../../core/adapters/figma-url-parser.js\";\nimport { analyzeFile } from \"../../core/engine/rule-engine.js\";\nimport { loadFile, isFigmaUrl, isJsonFile, isFixtureDir } from \"../../core/engine/loader.js\";\nimport { getFigmaToken } from \"../../core/engine/config-store.js\";\nimport { calculateScores, buildResultJson } from \"../../core/engine/scoring.js\";\nimport { collectVectorNodes, collectImageNodes, sanitizeFilename } from \"../helpers.js\";\n\nconst ImplementOptionsSchema = z.object({\n token: z.string().optional(),\n output: z.string().optional(),\n prompt: z.string().optional(),\n imageScale: z.string().optional(),\n});\n\n\nexport function registerImplement(cli: CAC): void {\n cli\n .command(\n \"implement <input>\",\n \"Prepare design-to-code package: analysis + design tree + assets + prompt\"\n )\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--output <dir>\", \"Output directory (default: ./canicode-implement/)\")\n .option(\"--prompt <path>\", \"Custom prompt file (default: built-in HTML+CSS prompt)\")\n .option(\"--image-scale <n>\", \"Image export scale: 2 for PC (default), 3 for mobile\")\n .example(\" canicode implement ./fixtures/my-design\")\n .example(\" canicode implement ./fixtures/my-design --prompt ./my-react-prompt.md --image-scale 3\")\n .action(async (input: string, rawOptions: Record<string, unknown>) => {\n try {\n const parseResult = ImplementOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => `--${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n\n // Validate --image-scale early\n if (options.imageScale !== undefined) {\n const scale = Number(options.imageScale);\n if (!Number.isFinite(scale) || scale < 1 || scale > 4) {\n console.error(\"Error: --image-scale must be 1-4 (2 for PC, 3 for mobile)\");\n process.exit(1);\n }\n }\n\n // Warn for unscoped Figma URL\n if (isFigmaUrl(input) && !parseFigmaUrl(input).nodeId) {\n console.warn(\"Warning: No node-id in Figma URL. Implementation package will cover the entire file.\");\n console.warn(\"Tip: Add ?node-id=XXX to target a specific section.\\n\");\n }\n\n const outputDir = resolve(options.output ?? \"canicode-implement\");\n mkdirSync(outputDir, { recursive: true });\n\n console.log(\"\\nPreparing implementation package...\\n\");\n\n // 1. Load file\n const { file } = await loadFile(input, options.token);\n console.log(`Design: ${file.name}`);\n\n // 2. Analysis\n const result = analyzeFile(file);\n const scores = calculateScores(result);\n const resultJson = buildResultJson(file.name, result, scores, { fileKey: file.fileKey });\n await writeFile(resolve(outputDir, \"analysis.json\"), JSON.stringify(resultJson, null, 2), \"utf-8\");\n console.log(` analysis.json: ${result.issues.length} issues, grade ${scores.overall.grade}`);\n\n // 3. Prepare assets (before design tree, so tree can reference image paths)\n const fixtureBase = (isJsonFile(input) || isFixtureDir(input))\n ? (isJsonFile(input) ? dirname(resolve(input)) : resolve(input))\n : undefined;\n\n let vectorDir = fixtureBase ? resolve(fixtureBase, \"vectors\") : undefined;\n let imageDir = fixtureBase ? resolve(fixtureBase, \"images\") : undefined;\n\n // Copy fixture assets to output\n if (vectorDir && existsSync(vectorDir)) {\n const vecOutputDir = resolve(outputDir, \"vectors\");\n mkdirSync(vecOutputDir, { recursive: true });\n const { readdirSync, copyFileSync } = await import(\"node:fs\");\n const vecFiles = readdirSync(vectorDir).filter(f => f.endsWith(\".svg\") || f === \"mapping.json\");\n for (const f of vecFiles) {\n copyFileSync(resolve(vectorDir, f), resolve(vecOutputDir, f));\n }\n vectorDir = vecOutputDir;\n console.log(` vectors/: ${vecFiles.length} SVGs copied`);\n }\n\n if (imageDir && existsSync(imageDir)) {\n const imgOutputDir = resolve(outputDir, \"images\");\n mkdirSync(imgOutputDir, { recursive: true });\n const { readdirSync, copyFileSync } = await import(\"node:fs\");\n const imgFiles = readdirSync(imageDir).filter(f => f.endsWith(\".png\") || f.endsWith(\".jpg\") || f.endsWith(\".json\"));\n for (const f of imgFiles) {\n copyFileSync(resolve(imageDir, f), resolve(imgOutputDir, f));\n }\n imageDir = imgOutputDir;\n const pngCount = imgFiles.filter(f => f.endsWith(\".png\")).length;\n console.log(` images/: ${pngCount} assets copied`);\n }\n\n // Download assets from Figma API for live URLs\n if (isFigmaUrl(input) && !fixtureBase) {\n const figmaToken = options.token ?? getFigmaToken();\n if (figmaToken) {\n const imgScale = options.imageScale !== undefined ? Number(options.imageScale) : 2;\n\n const { FigmaClient } = await import(\"../../core/adapters/figma-client.js\");\n const client = new FigmaClient({ token: figmaToken });\n\n // Download screenshot\n const { nodeId } = parseFigmaUrl(input);\n const rootNodeId = nodeId?.replace(/-/g, \":\") ?? file.document.id;\n try {\n const screenshotUrls = await client.getNodeImages(file.fileKey, [rootNodeId], { format: \"png\", scale: 2 });\n const screenshotUrl = screenshotUrls[rootNodeId];\n if (screenshotUrl) {\n const resp = await fetch(screenshotUrl);\n if (resp.ok) {\n const buf = Buffer.from(await resp.arrayBuffer());\n await writeFile(resolve(outputDir, \"screenshot.png\"), buf);\n console.log(` screenshot.png: saved`);\n }\n }\n } catch {\n console.warn(\" screenshot.png: failed to download (continuing)\");\n }\n\n // Download vector SVGs\n const vectorNodes = collectVectorNodes(file.document);\n if (vectorNodes.length > 0) {\n const vecOutDir = resolve(outputDir, \"vectors\");\n mkdirSync(vecOutDir, { recursive: true });\n try {\n const svgUrls = await client.getNodeImages(\n file.fileKey,\n vectorNodes.map(n => n.id),\n { format: \"svg\" },\n );\n // Build mapping + download in a single pass to keep filenames consistent\n const mapping: Record<string, string> = {};\n const usedNames = new Map<string, number>();\n let downloaded = 0;\n for (const { id, name } of vectorNodes) {\n let base = sanitizeFilename(name);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n if (count > 0) base = `${base}-${count + 1}`;\n const filename = `${base}.svg`;\n mapping[id] = filename;\n const svgUrl = svgUrls[id];\n if (!svgUrl) continue;\n try {\n const resp = await fetch(svgUrl);\n if (resp.ok) {\n const svg = await resp.text();\n await writeFile(resolve(vecOutDir, filename), svg, \"utf-8\");\n downloaded++;\n }\n } catch { /* skip */ }\n }\n await writeFile(resolve(vecOutDir, \"mapping.json\"), JSON.stringify(mapping, null, 2), \"utf-8\");\n\n console.log(` vectors/: ${downloaded}/${vectorNodes.length} SVGs`);\n } catch {\n console.warn(\" vectors/: failed to download (continuing)\");\n }\n }\n\n // Download image PNGs\n const imgNodes = collectImageNodes(file.document);\n if (imgNodes.length > 0) {\n const imgOutDir = resolve(outputDir, \"images\");\n mkdirSync(imgOutDir, { recursive: true });\n try {\n // Use image fills API to get original images (not node renders which include children)\n const imageFills = await client.getImageFills(file.fileKey);\n const mapping: Record<string, string> = {};\n const usedNames = new Map<string, number>();\n let downloaded = 0;\n for (const { id, name, imageRef } of imgNodes) {\n let base = sanitizeFilename(name);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n if (count > 0) base = `${base}-${count + 1}`;\n const filename = `${base}@${imgScale}x.png`;\n mapping[id] = filename;\n if (!imageRef) continue;\n const imgUrl = imageFills[imageRef];\n if (!imgUrl) continue;\n try {\n const resp = await fetch(imgUrl);\n if (resp.ok) {\n const buf = Buffer.from(await resp.arrayBuffer());\n await writeFile(resolve(imgOutDir, filename), buf);\n downloaded++;\n }\n } catch { /* skip */ }\n }\n await writeFile(resolve(imgOutDir, \"mapping.json\"), JSON.stringify(mapping, null, 2), \"utf-8\");\n\n imageDir = imgOutDir;\n console.log(` images/: ${downloaded}/${imgNodes.length} PNGs (@${imgScale}x)`);\n } catch {\n console.warn(\" images/: failed to download (continuing)\");\n }\n }\n\n // Update vectorDir to point to downloaded assets\n const vecOutCheck = resolve(outputDir, \"vectors\");\n if (existsSync(vecOutCheck)) vectorDir = vecOutCheck;\n }\n }\n\n // 4. Design tree (after assets so image paths are available)\n const { generateDesignTreeWithStats } = await import(\"../../core/design-tree/design-tree.js\");\n const treeOptions = {\n ...(vectorDir && existsSync(vectorDir) ? { vectorDir } : {}),\n ...(imageDir && existsSync(imageDir) ? { imageDir } : {}),\n };\n const stats = generateDesignTreeWithStats(file, treeOptions);\n await writeFile(resolve(outputDir, \"design-tree.txt\"), stats.tree, \"utf-8\");\n console.log(` design-tree.txt: ~${stats.estimatedTokens} tokens`);\n\n // 5. Assemble prompt\n if (options.prompt) {\n // Custom prompt: copy user's file\n const { readFile: rf } = await import(\"node:fs/promises\");\n const customPrompt = await rf(resolve(options.prompt), \"utf-8\");\n await writeFile(resolve(outputDir, \"PROMPT.md\"), customPrompt, \"utf-8\");\n console.log(` PROMPT.md: custom (${options.prompt})`);\n } else {\n // Default: built-in HTML+CSS prompt\n const { readFile: rf } = await import(\"node:fs/promises\");\n const { dirname: dirnameFn, resolve: resolveFn } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n const cliDir = dirnameFn(fileURLToPath(import.meta.url));\n const projectRoot = resolveFn(cliDir, \"../..\");\n const altRoot = resolveFn(cliDir, \"..\");\n\n let prompt = \"\";\n for (const root of [projectRoot, altRoot]) {\n const p = resolveFn(root, \".claude/skills/design-to-code/PROMPT.md\");\n try {\n prompt = await rf(p, \"utf-8\");\n break;\n } catch { /* try next */ }\n }\n\n if (prompt) {\n await writeFile(resolve(outputDir, \"PROMPT.md\"), prompt, \"utf-8\");\n console.log(` PROMPT.md: default (html-css)`);\n } else {\n console.warn(\" PROMPT.md: built-in prompt not found (skipped)\");\n }\n }\n\n // Summary\n console.log(`\\n${\"=\".repeat(50)}`);\n console.log(`Implementation package ready: ${outputDir}/`);\n console.log(` Grade: ${scores.overall.grade} (${scores.overall.percentage}%)`);\n console.log(` Issues: ${result.issues.length}`);\n console.log(` Design tree: ~${stats.estimatedTokens} tokens`);\n console.log(`${\"=\".repeat(50)}`);\n console.log(`\\nNext: Feed design-tree.txt + PROMPT.md to your AI assistant.`);\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { z } from \"zod\";\n\nconst positiveCliNumber = z\n .union([z.string(), z.number()])\n .transform((v) => Number(v))\n .refine(Number.isFinite, \"must be a valid number\")\n .refine((v) => v > 0, \"must be positive\");\n\nconst figmaScaleNumber = z\n .union([z.string(), z.number()])\n .transform((v) => Number(v))\n .refine(Number.isFinite, \"must be a valid number\")\n .refine((v) => v >= 1, \"must be >= 1\");\n\n/** Zod schema for CLI visual-compare options (raw CLI input). */\nexport const VisualCompareCliOptionsSchema = z.object({\n figmaUrl: z.string().optional(),\n figmaScreenshot: z.string().optional(),\n token: z.string().optional(),\n output: z.string().optional(),\n width: positiveCliNumber.optional(),\n height: positiveCliNumber.optional(),\n figmaScale: figmaScaleNumber.optional(),\n expandRoot: z.boolean().optional(),\n});\n\nexport type VisualCompareCliOptions = z.infer<typeof VisualCompareCliOptionsSchema>;\n","import { resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { parseFigmaUrl } from \"../../core/adapters/figma-url-parser.js\";\nimport { getFigmaToken } from \"../../core/engine/config-store.js\";\nimport { VisualCompareCliOptionsSchema } from \"../../core/contracts/visual-compare.js\";\n\n\nexport function registerVisualCompare(cli: CAC): void {\n cli\n .command(\n \"visual-compare <codePath>\",\n \"Compare rendered code against Figma screenshot (pixel-level similarity)\"\n )\n .option(\"--figma-url <url>\", \"Figma URL with node-id (required for API fetch)\")\n .option(\"--figma-screenshot <path>\", \"Local Figma screenshot file (skips API fetch)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--output <dir>\", \"Output directory for screenshots and diff (default: /tmp/canicode-visual-compare)\")\n .option(\"--width <px>\", \"Logical viewport width in CSS px (default: infer from Figma PNG ÷ export scale)\")\n .option(\"--height <px>\", \"Logical viewport height in CSS px (default: infer from Figma PNG ÷ export scale)\")\n .option(\"--figma-scale <n>\", \"Figma export scale (default: 2, matches save-fixture / @2x PNGs)\")\n .option(\"--expand-root\", \"Replace root element's fixed width with 100% before rendering (for responsive comparison)\")\n .example(\" canicode visual-compare ./generated/index.html --figma-url 'https://www.figma.com/design/ABC/File?node-id=1-234'\")\n .action(async (codePath: string, rawOptions: Record<string, unknown>) => {\n try {\n const parseResult = VisualCompareCliOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => `--${i.path.join(\".\")}: ${i.message}`).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n\n if (!options.figmaUrl && !options.figmaScreenshot) {\n console.error(\"Error: --figma-url or --figma-screenshot is required\");\n process.exitCode = 1; return;\n }\n\n // When using --figma-screenshot, --figma-url is still needed for URL parsing\n // but token is not required (no API fetch)\n if (options.figmaUrl && !parseFigmaUrl(options.figmaUrl).nodeId) {\n console.warn(\"Warning: --figma-url has no node-id. Results may be inaccurate for full files.\");\n console.warn(\"Tip: Add ?node-id=XXX to target a specific section.\\n\");\n }\n\n const token = options.token ?? getFigmaToken();\n if (!token && !options.figmaScreenshot) {\n console.error(\"Error: Figma token required. Use --token or set FIGMA_TOKEN env var (or use --figma-screenshot for local files).\");\n process.exitCode = 1; return;\n }\n\n const { visualCompare } = await import(\"../../core/comparison/visual-compare.js\");\n\n const hasViewportOverride = options.width !== undefined || options.height !== undefined;\n\n // Progress to stderr so stdout contains only valid JSON\n console.error(\"Comparing...\");\n const result = await visualCompare({\n figmaUrl: options.figmaUrl ?? \"https://www.figma.com/design/local/file?node-id=0-0\",\n figmaToken: token ?? \"\",\n codePath: resolve(codePath),\n outputDir: options.output,\n ...(options.figmaScale !== undefined ? { figmaExportScale: options.figmaScale } : {}),\n ...(options.figmaScreenshot ? { figmaScreenshotPath: resolve(options.figmaScreenshot) } : {}),\n ...(hasViewportOverride\n ? {\n viewport: {\n ...(options.width !== undefined ? { width: options.width } : {}),\n ...(options.height !== undefined ? { height: options.height } : {}),\n },\n }\n : {}),\n ...(options.expandRoot ? { expandRoot: true } : {}),\n });\n\n // JSON output for programmatic use\n console.log(JSON.stringify({\n similarity: result.similarity,\n diffPixels: result.diffPixels,\n totalPixels: result.totalPixels,\n width: result.width,\n height: result.height,\n figmaScreenshot: result.figmaScreenshotPath,\n codeScreenshot: result.codeScreenshotPath,\n diff: result.diffPath,\n }, null, 2));\n\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport {\n initAiready, getConfigPath, getReportsDir,\n} from \"../../core/engine/config-store.js\";\n\nconst InitOptionsSchema = z.object({\n token: z.string().optional(),\n});\n\nexport function registerInit(cli: CAC): void {\n cli\n .command(\"init\", \"Set up canicode with Figma API token\")\n .option(\"--token <token>\", \"Save Figma API token to ~/.canicode/\")\n .action((rawOptions: Record<string, unknown>) => {\n try {\n const parseResult = InitOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues.map(i => i.message).join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n const options = parseResult.data;\n\n if (options.token) {\n initAiready(options.token);\n\n console.log(` Config saved: ${getConfigPath()}`);\n console.log(` Reports will be saved to: ${getReportsDir()}/`);\n console.log(`\\n Next: canicode analyze \"https://www.figma.com/design/...\"`);\n return;\n }\n\n // No flags: show setup guide\n console.log(`CANICODE SETUP\\n`);\n console.log(` canicode init --token YOUR_FIGMA_TOKEN`);\n console.log(` Get token: figma.com > Settings > Personal access tokens\\n`);\n console.log(`After setup:`);\n console.log(` canicode analyze \"https://www.figma.com/design/...\"`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\n\nimport {\n getConfigPath, readConfig, setTelemetryEnabled,\n} from \"../../core/engine/config-store.js\";\n\ninterface ConfigOptions {\n telemetry?: boolean;\n}\n\nexport function registerConfig(cli: CAC): void {\n cli\n .command(\"config\", \"Manage canicode configuration\")\n .option(\"--telemetry\", \"Enable anonymous telemetry\")\n .option(\"--no-telemetry\", \"Disable anonymous telemetry\")\n .action((options: ConfigOptions) => {\n try {\n // CAC maps --no-telemetry to options.telemetry === false\n if (options.telemetry === false) {\n setTelemetryEnabled(false);\n console.log(\"Telemetry disabled. No analytics data will be sent.\");\n return;\n }\n\n if (options.telemetry === true) {\n setTelemetryEnabled(true);\n console.log(\"Telemetry enabled. Only anonymous usage events are tracked — no design data.\");\n return;\n }\n\n // No flags: show current config\n const cfg = readConfig();\n console.log(\"CANICODE CONFIG\\n\");\n console.log(` Config path: ${getConfigPath()}`);\n console.log(` Figma token: ${cfg.figmaToken ? \"set\" : \"not set\"}`);\n console.log(` Telemetry: ${cfg.telemetry !== false ? \"enabled\" : \"disabled\"}`);\n console.log(`\\nOptions:`);\n console.log(` canicode config --no-telemetry Opt out of anonymous telemetry`);\n console.log(` canicode config --telemetry Opt back in`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\n\nimport type { RuleConfig } from \"../../core/contracts/rule.js\";\nimport { RULE_CONFIGS } from \"../../core/rules/rule-config.js\";\nimport { ruleRegistry } from \"../../core/rules/rule-registry.js\";\nimport { loadConfigFile, mergeConfigs } from \"../../core/rules/config-loader.js\";\n\ninterface ListRulesOptions {\n config?: string;\n json?: boolean;\n}\n\nexport function registerListRules(cli: CAC): void {\n cli\n .command(\"list-rules\", \"List all analysis rules with scores and severity\")\n .option(\"--config <path>\", \"Apply config overrides to show effective scores\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (options: ListRulesOptions) => {\n try {\n let configs: Record<string, RuleConfig> = { ...RULE_CONFIGS };\n\n if (options.config) {\n const configFile = await loadConfigFile(options.config);\n configs = mergeConfigs(configs, configFile);\n }\n\n const rules = ruleRegistry.getAll().map((rule) => {\n const config = configs[rule.definition.id as string];\n return {\n id: rule.definition.id,\n name: rule.definition.name,\n category: rule.definition.category,\n severity: config?.severity ?? \"risk\",\n score: config?.score ?? 0,\n enabled: config?.enabled ?? true,\n };\n });\n\n if (options.json) {\n console.log(JSON.stringify(rules, null, 2));\n return;\n }\n\n // Group by category\n const byCategory = new Map<string, typeof rules>();\n for (const rule of rules) {\n const list = byCategory.get(rule.category) ?? [];\n list.push(rule);\n byCategory.set(rule.category, list);\n }\n\n for (const [category, catRules] of byCategory) {\n console.log(`\\n ${category.toUpperCase()}`);\n for (const r of catRules) {\n const status = r.enabled ? \"\" : \" (disabled)\";\n const pad = \" \".repeat(Math.max(0, 40 - r.id.length));\n console.log(` ${r.id}${pad} ${String(r.score).padStart(4)} ${r.severity}${status}`);\n }\n }\n console.log(`\\n Total: ${rules.length} rules\\n`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\n\nexport function registerPrompt(cli: CAC): void {\n cli\n .command(\"prompt\", \"Output the standard design-to-code prompt for AI code generation\")\n .action(async () => {\n try {\n const { readFile } = await import(\"node:fs/promises\");\n const { dirname: dirnameFn, resolve: resolveFn } = await import(\"node:path\");\n const { fileURLToPath } = await import(\"node:url\");\n const __dirname = dirnameFn(fileURLToPath(import.meta.url));\n // Try from source location first, then npm-installed location\n const paths = [\n resolveFn(__dirname, \"../../.claude/skills/design-to-code/PROMPT.md\"),\n resolveFn(__dirname, \"../.claude/skills/design-to-code/PROMPT.md\"),\n ];\n for (const p of paths) {\n try {\n const content = await readFile(p, \"utf-8\");\n console.log(content);\n return;\n } catch { /* try next */ }\n }\n console.error(\"Prompt file not found\");\n process.exitCode = 1; return;\n } catch (error) {\n console.error(\"Error:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { z } from \"zod\";\n\nexport const DifficultySchema = z.enum([\"easy\", \"moderate\", \"hard\", \"failed\"]);\nexport type Difficulty = z.infer<typeof DifficultySchema>;\n\nexport const RuleRelatedStruggleSchema = z.object({\n ruleId: z.string(),\n description: z.string(),\n actualImpact: DifficultySchema,\n});\n\nexport type RuleRelatedStruggle = z.infer<typeof RuleRelatedStruggleSchema>;\n\nexport const UncoveredStruggleSchema = z.object({\n description: z.string(),\n suggestedCategory: z.string(),\n estimatedImpact: DifficultySchema,\n});\n\nexport type UncoveredStruggle = z.infer<typeof UncoveredStruggleSchema>;\n\nexport const ConversionRecordSchema = z.object({\n nodeId: z.string(),\n nodePath: z.string(),\n generatedCode: z.string(),\n difficulty: DifficultySchema,\n notes: z.string(),\n ruleRelatedStruggles: z.array(RuleRelatedStruggleSchema),\n uncoveredStruggles: z.array(UncoveredStruggleSchema),\n durationMs: z.number(),\n});\n\nexport type ConversionRecord = z.infer<typeof ConversionRecordSchema>;\n\nexport const StripTypeEnum = z.enum([\n \"layout-direction-spacing\",\n \"size-constraints\",\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n]);\n\nexport const StripDeltaResultSchema = z.object({\n stripType: StripTypeEnum,\n // Pixel similarity (design viewport)\n baselineSimilarity: z.number(),\n strippedSimilarity: z.number(),\n delta: z.number().finite(),\n deltaDifficulty: DifficultySchema,\n // Responsive similarity (expanded viewport — primarily for size-constraints)\n baselineResponsiveSimilarity: z.number().finite().nullable().optional(),\n strippedResponsiveSimilarity: z.number().finite().nullable().optional(),\n responsiveDelta: z.number().finite().nullable().optional(),\n responsiveViewport: z.number().int().positive().nullable().optional(),\n // Input tokens (design-tree token count)\n baselineInputTokens: z.number().int().nonnegative().optional(),\n strippedInputTokens: z.number().int().nonnegative().optional(),\n tokenDelta: z.number().int().optional(),\n // HTML output size\n baselineHtmlBytes: z.number().int().nonnegative().optional(),\n strippedHtmlBytes: z.number().int().nonnegative().optional(),\n htmlBytesDelta: z.number().int().optional(),\n // CSS metrics\n baselineCssClassCount: z.number().int().nonnegative().optional(),\n strippedCssClassCount: z.number().int().nonnegative().optional(),\n baselineCssVariableCount: z.number().int().nonnegative().optional(),\n strippedCssVariableCount: z.number().int().nonnegative().optional(),\n});\n\nexport const StripDeltasArraySchema = z.array(StripDeltaResultSchema);\n\nexport type StripDeltaResult = z.infer<typeof StripDeltaResultSchema>;\n\nexport const RuleImpactAssessmentSchema = z.array(\n z.object({\n ruleId: z.string(),\n issueCount: z.number(),\n actualImpact: z.string(),\n description: z.string(),\n })\n);\n\nexport const UncoveredStrugglesInputSchema = z.array(\n z.object({\n description: z.string(),\n suggestedCategory: z.string(),\n estimatedImpact: z.string(),\n })\n);\n\n","import { z } from \"zod\";\n\nexport const SamplingStrategySchema = z.enum([\"all\", \"top-issues\", \"random\"]);\nexport type SamplingStrategy = z.infer<typeof SamplingStrategySchema>;\n\nexport const CalibrationStatusSchema = z.enum([\n \"pending\",\n \"analyzing\",\n \"converting\",\n \"evaluating\",\n \"tuning\",\n \"completed\",\n \"failed\",\n]);\nexport type CalibrationStatus = z.infer<typeof CalibrationStatusSchema>;\n\nexport const CalibrationConfigSchema = z.object({\n input: z.string(),\n token: z.string().optional(),\n targetNodeId: z.string().optional(),\n maxConversionNodes: z.number().int().positive().default(20),\n samplingStrategy: SamplingStrategySchema.default(\"top-issues\"),\n outputPath: z.string().default(\"logs/calibration/calibration-report.md\"),\n runDir: z.string().optional(),\n});\n\nexport type CalibrationConfig = z.infer<typeof CalibrationConfigSchema>;\nexport type CalibrationConfigInput = z.input<typeof CalibrationConfigSchema>;\n\nexport interface CalibrationRun {\n config: CalibrationConfig;\n status: CalibrationStatus;\n startedAt: string;\n completedAt?: string;\n error?: string;\n}\n","import type { AnalysisResult } from \"../core/engine/rule-engine.js\";\nimport { calculateScores } from \"../core/engine/scoring.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport type { Severity } from \"../core/contracts/severity.js\";\nimport type {\n AnalysisAgentInput,\n AnalysisAgentOutput,\n NodeIssueSummary,\n} from \"./contracts/analysis-agent.js\";\n\n/**\n * Group issues by nodeId and produce sorted summaries\n */\nfunction buildNodeIssueSummaries(\n result: AnalysisResult\n): NodeIssueSummary[] {\n const nodeMap = new Map<\n string,\n {\n nodePath: string;\n totalScore: number;\n issueCount: number;\n ruleIds: Set<string>;\n severities: Set<string>;\n }\n >();\n\n for (const issue of result.issues) {\n const nodeId = issue.violation.nodeId;\n const existing = nodeMap.get(nodeId);\n\n if (existing) {\n existing.totalScore += issue.calculatedScore;\n existing.issueCount++;\n existing.ruleIds.add(issue.rule.definition.id);\n existing.severities.add(issue.config.severity);\n } else {\n nodeMap.set(nodeId, {\n nodePath: issue.violation.nodePath,\n totalScore: issue.calculatedScore,\n issueCount: 1,\n ruleIds: new Set([issue.rule.definition.id]),\n severities: new Set([issue.config.severity as string]),\n });\n }\n }\n\n const summaries: NodeIssueSummary[] = [];\n\n for (const [nodeId, data] of nodeMap) {\n summaries.push({\n nodeId,\n nodePath: data.nodePath,\n totalScore: data.totalScore,\n issueCount: data.issueCount,\n flaggedRuleIds: [...data.ruleIds],\n severities: [...data.severities],\n });\n }\n\n // Sort by totalScore ascending (most negative = most problematic first)\n summaries.sort((a, b) => a.totalScore - b.totalScore);\n\n return summaries;\n}\n\n/**\n * Extract rule scores map from analysis result for downstream agents\n */\nexport function extractRuleScores(\n result: AnalysisResult\n): Record<string, { score: number; severity: string }> {\n const scores: Record<string, { score: number; severity: string }> = {};\n\n for (const issue of result.issues) {\n const ruleId = issue.rule.definition.id as RuleId;\n if (!scores[ruleId]) {\n scores[ruleId] = {\n score: issue.config.score,\n severity: issue.config.severity as Severity,\n };\n }\n }\n\n return scores;\n}\n\n/**\n * Analysis Agent - Step 1 of calibration pipeline\n *\n * Wraps existing analyzeFile + calculateScores and adds\n * nodeId-grouped issue summaries for downstream agents.\n */\nexport function runAnalysisAgent(\n input: AnalysisAgentInput\n): AnalysisAgentOutput {\n const { analysisResult } = input;\n\n const scoreReport = calculateScores(analysisResult);\n const nodeIssueSummaries = buildNodeIssueSummaries(analysisResult);\n\n return {\n analysisResult,\n scoreReport,\n nodeIssueSummaries,\n };\n}\n","/**\n * Delta-based difficulty mapping for ablation experiments.\n * Converts pixel similarity delta (baseline - stripped) to a difficulty level.\n *\n * Used by calibration pipeline to objectively measure rule impact\n * instead of relying on Converter self-assessment.\n */\n\nimport type { Difficulty } from \"../../agents/contracts/conversion-agent.js\";\n\n/**\n * Map a strip experiment's similarity delta to a difficulty level.\n *\n * Delta = baseline similarity - stripped similarity (percentage points).\n * Higher delta means removing that information caused more pixel degradation.\n *\n * Thresholds from issue #191:\n * - ≤ 5%p → easy (removing info barely matters)\n * - 6-15%p → moderate (noticeable degradation)\n * - 16-30%p → hard (significant degradation)\n * - > 30%p → failed (critical information)\n */\nexport function stripDeltaToDifficulty(delta: number): Difficulty {\n if (!Number.isFinite(delta)) {\n throw new TypeError(`Invalid strip delta: ${delta}`);\n }\n if (delta <= 5) return \"easy\";\n if (delta <= 15) return \"moderate\";\n if (delta <= 30) return \"hard\";\n return \"failed\";\n}\n\n/**\n * Map a token count delta percentage to a difficulty level.\n *\n * tokenDelta = baselineInputTokens - strippedInputTokens.\n * tokenDeltaPercent = tokenDelta / baselineInputTokens * 100.\n * Higher percentage means removing that info significantly reduces token cost,\n * i.e. the info contributed a lot of tokens — its absence matters for token management.\n *\n * Thresholds:\n * - ≤ 5% → easy (minimal token impact)\n * - 6-20% → moderate (noticeable token savings)\n * - 21-40% → hard (significant token impact)\n * - > 40% → failed (critical for token budget)\n */\nexport function tokenDeltaToDifficulty(baselineTokens: number, strippedTokens: number): Difficulty {\n if (!Number.isFinite(baselineTokens) || !Number.isFinite(strippedTokens)) {\n throw new TypeError(`Invalid token counts: baseline=${baselineTokens}, stripped=${strippedTokens}`);\n }\n if (baselineTokens <= 0) return \"easy\";\n const deltaPercent = ((baselineTokens - strippedTokens) / baselineTokens) * 100;\n if (deltaPercent <= 5) return \"easy\";\n if (deltaPercent <= 20) return \"moderate\";\n if (deltaPercent <= 40) return \"hard\";\n return \"failed\";\n}\n","import type {\n EvaluationAgentInput,\n EvaluationAgentOutput,\n MismatchCase,\n MismatchType,\n StripDeltaForEval,\n} from \"./contracts/evaluation-agent.js\";\nimport type { Difficulty } from \"./contracts/conversion-agent.js\";\nimport type { Severity } from \"../core/contracts/severity.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport { RULE_ID_CATEGORY } from \"../core/rules/rule-config.js\";\nimport type { DesignTreeInfoType } from \"../core/design-tree/strip.js\";\nimport { stripDeltaToDifficulty, tokenDeltaToDifficulty } from \"../core/design-tree/delta.js\";\n\n/**\n * Difficulty-to-score range mapping.\n * Used to determine if a rule's current score aligns with actual conversion difficulty.\n *\n * easy → score should be 0 to -3\n * moderate → score should be -4 to -7\n * hard → score should be -8 to -12\n * failed → score should be -8 to -12\n */\nconst DIFFICULTY_SCORE_RANGES: Record<Difficulty, { min: number; max: number }> = {\n easy: { min: -3, max: 0 },\n moderate: { min: -7, max: -4 },\n hard: { min: -12, max: -8 },\n failed: { min: -12, max: -8 },\n};\n\n/**\n * Check if a score falls within the expected range for a given difficulty\n */\nfunction scoreMatchesDifficulty(score: number, difficulty: Difficulty): boolean {\n const range = DIFFICULTY_SCORE_RANGES[difficulty];\n return score >= range.min && score <= range.max;\n}\n\n/**\n * Determine mismatch type for a flagged rule based on conversion difficulty\n */\nfunction classifyFlaggedRule(\n currentScore: number,\n actualDifficulty: Difficulty\n): MismatchType {\n if (scoreMatchesDifficulty(currentScore, actualDifficulty)) {\n return \"validated\";\n }\n\n // If actual difficulty is easier than what the score suggests\n if (\n (actualDifficulty === \"easy\" && currentScore < -3) ||\n (actualDifficulty === \"moderate\" && currentScore < -7)\n ) {\n return \"overscored\";\n }\n\n // If actual difficulty is harder than what the score suggests\n return \"underscored\";\n}\n\n/**\n * Build reasoning string for a mismatch\n */\nfunction buildReasoning(\n type: MismatchType,\n ruleId: string | undefined,\n currentScore: number | undefined,\n actualDifficulty: Difficulty\n): string {\n const range = DIFFICULTY_SCORE_RANGES[actualDifficulty];\n\n switch (type) {\n case \"validated\":\n return `Rule \"${ruleId}\" score (${currentScore}) aligns with actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"overscored\":\n return `Rule \"${ruleId}\" score (${currentScore}) is too harsh for actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"underscored\":\n return `Rule \"${ruleId}\" score (${currentScore}) is too lenient for actual difficulty \"${actualDifficulty}\" (expected range: ${range.min} to ${range.max}).`;\n case \"missing-rule\":\n return `No rule covers this difficulty \"${actualDifficulty}\" (expected score range: ${range.min} to ${range.max}).`;\n }\n}\n\n/**\n * Merge all node issue summaries into a single virtual summary.\n * Used when whole-design conversion produces a single root record but analysis\n * flags rules on individual child nodes. Without merging, rules only flagged on\n * non-root nodes would be silently dropped from evaluation.\n */\nfunction mergeAllSummaries(\n summaries: Array<{ nodeId: string; nodePath: string; flaggedRuleIds: string[] }>,\n rootNodeId: string,\n rootNodePath: string,\n): { nodeId: string; nodePath: string; flaggedRuleIds: string[] } {\n const allRuleIds = new Set<string>();\n for (const s of summaries) {\n for (const id of s.flaggedRuleIds) {\n allRuleIds.add(id);\n }\n }\n return { nodeId: rootNodeId, nodePath: rootNodePath, flaggedRuleIds: [...allRuleIds] };\n}\n\n/**\n * Evaluation Agent - Step 3 of calibration pipeline\n *\n * Deterministic comparison of analysis results vs conversion results.\n * No LLM required — pure algorithmic evaluation.\n */\nexport function runEvaluationAgent(\n input: EvaluationAgentInput\n): EvaluationAgentOutput {\n const mismatches: MismatchCase[] = [];\n const validatedRuleSet = new Set<string>();\n\n // Build a lookup from nodeId to issue summary\n const nodeSummaryMap = new Map(\n input.nodeIssueSummaries.map((s) => [s.nodeId, s])\n );\n\n for (const record of input.conversionRecords) {\n const summary = input.wholeDesign\n ? mergeAllSummaries(input.nodeIssueSummaries, record.nodeId, record.nodePath)\n : nodeSummaryMap.get(record.nodeId);\n const difficulty = record.difficulty as Difficulty;\n\n // Process rule-related struggles from conversion\n for (const struggle of record.ruleRelatedStruggles) {\n const ruleInfo = input.ruleScores[struggle.ruleId];\n if (!ruleInfo) continue;\n\n const actualDifficulty = struggle.actualImpact as Difficulty;\n const type = classifyFlaggedRule(ruleInfo.score, actualDifficulty);\n\n if (type === \"validated\") {\n validatedRuleSet.add(struggle.ruleId);\n }\n\n mismatches.push({\n type,\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId: struggle.ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty,\n reasoning: buildReasoning(type, struggle.ruleId, ruleInfo.score, actualDifficulty),\n });\n }\n\n // Process flagged rules that had NO struggle reported\n // Not mentioned ≠ overscored. Only classify as overscored when the Converter\n // explicitly reported actualImpact: \"easy\" for this rule. Otherwise validate.\n if (summary) {\n const struggledRuleIds = new Set(\n record.ruleRelatedStruggles.map((s) => s.ruleId)\n );\n\n for (const ruleId of summary.flaggedRuleIds) {\n if (struggledRuleIds.has(ruleId)) continue;\n\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n // Rule was flagged but conversion had no struggle with it — validate conservatively\n validatedRuleSet.add(ruleId);\n mismatches.push({\n type: \"validated\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty: difficulty,\n reasoning: `Rule \"${ruleId}\" was flagged but not mentioned in conversion struggles (overall: \"${difficulty}\") — validated (no explicit easy signal).`,\n });\n }\n }\n\n // Process uncovered struggles (no existing rule)\n for (const uncovered of record.uncoveredStruggles) {\n const estimatedDifficulty = uncovered.estimatedImpact as Difficulty;\n\n mismatches.push({\n type: \"missing-rule\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n actualDifficulty: estimatedDifficulty,\n reasoning: `Uncovered struggle: \"${uncovered.description}\" (category: ${uncovered.suggestedCategory}, impact: ${estimatedDifficulty}).`,\n category: uncovered.suggestedCategory,\n description: uncovered.description,\n });\n }\n }\n\n // Override responsive-critical rule evaluations with measured responsiveDelta\n if (input.responsiveDelta != null) {\n const responsiveDifficulty = responsiveDeltaToDifficulty(input.responsiveDelta);\n for (const mismatch of mismatches) {\n if (!mismatch.ruleId) continue;\n if (!(mismatch.ruleId in RULE_ID_CATEGORY)) continue;\n const category = RULE_ID_CATEGORY[mismatch.ruleId as RuleId];\n if (category !== \"responsive-critical\") continue;\n\n const prevType = mismatch.type;\n const newType = classifyFlaggedRule(mismatch.currentScore ?? 0, responsiveDifficulty);\n mismatch.type = newType;\n mismatch.actualDifficulty = responsiveDifficulty;\n mismatch.reasoning = buildReasoning(newType, mismatch.ruleId, mismatch.currentScore, responsiveDifficulty)\n + ` (responsive: delta=${input.responsiveDelta}%p, overrides AI opinion \"${prevType}\")`;\n\n if (newType === \"validated\") {\n validatedRuleSet.add(mismatch.ruleId);\n } else {\n validatedRuleSet.delete(mismatch.ruleId);\n }\n }\n }\n\n // Override rule evaluations with objective strip ablation deltas\n if (input.stripDeltas) {\n for (const mismatch of mismatches) {\n if (!mismatch.ruleId) continue;\n // Responsive-critical: only apply strip override when size-constraints has a measured\n // responsive delta (#205). Otherwise skip so design-viewport pixel fallback cannot replace\n // baseline page responsiveDelta classification.\n if (mismatch.ruleId in RULE_ID_CATEGORY) {\n const category = RULE_ID_CATEGORY[mismatch.ruleId as RuleId];\n if (\n category === \"responsive-critical\" &&\n !sizeConstraintsStripHasResponsiveMetric(input.stripDeltas)\n ) {\n continue;\n }\n }\n const stripDifficulty = getStripDifficultyForRule(mismatch.ruleId, input.stripDeltas);\n if (!stripDifficulty) continue;\n\n const prevType = mismatch.type;\n const newType = classifyFlaggedRule(mismatch.currentScore ?? 0, stripDifficulty);\n mismatch.type = newType;\n mismatch.actualDifficulty = stripDifficulty;\n mismatch.reasoning = buildReasoning(newType, mismatch.ruleId, mismatch.currentScore, stripDifficulty)\n + ` (strip-ablation: overrides AI opinion \"${prevType}\")`;\n\n if (newType === \"validated\") {\n validatedRuleSet.add(mismatch.ruleId);\n } else {\n validatedRuleSet.delete(mismatch.ruleId);\n }\n }\n }\n\n return {\n mismatches,\n validatedRules: [...validatedRuleSet],\n };\n}\n\n/**\n * Map strip type to related rule IDs.\n * Based on what information each strip type removes and which rules detect those issues.\n */\nfunction sizeConstraintsStripHasResponsiveMetric(\n stripDeltas: Record<string, StripDeltaForEval>,\n): boolean {\n const rd = stripDeltas[\"size-constraints\"]?.responsiveDelta;\n return rd != null && Number.isFinite(rd);\n}\n\nconst STRIP_TYPE_RULES: Record<DesignTreeInfoType, RuleId[]> = {\n \"layout-direction-spacing\": [\"no-auto-layout\", \"absolute-position-in-auto-layout\", \"non-layout-container\", \"irregular-spacing\"],\n \"size-constraints\": [\"missing-size-constraint\", \"fixed-size-in-auto-layout\"],\n \"component-references\": [\"missing-component\", \"detached-instance\", \"variant-structure-mismatch\"],\n \"node-names-hierarchy\": [\"non-standard-naming\", \"non-semantic-name\", \"inconsistent-naming-convention\"],\n \"variable-references\": [\"raw-value\"],\n \"style-references\": [\"raw-value\"],\n};\n\n/**\n * Strip types that should use token delta instead of pixel delta.\n * These represent information whose absence affects token cost/code quality,\n * not pixel accuracy at design viewport.\n */\nconst TOKEN_METRIC_STRIPS = new Set<DesignTreeInfoType>([\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n]);\n\n/**\n * Strip types that should use responsive pixel delta.\n * These represent information whose absence manifests at expanded viewports.\n */\nconst RESPONSIVE_METRIC_STRIPS = new Set<DesignTreeInfoType>([\n \"size-constraints\",\n]);\n\n/**\n * Get the objective strip-based difficulty for a rule.\n * Uses category-appropriate metric per strip type:\n * - layout-direction-spacing → pixel delta\n * - size-constraints → responsive pixel delta\n * - component/naming/variable/style → token delta\n * If multiple strip types affect the same rule, take the worst difficulty.\n */\nfunction getStripDifficultyForRule(\n ruleId: string,\n stripDeltas: Record<string, StripDeltaForEval>,\n): Difficulty | null {\n const difficulties: Difficulty[] = [];\n\n for (const [stripType, ruleIds] of Object.entries(STRIP_TYPE_RULES)) {\n if (!ruleIds.includes(ruleId as RuleId)) continue;\n const data = stripDeltas[stripType];\n if (!data) continue;\n\n const infoType = stripType as DesignTreeInfoType;\n\n if (RESPONSIVE_METRIC_STRIPS.has(infoType)) {\n // size-constraints: use responsive delta if available, fall back to pixel delta\n const delta = data.responsiveDelta ?? data.pixelDelta;\n difficulties.push(stripDeltaToDifficulty(delta));\n } else if (TOKEN_METRIC_STRIPS.has(infoType)) {\n // token-management strips: use token delta if available, fall back to pixel delta\n if (data.baselineInputTokens != null && data.strippedInputTokens != null) {\n difficulties.push(tokenDeltaToDifficulty(data.baselineInputTokens, data.strippedInputTokens));\n } else {\n difficulties.push(stripDeltaToDifficulty(data.pixelDelta));\n }\n } else {\n // layout: use pixel delta\n difficulties.push(stripDeltaToDifficulty(data.pixelDelta));\n }\n }\n\n if (difficulties.length === 0) return null;\n\n // Take worst difficulty (failed > hard > moderate > easy)\n const order: Difficulty[] = [\"easy\", \"moderate\", \"hard\", \"failed\"];\n return difficulties.reduce((worst, d) =>\n order.indexOf(d) > order.indexOf(worst) ? d : worst\n );\n}\n\n/**\n * Map responsiveDelta to difficulty.\n * Based on ablation Experiment 04: structure drops -32%p at different viewport.\n * Higher delta = more responsive breakage = harder to implement.\n */\nfunction responsiveDeltaToDifficulty(delta: number): Difficulty {\n // Negative delta = expanded viewport matches better than original (unusual).\n // Treat as easy — the design is not breaking at wider viewport.\n const d = Math.max(0, delta);\n if (d <= 5) return \"easy\"; // minimal responsive breakage\n if (d <= 15) return \"moderate\"; // noticeable breakage\n if (d <= 30) return \"hard\"; // severe breakage\n return \"failed\"; // completely broken at expanded viewport\n}\n","import type { Severity } from \"../core/contracts/severity.js\";\nimport type { Confidence } from \"./contracts/tuning-agent.js\";\nimport type {\n TuningAgentInput,\n TuningAgentOutput,\n ScoreAdjustment,\n NewRuleProposal,\n} from \"./contracts/tuning-agent.js\";\n\n/**\n * Difficulty-to-score midpoint mapping for proposing new scores\n */\nconst DIFFICULTY_MIDPOINT: Record<string, number> = {\n easy: -2,\n moderate: -5,\n hard: -10,\n failed: -12,\n};\n\n/**\n * Difficulty-to-severity mapping for new rule proposals\n */\nconst DIFFICULTY_SEVERITY: Record<string, Severity> = {\n easy: \"suggestion\",\n moderate: \"risk\",\n hard: \"blocking\",\n failed: \"blocking\",\n};\n\n/**\n * Determine confidence based on number of supporting cases\n */\nfunction getConfidence(caseCount: number): Confidence {\n if (caseCount >= 3) return \"high\";\n if (caseCount >= 2) return \"medium\";\n return \"low\";\n}\n\n/**\n * Score range for worst-case floor clamping\n */\nconst DIFFICULTY_SCORE_MAX: Record<string, number> = {\n easy: 0,\n moderate: -4,\n hard: -8,\n failed: -8,\n};\n\n/**\n * Propose a score based on weighted average of actual difficulties,\n * with a worst-case floor so hard cases aren't drowned out by easy ones.\n */\nfunction proposedScoreFromDifficulties(difficulties: string[]): number {\n if (difficulties.length === 0) return -5;\n\n // Weighted average: Σ(midpoint × count) / total\n let sum = 0;\n let worstFloor = 0;\n for (const d of difficulties) {\n const midpoint = DIFFICULTY_MIDPOINT[d] ?? -5;\n sum += midpoint;\n // Track the harshest floor from any observed difficulty\n const floor = DIFFICULTY_SCORE_MAX[d] ?? -5;\n if (floor < worstFloor) worstFloor = floor;\n }\n\n const weightedAvg = Math.round(sum / difficulties.length);\n\n // Clamp: proposed score must be at least as harsh as the worst observed difficulty's range start\n return Math.min(weightedAvg, worstFloor);\n}\n\n/**\n * Determine if severity should change based on proposed score\n */\nfunction proposeSeverity(\n currentSeverity: Severity,\n proposedScore: number\n): Severity | undefined {\n let expectedSeverity: Severity;\n if (proposedScore <= -8) {\n expectedSeverity = \"blocking\";\n } else if (proposedScore <= -4) {\n expectedSeverity = \"risk\";\n } else if (proposedScore <= -2) {\n expectedSeverity = \"missing-info\";\n } else {\n expectedSeverity = \"suggestion\";\n }\n\n if (expectedSeverity !== currentSeverity) {\n return expectedSeverity;\n }\n return undefined;\n}\n\n/**\n * Tuning Agent - Step 4 of calibration pipeline\n *\n * Deterministic aggregation algorithm. No LLM required.\n * Aggregates mismatch cases into score adjustment proposals.\n */\nexport function runTuningAgent(\n input: TuningAgentInput\n): TuningAgentOutput {\n const adjustments: ScoreAdjustment[] = [];\n const newRuleProposals: NewRuleProposal[] = [];\n\n // Group mismatches by ruleId for overscored and underscored\n const overscoredByRule = new Map<string, typeof input.mismatches>();\n const underscoredByRule = new Map<string, typeof input.mismatches>();\n const missingRuleCases: typeof input.mismatches = [];\n\n for (const mismatch of input.mismatches) {\n switch (mismatch.type) {\n case \"overscored\": {\n if (!mismatch.ruleId) break;\n const existing = overscoredByRule.get(mismatch.ruleId);\n if (existing) {\n existing.push(mismatch);\n } else {\n overscoredByRule.set(mismatch.ruleId, [mismatch]);\n }\n break;\n }\n case \"underscored\": {\n if (!mismatch.ruleId) break;\n const existing = underscoredByRule.get(mismatch.ruleId);\n if (existing) {\n existing.push(mismatch);\n } else {\n underscoredByRule.set(mismatch.ruleId, [mismatch]);\n }\n break;\n }\n case \"missing-rule\":\n missingRuleCases.push(mismatch);\n break;\n }\n }\n\n const prior = input.priorEvidence ?? {};\n\n // Generate score reduction proposals for overscored rules\n // Include rules with prior-only evidence (no current mismatches)\n const allOverscoredRuleIds = new Set([\n ...overscoredByRule.keys(),\n ...Object.keys(prior).filter((id) => {\n const p = prior[id];\n return p && p.overscoredCount > 0 && !overscoredByRule.has(id);\n }),\n ]);\n\n for (const ruleId of allOverscoredRuleIds) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const cases = overscoredByRule.get(ruleId) ?? [];\n const priorData = prior[ruleId];\n const currentDifficulties = cases.map((c) => c.actualDifficulty);\n const priorDifficulties = priorData?.overscoredDifficulties ?? [];\n const allDifficulties = [...currentDifficulties, ...priorDifficulties];\n const totalCases = cases.length + (priorData?.overscoredCount ?? 0);\n\n const proposedScore = proposedScoreFromDifficulties(allDifficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n const priorNote = priorData?.overscoredCount\n ? ` (+ ${priorData.overscoredCount} case(s) from prior runs)`\n : \"\";\n\n // Propose disable when rule converges to zero impact:\n // score already at suggestion floor (-2) + 3+ cases + all easy\n const shouldDisable =\n proposedScore >= -2 &&\n totalCases >= 3 &&\n allDifficulties.every((d) => d === \"easy\");\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: shouldDisable\n ? `Converged to zero impact: ${totalCases} case(s) all \"easy\"${priorNote}. Recommend disabling.`\n : `Overscored in ${cases.length} case(s)${priorNote}. Actual difficulties: [${allDifficulties.join(\", \")}]. Current score ${ruleInfo.score} is too harsh.`,\n confidence: getConfidence(totalCases),\n supportingCases: totalCases,\n ...(shouldDisable && { proposedDisable: true }),\n });\n }\n\n // Generate score increase proposals for underscored rules\n // Include rules with prior-only evidence (no current mismatches)\n const allUnderscoredRuleIds = new Set([\n ...underscoredByRule.keys(),\n ...Object.keys(prior).filter((id) => {\n const p = prior[id];\n return p && p.underscoredCount > 0 && !underscoredByRule.has(id);\n }),\n ]);\n\n for (const ruleId of allUnderscoredRuleIds) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const cases = underscoredByRule.get(ruleId) ?? [];\n const priorData = prior[ruleId];\n const currentDifficulties = cases.map((c) => c.actualDifficulty);\n const priorDifficulties = priorData?.underscoredDifficulties ?? [];\n const allDifficulties = [...currentDifficulties, ...priorDifficulties];\n const totalCases = cases.length + (priorData?.underscoredCount ?? 0);\n\n const proposedScore = proposedScoreFromDifficulties(allDifficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n const priorNote = priorData?.underscoredCount\n ? ` (+ ${priorData.underscoredCount} case(s) from prior runs)`\n : \"\";\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: `Underscored in ${cases.length} case(s)${priorNote}. Actual difficulties: [${allDifficulties.join(\", \")}]. Current score ${ruleInfo.score} is too lenient.`,\n confidence: getConfidence(totalCases),\n supportingCases: totalCases,\n });\n }\n\n // Generate new rule proposals from missing-rule cases\n // Group by suggestedCategory extracted from reasoning\n const missingGrouped = new Map<string, typeof input.mismatches>();\n\n for (const c of missingRuleCases) {\n const category = c.category ?? \"unknown\";\n\n const existing = missingGrouped.get(category);\n if (existing) {\n existing.push(c);\n } else {\n missingGrouped.set(category, [c]);\n }\n }\n\n for (const [category, cases] of missingGrouped) {\n const difficulties = cases.map((c) => c.actualDifficulty);\n const dominantDifficulty = getDominantDifficulty(difficulties);\n const descriptions = cases.map((c) => c.description ?? c.reasoning);\n\n newRuleProposals.push({\n suggestedId: `new-${category}-rule`,\n category,\n description: descriptions.join(\"; \"),\n suggestedSeverity: DIFFICULTY_SEVERITY[dominantDifficulty] ?? \"risk\",\n suggestedScore: DIFFICULTY_MIDPOINT[dominantDifficulty] ?? -5,\n reasoning: `${cases.length} uncovered struggle(s) in category \"${category}\". Difficulties: [${difficulties.join(\", \")}].`,\n supportingCases: cases.length,\n });\n }\n\n return { adjustments, newRuleProposals };\n}\n\nfunction getDominantDifficulty(difficulties: string[]): string {\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n\n let dominant = difficulties[0] ?? \"moderate\";\n let maxCount = 0;\n for (const [difficulty, count] of Object.entries(counts)) {\n if (count > maxCount) {\n maxCount = count;\n dominant = difficulty;\n }\n }\n return dominant;\n}\n","import type { ScoreReport } from \"../core/engine/scoring.js\";\nimport type { MismatchCase } from \"./contracts/evaluation-agent.js\";\nimport type { ScoreAdjustment, NewRuleProposal } from \"./contracts/tuning-agent.js\";\n\n/** Data structure for generating calibration report markdown. */\nexport interface CalibrationReportData {\n fileKey: string;\n fileName: string;\n analyzedAt: string;\n nodeCount: number;\n issueCount: number;\n convertedNodeCount: number;\n skippedNodeCount: number;\n scoreReport: ScoreReport;\n mismatches: MismatchCase[];\n validatedRules: string[];\n adjustments: ScoreAdjustment[];\n newRuleProposals: NewRuleProposal[];\n /** Design tree token metrics (optional — present when design-tree stats are available) */\n tokenMetrics?: {\n designTreeTokens: number;\n designTreeBytes: number;\n tokensPerNode: number;\n } | undefined;\n}\n\n/**\n * Generate a CALIBRATION_REPORT.md from calibration pipeline results\n */\nexport function generateCalibrationReport(data: CalibrationReportData): string {\n const lines: string[] = [];\n\n lines.push(\"# Calibration Report\");\n lines.push(\"\");\n lines.push(renderOverview(data));\n lines.push(renderCurrentScores(data));\n lines.push(renderAdjustmentProposals(data.adjustments));\n lines.push(renderNewRuleProposals(data.newRuleProposals));\n lines.push(renderValidatedRules(data.validatedRules));\n lines.push(renderMismatchDetails(data.mismatches));\n lines.push(renderApplicationGuide(data.adjustments));\n\n return lines.join(\"\\n\");\n}\n\nfunction renderOverview(data: CalibrationReportData): string {\n return `## Overview\n\n| Metric | Value |\n|--------|-------|\n| File | ${data.fileName} (${data.fileKey}) |\n| Analyzed At | ${data.analyzedAt} |\n| Total Nodes | ${data.nodeCount} |\n| Total Issues | ${data.issueCount} |\n| Converted Nodes | ${data.convertedNodeCount} |\n| Skipped Nodes | ${data.skippedNodeCount} |\n| Overall Grade | ${data.scoreReport.overall.grade} (${data.scoreReport.overall.percentage}%) |${data.tokenMetrics ? `\n| Design Tree Tokens | ~${data.tokenMetrics.designTreeTokens.toLocaleString()} tokens (${Math.round(data.tokenMetrics.designTreeBytes / 1024)}KB) |\n| Tokens per Node | ~${Math.round(data.tokenMetrics.tokensPerNode)} |` : \"\"}\n`;\n}\n\nfunction renderCurrentScores(data: CalibrationReportData): string {\n const lines: string[] = [];\n lines.push(\"## Current Score Summary\");\n lines.push(\"\");\n lines.push(\"| Category | Score | Issues | Density | Diversity |\");\n lines.push(\"|----------|-------|--------|---------|-----------|\");\n\n for (const [category, catScore] of Object.entries(data.scoreReport.byCategory)) {\n lines.push(\n `| ${category} | ${catScore.percentage}% | ${catScore.issueCount} | ${catScore.densityScore} | ${catScore.diversityScore} |`\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderAdjustmentProposals(adjustments: ScoreAdjustment[]): string {\n if (adjustments.length === 0) {\n return \"## Score Adjustment Proposals\\n\\nNo adjustments proposed.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Score Adjustment Proposals\");\n lines.push(\"\");\n lines.push(\"| Rule | Current Score | Proposed Score | Disable? | Severity Change | Confidence | Cases | Reasoning |\");\n lines.push(\"|------|--------------|----------------|----------|-----------------|------------|-------|-----------|\");\n\n for (const adj of adjustments) {\n const severityChange = adj.proposedSeverity\n ? `${adj.currentSeverity} -> ${adj.proposedSeverity}`\n : adj.currentSeverity;\n const disable = adj.proposedDisable ? \"⛔ YES\" : \"\";\n\n lines.push(\n `| ${adj.ruleId} | ${adj.currentScore} | ${adj.proposedScore} | ${disable} | ${severityChange} | ${adj.confidence} | ${adj.supportingCases} | ${adj.reasoning} |`\n );\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderNewRuleProposals(proposals: NewRuleProposal[]): string {\n if (proposals.length === 0) {\n return \"## New Rule Proposals\\n\\nNo new rules proposed.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## New Rule Proposals\");\n lines.push(\"\");\n\n for (const proposal of proposals) {\n lines.push(`### ${proposal.suggestedId}`);\n lines.push(\"\");\n lines.push(`- **Category**: ${proposal.category}`);\n lines.push(`- **Suggested Severity**: ${proposal.suggestedSeverity}`);\n lines.push(`- **Suggested Score**: ${proposal.suggestedScore}`);\n lines.push(`- **Supporting Cases**: ${proposal.supportingCases}`);\n lines.push(`- **Description**: ${proposal.description}`);\n lines.push(`- **Reasoning**: ${proposal.reasoning}`);\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderValidatedRules(validatedRules: string[]): string {\n if (validatedRules.length === 0) {\n return \"## Validated Rules\\n\\nNo rules were validated in this run.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Validated Rules\");\n lines.push(\"\");\n lines.push(\"The following rules had scores that aligned with actual conversion difficulty:\");\n lines.push(\"\");\n\n for (const ruleId of validatedRules) {\n lines.push(`- \\`${ruleId}\\``);\n }\n\n lines.push(\"\");\n return lines.join(\"\\n\");\n}\n\nfunction renderMismatchDetails(mismatches: MismatchCase[]): string {\n if (mismatches.length === 0) {\n return \"## Detailed Mismatch List\\n\\nNo mismatches found.\\n\";\n }\n\n const lines: string[] = [];\n lines.push(\"## Detailed Mismatch List\");\n lines.push(\"\");\n\n const grouped: Record<string, MismatchCase[]> = {};\n for (const m of mismatches) {\n const list = grouped[m.type];\n if (list) {\n list.push(m);\n } else {\n grouped[m.type] = [m];\n }\n }\n\n for (const [type, cases] of Object.entries(grouped)) {\n lines.push(`### ${type} (${cases.length})`);\n lines.push(\"\");\n\n for (const c of cases) {\n const ruleInfo = c.ruleId ? ` | Rule: \\`${c.ruleId}\\`` : \"\";\n const scoreInfo = c.currentScore !== undefined ? ` | Score: ${c.currentScore}` : \"\";\n lines.push(`- **${c.nodePath}** (${c.nodeId})${ruleInfo}${scoreInfo} | Difficulty: ${c.actualDifficulty}`);\n lines.push(` > ${c.reasoning}`);\n }\n\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction renderApplicationGuide(adjustments: ScoreAdjustment[]): string {\n const lines: string[] = [];\n lines.push(\"## Application Guide\");\n lines.push(\"\");\n lines.push(\"To apply these calibration results:\");\n lines.push(\"\");\n lines.push(\"1. Review each adjustment proposal above\");\n lines.push(\"2. Edit `src/core/rules/rule-config.ts` to update scores and severities\");\n lines.push(\"3. Run `pnpm test:run` to verify no tests break\");\n lines.push(\"4. Re-run calibration to confirm improvements\");\n lines.push(\"\");\n\n if (adjustments.length > 0) {\n lines.push(\"### Suggested Changes to `rule-config.ts`\");\n lines.push(\"\");\n lines.push(\"```typescript\");\n\n for (const adj of adjustments) {\n if (adj.proposedDisable) {\n lines.push(`// ${adj.ruleId}: DISABLE (${adj.confidence} confidence, ${adj.supportingCases} cases)`);\n lines.push(`// enabled: false`);\n } else {\n lines.push(`// ${adj.ruleId}: ${adj.currentScore} -> ${adj.proposedScore} (${adj.confidence} confidence)`);\n }\n if (adj.proposedSeverity && !adj.proposedDisable) {\n lines.push(`// severity: \"${adj.currentSeverity}\" -> \"${adj.proposedSeverity}\"`);\n }\n }\n\n lines.push(\"```\");\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n","import { z } from \"zod\";\n\n// --- Calibration evidence ---\n\nexport const CalibrationEvidenceEntrySchema = z.object({\n ruleId: z.string(),\n type: z.enum([\"overscored\", \"underscored\"]),\n actualDifficulty: z.string(),\n fixture: z.string(),\n timestamp: z.string(),\n // Phase 1 fields (#144) — optional for backward compatibility with existing evidence\n confidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n pro: z.array(z.string()).optional(),\n con: z.array(z.string()).optional(),\n decision: z.enum([\"APPROVE\", \"REJECT\", \"REVISE\", \"HOLD\"]).optional(),\n});\n\nexport type CalibrationEvidenceEntry = z.infer<typeof CalibrationEvidenceEntrySchema>;\n\nexport const CrossRunEvidenceGroupSchema = z.object({\n overscoredCount: z.number(),\n underscoredCount: z.number(),\n overscoredDifficulties: z.array(z.string()),\n underscoredDifficulties: z.array(z.string()),\n // Aggregated pro/con from all entries for this rule\n allPro: z.array(z.string()).optional(),\n allCon: z.array(z.string()).optional(),\n lastConfidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n lastDecision: z.enum([\"APPROVE\", \"REJECT\", \"REVISE\", \"HOLD\"]).optional(),\n});\n\nexport type CrossRunEvidenceGroup = z.infer<typeof CrossRunEvidenceGroupSchema>;\n\nexport type CrossRunEvidence = Record<string, CrossRunEvidenceGroup>;\n\n// --- Evidence ratio summary (deterministic pre-computation for Critic) ---\n\nexport const EvidenceRatioSummarySchema = z.object({\n totalSamples: z.number(),\n overscoredCount: z.number(),\n underscoredCount: z.number(),\n overscoredRate: z.number(),\n underscoredRate: z.number(),\n dominantDirection: z.enum([\"overscored\", \"underscored\", \"mixed\"]),\n dominantRate: z.number(),\n expectedDifficulty: z.string(),\n confidence: z.enum([\"high\", \"medium\", \"low\", \"insufficient\"]),\n summary: z.string(),\n});\n\nexport type EvidenceRatioSummary = z.infer<typeof EvidenceRatioSummarySchema>;\n\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport {\n CalibrationEvidenceEntrySchema,\n} from \"./contracts/evidence.js\";\nimport type {\n CalibrationEvidenceEntry,\n CrossRunEvidence,\n CrossRunEvidenceGroup,\n EvidenceRatioSummary,\n} from \"./contracts/evidence.js\";\n\nexport type { CalibrationEvidenceEntry, CrossRunEvidence, CrossRunEvidenceGroup, EvidenceRatioSummary };\n\nconst DEFAULT_CALIBRATION_PATH = resolve(\"data/calibration-evidence.json\");\n\nfunction readValidatedArray<T>(\n filePath: string,\n schema: { safeParse: (v: unknown) => { success: boolean; data?: T } }\n): T[] {\n if (!existsSync(filePath)) return [];\n try {\n const raw = JSON.parse(readFileSync(filePath, \"utf-8\")) as unknown;\n if (!Array.isArray(raw)) return [];\n const result: T[] = [];\n for (const item of raw) {\n const parsed = schema.safeParse(item);\n if (parsed.success && parsed.data !== undefined) {\n result.push(parsed.data);\n }\n }\n return result;\n } catch {\n return [];\n }\n}\n\nfunction writeJsonArray<T>(filePath: string, data: T[]): void {\n const dir = dirname(filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(filePath, JSON.stringify(data, null, 2) + \"\\n\", \"utf-8\");\n}\n\n/**\n * Load calibration evidence and group by ruleId for the tuning agent.\n */\nexport function loadCalibrationEvidence(\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): CrossRunEvidence {\n const entries = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n const result: CrossRunEvidence = {};\n\n for (const entry of entries) {\n let group = result[entry.ruleId];\n if (!group) {\n group = {\n overscoredCount: 0,\n underscoredCount: 0,\n overscoredDifficulties: [],\n underscoredDifficulties: [],\n allPro: [],\n allCon: [],\n };\n result[entry.ruleId] = group;\n }\n\n if (entry.type === \"overscored\") {\n group.overscoredCount++;\n group.overscoredDifficulties.push(entry.actualDifficulty);\n } else {\n group.underscoredCount++;\n group.underscoredDifficulties.push(entry.actualDifficulty);\n }\n\n // Aggregate pro/con from enriched entries (deduplicated)\n if (entry.pro) {\n group.allPro ??= [];\n for (const p of entry.pro) {\n if (!group.allPro.includes(p)) group.allPro.push(p);\n }\n }\n if (entry.con) {\n group.allCon ??= [];\n for (const c of entry.con) {\n if (!group.allCon.includes(c)) group.allCon.push(c);\n }\n }\n // Keep last confidence/decision (most recent entry wins)\n if (entry.confidence) group.lastConfidence = entry.confidence;\n if (entry.decision) group.lastDecision = entry.decision;\n }\n\n return result;\n}\n\n/**\n * Minimum sample size before ratio-based confidence kicks in.\n * Below this threshold, confidence is \"insufficient\".\n * Lowered from 3→2: strip ablation deltas provide objective signal,\n * so fewer fixtures are needed for convergence (#194).\n */\nconst MIN_RATIO_SAMPLES = 2;\n\n/**\n * Difficulty dominance: pick the most frequent difficulty from a list.\n */\nfunction dominantDifficulty(difficulties: string[]): string {\n if (difficulties.length === 0) return \"moderate\";\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n let best = difficulties[0]!;\n let bestCount = 0;\n for (const [d, c] of Object.entries(counts)) {\n if (c > bestCount) {\n bestCount = c;\n best = d;\n }\n }\n return best;\n}\n\n/**\n * Compute a deterministic ratio summary from cross-run evidence for a single rule.\n * This pre-digests contradictory evidence into a clear signal so the Critic\n * doesn't have to do statistics — it just reads the conclusion.\n */\nexport function computeEvidenceRatio(group: CrossRunEvidenceGroup): EvidenceRatioSummary {\n const total = group.overscoredCount + group.underscoredCount;\n\n if (total === 0) {\n return {\n totalSamples: 0,\n overscoredCount: 0,\n underscoredCount: 0,\n overscoredRate: 0,\n underscoredRate: 0,\n dominantDirection: \"mixed\",\n dominantRate: 0,\n expectedDifficulty: \"moderate\",\n confidence: \"insufficient\",\n summary: \"No evidence available.\",\n };\n }\n\n const overscoredRate = group.overscoredCount / total;\n const underscoredRate = group.underscoredCount / total;\n\n // Determine dominant direction\n let dir: \"overscored\" | \"underscored\" | \"mixed\";\n let dominantRate: number;\n if (overscoredRate >= 0.6) {\n dir = \"overscored\";\n dominantRate = overscoredRate;\n } else if (underscoredRate >= 0.6) {\n dir = \"underscored\";\n dominantRate = underscoredRate;\n } else {\n dir = \"mixed\";\n dominantRate = Math.max(overscoredRate, underscoredRate);\n }\n\n // Expected difficulty from the dominant direction's difficulties\n const relevantDifficulties =\n dir === \"underscored\"\n ? group.underscoredDifficulties\n : dir === \"overscored\"\n ? group.overscoredDifficulties\n : [...group.overscoredDifficulties, ...group.underscoredDifficulties];\n const expectedDiff = dominantDifficulty(relevantDifficulties);\n\n // Confidence based on sample size + dominance clarity\n let confidence: \"high\" | \"medium\" | \"low\" | \"insufficient\";\n if (total < MIN_RATIO_SAMPLES) {\n confidence = \"insufficient\";\n } else if (dominantRate >= 0.7 && total >= 3) {\n confidence = \"high\";\n } else if (dominantRate >= 0.6 && total >= MIN_RATIO_SAMPLES) {\n confidence = \"medium\";\n } else {\n confidence = \"low\";\n }\n\n // Human-readable summary\n const pct = (r: number) => `${Math.round(r * 100)}%`;\n let summary: string;\n if (dir === \"mixed\") {\n summary = `Mixed signals: ${group.overscoredCount} overscored (${pct(overscoredRate)}) vs ${group.underscoredCount} underscored (${pct(underscoredRate)}) across ${total} fixtures. No clear direction.`;\n } else {\n summary = `${total} fixtures: ${dir} in ${dir === \"overscored\" ? group.overscoredCount : group.underscoredCount}/${total} (${pct(dominantRate)}). Expected difficulty: ${expectedDiff}. Confidence: ${confidence}.`;\n }\n\n return {\n totalSamples: total,\n overscoredCount: group.overscoredCount,\n underscoredCount: group.underscoredCount,\n overscoredRate: Math.round(overscoredRate * 1000) / 1000,\n underscoredRate: Math.round(underscoredRate * 1000) / 1000,\n dominantDirection: dir,\n dominantRate: Math.round(dominantRate * 1000) / 1000,\n expectedDifficulty: expectedDiff,\n confidence,\n summary,\n };\n}\n\n/**\n * Append new calibration evidence entries (overscored/underscored mismatches).\n *\n * Dedup policy: one entry per (ruleId, fixture) — last-write-wins within and across calls.\n * This is intentional: with strip-ablation (#194) each rule gets one objective delta per fixture,\n * so multiple entries for the same (ruleId, fixture) would be redundant.\n * Cross-run confidence in `computeEvidenceRatio` counts entries (=fixtures), not occurrences.\n */\nexport function appendCalibrationEvidence(\n entries: CalibrationEvidenceEntry[],\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (entries.length === 0) return;\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n // Same batch can repeat (ruleId, fixture); last entry wins (matches cross-call behavior)\n // Normalize ruleId/fixture to prevent bucket splitting from whitespace differences\n const incomingByKey = new Map<string, CalibrationEvidenceEntry>();\n for (const e of entries) {\n const normalized = { ...e, ruleId: e.ruleId.trim(), fixture: e.fixture.trim() };\n const k = `${normalized.ruleId}\\0${normalized.fixture}`;\n incomingByKey.set(k, normalized);\n }\n const mergedIncoming = [...incomingByKey.values()];\n const keys = new Set(incomingByKey.keys());\n const withoutDupes = existing.filter(\n (e) => !keys.has(`${e.ruleId.trim()}\\0${e.fixture.trim()}`),\n );\n withoutDupes.push(...mergedIncoming);\n writeJsonArray(evidencePath, withoutDupes);\n}\n\n/**\n * Remove entries for rules whose scores were applied/revised by the Arbitrator.\n * Prunes all fixtures for the given ruleIds — score changes are global.\n */\nexport function pruneCalibrationEvidence(\n appliedRuleIds: string[],\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (appliedRuleIds.length === 0) return;\n const ruleSet = new Set(appliedRuleIds.map((id) => id.trim()).filter((id) => id.length > 0));\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n const pruned = existing.filter((e) => !ruleSet.has(e.ruleId.trim()));\n writeJsonArray(evidencePath, pruned);\n}\n\n/**\n * Enrich existing calibration evidence entries with Critic's structured review data.\n * Matches by (ruleId, fixture) to avoid overwriting entries from other fixtures.\n * Entries without a matching review are left unchanged.\n */\nexport function enrichCalibrationEvidence(\n reviews: Array<{\n ruleId: string;\n confidence?: \"high\" | \"medium\" | \"low\";\n pro?: string[];\n con?: string[];\n decision?: \"APPROVE\" | \"REJECT\" | \"REVISE\" | \"HOLD\";\n }>,\n fixture: string,\n evidencePath: string = DEFAULT_CALIBRATION_PATH\n): void {\n if (reviews.length === 0) return;\n const existing = readValidatedArray(evidencePath, CalibrationEvidenceEntrySchema);\n if (existing.length === 0) return;\n\n const reviewByRule = new Map(reviews.map((r) => [r.ruleId.trim(), r]));\n const fixtureTrimmed = fixture.trim();\n\n let matchCount = 0;\n const enriched = existing.map((entry) => {\n if (entry.fixture.trim() !== fixtureTrimmed) return entry;\n const review = reviewByRule.get(entry.ruleId.trim());\n if (!review) return entry;\n matchCount++;\n return {\n ...entry,\n ...(review.confidence && { confidence: review.confidence }),\n ...(review.pro && { pro: review.pro }),\n ...(review.con && { con: review.con }),\n ...(review.decision && { decision: review.decision }),\n };\n });\n\n if (matchCount === 0) {\n console.warn(`[enrich] No entries matched fixture=\"${fixture}\" — evidence unchanged`);\n return;\n }\n writeJsonArray(evidencePath, enriched);\n}\n\n","import type { AnalysisFile, AnalysisNode, AnalysisNodeType } from \"../core/contracts/figma-node.js\";\nimport { analyzeFile } from \"../core/engine/rule-engine.js\";\nimport { RULE_CONFIGS } from \"../core/rules/rule-config.js\";\n\nimport type { CalibrationConfigInput } from \"./contracts/calibration.js\";\nimport { StripDeltasArraySchema, RuleImpactAssessmentSchema, UncoveredStrugglesInputSchema } from \"./contracts/conversion-agent.js\";\nimport { CalibrationConfigSchema } from \"./contracts/calibration.js\";\nimport type { NodeIssueSummary } from \"./contracts/analysis-agent.js\";\nimport type { ScoreReport } from \"../core/engine/scoring.js\";\n\nimport { runAnalysisAgent, extractRuleScores } from \"./analysis-agent.js\";\nimport { runEvaluationAgent } from \"./evaluation-agent.js\";\nimport { runTuningAgent } from \"./tuning-agent.js\";\nimport { generateCalibrationReport } from \"./report-generator.js\";\nimport {\n loadCalibrationEvidence,\n appendCalibrationEvidence,\n} from \"./evidence-collector.js\";\nimport type { CalibrationEvidenceEntry } from \"./evidence-collector.js\";\n\n/**\n * Normalize Converter's actualImpact (none/low/medium/high) to Difficulty enum (easy/moderate/hard/failed).\n * Falls back to \"moderate\" for unknown values.\n */\nfunction normalizeActualImpact(impact: string): string {\n const mapping: Record<string, string> = {\n none: \"easy\",\n low: \"easy\",\n easy: \"easy\",\n medium: \"moderate\",\n moderate: \"moderate\",\n high: \"hard\",\n hard: \"hard\",\n failed: \"failed\",\n };\n return mapping[impact] ?? \"moderate\";\n}\n\n/**\n * Calibration tier thresholds (percentage-based).\n * - \"full\": Converter + Measurements + Gap Analysis\n * - \"visual-only\": Converter + Measurements (Gap Analysis skipped)\n */\nexport const CALIBRATION_TIER_THRESHOLDS = {\n full: 90, // A or higher\n visualOnly: 0, // everything else — always run Converter\n} as const;\n\nexport type CalibrationTier = \"full\" | \"visual-only\";\n\n/**\n * Determine calibration tier from analysis percentage.\n */\nexport function determineCalibrationTier(percentage: number): CalibrationTier {\n if (percentage >= CALIBRATION_TIER_THRESHOLDS.full) return \"full\";\n return \"visual-only\";\n}\n\n/**\n * Map visual-compare similarity percentage to conversion difficulty.\n * Used by Converter and Evaluation agents.\n */\nexport const SIMILARITY_DIFFICULTY_THRESHOLDS = {\n easy: 90,\n moderate: 70,\n hard: 50,\n} as const;\n\nexport type ConversionDifficulty = \"easy\" | \"moderate\" | \"hard\" | \"failed\";\n\nexport function similarityToDifficulty(similarity: number): ConversionDifficulty {\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.easy) return \"easy\";\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.moderate) return \"moderate\";\n if (similarity >= SIMILARITY_DIFFICULTY_THRESHOLDS.hard) return \"hard\";\n return \"failed\";\n}\n\n/**\n * Node types that are pure graphics — not useful for code conversion\n */\nconst EXCLUDED_NODE_TYPES: Set<AnalysisNodeType> = new Set([\n \"VECTOR\",\n \"BOOLEAN_OPERATION\",\n \"STAR\",\n \"REGULAR_POLYGON\",\n \"ELLIPSE\",\n \"LINE\",\n]);\n\n/**\n * Find a node by ID in the tree\n */\nfunction findNode(root: AnalysisNode, nodeId: string): AnalysisNode | null {\n if (root.id === nodeId) return root;\n if (root.children) {\n for (const child of root.children) {\n const found = findNode(child, nodeId);\n if (found) return found;\n }\n }\n return null;\n}\n\n/**\n * Check if a subtree contains at least one TEXT node\n */\nfunction hasTextDescendant(node: AnalysisNode): boolean {\n if (node.type === \"TEXT\") return true;\n if (node.children) {\n for (const child of node.children) {\n if (hasTextDescendant(child)) return true;\n }\n }\n return false;\n}\n\n/**\n * Minimum dimensions for conversion candidates\n */\nconst MIN_WIDTH = 200;\nconst MIN_HEIGHT = 200;\nconst FILTER_THRESHOLD = 500;\n\n/**\n * Node types eligible for code conversion\n */\nconst ELIGIBLE_NODE_TYPES: Set<AnalysisNodeType> = new Set([\n \"FRAME\",\n \"COMPONENT\",\n \"INSTANCE\",\n]);\n\nimport { isExcludedName } from \"../core/rules/node-semantics.js\";\n\n/**\n * Filter node summaries to meaningful conversion candidates.\n *\n * If summaries.length <= FILTER_THRESHOLD (500), all nodes pass (typical page size).\n * Otherwise, inclusion criteria:\n * - type is FRAME, COMPONENT, or INSTANCE\n * - width >= 200 AND height >= 200\n * - 3+ direct children\n * - at least one TEXT descendant (excludes pure icons/graphics)\n *\n * Exclusion criteria:\n * - pure graphic types (VECTOR, BOOLEAN_OPERATION, etc.)\n * - name contains \"icon\", \"ico\", \"badge\", or \"indicator\"\n */\nexport function filterConversionCandidates(\n summaries: NodeIssueSummary[],\n documentRoot: AnalysisNode\n): NodeIssueSummary[] {\n // Always exclude invisible nodes — can't screenshot for visual comparison\n const visibleSummaries = summaries.filter((summary) => {\n const node = findNode(documentRoot, summary.nodeId);\n return node ? node.visible !== false : false;\n });\n\n // Small trees: skip further filtering\n if (visibleSummaries.length <= FILTER_THRESHOLD) return visibleSummaries;\n\n // Large trees: filter to meaningful conversion candidates\n return visibleSummaries.filter((summary) => {\n const node = findNode(documentRoot, summary.nodeId);\n if (!node) return false;\n\n // Exclude pure graphic node types\n if (EXCLUDED_NODE_TYPES.has(node.type)) return false;\n\n // Only allow FRAME, COMPONENT, INSTANCE\n if (!ELIGIBLE_NODE_TYPES.has(node.type)) return false;\n\n // Exclude decorative/structural/overlay nodes by name\n if (isExcludedName(node.name)) return false;\n\n // Require minimum dimensions\n const bbox = node.absoluteBoundingBox;\n if (bbox && (bbox.width < MIN_WIDTH || bbox.height < MIN_HEIGHT)) return false;\n\n // Require 3+ direct children\n if (!node.children || node.children.length < 3) return false;\n\n // Require at least one TEXT descendant\n if (!hasTextDescendant(node)) return false;\n\n return true;\n });\n}\n\n// Reuse loader from core engine\nimport { loadFile as coreLoadFile } from \"../core/engine/loader.js\";\n\nasync function loadFile(\n input: string,\n token?: string\n): Promise<{ file: AnalysisFile; fileKey: string; nodeId: string | undefined }> {\n const { file, nodeId } = await coreLoadFile(input, token);\n return { file, fileKey: file.fileKey, nodeId };\n}\n\n/**\n * Build rule scores map from RULE_CONFIGS\n */\nfunction buildRuleScoresMap(): Record<string, { score: number; severity: string }> {\n const scores: Record<string, { score: number; severity: string }> = {};\n for (const [id, config] of Object.entries(RULE_CONFIGS)) {\n scores[id] = { score: config.score, severity: config.severity };\n }\n return scores;\n}\n\n/**\n * Run Step 1 only: analysis + save JSON output\n */\nexport async function runCalibrationAnalyze(\n config: CalibrationConfigInput\n): Promise<{\n analysisOutput: ReturnType<typeof runAnalysisAgent> extends infer T ? T : never;\n ruleScores: Record<string, { score: number; severity: string }>;\n fileKey: string;\n}> {\n const parsed = CalibrationConfigSchema.parse(config);\n const { file, fileKey, nodeId } = await loadFile(parsed.input, parsed.token);\n\n const analyzeOptions = nodeId ? { targetNodeId: nodeId } : {};\n const analysisResult = analyzeFile(file, analyzeOptions);\n\n const analysisOutput = runAnalysisAgent({ analysisResult });\n const ruleScores = {\n ...buildRuleScoresMap(),\n ...extractRuleScores(analysisResult),\n };\n\n return { analysisOutput, ruleScores, fileKey };\n}\n\n/**\n * Run Steps 3+4: evaluation + tuning from pre-computed analysis and conversion data\n */\nexport function runCalibrationEvaluate(\n analysisJson: {\n nodeIssueSummaries: NodeIssueSummary[];\n scoreReport: ScoreReport;\n fileKey: string;\n fileName: string;\n analyzedAt: string;\n nodeCount: number;\n issueCount: number;\n },\n conversionJson: Record<string, unknown>,\n ruleScores: Record<string, { score: number; severity: string }>,\n options?: { collectEvidence?: boolean | undefined; fixtureName?: string | undefined }\n) {\n // Support both formats:\n // Old: { records: [...], skippedNodeIds: [...] }\n // New: { rootNodeId, similarity, ruleImpactAssessment: [...], uncoveredStruggles: [...] }\n let conversionRecords: Array<{\n nodeId: string;\n nodePath: string;\n difficulty: string;\n ruleRelatedStruggles: Array<{ ruleId: string; description: string; actualImpact: string }>;\n uncoveredStruggles: Array<{ description: string; suggestedCategory: string; estimatedImpact: string }>;\n }>;\n let wholeDesign = false;\n\n if (Array.isArray(conversionJson[\"records\"])) {\n // Old per-node format\n conversionRecords = conversionJson[\"records\"] as typeof conversionRecords;\n } else {\n // New whole-design format — Zod-validate before use\n const assessmentParsed = RuleImpactAssessmentSchema.safeParse(conversionJson[\"ruleImpactAssessment\"]);\n if (assessmentParsed.success && assessmentParsed.data.length > 0) {\n wholeDesign = true;\n const assessment = assessmentParsed.data;\n const strugglesParsed = UncoveredStrugglesInputSchema.safeParse(conversionJson[\"uncoveredStruggles\"]);\n const struggles = strugglesParsed.success ? strugglesParsed.data : [];\n conversionRecords = [{\n nodeId: typeof conversionJson[\"rootNodeId\"] === \"string\" ? conversionJson[\"rootNodeId\"] : \"root\",\n nodePath: \"root\",\n difficulty: typeof conversionJson[\"difficulty\"] === \"string\" ? conversionJson[\"difficulty\"] : \"moderate\",\n ruleRelatedStruggles: assessment.map(a => ({\n ruleId: a.ruleId,\n description: a.description,\n actualImpact: normalizeActualImpact(a.actualImpact),\n })),\n uncoveredStruggles: struggles.map(s => ({\n ...s,\n estimatedImpact: normalizeActualImpact(s.estimatedImpact),\n })),\n }];\n } else {\n conversionRecords = [];\n }\n }\n\n // Extract responsive comparison data if available\n const responsiveDelta = typeof conversionJson[\"responsiveDelta\"] === \"number\"\n ? conversionJson[\"responsiveDelta\"] as number\n : null;\n\n // Extract strip ablation deltas if available (Zod-validated)\n let stripDeltas: Record<string, import(\"./contracts/evaluation-agent.js\").StripDeltaForEval> | undefined;\n {\n const parsed = StripDeltasArraySchema.safeParse(conversionJson[\"stripDeltas\"]);\n if (parsed.success && parsed.data.length > 0) {\n stripDeltas = {};\n for (const r of parsed.data) {\n stripDeltas[r.stripType] = {\n pixelDelta: r.delta,\n responsiveDelta: r.responsiveDelta ?? null,\n baselineInputTokens: r.baselineInputTokens ?? null,\n strippedInputTokens: r.strippedInputTokens ?? null,\n };\n }\n }\n }\n\n const evaluationOutput = runEvaluationAgent({\n nodeIssueSummaries: analysisJson.nodeIssueSummaries.map((s) => ({\n nodeId: s.nodeId,\n nodePath: s.nodePath,\n flaggedRuleIds: s.flaggedRuleIds,\n })),\n conversionRecords,\n ruleScores,\n responsiveDelta,\n stripDeltas,\n wholeDesign,\n });\n\n // Load prior evidence if collecting\n const priorEvidence = options?.collectEvidence\n ? loadCalibrationEvidence()\n : undefined;\n\n const tuningInput = {\n mismatches: evaluationOutput.mismatches,\n ruleScores,\n ...(priorEvidence ? { priorEvidence } : {}),\n };\n const tuningOutput = runTuningAgent(tuningInput);\n\n // Collect evidence from this run (non-fatal — pipeline continues on I/O failure)\n if (options?.collectEvidence) {\n try {\n const timestamp = new Date().toISOString();\n const fixture = options.fixtureName ?? analysisJson.fileKey;\n\n // Append calibration evidence (overscored/underscored)\n const calibrationEntries: CalibrationEvidenceEntry[] = [];\n for (const m of evaluationOutput.mismatches) {\n if ((m.type === \"overscored\" || m.type === \"underscored\") && m.ruleId) {\n calibrationEntries.push({\n ruleId: m.ruleId,\n type: m.type,\n actualDifficulty: m.actualDifficulty,\n fixture,\n timestamp,\n });\n }\n }\n appendCalibrationEvidence(calibrationEntries);\n\n } catch (err) {\n console.warn(\"[evidence] Failed to collect evidence (non-fatal):\", err);\n }\n }\n\n const report = generateCalibrationReport({\n fileKey: analysisJson.fileKey,\n fileName: analysisJson.fileName,\n analyzedAt: analysisJson.analyzedAt,\n nodeCount: analysisJson.nodeCount,\n issueCount: analysisJson.issueCount,\n convertedNodeCount: conversionRecords.length,\n skippedNodeCount: Array.isArray(conversionJson[\"skippedNodeIds\"]) ? (conversionJson[\"skippedNodeIds\"] as unknown[]).length : 0,\n scoreReport: analysisJson.scoreReport,\n mismatches: evaluationOutput.mismatches,\n validatedRules: evaluationOutput.validatedRules,\n adjustments: tuningOutput.adjustments,\n newRuleProposals: tuningOutput.newRuleProposals,\n });\n\n return {\n evaluationOutput,\n tuningOutput,\n report,\n };\n}\n\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport {\n runCalibrationAnalyze,\n filterConversionCandidates,\n determineCalibrationTier,\n} from \"../../../agents/orchestrator.js\";\n\ninterface CalibrateAnalyzeOptions {\n output?: string;\n runDir?: string;\n token?: string;\n targetNodeId?: string;\n}\n\nexport function registerCalibrateAnalyze(cli: CAC): void {\n cli\n .command(\n \"calibrate-analyze <input>\",\n \"Run calibration analysis and output JSON for conversion step\"\n )\n .option(\"--output <path>\", \"Output JSON path\", { default: \"logs/calibration/calibration-analysis.json\" })\n .option(\"--run-dir <path>\", \"Run directory (overrides --output, writes to <run-dir>/analysis.json)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--target-node-id <nodeId>\", \"Scope analysis to a specific node\")\n .action(async (input: string, options: CalibrateAnalyzeOptions) => {\n try {\n console.log(\"Running calibration analysis...\");\n\n const calibConfig = {\n input,\n maxConversionNodes: 20,\n samplingStrategy: \"top-issues\" as const,\n outputPath: \"logs/calibration/calibration-report.md\",\n ...(options.token && { token: options.token }),\n ...(options.targetNodeId && { targetNodeId: options.targetNodeId }),\n };\n\n const { analysisOutput, ruleScores, fileKey } =\n await runCalibrationAnalyze(calibConfig);\n\n // Filter out icon/graphic nodes that are not useful for code conversion\n const filteredSummaries = filterConversionCandidates(\n analysisOutput.nodeIssueSummaries,\n analysisOutput.analysisResult.file.document\n );\n\n const percentage = analysisOutput.scoreReport.overall.percentage;\n const calibrationTier = determineCalibrationTier(percentage);\n\n const outputData = {\n fileKey,\n fileName: analysisOutput.analysisResult.file.name,\n analyzedAt: analysisOutput.analysisResult.analyzedAt,\n nodeCount: analysisOutput.analysisResult.nodeCount,\n issueCount: analysisOutput.analysisResult.issues.length,\n calibrationTier,\n scoreReport: analysisOutput.scoreReport,\n nodeIssueSummaries: filteredSummaries,\n ruleScores,\n };\n\n const outputPath = options.runDir\n ? resolve(options.runDir, \"analysis.json\")\n : resolve(options.output ?? \"logs/calibration/calibration-analysis.json\");\n const outputDir = dirname(outputPath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n await writeFile(outputPath, JSON.stringify(outputData, null, 2), \"utf-8\");\n\n console.log(`\\nAnalysis complete.`);\n console.log(` Nodes: ${outputData.nodeCount}`);\n console.log(` Issues: ${outputData.issueCount}`);\n console.log(` Nodes with issues: ${outputData.nodeIssueSummaries.length}`);\n console.log(` Grade: ${outputData.scoreReport.overall.grade} (${percentage}%)`);\n console.log(` Calibration tier: ${calibrationTier}`);\n console.log(`\\nOutput saved: ${outputPath}`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { runCalibrationEvaluate } from \"../../../agents/orchestrator.js\";\n\ninterface CalibrateEvaluateOptions {\n output?: string;\n runDir?: string;\n}\n\nexport function registerCalibrateEvaluate(cli: CAC): void {\n cli\n .command(\n \"calibrate-evaluate [analysisJson] [conversionJson]\",\n \"Evaluate conversion results and generate calibration report\"\n )\n .option(\"--output <path>\", \"Report output path\")\n .option(\"--run-dir <path>\", \"Run directory (reads analysis.json + conversion.json, writes summary.md)\")\n .action(async (analysisJsonPath: string, conversionJsonPath: string, options: CalibrateEvaluateOptions) => {\n try {\n console.log(\"Running calibration evaluation...\");\n\n const analysisPath = options.runDir\n ? resolve(options.runDir, \"analysis.json\")\n : resolve(analysisJsonPath);\n const conversionPath = options.runDir\n ? resolve(options.runDir, \"conversion.json\")\n : resolve(conversionJsonPath);\n\n if (!existsSync(analysisPath)) {\n throw new Error(`Analysis file not found: ${analysisPath}`);\n }\n if (!existsSync(conversionPath)) {\n throw new Error(`Conversion file not found: ${conversionPath}`);\n }\n\n const { readFile } = await import(\"node:fs/promises\");\n const analysisData = JSON.parse(await readFile(analysisPath, \"utf-8\"));\n const conversionData = JSON.parse(await readFile(conversionPath, \"utf-8\"));\n\n // Derive fixture name from run-dir: <fixture-name>--<timestamp>\n let fixtureName: string | undefined;\n if (options.runDir) {\n const dirName = resolve(options.runDir).split(/[/\\\\]/).pop() ?? \"\";\n const idx = dirName.lastIndexOf(\"--\");\n fixtureName = idx === -1 ? dirName : dirName.slice(0, idx);\n }\n\n const { evaluationOutput, tuningOutput, report } = runCalibrationEvaluate(\n analysisData,\n conversionData,\n analysisData.ruleScores,\n { collectEvidence: !!options.runDir, ...(fixtureName ? { fixtureName } : {}) }\n );\n\n let outputPath: string;\n if (options.runDir) {\n outputPath = resolve(options.runDir, \"summary.md\");\n } else if (options.output) {\n outputPath = resolve(options.output);\n } else {\n const calNow = new Date();\n const calTs = `${calNow.getFullYear()}-${String(calNow.getMonth() + 1).padStart(2, \"0\")}-${String(calNow.getDate()).padStart(2, \"0\")}-${String(calNow.getHours()).padStart(2, \"0\")}-${String(calNow.getMinutes()).padStart(2, \"0\")}`;\n outputPath = resolve(`logs/calibration/calibration-${calTs}.md`);\n }\n const calOutputDir = dirname(outputPath);\n if (!existsSync(calOutputDir)) {\n mkdirSync(calOutputDir, { recursive: true });\n }\n await writeFile(outputPath, report, \"utf-8\");\n\n const mismatchCounts = {\n overscored: 0,\n underscored: 0,\n \"missing-rule\": 0,\n validated: 0,\n };\n for (const m of evaluationOutput.mismatches) {\n const key = m.type as keyof typeof mismatchCounts;\n mismatchCounts[key]++;\n }\n\n // Write proposed ruleIds for deterministic evidence gathering\n if (options.runDir && tuningOutput.adjustments.length > 0) {\n const proposedIds = tuningOutput.adjustments.map(\n (a: { ruleId: string }) => a.ruleId\n );\n const proposedPath = resolve(options.runDir, \"proposed-rules.json\");\n await writeFile(proposedPath, JSON.stringify(proposedIds) + \"\\n\", \"utf-8\");\n }\n\n console.log(`\\nEvaluation complete.`);\n console.log(` Validated: ${mismatchCounts.validated}`);\n console.log(` Overscored: ${mismatchCounts.overscored}`);\n console.log(` Underscored: ${mismatchCounts.underscored}`);\n console.log(` Missing rules: ${mismatchCounts[\"missing-rule\"]}`);\n console.log(` Score adjustments proposed: ${tuningOutput.adjustments.length}`);\n console.log(` New rule proposals: ${tuningOutput.newRuleProposals.length}`);\n console.log(`\\nReport saved: ${outputPath}`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { z } from \"zod\";\n\nexport const GapEntrySchema = z.object({\n category: z.string(),\n description: z.string(),\n pixelImpact: z.string().optional(),\n coveredByRule: z.string().nullable().optional(),\n coveredByExistingRule: z.boolean().optional(),\n existingRule: z.string().nullable().optional(),\n causedByInterpretation: z.boolean().optional(),\n actionable: z.boolean().optional(),\n suggestedRuleCategory: z.string().optional(),\n area: z.string().optional(),\n});\n\nexport type GapEntry = z.infer<typeof GapEntrySchema>;\n\nexport const GapAnalyzerOutputSchema = z.object({\n fixture: z.string().optional(),\n similarity: z.number().optional(),\n timestamp: z.string().optional(),\n gaps: z.array(GapEntrySchema),\n summary: z\n .object({\n totalGaps: z.number(),\n actionableGaps: z.number(),\n coveredByExistingRules: z.number(),\n newRuleCandidates: z.number(),\n renderingArtifacts: z.number(),\n })\n .optional(),\n newRuleSuggestions: z\n .array(\n z.object({\n ruleId: z.string(),\n rationale: z.string().optional(),\n })\n )\n .optional(),\n});\n\nexport type GapAnalyzerOutput = z.infer<typeof GapAnalyzerOutputSchema>;\n","import { readdirSync, readFileSync, existsSync, statSync } from \"node:fs\";\nimport { join, resolve } from \"node:path\";\nimport { RULE_CONFIGS } from \"../core/rules/rule-config.js\";\nimport type { RuleId } from \"../core/contracts/rule.js\";\nimport { runCalibrationEvaluate } from \"./orchestrator.js\";\nimport { GapAnalyzerOutputSchema } from \"./contracts/gap-analyzer.js\";\nimport { loadCalibrationEvidence } from \"./evidence-collector.js\";\n\ntype CalibrationAnalysisJson = Parameters<typeof runCalibrationEvaluate>[0] & {\n ruleScores: Record<string, { score: number; severity: string }>;\n};\n\nexport interface GapRuleReportOptions {\n calibrationDir: string;\n minPatternRepeat: number;\n}\n\nexport interface GapRuleReportResult {\n markdown: string;\n runCount: number;\n gapRunCount: number;\n}\n\ninterface NormalizedGap {\n category: string;\n description: string;\n area?: string;\n coveredByExistingRule: boolean;\n existingRule: string | null;\n actionable: boolean;\n fixtureKey: string;\n}\n\ninterface ParsedGapFile {\n runDir: string;\n fixtureKey: string;\n similarity: number | undefined;\n gaps: NormalizedGap[];\n newRuleSuggestions: Array<{ ruleId: string; rationale?: string }>;\n}\n\nfunction fixtureKeyFromRunDir(runDir: string, raw: Record<string, unknown>): string {\n const fromJson =\n (typeof raw[\"fileKey\"] === \"string\" && raw[\"fileKey\"]) ||\n (typeof raw[\"fixture\"] === \"string\" && raw[\"fixture\"]);\n if (fromJson) return fromJson;\n // Extract fixture name from run dir name: <fixture-name>--<timestamp>\n const dirName = runDir.split(/[/\\\\]/).pop() ?? runDir;\n const idx = dirName.lastIndexOf(\"--\");\n return idx === -1 ? dirName : dirName.slice(0, idx);\n}\n\nfunction normalizeGapEntry(\n raw: Record<string, unknown>,\n fixtureKey: string\n): NormalizedGap | null {\n const category = typeof raw[\"category\"] === \"string\" ? raw[\"category\"] : \"unknown\";\n const description =\n typeof raw[\"description\"] === \"string\" ? raw[\"description\"] : \"\";\n const area = typeof raw[\"area\"] === \"string\" ? raw[\"area\"] : undefined;\n\n let covered = false;\n if (typeof raw[\"coveredByExistingRule\"] === \"boolean\") {\n covered = raw[\"coveredByExistingRule\"];\n } else if (raw[\"coveredByRule\"] === true) {\n covered = true;\n }\n\n let existingRule: string | null = null;\n if (typeof raw[\"existingRule\"] === \"string\") {\n existingRule = raw[\"existingRule\"];\n }\n\n const actionable = raw[\"actionable\"] !== false;\n\n if (!description && !area) return null;\n\n return {\n category,\n description,\n ...(area !== undefined ? { area } : {}),\n coveredByExistingRule: covered,\n existingRule,\n actionable,\n fixtureKey,\n };\n}\n\nfunction parseGapFile(runDir: string, gapsPath: string): ParsedGapFile | null {\n let raw: Record<string, unknown>;\n try {\n const parsed = JSON.parse(readFileSync(gapsPath, \"utf-8\")) as unknown;\n // Validate with Zod schema; fall back to best-effort parsing on failure\n const validation = GapAnalyzerOutputSchema.safeParse(parsed);\n if (validation.success) {\n raw = validation.data as unknown as Record<string, unknown>;\n } else {\n // Schema validation failed — use raw data with best-effort parsing\n raw = parsed as Record<string, unknown>;\n }\n } catch {\n return null;\n }\n\n const fixtureKey = fixtureKeyFromRunDir(runDir, raw);\n const gapsRaw = raw[\"gaps\"];\n const gaps: NormalizedGap[] = [];\n if (Array.isArray(gapsRaw)) {\n for (const g of gapsRaw) {\n if (!g || typeof g !== \"object\") continue;\n const n = normalizeGapEntry(g as Record<string, unknown>, fixtureKey);\n if (n) gaps.push(n);\n }\n }\n\n const newRuleSuggestions: Array<{ ruleId: string; rationale?: string }> = [];\n const sug = raw[\"newRuleSuggestions\"];\n if (Array.isArray(sug)) {\n for (const s of sug) {\n if (!s || typeof s !== \"object\") continue;\n const o = s as Record<string, unknown>;\n if (typeof o[\"ruleId\"] === \"string\") {\n const entry: { ruleId: string; rationale?: string } = { ruleId: o[\"ruleId\"] };\n if (typeof o[\"rationale\"] === \"string\") {\n entry.rationale = o[\"rationale\"];\n }\n newRuleSuggestions.push(entry);\n }\n }\n }\n\n return {\n runDir,\n fixtureKey,\n similarity: typeof raw[\"similarity\"] === \"number\" ? raw[\"similarity\"] : undefined,\n gaps,\n newRuleSuggestions,\n };\n}\n\nfunction patternKey(g: NormalizedGap): string {\n const label = (g.area ?? g.description).trim().slice(0, 120);\n return `${g.category}|${label.toLowerCase().replace(/\\s+/g, \" \")}`;\n}\n\n/**\n * List all run directories under the calibration dir.\n * Each run dir is expected to be `<name>--<timestamp>`.\n */\nfunction listRunDirs(calibrationDir: string): string[] {\n if (!existsSync(calibrationDir)) return [];\n return readdirSync(calibrationDir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name.includes(\"--\"))\n .map((e) => join(calibrationDir, e.name))\n .sort();\n}\n\ninterface RunSnapshot {\n dir: string;\n label: string;\n analysis: CalibrationAnalysisJson;\n conversion: Record<string, unknown>;\n}\n\nfunction loadRunSnapshot(dir: string): RunSnapshot | null {\n const aPath = join(dir, \"analysis.json\");\n const cPath = join(dir, \"conversion.json\");\n if (!existsSync(aPath) || !existsSync(cPath)) return null;\n try {\n const analysis = JSON.parse(readFileSync(aPath, \"utf-8\")) as CalibrationAnalysisJson;\n const conversion = JSON.parse(readFileSync(cPath, \"utf-8\")) as Record<string, unknown>;\n if (!analysis.nodeIssueSummaries || !analysis.ruleScores) return null;\n const label = dir.split(/[/\\\\]/).pop() ?? dir;\n return { dir, label, analysis, conversion };\n } catch {\n return null;\n }\n}\n\nfunction enabledRuleIds(): RuleId[] {\n return (Object.keys(RULE_CONFIGS) as RuleId[]).filter(\n (id) => RULE_CONFIGS[id]?.enabled !== false\n );\n}\n\n/**\n * Aggregates gap data and calibration snapshots from run directories into a markdown report.\n */\nexport function generateGapRuleReport(options: GapRuleReportOptions): GapRuleReportResult {\n const calibrationDir = resolve(options.calibrationDir);\n const minRepeat = options.minPatternRepeat;\n\n const runDirs = listRunDirs(calibrationDir);\n\n // Parse gaps from each run directory\n const parsed: ParsedGapFile[] = [];\n for (const dir of runDirs) {\n const gapsPath = join(dir, \"gaps.json\");\n if (!existsSync(gapsPath) || !statSync(gapsPath).isFile()) continue;\n const g = parseGapFile(dir, gapsPath);\n if (g && (g.gaps.length > 0 || g.newRuleSuggestions.length > 0)) parsed.push(g);\n }\n\n const allGaps = parsed.flatMap((f) => f.gaps);\n const fixtureKeys = [...new Set(parsed.map((p) => p.fixtureKey))];\n const totalFixtures = fixtureKeys.length;\n\n const byCategory = new Map<string, number>();\n for (const g of allGaps) {\n byCategory.set(g.category, (byCategory.get(g.category) ?? 0) + 1);\n }\n\n const patternMap = new Map<\n string,\n { count: number; fixtures: Set<string>; sample: string; category: string }\n >();\n for (const g of allGaps) {\n const key = patternKey(g);\n const cur = patternMap.get(key);\n if (cur) {\n cur.count++;\n cur.fixtures.add(g.fixtureKey);\n } else {\n patternMap.set(key, {\n count: 1,\n fixtures: new Set([g.fixtureKey]),\n sample: g.description.slice(0, 200),\n category: g.category,\n });\n }\n }\n\n const repeatingPatterns = [...patternMap.entries()]\n .filter(([, v]) => v.fixtures.size >= minRepeat)\n .sort((a, b) => b[1].fixtures.size - a[1].fixtures.size);\n\n const existingRuleMentions = new Map<string, Set<string>>();\n for (const g of allGaps) {\n if (g.existingRule) {\n let set = existingRuleMentions.get(g.existingRule);\n if (!set) {\n set = new Set();\n existingRuleMentions.set(g.existingRule, set);\n }\n set.add(g.fixtureKey);\n }\n }\n\n const notCoveredActionable = allGaps.filter((g) => !g.coveredByExistingRule && g.actionable);\n const suggestionCounts = new Map<string, { count: number; fixtures: Set<string> }>();\n for (const f of parsed) {\n for (const s of f.newRuleSuggestions) {\n const id = s.ruleId.trim();\n if (!id) continue;\n const cur = suggestionCounts.get(id);\n if (cur) {\n cur.count++;\n cur.fixtures.add(f.fixtureKey);\n } else {\n suggestionCounts.set(id, { count: 1, fixtures: new Set([f.fixtureKey]) });\n }\n }\n }\n\n // Load run snapshots for score-vs-impact analysis\n const runs: RunSnapshot[] = [];\n for (const dir of runDirs) {\n const snap = loadRunSnapshot(dir);\n if (snap) runs.push(snap);\n }\n\n const flaggedRules = new Set<string>();\n const overscoredRuns = new Map<string, Set<number>>();\n const underscoredRuns = new Map<string, Set<number>>();\n const validatedRuns = new Map<string, Set<number>>();\n\n for (let i = 0; i < runs.length; i++) {\n const snap = runs[i];\n if (!snap) continue;\n for (const n of snap.analysis.nodeIssueSummaries) {\n for (const id of n.flaggedRuleIds) {\n flaggedRules.add(id);\n }\n }\n\n const a = snap.analysis;\n const { evaluationOutput } = runCalibrationEvaluate(\n {\n nodeIssueSummaries: a.nodeIssueSummaries,\n scoreReport: a.scoreReport,\n fileKey: a.fileKey,\n fileName: a.fileName,\n analyzedAt: a.analyzedAt,\n nodeCount: a.nodeCount,\n issueCount: a.issueCount,\n },\n snap.conversion,\n a.ruleScores\n );\n\n const seenO = new Set<string>();\n const seenU = new Set<string>();\n const seenV = new Set<string>();\n for (const m of evaluationOutput.mismatches) {\n if (!m.ruleId) continue;\n if (m.type === \"overscored\") {\n if (!seenO.has(m.ruleId)) {\n seenO.add(m.ruleId);\n let s = overscoredRuns.get(m.ruleId);\n if (!s) {\n s = new Set();\n overscoredRuns.set(m.ruleId, s);\n }\n s.add(i);\n }\n } else if (m.type === \"underscored\") {\n if (!seenU.has(m.ruleId)) {\n seenU.add(m.ruleId);\n let s = underscoredRuns.get(m.ruleId);\n if (!s) {\n s = new Set();\n underscoredRuns.set(m.ruleId, s);\n }\n s.add(i);\n }\n } else if (m.type === \"validated\") {\n if (!seenV.has(m.ruleId)) {\n seenV.add(m.ruleId);\n let s = validatedRuns.get(m.ruleId);\n if (!s) {\n s = new Set();\n validatedRuns.set(m.ruleId, s);\n }\n s.add(i);\n }\n }\n }\n }\n\n const nRuns = runs.length;\n const neverFlagged = enabledRuleIds().filter((id) => !flaggedRules.has(id));\n\n // Similarity summary per run\n const similaritySummary: Array<{ label: string; similarity: number | undefined }> = [];\n for (const f of parsed) {\n const dirName = f.runDir.split(/[/\\\\]/).pop() ?? f.runDir;\n similaritySummary.push({ label: dirName, similarity: f.similarity });\n }\n\n const lines: string[] = [];\n lines.push(\"# Gap-based rule review\");\n lines.push(\"\");\n lines.push(`Generated: ${new Date().toISOString()}`);\n lines.push(\"\");\n lines.push(\"## Summary\");\n lines.push(\"\");\n lines.push(`| Metric | Value |`);\n lines.push(`| --- | --- |`);\n lines.push(`| Run directories scanned | ${runDirs.length} |`);\n lines.push(`| Runs with gap data | ${parsed.length} |`);\n lines.push(`| Runs with analysis+conversion | ${nRuns} |`);\n lines.push(`| Distinct fixtures (from gaps) | ${totalFixtures} |`);\n lines.push(`| Total gap entries | ${allGaps.length} |`);\n lines.push(`| Actionable gaps not covered by existing rule | ${notCoveredActionable.length} |`);\n lines.push(\"\");\n\n if (similaritySummary.length > 0) {\n lines.push(\"## Similarity per run\");\n lines.push(\"\");\n lines.push(\"| Run | Similarity |\");\n lines.push(\"| --- | --- |\");\n for (const s of similaritySummary) {\n lines.push(`| ${s.label} | ${s.similarity != null ? `${s.similarity}%` : \"N/A\"} |`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"## Gaps by category\");\n lines.push(\"\");\n if (byCategory.size === 0) {\n lines.push(\"_No gap entries found._\");\n } else {\n lines.push(\"| Category | Count |\");\n lines.push(\"| --- | --- |\");\n for (const [k, v] of [...byCategory.entries()].sort((a, b) => b[1] - a[1])) {\n lines.push(`| ${k} | ${v} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(`## Repeating patterns (${minRepeat}+ fixtures)`);\n lines.push(\"\");\n lines.push(\n \"_Patterns use category + area/description. Review for **new rule** candidates when not covered by existing rules._\"\n );\n lines.push(\"\");\n if (repeatingPatterns.length === 0) {\n lines.push(`_No patterns appearing in at least ${minRepeat} distinct fixtures._`);\n } else {\n lines.push(\"| Pattern (category) | Fixtures | Sample |\");\n lines.push(\"| --- | --- | --- |\");\n for (const [, info] of repeatingPatterns) {\n const fx = [...info.fixtures].sort().join(\", \");\n const safe = info.sample.replace(/\\|/g, \"\\\\|\").replace(/\\n/g, \" \");\n lines.push(`| ${info.category} | ${info.fixtures.size} (${fx}) | ${safe} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(\"## Existing rules mentioned in gaps\");\n lines.push(\"\");\n lines.push(\"_When a gap is attributed to an existing rule, which fixtures reported it._\");\n lines.push(\"\");\n if (existingRuleMentions.size === 0) {\n lines.push(\"_None._\");\n } else {\n lines.push(\"| Rule ID | Fixture count | Fixtures |\");\n lines.push(\"| --- | --- | --- |\");\n for (const [ruleId, set] of [...existingRuleMentions.entries()].sort(\n (a, b) => b[1].size - a[1].size\n )) {\n const fx = [...set].sort().join(\", \");\n lines.push(`| \\`${ruleId}\\` | ${set.size} | ${fx} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(\"## New rule candidates (from gap files)\");\n lines.push(\"\");\n const strongSuggestions = [...suggestionCounts.entries()].filter(\n ([, v]) => v.fixtures.size >= minRepeat\n );\n if (strongSuggestions.length === 0) {\n lines.push(`_No suggestion keys appearing in ${minRepeat}+ fixtures. Lower the threshold or add more gap data._`);\n } else {\n lines.push(\"| Candidate | Appearances | Fixtures |\");\n lines.push(\"| --- | --- | --- |\");\n for (const [id, v] of strongSuggestions.sort((a, b) => b[1].fixtures.size - a[1].fixtures.size)) {\n const fx = [...v.fixtures].sort().join(\", \");\n lines.push(`| ${id} | ${v.count} | ${fx} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(\"## Rule score vs conversion impact (from run snapshots)\");\n lines.push(\"\");\n if (nRuns === 0) {\n lines.push(\n \"_No runs with both `analysis.json` and `conversion.json`. Run calibration first to populate this section._\"\n );\n } else {\n lines.push(\n \"_Per run, `calibrate-evaluate`-style comparison: **overscored** means the rule penalty looks too harsh for actual impact; **underscored** means too lenient._\"\n );\n lines.push(\"\");\n lines.push(`| Rule ID | Overscored (runs) | Underscored (runs) | Validated (runs) |`);\n lines.push(\"| --- | --- | --- | --- |\");\n const ruleIds = new Set<string>([\n ...overscoredRuns.keys(),\n ...underscoredRuns.keys(),\n ...validatedRuns.keys(),\n ]);\n for (const id of [...ruleIds].sort()) {\n const o = overscoredRuns.get(id)?.size ?? 0;\n const u = underscoredRuns.get(id)?.size ?? 0;\n const val = validatedRuns.get(id)?.size ?? 0;\n lines.push(`| \\`${id}\\` | ${o}/${nRuns} | ${u}/${nRuns} | ${val}/${nRuns} |`);\n }\n lines.push(\"\");\n lines.push(\"**Heuristic:** many **overscored** rows with high similarity → consider lowering severity or score in `rule-config.ts`. Many **underscored** → consider raising.\");\n }\n lines.push(\"\");\n\n lines.push(\"## Enabled rules never flagged in any run\");\n lines.push(\"\");\n if (nRuns === 0) {\n lines.push(\"_Skipped (no run snapshots)._\");\n } else if (neverFlagged.length === 0) {\n lines.push(\"_Every enabled rule was flagged at least once across runs._\");\n } else {\n lines.push(\n `_These rules did not appear in \\`flaggedRuleIds\\` in any saved analysis. They may still be valuable for other designs._`\n );\n lines.push(\"\");\n for (const id of neverFlagged) {\n lines.push(`- \\`${id}\\``);\n }\n }\n lines.push(\"\");\n\n // Cross-run evidence from git-tracked files\n const calibrationEvidence = loadCalibrationEvidence();\n const calibrationEvidenceRules = Object.keys(calibrationEvidence);\n lines.push(\"## Cross-run calibration evidence (git-tracked)\");\n lines.push(\"\");\n if (calibrationEvidenceRules.length === 0) {\n lines.push(\"_No accumulated calibration evidence. Evidence is collected during `calibrate-evaluate --run-dir` runs._\");\n } else {\n lines.push(\"_Evidence persisted in `data/calibration-evidence.json` across sessions. Pruned when Arbitrator applies score changes._\");\n lines.push(\"\");\n lines.push(\"| Rule ID | Overscored | Underscored |\");\n lines.push(\"| --- | --- | --- |\");\n for (const ruleId of calibrationEvidenceRules.sort()) {\n const ev = calibrationEvidence[ruleId];\n if (!ev) continue;\n lines.push(`| \\`${ruleId}\\` | ${ev.overscoredCount} | ${ev.underscoredCount} |`);\n }\n }\n lines.push(\"\");\n\n lines.push(\"## Next step (manual)\");\n lines.push(\"\");\n lines.push(\n \"Review this report. To add a new rule, implement it manually and re-run calibration for verification.\"\n );\n lines.push(\"\");\n\n return {\n markdown: lines.join(\"\\n\"),\n runCount: nRuns,\n gapRunCount: parsed.length,\n };\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { generateGapRuleReport } from \"../../../agents/gap-rule-report.js\";\n\ninterface CalibrateGapReportOptions {\n calibrationDir?: string;\n output?: string;\n minRepeat?: string;\n json?: boolean;\n}\n\nexport function registerCalibrateGapReport(cli: CAC): void {\n cli\n .command(\n \"calibrate-gap-report\",\n \"Aggregate gap data and calibration runs into a rule review report\"\n )\n .option(\"--calibration-dir <path>\", \"Calibration runs directory\", {\n default: \"logs/calibration\",\n })\n .option(\"--output <path>\", \"Markdown report path\", {\n default: \"logs/calibration/REPORT.md\",\n })\n .option(\"--min-repeat <n>\", \"Minimum distinct fixtures to treat as a repeating pattern\", {\n default: \"2\",\n })\n .option(\"--json\", \"Print JSON summary to stdout\")\n .action(async (options: CalibrateGapReportOptions) => {\n try {\n // In --json mode, send progress messages to stderr so stdout contains only valid JSON\n const log = options.json ? console.error.bind(console) : console.log.bind(console);\n\n const parsed = Number.parseInt(options.minRepeat ?? \"2\", 10);\n const minRepeat = Number.isNaN(parsed) ? 2 : Math.max(1, parsed);\n const result = generateGapRuleReport({\n calibrationDir: resolve(options.calibrationDir ?? \"logs/calibration\"),\n minPatternRepeat: minRepeat,\n });\n\n const outPath = resolve(options.output ?? \"logs/calibration/REPORT.md\");\n const outDir = dirname(outPath);\n if (!existsSync(outDir)) {\n mkdirSync(outDir, { recursive: true });\n }\n\n // Backup existing report with timestamp before overwriting\n if (existsSync(outPath)) {\n const { readFile: readFileAsync } = await import(\"node:fs/promises\");\n const existing = await readFileAsync(outPath, \"utf-8\");\n // Extract timestamp from the \"Generated:\" line\n const match = existing.match(/Generated:\\s*(\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z)/);\n if (match?.[1]) {\n const ts = match[1].replace(/[:.]/g, \"-\").replace(\"T\", \"-\").replace(\"Z\", \"\");\n const backupPath = outPath.replace(/\\.md$/, `--${ts}.md`);\n await writeFile(backupPath, existing, \"utf-8\");\n log(` Previous report backed up: ${backupPath}`);\n }\n }\n\n await writeFile(outPath, result.markdown, \"utf-8\");\n\n log(\"Gap rule review report written.\");\n log(` Runs with gaps: ${result.gapRunCount}`);\n log(` Runs with snapshots: ${result.runCount}`);\n log(` Output: ${outPath}`);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n gapRunCount: result.gapRunCount,\n runCount: result.runCount,\n outputPath: outPath,\n },\n null,\n 2\n )\n );\n }\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import type { CAC } from \"cac\";\n\nimport { parseFigmaUrl } from \"../../../core/adapters/figma-url-parser.js\";\nimport { isFigmaUrl } from \"../../../core/engine/loader.js\";\nimport { getFigmaToken } from \"../../../core/engine/config-store.js\";\nimport { runCalibrationAnalyze } from \"../../../agents/orchestrator.js\";\n\ninterface CalibrateRunOptions {\n token?: string;\n maxNodes?: number;\n sampling?: string;\n}\n\nexport function registerCalibrateRun(cli: CAC): void {\n cli\n .command(\n \"calibrate-run <input>\",\n \"Run full calibration pipeline (analysis-only, conversion via /calibrate-loop)\"\n )\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--max-nodes <count>\", \"Max nodes to convert\", { default: 5 })\n .option(\"--sampling <strategy>\", \"Sampling strategy (all | top-issues | random)\", { default: \"top-issues\" })\n .action(async (input: string, options: CalibrateRunOptions) => {\n try {\n const figmaToken = options.token ?? getFigmaToken();\n\n if (isFigmaUrl(input) && !parseFigmaUrl(input).nodeId) {\n console.warn(\"\\nWarning: No node-id specified. Calibrating entire file may produce noisy results.\");\n console.warn(\"Tip: Add ?node-id=XXX to target a specific section.\\n\");\n }\n\n console.log(\"Running calibration pipeline (analysis-only)...\");\n console.log(` Input: ${input}`);\n console.log(\"\");\n\n const { analysisOutput } = await runCalibrationAnalyze({\n input,\n maxConversionNodes: options.maxNodes ?? 5,\n samplingStrategy: (options.sampling as \"all\" | \"top-issues\" | \"random\") ?? \"top-issues\",\n ...(figmaToken && { token: figmaToken }),\n });\n\n console.log(\"\\nCalibration complete (analysis-only).\");\n console.log(` Grade: ${analysisOutput.scoreReport.overall.grade} (${analysisOutput.scoreReport.overall.percentage}%)`);\n console.log(` Nodes with issues: ${analysisOutput.nodeIssueSummaries.length}`);\n console.log(\" Note: Use /calibrate-loop in Claude Code for full pipeline with visual comparison.\");\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync } from \"node:fs\";\nimport { resolve, join, basename } from \"node:path\";\nimport { z } from \"zod\";\n\nconst CALIBRATION_DIR = \"logs/calibration\";\n\nfunction getDateTimeString(): string {\n const now = new Date();\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, \"0\");\n const day = String(now.getDate()).padStart(2, \"0\");\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n return `${year}-${month}-${day}-${hours}${minutes}`;\n}\n\n/**\n * Extract a short fixture name from a fixture path.\n * e.g. \"fixtures/http-design\" → \"http-design\"\n * \"fixtures/http-design/data.json\" → \"http-design\"\n */\nexport function extractFixtureName(fixturePath: string): string {\n // Remove trailing slash\n const cleaned = fixturePath.replace(/\\/+$/, \"\");\n const last = cleaned.split(\"/\").pop() ?? cleaned;\n // If pointing to data.json, use parent directory name\n if (last === \"data.json\") {\n const parts = cleaned.split(\"/\");\n return parts[parts.length - 2] ?? last;\n }\n return last.replace(/\\.json$/, \"\");\n}\n\n/**\n * Build a run directory name: `<name>--<timestamp>`\n * Double dash separates name from timestamp (names can contain single dashes).\n */\nfunction buildRunDirName(name: string, timestamp: string): string {\n return `${name}--${timestamp}`;\n}\n\n/**\n * Parse a run directory name into its components.\n * e.g. \"material3-kit--2026-03-24-0200\" → { name: \"material3-kit\", timestamp: \"2026-03-24-0200\" }\n */\nexport function parseRunDirName(dirName: string): { name: string; timestamp: string } {\n const idx = dirName.lastIndexOf(\"--\");\n if (idx === -1) {\n return { name: dirName, timestamp: \"\" };\n }\n return {\n name: dirName.slice(0, idx),\n timestamp: dirName.slice(idx + 2),\n };\n}\n\n/**\n * Create a calibration run directory and return its absolute path.\n * Format: `logs/calibration/<fixture-name>--<YYYY-MM-DD-HHMM>/`\n */\nexport function createCalibrationRunDir(fixtureName: string): string {\n const timestamp = getDateTimeString();\n const dirName = buildRunDirName(fixtureName, timestamp);\n const dirPath = resolve(CALIBRATION_DIR, dirName);\n mkdirSync(dirPath, { recursive: true });\n return dirPath;\n}\n\n/**\n * List all calibration run directories, sorted by name (oldest first).\n */\nexport function listCalibrationRuns(): string[] {\n const dir = resolve(CALIBRATION_DIR);\n if (!existsSync(dir)) return [];\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name.includes(\"--\"))\n .map((e) => join(dir, e.name))\n .sort();\n}\n\n// --- Fixture discovery ---\n\nconst DEFAULT_FIXTURES_DIR = \"fixtures\";\nconst DONE_DIR = \"done\";\n\n/**\n * List active fixture directories (those containing data.json, excluding done/).\n * Returns absolute paths sorted alphabetically.\n */\nexport function listActiveFixtures(fixturesDir: string = DEFAULT_FIXTURES_DIR): string[] {\n const dir = resolve(fixturesDir);\n if (!existsSync(dir)) return [];\n return readdirSync(dir, { withFileTypes: true })\n .filter((e) => e.isDirectory() && e.name !== DONE_DIR)\n .map((e) => join(dir, e.name))\n .filter((p) => existsSync(join(p, \"data.json\")))\n .sort();\n}\n\n/**\n * List done fixture directories.\n */\nexport function listDoneFixtures(fixturesDir: string = DEFAULT_FIXTURES_DIR): string[] {\n const doneDir = resolve(fixturesDir, DONE_DIR);\n if (!existsSync(doneDir)) return [];\n return readdirSync(doneDir, { withFileTypes: true })\n .filter((e) => e.isDirectory())\n .map((e) => join(doneDir, e.name))\n .filter((p) => existsSync(join(p, \"data.json\")))\n .sort();\n}\n\n/**\n * Move a fixture to done/.\n * Returns the new path, or null if the fixture doesn't exist.\n */\nexport function moveFixtureToDone(fixturePath: string, fixturesDir: string = DEFAULT_FIXTURES_DIR): string | null {\n const src = resolve(fixturePath);\n if (!existsSync(src)) return null;\n const name = basename(src);\n const doneDir = resolve(fixturesDir, DONE_DIR);\n mkdirSync(doneDir, { recursive: true });\n const dest = join(doneDir, name);\n renameSync(src, dest);\n return dest;\n}\n\n// --- Debate result parsing (Zod-validated) ---\n\nconst DebateDecisionSchema = z.object({\n ruleId: z.string(),\n decision: z.string(),\n before: z.number().optional(),\n after: z.number().optional(),\n reason: z.string().optional(),\n}).passthrough();\n\nconst CriticReviewSchema = z.object({\n ruleId: z.string(),\n decision: z.string(),\n reason: z.string().optional(),\n revised: z.number().optional(),\n confidence: z.enum([\"high\", \"medium\", \"low\"]).optional(),\n pro: z.array(z.string()).optional(),\n con: z.array(z.string()).optional(),\n}).passthrough();\n\nconst CriticSchema = z.object({\n summary: z.string(),\n reviews: z.array(CriticReviewSchema),\n}).passthrough();\n\nconst ArbitratorSchema = z.object({\n summary: z.string(),\n decisions: z.array(DebateDecisionSchema),\n newRuleProposals: z.array(z.unknown()).optional(),\n}).passthrough();\n\n/** stoppingReason canonical location: debate.json top level (not inside arbitrator) */\nconst DebateResultSchema = z.object({\n critic: CriticSchema.nullable().default(null),\n arbitrator: ArbitratorSchema.nullable().default(null),\n skipped: z.string().optional(),\n stoppingReason: z.string().optional(),\n}).passthrough();\n\n/** A single decision from the Arbitrator in debate.json. */\nexport type DebateDecision = z.infer<typeof DebateDecisionSchema>;\n\n/** Parsed debate.json structure from a calibration run. */\nexport type DebateResult = z.infer<typeof DebateResultSchema>;\n\n/**\n * Parse a debate.json file from a run directory.\n * Validates with Zod schema — returns null if file is missing or malformed.\n */\nexport function parseDebateResult(runDir: string): DebateResult | null {\n const debatePath = join(runDir, \"debate.json\");\n if (!existsSync(debatePath)) return null;\n try {\n const raw: unknown = JSON.parse(readFileSync(debatePath, \"utf-8\"));\n const result = DebateResultSchema.safeParse(raw);\n if (!result.success) {\n console.debug(`[parseDebateResult] invalid debate.json in ${runDir}:`, result.error.issues);\n return null;\n }\n return result.data;\n } catch (err) {\n console.debug(`[parseDebateResult] failed to read debate.json in ${runDir}:`, err);\n return null;\n }\n}\n\n/**\n * Extract ruleIds that were applied or revised by the Arbitrator.\n */\nexport function extractAppliedRuleIds(debate: DebateResult): string[] {\n if (!debate.arbitrator) return [];\n return debate.arbitrator.decisions\n .filter((d) => {\n const dec = d.decision.trim().toLowerCase();\n return dec === \"applied\" || dec === \"revised\";\n })\n .map((d) => d.ruleId.trim())\n .filter((id) => id.length > 0);\n}\n\n/**\n * Resolve the latest calibration run directory for a given fixture name.\n * Searches `logs/calibration/<name>--*` and returns the most recent (last sorted).\n * Returns null if no matching run exists.\n */\nexport function resolveLatestRunDir(fixtureName: string): string | null {\n const runs = listCalibrationRuns();\n const matching = runs.filter((runPath) => {\n const dirName = basename(runPath);\n const parsed = parseRunDirName(dirName);\n return parsed.name === fixtureName;\n });\n return matching.length > 0 ? matching[matching.length - 1]! : null;\n}\n\n/** Convergence summary with decision counts. */\nexport interface ConvergenceSummary {\n converged: boolean;\n mode: \"strict\" | \"lenient\";\n applied: number;\n revised: number;\n rejected: number;\n hold: number;\n kept: number;\n total: number;\n reason: string;\n}\n\n/**\n * Check convergence and return a detailed summary with decision counts.\n */\nexport function checkConvergence(runDir: string, options?: ConvergenceOptions): ConvergenceSummary {\n const mode = options?.lenient ? \"lenient\" : \"strict\";\n const debate = parseDebateResult(runDir);\n\n if (!debate) {\n return { converged: false, mode, applied: 0, revised: 0, rejected: 0, hold: 0, kept: 0, total: 0, reason: \"no debate.json found\" };\n }\n if (debate.skipped) {\n return { converged: true, mode, applied: 0, revised: 0, rejected: 0, hold: 0, kept: 0, total: 0, reason: debate.skipped };\n }\n if (!debate.arbitrator) {\n // Early-stop: Arbitrator skipped because all proposals rejected with high confidence\n if (debate.stoppingReason) {\n return { converged: true, mode, applied: 0, revised: 0, rejected: 0, hold: 0, kept: 0, total: 0, reason: `early-stop: ${debate.stoppingReason}` };\n }\n return { converged: false, mode, applied: 0, revised: 0, rejected: 0, hold: 0, kept: 0, total: 0, reason: \"no arbitrator result\" };\n }\n\n const decisions = debate.arbitrator.decisions;\n const applied = decisions.filter((d) => d.decision.trim().toLowerCase() === \"applied\").length;\n const revised = decisions.filter((d) => d.decision.trim().toLowerCase() === \"revised\").length;\n const rejected = decisions.filter((d) => d.decision.trim().toLowerCase() === \"rejected\").length;\n const hold = decisions.filter((d) => d.decision.trim().toLowerCase() === \"hold\").length;\n const kept = decisions.length - applied - revised - rejected - hold;\n const total = decisions.length;\n\n // hold = \"not enough confidence to decide\" → not converged (need more evidence)\n const converged = options?.lenient\n ? (applied + revised + hold) === 0\n : (applied + revised + hold) === 0 && rejected === 0;\n\n const parts: string[] = [];\n if (applied > 0) parts.push(`${applied} applied`);\n if (revised > 0) parts.push(`${revised} revised`);\n if (rejected > 0) parts.push(`${rejected} rejected`);\n if (hold > 0) parts.push(`${hold} hold`);\n if (kept > 0) parts.push(`${kept} kept`);\n const countsStr = parts.length > 0 ? parts.join(\", \") : \"no decisions\";\n const verdict = converged ? \"converged\" : \"not converged\";\n const reason = `${verdict} (${mode}) — ${countsStr} (${total} total)`;\n\n return { converged, mode, applied, revised, rejected, hold, kept, total, reason };\n}\n\n/** Options for convergence checking. */\nexport interface ConvergenceOptions {\n /**\n * When true, converged iff no applied/revised decisions (ignore rejected count).\n * Use when repeated reject loops block `fixture-done` but scores are stable (see issue #14).\n */\n lenient?: boolean | undefined;\n}\n\n/**\n * Check if a calibration run has converged.\n * Delegates to checkConvergence to avoid duplicating early-stop / hold logic.\n */\nexport function isConverged(runDir: string, options?: ConvergenceOptions): boolean {\n return checkConvergence(runDir, options).converged;\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { z } from \"zod\";\n\nexport const RUN_DIR_ARG_SCHEMA = z.string().trim().min(1, \"runDir is required\");\nexport const KEYWORD_ARG_SCHEMA = z.string().trim().min(1, \"keyword is required\");\n\n/**\n * Validate and resolve a run directory path.\n * Returns the resolved absolute path, or null if invalid/missing/not a directory.\n * Logs to stdout and returns null on failure (internal CLI convention).\n */\nexport function resolveRunDir(runDir: string): string | null {\n const parsed = RUN_DIR_ARG_SCHEMA.safeParse(runDir);\n if (!parsed.success) {\n console.log(`Invalid runDir: ${parsed.error.issues[0]?.message}`);\n return null;\n }\n const dir = resolve(parsed.data);\n try {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) {\n console.log(`Run directory not found or is not a directory: ${runDir}`);\n return null;\n }\n } catch {\n console.log(`Run directory not accessible: ${runDir}`);\n return null;\n }\n return dir;\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { parseDebateResult } from \"../../../agents/run-directory.js\";\nimport { loadCalibrationEvidence, computeEvidenceRatio } from \"../../../agents/evidence-collector.js\";\nimport type { EvidenceRatioSummary } from \"../../../agents/contracts/evidence.js\";\nimport { RULE_CONFIGS } from \"../../../core/rules/rule-config.js\";\nimport { resolveRunDir } from \"./cli-helpers.js\";\n\nconst KNOWN_RULE_IDS = new Set(Object.keys(RULE_CONFIGS));\n\n// ─── calibrate-gather-evidence ──────────────────────────────────────────────\n\nexport interface GatheredEvidence {\n ruleImpactAssessment: unknown[];\n uncoveredStruggles: unknown[];\n actionableGaps: unknown[];\n priorEvidence: Record<string, unknown>;\n evidenceRatios: Record<string, EvidenceRatioSummary>;\n}\n\n/**\n * Gather structured evidence for the Critic from run artifacts + cross-run data.\n * Pure data extraction — no LLM needed.\n */\nexport function gatherEvidence(runDir: string, proposedRuleIds: string[]): GatheredEvidence {\n const result: GatheredEvidence = {\n ruleImpactAssessment: [],\n uncoveredStruggles: [],\n actionableGaps: [],\n priorEvidence: {},\n evidenceRatios: {},\n };\n\n // 1. conversion.json → ruleImpactAssessment, uncoveredStruggles\n const convPath = join(runDir, \"conversion.json\");\n if (existsSync(convPath)) {\n try {\n const conv = JSON.parse(readFileSync(convPath, \"utf-8\")) as Record<string, unknown>;\n if (Array.isArray(conv[\"ruleImpactAssessment\"])) {\n result.ruleImpactAssessment = conv[\"ruleImpactAssessment\"];\n }\n if (Array.isArray(conv[\"uncoveredStruggles\"])) {\n result.uncoveredStruggles = conv[\"uncoveredStruggles\"];\n }\n } catch { /* ignore malformed */ }\n }\n\n // 2. gaps.json → actionable gaps\n const gapsPath = join(runDir, \"gaps.json\");\n if (existsSync(gapsPath)) {\n try {\n const gaps = JSON.parse(readFileSync(gapsPath, \"utf-8\")) as Record<string, unknown>;\n const gapList = Array.isArray(gaps[\"gaps\"]) ? gaps[\"gaps\"] : [];\n result.actionableGaps = gapList.filter(\n (g): g is Record<string, unknown> =>\n typeof g === \"object\" && g !== null && (g as Record<string, unknown>)[\"actionable\"] === true\n );\n } catch { /* ignore malformed */ }\n }\n\n // 3. Prior evidence filtered to proposed rules only + ratio summaries\n if (proposedRuleIds.length > 0) {\n const allEvidence = loadCalibrationEvidence();\n const ruleSet = new Set(proposedRuleIds.map((id) => id.trim()));\n for (const [ruleId, group] of Object.entries(allEvidence)) {\n if (ruleSet.has(ruleId)) {\n result.priorEvidence[ruleId] = group;\n result.evidenceRatios[ruleId] = computeEvidenceRatio(group);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Load proposed ruleIds from proposed-rules.json (written by calibrate-evaluate).\n * Falls back to regex extraction from summary.md if file doesn't exist.\n */\nexport function loadProposedRuleIds(runDir: string): string[] {\n // Preferred: deterministic list from calibrate-evaluate\n const proposedPath = join(runDir, \"proposed-rules.json\");\n if (existsSync(proposedPath)) {\n try {\n const raw: unknown = JSON.parse(readFileSync(proposedPath, \"utf-8\"));\n if (Array.isArray(raw)) return raw.filter((id): id is string => typeof id === \"string\");\n } catch { /* fall through to regex */ }\n }\n\n // Fallback: extract from summary.md, filtered to known rule IDs only\n const summaryPath = join(runDir, \"summary.md\");\n if (!existsSync(summaryPath)) return [];\n try {\n const content = readFileSync(summaryPath, \"utf-8\");\n const ids = new Set<string>();\n for (const match of content.matchAll(/`([a-z][\\w-]*)`/g)) {\n if (match[1] && KNOWN_RULE_IDS.has(match[1])) ids.add(match[1]);\n }\n return [...ids];\n } catch {\n return [];\n }\n}\n\nexport function registerGatherEvidence(cli: CAC): void {\n cli\n .command(\n \"calibrate-gather-evidence <runDir>\",\n \"Gather structured evidence for Critic from run artifacts + cross-run data\"\n )\n .action((runDir: string) => {\n const dir = resolveRunDir(runDir);\n if (!dir) return;\n\n const proposedRuleIds = loadProposedRuleIds(dir);\n const evidence = gatherEvidence(dir, proposedRuleIds);\n\n // Write to file for orchestrator to include in Critic prompt\n const outPath = join(dir, \"critic-evidence.json\");\n writeFileSync(outPath, JSON.stringify(evidence, null, 2) + \"\\n\", \"utf-8\");\n const ratioCount = Object.keys(evidence.evidenceRatios).length;\n console.log(`Gathered evidence: ${evidence.ruleImpactAssessment.length} impact assessments, ${evidence.actionableGaps.length} gaps, ${Object.keys(evidence.priorEvidence).length} prior rules (${ratioCount} with ratio summaries)`);\n console.log(`Written to ${outPath}`);\n });\n}\n\n// ─── calibrate-finalize-debate ──────────────────────────────────────────────\n\ninterface FinalizeResult {\n action: \"early-stop\" | \"continue\" | \"finalized\";\n stoppingReason?: string;\n}\n\nexport function registerFinalizeDebate(cli: CAC): void {\n cli\n .command(\n \"calibrate-finalize-debate <runDir>\",\n \"Check early-stop or determine stoppingReason after debate\"\n )\n .action((runDir: string) => {\n const dir = resolveRunDir(runDir);\n if (!dir) return;\n\n const debate = parseDebateResult(dir);\n if (!debate) {\n console.log(\"No debate.json found\");\n return;\n }\n\n const debatePath = join(dir, \"debate.json\");\n let raw: Record<string, unknown>;\n try {\n raw = JSON.parse(readFileSync(debatePath, \"utf-8\")) as Record<string, unknown>;\n } catch {\n console.log(JSON.stringify({ action: \"continue\" }));\n return;\n }\n\n // Case 1: Critic done, no Arbitrator yet → check early-stop\n if (debate.critic && !debate.arbitrator) {\n const reviews = debate.critic.reviews;\n const allHighConfidenceReject = reviews.length > 0 && reviews.every((r) => {\n return r.decision.trim().toUpperCase() === \"REJECT\" && r.confidence === \"high\";\n });\n\n if (allHighConfidenceReject) {\n raw[\"stoppingReason\"] = \"all-high-confidence-reject\";\n writeFileSync(debatePath, JSON.stringify(raw, null, 2) + \"\\n\", \"utf-8\");\n const result: FinalizeResult = { action: \"early-stop\", stoppingReason: \"all-high-confidence-reject\" };\n console.log(JSON.stringify(result));\n // exit 0 = early-stop, orchestrator should skip Arbitrator\n return;\n }\n\n const result: FinalizeResult = { action: \"continue\" };\n console.log(JSON.stringify(result));\n // exit 0 but action=continue → orchestrator proceeds to Arbitrator\n return;\n }\n\n // Case 2: Both Critic and Arbitrator done → determine stoppingReason\n if (debate.arbitrator) {\n const decisions = debate.arbitrator.decisions;\n const allHold = decisions.length > 0 && decisions.every((d) =>\n d.decision.trim().toLowerCase() === \"hold\"\n );\n\n if (allHold) {\n raw[\"stoppingReason\"] = \"low-confidence-hold\";\n writeFileSync(debatePath, JSON.stringify(raw, null, 2) + \"\\n\", \"utf-8\");\n const result: FinalizeResult = { action: \"finalized\", stoppingReason: \"low-confidence-hold\" };\n console.log(JSON.stringify(result));\n return;\n }\n\n // Normal completion — no stoppingReason needed\n const result: FinalizeResult = { action: \"finalized\" };\n console.log(JSON.stringify(result));\n return;\n }\n\n // Fallback\n const result: FinalizeResult = { action: \"continue\" };\n console.log(JSON.stringify(result));\n });\n}\n","import { basename, resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\nimport { resolveRunDir } from \"./cli-helpers.js\";\n\nimport {\n listActiveFixtures,\n listDoneFixtures,\n moveFixtureToDone,\n parseDebateResult,\n parseRunDirName,\n extractAppliedRuleIds,\n extractFixtureName,\n resolveLatestRunDir,\n checkConvergence,\n} from \"../../../agents/run-directory.js\";\nimport {\n pruneCalibrationEvidence,\n enrichCalibrationEvidence,\n} from \"../../../agents/evidence-collector.js\";\n\nexport function registerFixtureManagement(cli: CAC): void {\n cli\n .command(\n \"fixture-list [fixturesDir]\",\n \"List active and done fixtures\"\n )\n .option(\"--json\", \"Output as JSON\")\n .action((fixturesDir: string | undefined, options: { json?: boolean }) => {\n const dir = fixturesDir ?? \"fixtures\";\n const active = listActiveFixtures(dir);\n const done = listDoneFixtures(dir);\n\n if (options.json) {\n console.log(JSON.stringify({ active, done }, null, 2));\n } else {\n console.log(`Active fixtures (${active.length}):`);\n for (const p of active) {\n console.log(` ${p}`);\n }\n console.log(`\\nDone fixtures (${done.length}):`);\n for (const p of done) {\n console.log(` ${p}`);\n }\n }\n });\n\n cli\n .command(\n \"fixture-done <fixturePath>\",\n \"Move a converged fixture to done/\"\n )\n .option(\"--fixtures-dir <path>\", \"Fixtures root directory\", { default: \"fixtures\" })\n .option(\"--force\", \"Skip convergence check\")\n .option(\"--run-dir <path>\", \"Run directory to check for convergence (auto-resolves latest if omitted)\")\n .option(\"--dry-run\", \"Show convergence judgment without moving files\")\n .option(\n \"--lenient-convergence\",\n \"Converged when no applied/revised decisions (ignore rejected; see calibration issue #14)\"\n )\n .action(\n (fixturePath: string, options: {\n fixturesDir?: string;\n force?: boolean;\n runDir?: string;\n dryRun?: boolean;\n lenientConvergence?: boolean;\n }) => {\n const fixtureName = extractFixtureName(fixturePath);\n\n // Resolve run directory: explicit --run-dir or auto-resolve latest\n let runDir = options.runDir ? resolve(options.runDir) : null;\n if (!runDir && !options.force) {\n const latest = resolveLatestRunDir(fixtureName);\n if (latest) {\n runDir = latest;\n console.log(`Auto-resolved latest run: ${runDir}`);\n }\n }\n\n if (!options.force) {\n if (!runDir) {\n console.error(`Error: no run directory found for fixture \"${fixtureName}\". Specify --run-dir, or use --force to skip check.`);\n process.exitCode = 1; return;\n }\n const summary = checkConvergence(runDir, { lenient: options.lenientConvergence });\n console.log(`\\nConvergence check (${summary.mode}):`);\n console.log(` ${summary.reason}`);\n if (summary.total > 0) {\n console.log(` applied=${summary.applied} revised=${summary.revised} rejected=${summary.rejected} kept=${summary.kept}`);\n }\n\n if (options.dryRun) {\n console.log(`\\n[dry-run] Would ${summary.converged ? \"move\" : \"NOT move\"} fixture: ${fixturePath}`);\n return;\n }\n\n if (!summary.converged) {\n console.error(`\\nError: fixture has not converged. Use --force to override or --lenient-convergence.`);\n process.exitCode = 1; return;\n }\n } else if (options.dryRun) {\n console.log(`[dry-run] --force: would move fixture without convergence check: ${fixturePath}`);\n return;\n }\n\n const dest = moveFixtureToDone(fixturePath, options.fixturesDir ?? \"fixtures\");\n if (dest) {\n console.log(`\\nMoved to: ${dest}`);\n } else {\n console.error(`Error: fixture not found: ${fixturePath}`);\n process.exitCode = 1;\n }\n });\n}\n\nexport function registerEvidenceEnrich(cli: CAC): void {\n cli\n .command(\n \"calibrate-enrich-evidence <runDir>\",\n \"Enrich evidence with Critic's pro/con/confidence from debate.json\"\n )\n .action((runDir: string) => {\n const resolvedDir = resolveRunDir(runDir);\n if (!resolvedDir) return;\n const debate = parseDebateResult(resolvedDir);\n if (!debate?.critic) {\n console.log(\"No critic reviews in debate.json — nothing to enrich.\");\n return;\n }\n\n // Extract fixture name from run directory (e.g. \"material3-kit--2026-03-26-0900\" → \"material3-kit\")\n const { name: fixture, timestamp } = parseRunDirName(basename(resolvedDir));\n if (!timestamp) {\n console.log(`Run directory \"${basename(resolvedDir)}\" does not match expected <name>--<timestamp> format`);\n return;\n }\n\n const reviews = debate.critic.reviews.map((r) => {\n const entry: Parameters<typeof enrichCalibrationEvidence>[0][number] = { ruleId: r.ruleId };\n if (r.confidence) entry.confidence = r.confidence;\n if (r.pro) entry.pro = r.pro;\n if (r.con) entry.con = r.con;\n const dec = r.decision.trim().toUpperCase();\n if (dec === \"APPROVE\" || dec === \"REJECT\" || dec === \"REVISE\" || dec === \"HOLD\") entry.decision = dec;\n return entry;\n });\n\n enrichCalibrationEvidence(reviews, fixture);\n console.log(`Enriched calibration evidence for fixture \"${fixture}\" with ${reviews.length} review(s)`);\n });\n}\n\nexport function registerEvidencePrune(cli: CAC): void {\n cli\n .command(\n \"calibrate-prune-evidence <runDir>\",\n \"Prune evidence for rules applied by the Arbitrator in the given run\"\n )\n .action((runDir: string) => {\n const resolvedDir = resolveRunDir(runDir);\n if (!resolvedDir) return;\n const debate = parseDebateResult(resolvedDir);\n if (!debate) {\n console.log(\"No debate.json found — nothing to prune.\");\n return;\n }\n\n const appliedIds = extractAppliedRuleIds(debate);\n if (appliedIds.length === 0) {\n console.log(\"No applied/revised rules — nothing to prune.\");\n return;\n }\n\n pruneCalibrationEvidence(appliedIds);\n console.log(`Pruned calibration evidence for ${appliedIds.length} rule(s): ${appliedIds.join(\", \")}`);\n });\n\n}","/**\n * Strip specific information types from design-tree text for ablation experiments.\n * Post-processes the generated text — does NOT modify design-tree.ts.\n *\n * Flow: generateDesignTree() → stripDesignTree() → send to LLM\n */\n\n/** All strip types available (including utility strips not used in experiments). */\nexport type DesignTreeStripType =\n | \"layout-direction-spacing\"\n | \"size-constraints\"\n | \"position-stacking\"\n | \"color-values\"\n | \"typography\"\n | \"shadows-effects\"\n | \"component-references\"\n | \"component-descriptions\"\n | \"node-names-hierarchy\"\n | \"overflow-text-behavior\"\n | \"hover-interaction-states\"\n | \"variable-references\"\n | \"style-references\";\n\n/**\n * Experiment-relevant strip types only.\n * Excludes trivially obvious types (color, typography, shadows, overflow, hover)\n * and no-op types (position-stacking, component-descriptions).\n */\nexport type DesignTreeInfoType =\n | \"layout-direction-spacing\"\n | \"size-constraints\"\n | \"component-references\"\n | \"node-names-hierarchy\"\n | \"variable-references\"\n | \"style-references\";\n\n/** All strip types (used for exhaustive testing). */\nexport const ALL_STRIP_TYPES: readonly DesignTreeStripType[] = [\n \"layout-direction-spacing\", \"size-constraints\", \"position-stacking\",\n \"color-values\", \"typography\", \"shadows-effects\", \"component-references\",\n \"component-descriptions\", \"node-names-hierarchy\", \"overflow-text-behavior\",\n \"hover-interaction-states\", \"variable-references\", \"style-references\",\n] as const;\n\n/**\n * Strip experiment types used in calibration ablation (six types).\n * Keep in sync with `StripTypeEnum` / `STRIP_TYPE_RULES` in the agents layer.\n * `size-constraints` pairs with responsive rules `missing-size-constraint`, `fixed-size-in-auto-layout`.\n */\nexport const DESIGN_TREE_INFO_TYPES: readonly DesignTreeInfoType[] = [\n \"layout-direction-spacing\",\n \"size-constraints\",\n \"component-references\",\n \"node-names-hierarchy\",\n \"variable-references\",\n \"style-references\",\n] as const;\n\n// --- Style property matchers ---\n\nconst LAYOUT_PROPS = new Set([\n \"display\",\n \"flex-direction\",\n \"flex-wrap\",\n \"gap\",\n \"row-gap\",\n \"column-gap\",\n \"justify-content\",\n \"align-items\",\n \"align-content\",\n \"padding\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"align-self\",\n]);\n\nconst SIZE_PROPS = new Set([\n \"min-width\",\n \"max-width\",\n \"min-height\",\n \"max-height\",\n \"flex-grow\",\n]);\n\nconst TYPOGRAPHY_PROPS = new Set([\n \"font-family\",\n \"font-weight\",\n \"font-size\",\n \"line-height\",\n \"letter-spacing\",\n \"text-align\",\n \"text-decoration\",\n]);\n\nconst SHADOW_PROPS = new Set([\n \"box-shadow\",\n \"opacity\",\n]);\n\n/** Get the CSS property name from a style segment like \"font-size: 16px\" */\nfunction getPropertyName(segment: string): string {\n const colonIdx = segment.indexOf(\":\");\n if (colonIdx === -1) return segment.trim();\n return segment.slice(0, colonIdx).trim();\n}\n\n/** Check if a style segment is a \"fill\" size (width: 100% or height: 100%) */\nfunction isFillSize(segment: string): boolean {\n const trimmed = segment.trim();\n return trimmed === \"width: 100%\" || trimmed === \"height: 100%\";\n}\n\n// --- Color replacement ---\n\nconst HEX_COLOR_RE = /#[0-9A-Fa-f]{6,8}/g;\nconst RGBA_RE = /rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+\\s*(?:,\\s*[\\d.]+\\s*)?\\)/g;\nconst SVG_COLOR_ATTR_RE = /(fill|stroke)=\"(#[0-9A-Fa-f]{6,8})\"/g;\n\nfunction replaceColors(segment: string): string {\n let result = segment;\n result = result.replace(RGBA_RE, \"[COLOR]\");\n result = result.replace(HEX_COLOR_RE, \"[COLOR]\");\n return result;\n}\n\nfunction replaceColorsInSvg(svgContent: string): string {\n return svgContent.replace(SVG_COLOR_ATTR_RE, '$1=\"[COLOR]\"');\n}\n\n// --- Reference removal ---\n\nconst VAR_COMMENT_RE = /\\s*\\/\\*\\s*var:[^*]*\\*\\//g;\nconst TEXT_STYLE_COMMENT_RE = /\\s*\\/\\*\\s*text-style:[^*]*\\*\\//g;\n\nfunction removeVarRefs(segment: string): string {\n return segment.replace(VAR_COMMENT_RE, \"\").trim();\n}\n\nfunction removeStyleRefs(segment: string): string {\n return segment.replace(TEXT_STYLE_COMMENT_RE, \"\").trim();\n}\n\n\n// --- Line classification ---\n\ninterface ParsedStyleLine {\n indent: string;\n properties: string[];\n svgSegment: string | null;\n /** text: \"...\" content — always preserved, never stripped or split. */\n textSegment: string | null;\n}\n\n/** Extract `text: \"...\"` segment from raw style string, handling escaped quotes. */\nfunction extractTextSegment(raw: string): { textSegment: string | null; rest: string } {\n // Match text: \"...\" allowing escaped quotes inside\n const textMatch = raw.match(/(?:^|;\\s*)text:\\s*\"(?:[^\"\\\\]|\\\\.)*\"/);\n if (!textMatch) return { textSegment: null, rest: raw };\n const textSegment = textMatch[0].replace(/^;\\s*/, \"\").trim();\n const rest = raw.replace(textMatch[0], \"\").replace(/;\\s*$/, \"\").replace(/^;\\s*/, \"\");\n return { textSegment, rest };\n}\n\n/** Split a style line into prefix, individual properties, optional SVG tail, and protected text. */\nfunction parseStyleLine(line: string): ParsedStyleLine | null {\n const match = line.match(/^(\\s*)style:\\s*(.*)/s);\n if (!match) return null;\n const indent = match[1] ?? \"\";\n const raw = match[2] ?? \"\";\n\n // 1. Extract text: \"...\" first (protected from splitting)\n const { textSegment, rest: afterText } = extractTextSegment(raw);\n\n // 2. Separate SVG segment (always last, starts with \"svg: <\")\n let svgSegment: string | null = null;\n let propsRaw = afterText;\n const svgIdx = afterText.indexOf(\"svg: <\");\n if (svgIdx !== -1) {\n svgSegment = afterText.slice(svgIdx);\n propsRaw = afterText.slice(0, svgIdx).replace(/;\\s*$/, \"\");\n }\n\n // 3. Split remaining properties by \"; \"\n const properties = propsRaw\n ? propsRaw.split(\"; \").map((p) => p.trim()).filter(Boolean)\n : [];\n\n return { indent, properties, svgSegment, textSegment };\n}\n\n/** Reassemble a style line from parts. Returns null if no properties remain. */\nfunction reassembleStyleLine(parsed: ParsedStyleLine): string | null {\n const parts = [...parsed.properties];\n if (parsed.svgSegment) parts.push(parsed.svgSegment);\n if (parsed.textSegment) parts.push(parsed.textSegment);\n if (parts.length === 0) return null;\n return `${parsed.indent}style: ${parts.join(\"; \")}`;\n}\n\n// --- Per-type strip functions ---\n\nfunction stripLayoutSpacing(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n return !LAYOUT_PROPS.has(prop);\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripSizeConstraints(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n if (SIZE_PROPS.has(prop)) return false;\n if (isFillSize(p)) return false;\n return true;\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripColorValues(lines: string[]): string[] {\n return lines.map((line) => {\n // Handle [hover] lines — replace colors there too\n if (line.match(/^\\s*\\[hover\\]:/)) {\n return replaceColors(line);\n }\n\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n\n parsed.properties = parsed.properties.map((p) => {\n const prop = getPropertyName(p);\n // Don't touch image paths or text content\n if (prop === \"background-image\") return p;\n if (prop === \"content-image\") return p;\n if (prop === \"text\") return p;\n // Replace colors in background, color, border, box-shadow\n if ([\"background\", \"color\", \"border\", \"border-top\", \"border-right\",\n \"border-bottom\", \"border-left\", \"box-shadow\"].includes(prop)) {\n return replaceColors(p);\n }\n return p;\n });\n\n // Replace colors in SVG\n if (parsed.svgSegment) {\n parsed.svgSegment = replaceColorsInSvg(parsed.svgSegment);\n }\n\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripTypography(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n if (TYPOGRAPHY_PROPS.has(prop)) return false;\n if (p.trim().startsWith(\"/* text-style:\")) return false;\n return true;\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripShadowsEffects(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) => {\n const prop = getPropertyName(p);\n return !SHADOW_PROPS.has(prop);\n });\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n/** Header line pattern: {indent}Name (TYPE, WxH) with optional [component: ...] */\nconst HEADER_RE = /^(\\s*)(.+?)(\\s*\\([A-Z_]+,\\s*[\\d?]+x[\\d?]+\\).*)$/;\n\n/** Check if a line is a node header (not style/comment/component-properties/hover). */\nfunction isHeaderLine(line: string): boolean {\n if (line.trimStart().startsWith(\"style:\")) return false;\n if (line.trimStart().startsWith(\"[hover]:\")) return false;\n if (line.trimStart().startsWith(\"component-properties:\")) return false;\n if (line.startsWith(\"#\")) return false;\n return HEADER_RE.test(line);\n}\n\nfunction stripComponentReferences(lines: string[]): string[] {\n return lines\n .filter((line) => !line.match(/^\\s*component-properties:/))\n .map((line) => {\n if (isHeaderLine(line)) {\n return line.replace(/\\s*\\[component:[^\\]]*\\]$/, \"\");\n }\n return line;\n });\n}\n\nfunction stripNodeNames(lines: string[]): string[] {\n let counter = 0;\n return lines.map((line) => {\n if (!isHeaderLine(line)) return line;\n const match = line.match(HEADER_RE);\n if (match) {\n counter++;\n return `${match[1]}Node${counter}${match[3]}`;\n }\n return line;\n });\n}\n\nfunction stripOverflow(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties.filter((p) =>\n p.trim() !== \"overflow: hidden\"\n );\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\nfunction stripHoverStates(lines: string[]): string[] {\n return lines.filter((line) => !line.match(/^\\s*\\[hover\\]:/));\n}\n\n/** Strip variable reference comments only (keep text-style references). */\nfunction stripVariableReferences(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties\n .map((p) => removeVarRefs(p))\n .filter(Boolean);\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n/** Strip text-style comments only (keep variable references). */\nfunction stripStyleReferences(lines: string[]): string[] {\n return lines.map((line) => {\n const parsed = parseStyleLine(line);\n if (!parsed) return line;\n parsed.properties = parsed.properties\n .map((p) => removeStyleRefs(p))\n .filter(Boolean);\n return reassembleStyleLine(parsed);\n }).filter((line): line is string => line !== null);\n}\n\n// --- Main API ---\n\nconst STRIP_FUNCTIONS: Record<DesignTreeStripType, (lines: string[]) => string[]> = {\n \"layout-direction-spacing\": stripLayoutSpacing,\n \"size-constraints\": stripSizeConstraints,\n \"position-stacking\": (lines) => lines,\n \"color-values\": stripColorValues,\n \"typography\": stripTypography,\n \"shadows-effects\": stripShadowsEffects,\n \"component-references\": stripComponentReferences,\n \"component-descriptions\": (lines) => lines,\n \"node-names-hierarchy\": stripNodeNames,\n \"overflow-text-behavior\": stripOverflow,\n \"hover-interaction-states\": stripHoverStates,\n \"variable-references\": stripVariableReferences,\n \"style-references\": stripStyleReferences,\n};\n\n/**\n * Strip a specific information type from a design-tree text.\n * Returns a new string with the target information removed.\n */\nexport function stripDesignTree(tree: string, type: DesignTreeStripType): string {\n const lines = tree.split(\"\\n\");\n const stripped = STRIP_FUNCTIONS[type](lines);\n return stripped.join(\"\\n\");\n}\n","import { existsSync, mkdirSync, readFileSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, join } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { stripDesignTree, DESIGN_TREE_INFO_TYPES, ALL_STRIP_TYPES } from \"../../../core/design-tree/strip.js\";\nimport type { DesignTreeStripType } from \"../../../core/design-tree/strip.js\";\n\nconst VALID_TYPES = new Set<string>(ALL_STRIP_TYPES);\n\nexport function registerDesignTreeStrip(cli: CAC): void {\n cli\n .command(\n \"design-tree-strip <input>\",\n \"[internal] Generate stripped design-tree variants for ablation\"\n )\n .option(\"--types <types>\", `Comma-separated strip types (default: all DESIGN_TREE_INFO_TYPES)`)\n .option(\"--output-dir <dir>\", \"Output directory for stripped files (required)\")\n .action(async (input: string, options: { types?: string; outputDir?: string }) => {\n try {\n if (!options.outputDir) {\n console.error(\"Error: --output-dir is required\");\n process.exitCode = 1;\n return;\n }\n\n const inputPath = resolve(input);\n if (!existsSync(inputPath)) {\n console.error(`Error: Input file not found: ${inputPath}`);\n process.exitCode = 1;\n return;\n }\n\n const designTree = readFileSync(inputPath, \"utf-8\");\n\n let types: DesignTreeStripType[];\n if (options.types) {\n const tokens = options.types.split(\",\").map(t => t.trim());\n const invalid = tokens.filter(t => !VALID_TYPES.has(t));\n if (invalid.length > 0) {\n console.error(`Error: Unknown strip type(s): ${invalid.join(\", \")}`);\n console.error(`Valid types: ${ALL_STRIP_TYPES.join(\", \")}`);\n process.exitCode = 1;\n return;\n }\n types = tokens as DesignTreeStripType[];\n } else {\n types = [...DESIGN_TREE_INFO_TYPES];\n }\n\n const outputDir = resolve(options.outputDir);\n mkdirSync(outputDir, { recursive: true });\n\n for (const type of types) {\n const stripped = stripDesignTree(designTree, type);\n const outputPath = join(outputDir, `${type}.txt`);\n await writeFile(outputPath, stripped, \"utf-8\");\n console.log(` ${type}.txt (${Math.round(Buffer.byteLength(stripped) / 1024)}KB)`);\n }\n\n console.log(`Stripped ${types.length} design-tree variants → ${outputDir}`);\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","/**\n * HTML extraction and processing utilities.\n * Shared by calibration pipeline and experiment scripts.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\n\n/**\n * Extract HTML from LLM markdown response text.\n * Tries three strategies: full document → body tag → largest block.\n */\nexport function extractHtml(text: string): { html: string; method: string } {\n const allBlocks = [...text.matchAll(/```(?:html|css|[a-z]*)?\\s*\\n([\\s\\S]*?)(?:```|$)/g)]\n .map((m) => m[1]?.trim() ?? \"\")\n .filter((block) => block.includes(\"<\") && block.length > 50);\n if (allBlocks.length === 0) return { html: \"\", method: \"none\" };\n const fullDoc = allBlocks.find((b) => /^<!doctype|^<html/i.test(b));\n if (fullDoc) return { html: fullDoc, method: \"doctype\" };\n const hasBody = allBlocks.find((b) => /<body/i.test(b));\n if (hasBody) return { html: hasBody, method: \"body\" };\n return { html: allBlocks.reduce((a, b) => (a.length >= b.length ? a : b)), method: \"largest\" };\n}\n\n/**\n * Remove scripts and event handlers from HTML for safe rendering.\n */\nexport function sanitizeHtml(html: string): string {\n let result = html;\n result = result.replace(/^\\/\\/\\s*filename:.*\\n/i, \"\");\n result = result.replace(/<script[\\s\\S]*?<\\/script>/gi, \"\");\n result = result.replace(/\\s+on\\w+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^\\s>]+)/gi, \"\");\n result = result.replace(\n /\\s+(href|src|xlink:href)\\s*=\\s*(?:\"\\s*javascript:[^\"]*\"|'\\s*javascript:[^']*'|javascript:[^\\s>]+)/gi,\n (_, attr) => ` ${attr}=\"#\"`,\n );\n return result;\n}\n\n/**\n * Replace Google Fonts CDN links with a local Inter font-face declaration.\n */\nexport function injectLocalFont(html: string): string {\n const fontPath = resolve(\"assets/fonts/Inter.var.woff2\");\n if (!existsSync(fontPath)) return html;\n const fontUrl = pathToFileURL(fontPath).href;\n const fontCss = `@font-face { font-family: \"Inter\"; src: url(\"${fontUrl}\") format(\"woff2\"); font-weight: 100 900; }`;\n let result = html;\n result = result.replace(/<link[^>]*fonts\\.googleapis\\.com[^>]*>/gi, \"\");\n result = result.replace(/<link[^>]*fonts\\.gstatic\\.com[^>]*>/gi, \"\");\n if (result.includes(\"<style>\")) {\n result = result.replace(\"<style>\", `<style>\\n${fontCss}\\n`);\n } else if (result.includes(\"</head>\")) {\n result = result.replace(\"</head>\", `<style>${fontCss}</style>\\n</head>`);\n }\n return result;\n}\n\n/** Full pipeline: extract → sanitize → inject font */\nexport function processHtml(responseText: string): { html: string; method: string } {\n const { html: raw, method } = extractHtml(responseText);\n const html = injectLocalFont(sanitizeHtml(raw));\n return { html, method };\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { sanitizeHtml, injectLocalFont } from \"../../../core/comparison/html-utils.js\";\n\nexport function registerHtmlPostprocess(cli: CAC): void {\n cli\n .command(\n \"html-postprocess <input>\",\n \"[internal] Sanitize HTML and inject local fonts\"\n )\n .option(\"--output <path>\", \"Output path (default: overwrite input)\")\n .action(async (input: string, options: { output?: string }) => {\n try {\n const inputPath = resolve(input);\n if (!existsSync(inputPath)) {\n console.error(`Error: Input file not found: ${inputPath}`);\n process.exitCode = 1;\n return;\n }\n\n const raw = readFileSync(inputPath, \"utf-8\");\n const html = injectLocalFont(sanitizeHtml(raw));\n\n const outputPath = options.output ? resolve(options.output) : inputPath;\n await writeFile(outputPath, html, \"utf-8\");\n\n console.log(JSON.stringify({\n inputPath,\n outputPath,\n inputBytes: Buffer.byteLength(raw, \"utf-8\"),\n outputBytes: Buffer.byteLength(html, \"utf-8\"),\n }));\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { CAC } from \"cac\";\n\nimport { computeCodeMetrics } from \"../../../core/comparison/visual-compare-helpers.js\";\n\nexport function registerCodeMetrics(cli: CAC): void {\n cli\n .command(\n \"code-metrics <input>\",\n \"[internal] Compute code metrics for an HTML file\"\n )\n .action((input: string) => {\n try {\n const inputPath = resolve(input);\n if (!existsSync(inputPath)) {\n console.error(`Error: Input file not found: ${inputPath}`);\n process.exitCode = 1;\n return;\n }\n\n const html = readFileSync(inputPath, \"utf-8\");\n const metrics = computeCodeMetrics(html);\n\n console.log(JSON.stringify(metrics));\n } catch (error) {\n console.error(\"\\nError:\", error instanceof Error ? error.message : String(error));\n process.exitCode = 1;\n }\n });\n}\n","#!/usr/bin/env node\nimport { createRequire } from \"node:module\";\nimport { config } from \"dotenv\";\nimport cac from \"cac\";\n\n// Load .env file (quiet: suppress dotenv's stdout banner)\nconfig({ quiet: true });\n\nimport {\n getTelemetryEnabled, getPosthogApiKey, getSentryDsn, getDeviceId,\n} from \"../core/engine/config-store.js\";\nimport { initMonitoring, shutdownMonitoring } from \"../core/monitoring/index.js\";\nimport { POSTHOG_API_KEY as BUILTIN_PH_KEY, SENTRY_DSN as BUILTIN_SENTRY_DSN } from \"../core/monitoring/keys.js\";\nimport { handleDocs } from \"./docs.js\";\n\n// Import rules to register them\nimport \"../core/rules/index.js\";\n\n// User-facing commands\nimport { registerAnalyze } from \"./commands/analyze.js\";\nimport { registerSaveFixture } from \"./commands/save-fixture.js\";\nimport { registerDesignTree } from \"./commands/design-tree.js\";\nimport { registerImplement } from \"./commands/implement.js\";\nimport { registerVisualCompare } from \"./commands/visual-compare.js\";\nimport { registerInit } from \"./commands/init.js\";\nimport { registerConfig } from \"./commands/config.js\";\nimport { registerListRules } from \"./commands/list-rules.js\";\nimport { registerPrompt } from \"./commands/prompt.js\";\n\n// Internal commands (used by subagents, hidden from user help)\nimport { registerCalibrateAnalyze } from \"./commands/internal/calibrate-analyze.js\";\nimport { registerCalibrateEvaluate } from \"./commands/internal/calibrate-evaluate.js\";\nimport { registerCalibrateGapReport } from \"./commands/internal/calibrate-gap-report.js\";\nimport { registerCalibrateRun } from \"./commands/internal/calibrate-run.js\";\nimport { registerGatherEvidence, registerFinalizeDebate } from \"./commands/internal/calibrate-debate.js\";\nimport { registerFixtureManagement, registerEvidenceEnrich, registerEvidencePrune } from \"./commands/internal/fixture-management.js\";\nimport { registerDesignTreeStrip } from \"./commands/internal/design-tree-strip.js\";\nimport { registerHtmlPostprocess } from \"./commands/internal/html-postprocess.js\";\nimport { registerCodeMetrics } from \"./commands/internal/code-metrics.js\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../../package.json\") as { version: string };\n\nconst cli = cac(\"canicode\");\n\n// Initialise monitoring (fire-and-forget, never blocks startup)\n{\n const monitoringConfig: Parameters<typeof initMonitoring>[0] = {\n environment: \"cli\",\n version: pkg.version,\n enabled: getTelemetryEnabled(),\n };\n const phKey = getPosthogApiKey() || BUILTIN_PH_KEY;\n if (phKey) monitoringConfig.posthogApiKey = phKey;\n const sDsn = getSentryDsn() || BUILTIN_SENTRY_DSN;\n if (sDsn) monitoringConfig.sentryDsn = sDsn;\n monitoringConfig.distinctId = getDeviceId();\n initMonitoring(monitoringConfig);\n}\n\nprocess.on(\"beforeExit\", () => {\n shutdownMonitoring();\n});\n\n// ============================================\n// User-facing commands\n// ============================================\nregisterAnalyze(cli);\nregisterSaveFixture(cli);\nregisterDesignTree(cli);\nregisterImplement(cli);\nregisterVisualCompare(cli);\nregisterInit(cli);\nregisterConfig(cli);\nregisterListRules(cli);\nregisterPrompt(cli);\n\n// ============================================\n// Internal commands (calibration & fixtures)\n// ============================================\nregisterCalibrateAnalyze(cli);\nregisterCalibrateEvaluate(cli);\nregisterCalibrateGapReport(cli);\nregisterCalibrateRun(cli);\nregisterGatherEvidence(cli);\nregisterFinalizeDebate(cli);\nregisterFixtureManagement(cli);\nregisterEvidenceEnrich(cli);\nregisterEvidencePrune(cli);\nregisterDesignTreeStrip(cli);\nregisterHtmlPostprocess(cli);\nregisterCodeMetrics(cli);\n\n// ============================================\n// Documentation command\n// ============================================\ncli\n .command(\"docs [topic]\", \"Show documentation (topics: setup, rules, config, visual-compare, design-tree)\")\n .action((topic?: string) => {\n handleDocs(topic);\n });\n\ncli.help((sections) => {\n sections.push(\n {\n title: \"\\nSetup\",\n body: ` canicode init --token <token> Save Figma token to ~/.canicode/`,\n },\n {\n title: \"\\nData source\",\n body: [\n ` --api Load via Figma REST API (needs FIGMA_TOKEN)`,\n ` --token <token> Figma API token (or use FIGMA_TOKEN env var)`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nCustomization\",\n body: ` --config <path> Override rule settings (see: canicode docs config)`,\n },\n {\n title: \"\\nExamples\",\n body: [\n ` $ canicode analyze \"https://www.figma.com/design/...\" --api`,\n ` $ canicode analyze \"https://www.figma.com/design/...\" --preset strict`,\n ` $ canicode analyze \"https://www.figma.com/design/...\" --config ./my-config.json`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nInstallation\",\n body: [\n ` CLI: npm install -g canicode`,\n ` MCP: claude mcp add canicode -- npx -y -p canicode canicode-mcp`,\n ` Skills: github.com/let-sunny/canicode`,\n ].join(\"\\n\"),\n },\n );\n});\ncli.version(pkg.version);\n\ncli.parse();\n"]}