canicode 0.10.4 → 0.10.5

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/contracts/acknowledgment.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","../../src/core/adapters/instance-id-parser.ts","../../src/core/gotcha/apply-context.ts","../../package.json","../../src/core/engine/scoring.ts","../../src/core/contracts/design-key.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/core/rules/gotcha-questions.ts","../../src/core/gotcha/group-and-batch-questions.ts","../../src/core/gotcha/survey-generator.ts","../../src/cli/commands/gotcha-survey.ts","../../src/core/gotcha/upsert-gotcha-section.ts","../../src/cli/commands/upsert-gotcha-section.ts","../../src/cli/commands/design-tree.ts","../../src/core/contracts/visual-compare.ts","../../src/cli/commands/visual-compare.ts","../../src/cli/skill-installer.ts","../../src/cli/commands/init.ts","../../src/cli/commands/config.ts","../../src/cli/commands/list-rules.ts","../../src/cli/internal-commands.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/calibration-compute.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/calibrate-save-fixture.ts","../../src/cli/commands/internal/calibrate-implement.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","isFigmaUrl","readFile","esc","countNodes","cli","findNodeById","generateDesignTreeWithStats","visualCompare","homedir","copyFileSync","dominantDifficulty","loadFile","writeFile","readdirSync","basename","result","resolveComponentDefinitions","resolveInteractionDestinations","FigmaClient","fileURLToPath","createRequire","pkg"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,CAAA;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 `calibrate-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\n // Roundtrip (ADR-012)\n // Wiring point for the roundtrip helper's `telemetry` callback. No Node-side\n // orchestrator reads this yet — the helper ships in a sandbox-pure IIFE that\n // cannot import `core/monitoring` directly, so the event fires through a\n // caller-supplied callback. Define the typed name here so a future consumer\n // has a single place to wire it up.\n ROUNDTRIP_DEFINITION_WRITE_SKIPPED: `${EVENT_PREFIX}roundtrip_definition_write_skipped`,\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 scoring Scoring model explanation\n canicode docs rules Pointer to rule list (canicode list-rules)\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 (saves token + installs skills — see section 2 for --no-skills)\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 SKILLS (requires FIGMA_TOKEN)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Setup:\n canicode init --token figd_xxxxxxxxxxxxx\n (installs three skills into ./.claude/skills/ alongside the token)\n\n Installed skills:\n canicode Lightweight CLI wrapper\n canicode-gotchas Standalone gotcha survey\n canicode-roundtrip Full analyze -> gotcha -> apply roundtrip\n\n Flags:\n --global Install to ~/.claude/skills/ instead of ./.claude/skills/\n --no-skills Skip skill install (token only — legacy behavior)\n --force Overwrite existing skill files without prompting\n\n Use (in Claude Code):\n /canicode https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\n /canicode-gotchas <url> Run a gotcha survey\n /canicode-roundtrip <url> Analyze, fix gotchas in Figma, re-analyze\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 calibrate-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 pointer to the rule list. */\nexport function printDocsRules(): void {\n console.log(`\nRULES\n\n Run 'canicode list-rules' for the full table of rule IDs, scores, and severity.\n\n Customize per-rule via config:\n canicode docs config\n\n Full reference:\n https://github.com/let-sunny/canicode/blob/main/docs/CUSTOMIZATION.md\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 scoring: printDocsScoring,\n rules: printDocsRules,\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\";\nimport type { AnnotationProperty } from \"../roundtrip/types.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 * Per-rule annotation `properties` hints surfaced in Dev Mode. Kept as a\n * sibling map rather than a field on `RuleConfig` so the existing\n * `RuleConfigSchema` Zod contract and preset helpers stay untouched.\n *\n * `bySubType` takes precedence over `default` — mirrors the ruleId+subType\n * resolution pattern already used for `targetProperty` in apply-context.ts.\n * The Experiment 09 node-type matrix is enforced at write time by\n * `upsertCanicodeAnnotation`'s retry path, so hints can be passed\n * speculatively without server-side filtering.\n */\nexport const RULE_ANNOTATION_PROPERTIES: Partial<\n Record<\n RuleId,\n {\n default?: AnnotationProperty[];\n bySubType?: Record<string, AnnotationProperty[]>;\n }\n >\n> = {\n \"missing-size-constraint\": {\n default: [{ type: \"width\" }, { type: \"height\" }],\n },\n \"irregular-spacing\": {\n bySubType: {\n gap: [{ type: \"itemSpacing\" }],\n padding: [{ type: \"padding\" }],\n },\n },\n \"fixed-size-in-auto-layout\": {\n default: [{ type: \"width\" }, { type: \"height\" }, { type: \"layoutMode\" }],\n },\n \"raw-value\": {\n bySubType: {\n color: [{ type: \"fills\" }],\n font: [\n { type: \"fontSize\" },\n { type: \"fontFamily\" },\n { type: \"fontWeight\" },\n { type: \"lineHeight\" },\n ],\n spacing: [{ type: \"itemSpacing\" }, { type: \"padding\" }],\n },\n },\n \"absolute-position-in-auto-layout\": {\n default: [{ type: \"layoutMode\" }],\n },\n};\n\n/**\n * Resolve the annotation `properties` hint for a ruleId (+ subType).\n * Returns `undefined` for rules with no entry.\n */\nexport function getAnnotationProperties(\n ruleId: RuleId,\n subType?: string\n): AnnotationProperty[] | undefined {\n const entry = RULE_ANNOTATION_PROPERTIES[ruleId];\n if (!entry) return undefined;\n if (subType !== undefined && entry.bySubType) {\n const match = entry.bySubType[subType];\n if (match) return match;\n }\n return entry.default;\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 * Pre-computed name to write to `node.name` in Figma — populated by naming\n * rules whose suggestion is a deterministic function of the node's existing\n * state (`non-standard-naming`, `inconsistent-naming-convention`).\n * Capitalized for direct Plugin-API use; the human-readable `suggestion`\n * string keeps lowercase prose.\n */\n suggestedName?: 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 capitalize(s: string): string {\n if (!s) return s;\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\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 // #372: suppress when the case-conversion produces the same string as\n // the current name. Single-character names (\"X\"), all-numeric names, and\n // any input whose every word maps to itself across cases all fall into\n // this bucket — flagging them produces a no-op rename, an empty diff\n // visible as a misleading \"✅ resolved\" wrap-up entry.\n if (suggested === node.name) return null;\n return {\n ruleId: inconsistentNamingConventionDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n suggestedName: suggested,\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 suggestedName: capitalize(suggestion),\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 * Decide whether we have enough source data to assert a state variant is missing.\n *\n * The Figma REST API does not consistently mirror `componentPropertyDefinitions`\n * onto deeply-nested INSTANCE children, and `context.file.componentDefinitions`\n * only contains masters the loader actually fetched (external-library masters\n * stay null even after extra passes). When BOTH paths are empty for an INSTANCE\n * we cannot tell whether the master defines the variant or not — treat that as\n * \"unknown\" (return false here) rather than asserting a missing variant.\n *\n * COMPONENT nodes are special: a COMPONENT IS the master, so the absence of\n * `componentPropertyDefinitions` on a COMPONENT is itself meaningful evidence\n * (standalone master with no variant axis at all). Always treat COMPONENTs as\n * determinable so the rule still catches the \"designer never added variants\"\n * case the rule is supposed to flag.\n */\nfunction canDetermineVariants(node: AnalysisNode, context: RuleContext): boolean {\n if (node.type === \"COMPONENT\") return true;\n if (node.componentPropertyDefinitions !== undefined) return true;\n if (node.componentId !== undefined) {\n const defs = context.file.componentDefinitions;\n if (defs && defs[node.componentId] !== undefined) return true;\n }\n return false;\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 // Probe gate: only assert a missing variant when we can actually observe the\n // master's variant axes. For nested INSTANCE children whose master was not\n // fetched into `componentDefinitions` and whose own `componentPropertyDefinitions`\n // is undefined, treat the verdict as unknown and skip — this avoids the\n // false-positive class described in #354. The data-availability check is\n // per-node (not per-state), so it lives outside the for-loop below.\n if (!canDetermineVariants(node, context)) 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 { z } from \"zod\";\n\n/**\n * Acknowledgment marker — surfaced from a Figma Dev Mode annotation that\n * canicode itself wrote during a roundtrip. When the analysis pipeline\n * receives a list of acknowledgments, matching `(nodeId, ruleId)` issues are\n * flagged `acknowledged: true` and contribute half their normal weight to\n * the density score (#371).\n *\n * This contract is consumed by:\n * - The MCP `analyze` tool (`acknowledgments?: Acknowledgment[]` input)\n * - The CLI `analyze --acknowledgments <path>` flag\n * - `RuleEngineOptions.acknowledgments`\n *\n * It is produced by the Plugin-API helper\n * `extractAcknowledgmentsFromNode` / `readCanicodeAcknowledgments`\n * (see `src/core/roundtrip/read-acknowledgments.ts`).\n */\nexport const AcknowledgmentSchema = z.object({\n nodeId: z.string(),\n ruleId: z.string(),\n});\n\nexport type Acknowledgment = z.infer<typeof AcknowledgmentSchema>;\n\nexport const AcknowledgmentListSchema = z.array(AcknowledgmentSchema);\n\n/**\n * Normalize a Figma node id into `:`-separated form so callers can pass\n * either URL-style (`123-456`) or Plugin-API-style (`123:456`) ids and the\n * engine matches them consistently. Non-instance ids stay unchanged; the\n * `I…;…` instance-child format keeps its semicolon — only `-` → `:`\n * happens.\n */\nexport function normalizeNodeId(id: string): string {\n return id.replace(/-/g, \":\");\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\";\nimport {\n normalizeNodeId,\n type Acknowledgment,\n} from \"../contracts/acknowledgment.js\";\n\n/**\n * Analysis issue with calculated score and metadata.\n *\n * `acknowledged` (#371) — set when the analysis engine receives an\n * `acknowledgments` list (typically read from canicode-authored Figma\n * annotations) whose `(nodeId, ruleId)` matches this issue. Acknowledged\n * issues still surface in the result (so code-gen retains the context) but\n * contribute half their normal weight to the density score, so the grade\n * reflects \"the designer has a plan for this\" instead of treating the rule\n * as fully unaddressed.\n */\nexport interface AnalysisIssue {\n violation: RuleViolation;\n rule: Rule;\n config: RuleConfig;\n depth: number;\n maxDepth: number;\n calculatedScore: number;\n acknowledged?: boolean;\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 * `(nodeId, ruleId)` pairs sourced from canicode-authored Figma annotations\n * (#371). Issues whose violation matches an entry are flagged\n * `acknowledged: true` and contribute half their normal weight to the\n * density score in `calculateScores`. nodeId may be passed in URL form\n * (`123-456`) or Plugin-API form (`123:456`) — both normalize to `:`.\n */\n acknowledgments?: Acknowledgment[];\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 private acknowledgments: ReadonlySet<string>;\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 this.acknowledgments = new Set(\n (options.acknowledgments ?? []).map(\n (a) => `${normalizeNodeId(a.nodeId)}::${a.ruleId}`\n )\n );\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 if (this.acknowledgments.size > 0) {\n for (const issue of issues) {\n const key = `${normalizeNodeId(issue.violation.nodeId)}::${issue.violation.ruleId}`;\n if (this.acknowledgments.has(key)) {\n issue.acknowledged = true;\n }\n }\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 * Parse Figma instance-child node IDs.\n *\n * Nodes inside an instance carry an `I`-prefixed id with semicolon-separated\n * path segments: `I<parentInstanceId>;<sourceNodeId>`. For nested instances\n * the format chains further, e.g. `I<parentId>;<midId>;<sourceNodeId>` —\n * each `;` represents one additional level of instance expansion. The LAST\n * segment is always the id of the node inside the innermost source component,\n * which is reachable directly via `figma.getNodeById`.\n *\n * Siblings: `figma-url-parser.ts#toCommentableNodeId` handles the same id\n * format for a different purpose (stripping for the Comments API). That\n * helper is intentionally left alone — this module owns id parsing for the\n * apply pipeline.\n */\n\nexport interface InstanceChildIdParts {\n parentInstanceId: string;\n sourceNodeId: string;\n}\n\nexport function isInstanceChildNodeId(nodeId: string): boolean {\n return nodeId.startsWith(\"I\") && nodeId.includes(\";\");\n}\n\nexport function parseInstanceChildNodeId(\n nodeId: string,\n): InstanceChildIdParts | null {\n if (!isInstanceChildNodeId(nodeId)) return null;\n\n const segments = nodeId.split(\";\");\n if (segments.length < 2) return null;\n\n const parentInstanceId = segments[0]!.replace(/^I/, \"\");\n const sourceNodeId = segments[segments.length - 1]!;\n\n if (!parentInstanceId || !sourceNodeId) return null;\n\n return { parentInstanceId, sourceNodeId };\n}\n","import type { RuleId, RuleViolation } from \"../contracts/rule.js\";\nimport type { InstanceContext } from \"../contracts/gotcha-survey.js\";\nimport type { AnnotationProperty } from \"../roundtrip/types.js\";\nimport {\n isInstanceChildNodeId,\n parseInstanceChildNodeId,\n} from \"../adapters/instance-id-parser.js\";\nimport { getAnnotationProperties } from \"../rules/rule-config.js\";\n\n/**\n * Apply strategy for a rule violation. Tells the SKILL.md/`use_figma`\n * pipeline which Plugin-API path to take.\n *\n * - `property-mod` — Strategy A. Direct property write on the scene/instance node.\n * - `structural-mod` — Strategy B. Structural change; ask user to confirm before applying.\n * - `annotation` — Strategy C. Cannot be auto-fixed; record as a Figma annotation.\n * - `auto-fix` — Strategy D. Lower-severity rules from analyze output;\n * may be a property write (naming) or annotation-only.\n *\n * Sibling module `resolve-apply-target.ts` solves a different concern\n * (scene-vs-definition write target). Compose them — do not merge.\n */\nexport type RuleApplyStrategy =\n | \"property-mod\"\n | \"structural-mod\"\n | \"annotation\"\n | \"auto-fix\";\n\n/**\n * Pre-computed apply context attached to gotcha-survey questions and\n * analyze-output issues. Lets the SKILL.md consume the data directly\n * instead of re-deriving rule routing on every roundtrip run.\n *\n * `targetProperty` is `string` for single-property writes, `string[]`\n * for rules that require multiple writes (e.g. `irregular-spacing`\n * subType `padding` → 4 padding fields), and `undefined` for\n * annotation/structural strategies that have no single property target.\n */\nexport interface ApplyContext {\n applyStrategy: RuleApplyStrategy;\n targetProperty?: string | string[];\n annotationProperties?: AnnotationProperty[];\n isInstanceChild: boolean;\n sourceChildId?: string;\n}\n\nconst STRATEGY_BY_RULE: Record<RuleId, RuleApplyStrategy> = {\n // Strategy A — property modification\n \"no-auto-layout\": \"property-mod\",\n \"fixed-size-in-auto-layout\": \"property-mod\",\n \"missing-size-constraint\": \"property-mod\",\n \"irregular-spacing\": \"property-mod\",\n \"non-semantic-name\": \"property-mod\",\n // Strategy B — structural modification (needs user confirmation)\n \"non-layout-container\": \"structural-mod\",\n \"deep-nesting\": \"structural-mod\",\n \"missing-component\": \"structural-mod\",\n \"detached-instance\": \"structural-mod\",\n // Strategy C — annotation only\n \"absolute-position-in-auto-layout\": \"annotation\",\n \"variant-structure-mismatch\": \"annotation\",\n // Strategy D — auto-fix lower-severity issues from analyze output\n \"non-standard-naming\": \"auto-fix\",\n \"inconsistent-naming-convention\": \"auto-fix\",\n \"raw-value\": \"auto-fix\",\n \"missing-interaction-state\": \"auto-fix\",\n \"missing-prototype\": \"auto-fix\",\n};\n\n/**\n * Resolve the Figma Plugin-API target property (or properties) for a\n * violation. Returns `undefined` for rules whose strategy does not write\n * a single property (structural-mod, annotation), or for naming auto-fixes\n * where the value comes from `violation.suggestedName` rather than a\n * specific Figma property — except the `name` write itself, which we\n * surface so SKILL.md can branch uniformly on `targetProperty === 'name'`.\n */\nfunction resolveTargetProperty(\n ruleId: RuleId,\n subType: string | undefined,\n): string | string[] | undefined {\n switch (ruleId) {\n case \"no-auto-layout\":\n return [\"layoutMode\", \"itemSpacing\"];\n case \"fixed-size-in-auto-layout\":\n if (subType === \"horizontal\") return \"layoutSizingHorizontal\";\n // both-axes — write both axes\n return [\"layoutSizingHorizontal\", \"layoutSizingVertical\"];\n case \"missing-size-constraint\":\n // #374: always return BOTH bounds so `applyPropertyMod`'s array branch\n // iterates the full `{ minWidth, maxWidth }` answer shape. Pre-fix the\n // `wrap` subType returned `\"minWidth\"` and `max-width` returned\n // `\"maxWidth\"` as single strings — the user typically answered with\n // both keys (the gotcha hint asks for both) and the apply step\n // silently dropped half the intent because it only iterated the one\n // property in `targetProperty`. Partial answers still work: the per-\n // property lookup in `applyPropertyMod` returns `undefined` for the\n // missing key and the helper skips it.\n return [\"minWidth\", \"maxWidth\"];\n case \"irregular-spacing\":\n if (subType === \"gap\") return \"itemSpacing\";\n // padding — all four padding fields\n return [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"];\n case \"non-semantic-name\":\n return \"name\";\n case \"non-layout-container\":\n return \"layoutMode\";\n case \"non-standard-naming\":\n case \"inconsistent-naming-convention\":\n return \"name\";\n case \"deep-nesting\":\n case \"missing-component\":\n case \"detached-instance\":\n case \"absolute-position-in-auto-layout\":\n case \"variant-structure-mismatch\":\n case \"raw-value\":\n case \"missing-interaction-state\":\n case \"missing-prototype\":\n return undefined;\n }\n}\n\n/**\n * Compute the deterministic apply context for a rule violation.\n *\n * - `applyStrategy` and `targetProperty` come from the ruleId/subType tables above.\n * - `isInstanceChild` and `sourceChildId` are parsed from the violation `nodeId`\n * via `parseInstanceChildNodeId` — single source of truth for `I...;...` ids.\n * - `instanceContext`, when supplied, takes precedence for `sourceChildId` so\n * callers that already resolved the source component (gotcha-survey) do not\n * re-parse the id.\n *\n * Strategy D rules that target scene nodes (analyze output) can pass\n * `instanceContext: undefined` — the function still returns the parsed\n * `isInstanceChild`/`sourceChildId` so SKILL.md knows whether to walk the\n * instance fallback.\n */\nexport function computeApplyContext(\n violation: Pick<RuleViolation, \"ruleId\" | \"subType\" | \"nodeId\">,\n instanceContext?: InstanceContext,\n): ApplyContext {\n const ruleId = violation.ruleId as RuleId;\n const applyStrategy = STRATEGY_BY_RULE[ruleId] ?? \"annotation\";\n const targetProperty = resolveTargetProperty(ruleId, violation.subType);\n const annotationProperties = getAnnotationProperties(\n ruleId,\n violation.subType,\n );\n\n const parsed = parseInstanceChildNodeId(violation.nodeId);\n const isInstanceChild =\n parsed !== null || isInstanceChildNodeId(violation.nodeId);\n const sourceChildId = instanceContext?.sourceNodeId ?? parsed?.sourceNodeId;\n\n return {\n applyStrategy,\n ...(targetProperty !== undefined ? { targetProperty } : {}),\n ...(annotationProperties !== undefined ? { annotationProperties } : {}),\n isInstanceChild,\n ...(sourceChildId !== undefined ? { sourceChildId } : {}),\n };\n}\n","{\n \"name\": \"canicode\",\n \"version\": \"0.10.4\",\n \"mcpName\": \"io.github.let-sunny/canicode\",\n \"description\": \"Lint Figma designs for AI code-gen and roundtrip the answers back into the file. 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 && pnpm build:roundtrip && pnpm bundle:skills\",\n \"build:web\": \"bash scripts/build-web.sh\",\n \"build:roundtrip\": \"tsup --config tsup.roundtrip.config.ts\",\n \"bundle:skills\": \"bash scripts/bundle-skills.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 \"check:skill-determinism\": \"tsx scripts/check-skill-determinism.ts\",\n \"clean\": \"rm -rf dist skills\"\n },\n \"files\": [\n \"dist\",\n \"skills\",\n \"README.md\",\n \"docs/CUSTOMIZATION.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 { computeApplyContext } from \"../gotcha/apply-context.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 * Number of issues marked `acknowledged` by an upstream\n * acknowledgments list (#371). Acknowledged issues are still counted in\n * `totalIssues` and the per-severity tallies — the count here is purely\n * additive context so consumers can render\n * `N issues — A acknowledged / N-A unaddressed`. They contribute half\n * weight to the density score upstream.\n */\n acknowledgedCount: 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 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 * Returns true if the design is ready for code generation.\n * S, A+, and A grades (percentage >= 85) indicate the design has minimal blockers\n * and can be implemented accurately by AI or developers.\n */\nexport function isReadyForCodeGen(grade: Grade): boolean {\n return grade === \"S\" || grade === \"A+\" || grade === \"A\";\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 a per-issue weight: 1.0 for\n // unacknowledged issues, 0.5 for acknowledged ones (#371). The sqrt\n // damping below treats this sum as the \"occurrence count\" so the\n // half-weight flows through to density without changing the formula.\n // Diversity is left untouched — acknowledgment is per-issue, not\n // per-rule, and the rule still represents a kind of problem.\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n const weight = issue.acknowledged === true ? 0.5 : 1;\n ruleCountMap.set(ruleId, (ruleCountMap.get(ruleId) ?? 0) + weight);\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 acknowledgedCount: 0,\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 if (issue.acknowledged === true) summary.acknowledgedCount++;\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 if (report.summary.acknowledgedCount > 0) {\n const unaddressed =\n report.summary.totalIssues - report.summary.acknowledgedCount;\n lines.push(\n ` Total: ${report.summary.totalIssues} (${report.summary.acknowledgedCount} acknowledged via canicode annotations / ${unaddressed} unaddressed)`\n );\n } else {\n lines.push(` Total: ${report.summary.totalIssues}`);\n }\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; designKey?: 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 const applyContext = computeApplyContext(issue.violation);\n const suggestedName = issue.violation.suggestedName;\n return {\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 applyStrategy: applyContext.applyStrategy,\n ...(applyContext.targetProperty !== undefined\n ? { targetProperty: applyContext.targetProperty }\n : {}),\n ...(applyContext.annotationProperties !== undefined\n ? { annotationProperties: applyContext.annotationProperties }\n : {}),\n ...(suggestedName !== undefined ? { suggestedName } : {}),\n isInstanceChild: applyContext.isInstanceChild,\n ...(applyContext.sourceChildId !== undefined\n ? { sourceChildId: applyContext.sourceChildId }\n : {}),\n ...(issue.acknowledged === true ? { acknowledged: true as const } : {}),\n };\n });\n\n const json: Record<string, unknown> = {\n version: VERSION,\n analyzedAt: result.analyzedAt,\n ...(options?.fileKey && { fileKey: options.fileKey }),\n ...(options?.designKey && { designKey: options.designKey }),\n fileName,\n nodeCount: result.nodeCount,\n maxDepth: result.maxDepth,\n issueCount: result.issues.length,\n acknowledgedCount: scores.summary.acknowledgedCount,\n isReadyForCodeGen: isReadyForCodeGen(scores.overall.grade),\n blockingIssueCount: scores.summary.blocking,\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 { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { parseFigmaUrl } from \"../adapters/figma-url-parser.js\";\n\n/**\n * Local copy of `isFigmaUrl` (lives in `core/engine/loader.ts`). Inlined to\n * avoid a contracts/ → engine/ dependency cycle: contracts/ is meant to be\n * importable by every other layer, including engine/.\n */\nfunction isFigmaUrl(input: string): boolean {\n return input.includes(\"figma.com/\");\n}\n\nexport const DesignKeySchema = z.string();\nexport type DesignKey = z.infer<typeof DesignKeySchema>;\n\n/**\n * Compute the canonical `designKey` that uniquely identifies a design across\n * canicode runs.\n *\n * - **Figma URL** → `<fileKey>#<nodeId>` with `-` → `:` normalization on the\n * nodeId (matching the Figma MCP convention). Example:\n * `https://figma.com/design/abc123/My-File?node-id=42-100&t=ref` →\n * `abc123#42:100`. Trailing query parameters other than `node-id`\n * (`?t=...`, `?mode=...`) are dropped — they would otherwise break\n * string-matching on re-runs.\n * - **Figma URL without `node-id`** → just `<fileKey>` (file-level key).\n * - **Anything else** (fixture directory, JSON path, raw filename) →\n * absolute path via `node:path.resolve(input)`. Keeps fixture-based\n * smoke tests stable across cwd.\n *\n * Both `gotcha-survey` and `analyze` MCP/CLI tools surface the result on\n * their response's top-level `designKey` field. The `canicode-gotchas` and\n * `canicode-roundtrip` SKILLs read that field directly — neither one\n * re-implements URL parsing in prose anymore (per ADR-016).\n */\nexport function computeDesignKey(input: string): string {\n if (isFigmaUrl(input)) {\n const { fileKey, nodeId } = parseFigmaUrl(input);\n if (!nodeId) return fileKey;\n return `${fileKey}#${nodeId.replace(/-/g, \":\")}`;\n }\n return resolve(input);\n}\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 { readFile, 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 AcknowledgmentListSchema,\n type Acknowledgment,\n} from \"../../core/contracts/acknowledgment.js\";\nimport {\n getFigmaToken, getReportsDir, ensureReportsDir,\n} from \"../../core/engine/config-store.js\";\nimport { calculateScores, formatScoreSummary, buildResultJson } from \"../../core/engine/scoring.js\";\nimport { computeDesignKey } from \"../../core/contracts/design-key.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 acknowledgments: z.string().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 .option(\"--acknowledgments <path>\", \"(#371) Path to a JSON file containing [{ nodeId, ruleId }] pairs harvested from canicode-authored Figma annotations. Matching issues are flagged acknowledged and contribute half weight to density.\")\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 let acknowledgments: Acknowledgment[] | undefined;\n if (options.acknowledgments) {\n const ackPath = resolve(options.acknowledgments);\n const raw = await readFile(ackPath, \"utf-8\");\n const parsed = AcknowledgmentListSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n throw new Error(\n `Invalid --acknowledgments file at ${ackPath}: ${parsed.error.issues.map(i => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`\n );\n }\n acknowledgments = parsed.data;\n log(`Acknowledgments loaded: ${acknowledgments.length} entries from ${ackPath}`);\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 ...(acknowledgments && { acknowledgments }),\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, designKey: computeDesignKey(input) }), 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 { z } from \"zod\";\nimport type { RuleId } from \"../contracts/rule.js\";\n\n/**\n * Gotcha question template for a single rule.\n * Used to generate user-facing surveys from analysis results (#236).\n *\n * - question: uses {nodeName} placeholder for the affected node\n * - hint: guides the user on what kind of answer is expected\n * - example: concrete example answer\n */\nexport const GotchaQuestionSchema = z.object({\n ruleId: z.string(),\n question: z.string(),\n hint: z.string(),\n example: z.string(),\n});\n\nexport type GotchaQuestion = z.infer<typeof GotchaQuestionSchema>;\n\n/**\n * Gotcha question mapping for all 16 rules.\n * Keyed by ruleId for O(1) lookup during survey generation.\n */\nexport const GOTCHA_QUESTIONS: Record<RuleId, GotchaQuestion> = {\n // ── Pixel Critical (blocking) ──\n\n \"no-auto-layout\": {\n ruleId: \"no-auto-layout\",\n question: 'Frame \"{nodeName}\" has no Auto Layout. How should this area be laid out?',\n hint: \"Describe the flex direction, gap, and alignment\",\n example: \"Vertical flex, gap 16px, items centered\",\n },\n \"absolute-position-in-auto-layout\": {\n ruleId: \"absolute-position-in-auto-layout\",\n question: '\"{nodeName}\" uses absolute positioning inside an Auto Layout parent. Is this an intentional overlay, or should it flow with the layout?',\n hint: \"Specify if this is a badge/overlay, or should be part of the normal flow\",\n example: \"This is a notification badge — position absolute, top-right corner\",\n },\n \"non-layout-container\": {\n ruleId: \"non-layout-container\",\n question: '\"{nodeName}\" is a Group/Section used as a layout container. What layout structure should it have?',\n hint: \"Describe the intended layout: flex direction, wrap, gap\",\n example: \"Horizontal flex, gap 12px, wrap on mobile\",\n },\n\n // ── Responsive Critical (risk) ──\n\n \"fixed-size-in-auto-layout\": {\n ruleId: \"fixed-size-in-auto-layout\",\n question: '\"{nodeName}\" has a fixed size inside Auto Layout. Should it be responsive?',\n hint: \"Specify which axis should be flexible (width, height, or both)\",\n example: \"Width should FILL the parent, height can stay fixed\",\n },\n \"missing-size-constraint\": {\n ruleId: \"missing-size-constraint\",\n question: '\"{nodeName}\" uses FILL sizing without min/max constraints. What are the size boundaries?',\n hint: \"Provide min-width, max-width, or both\",\n example: \"min-width 320px, max-width 1200px\",\n },\n\n // ── Code Quality (risk) ──\n\n \"missing-component\": {\n ruleId: \"missing-component\",\n question: '\"{nodeName}\" appears to be a repeated structure. Should it be a reusable component?',\n hint: \"Describe if this should be extracted as a component and what props it needs\",\n example: \"Yes, extract as ProductCard component with title, image, and price props\",\n },\n \"detached-instance\": {\n ruleId: \"detached-instance\",\n question: '\"{nodeName}\" looks like a detached component instance. Should it use the original component or is it a new variant?',\n hint: \"Specify whether to restore the component link or create a new variant\",\n example: \"This is a new variant — create a 'compact' variant of the original component\",\n },\n \"variant-structure-mismatch\": {\n ruleId: \"variant-structure-mismatch\",\n question: '\"{nodeName}\" has variants with different child structures. Which structure is the canonical one?',\n hint: \"Describe which variant has the correct structure, or if they should all match\",\n example: \"Default variant is canonical — other variants should toggle child visibility instead of adding/removing elements\",\n },\n \"deep-nesting\": {\n ruleId: \"deep-nesting\",\n question: '\"{nodeName}\" is deeply nested. Can some intermediate layers be flattened or extracted?',\n hint: \"Identify which wrapper layers are unnecessary or should become sub-components\",\n example: \"The inner wrapper is just for spacing — flatten it and use padding instead\",\n },\n\n // ── Token Management ──\n\n \"raw-value\": {\n ruleId: \"raw-value\",\n question: '\"{nodeName}\" uses raw values without design tokens. What tokens should be used?',\n hint: \"Specify the token names or variable references for colors, fonts, spacing, etc.\",\n example: \"Use $color-primary for the fill, $font-body for the text style\",\n },\n \"irregular-spacing\": {\n ruleId: \"irregular-spacing\",\n question: '\"{nodeName}\" has spacing values that are off the design grid. What should the correct spacing be?',\n hint: \"Provide the intended spacing value aligned to the grid system\",\n example: \"Gap should be 16px (4pt grid), not 15px\",\n },\n\n // ── Interaction ──\n\n \"missing-interaction-state\": {\n ruleId: \"missing-interaction-state\",\n question: '\"{nodeName}\" appears interactive but is missing state variants. What interaction states are needed?',\n hint: \"List the needed states: Hover, Active, Disabled, Focus\",\n example: \"Needs Hover (darken 10%) and Disabled (opacity 50%, no pointer events)\",\n },\n \"missing-prototype\": {\n ruleId: \"missing-prototype\",\n question: '\"{nodeName}\" looks interactive but has no prototype interaction. What should happen on click/interaction?',\n hint: \"Describe the interaction behavior: navigation, overlay, state change, etc.\",\n example: \"On click, navigate to the product detail page\",\n },\n\n // ── Semantic ──\n\n \"non-standard-naming\": {\n ruleId: \"non-standard-naming\",\n question: '\"{nodeName}\" uses non-standard state names. What naming convention should be followed?',\n hint: \"Specify the expected state name format (e.g., Hover, Disabled, Active)\",\n example: 'Use \"Hover\" instead of \"hover_v1\", \"Disabled\" instead of \"off\"',\n },\n \"non-semantic-name\": {\n ruleId: \"non-semantic-name\",\n question: '\"{nodeName}\" has a non-semantic name. What is the purpose of this element?',\n hint: \"Provide a descriptive name that reflects the element's role in the UI\",\n example: 'Rename \"Frame 12\" to \"HeroSection\" or \"ProductGrid\"',\n },\n \"inconsistent-naming-convention\": {\n ruleId: \"inconsistent-naming-convention\",\n question: '\"{nodeName}\" uses a different naming convention than its siblings. Which convention should be used?',\n hint: \"Choose one: camelCase, kebab-case, PascalCase, or Title Case\",\n example: \"Use PascalCase for all component layers (e.g., CardTitle, CardBody)\",\n },\n};\n\n/**\n * Get the gotcha question for a specific rule.\n */\nexport function getGotchaQuestion(ruleId: RuleId): GotchaQuestion {\n return GOTCHA_QUESTIONS[ruleId];\n}\n\n/**\n * Format a gotcha question by replacing the {nodeName} placeholder.\n */\nexport function formatGotchaQuestion(ruleId: RuleId, nodeName: string): string {\n return GOTCHA_QUESTIONS[ruleId].question.replace(\"{nodeName}\", nodeName);\n}\n","import type {\n GotchaSurveyQuestion,\n InstanceContext,\n} from \"../contracts/gotcha-survey.js\";\nimport type { RuleId } from \"../contracts/rule.js\";\n\n/**\n * Rules whose answer is uniformly applicable to every member of a batch\n * (e.g. \"What min/max width should these layers share?\"). When N consecutive\n * questions in the same source-component group share one of these `ruleId`s,\n * the SKILL prompts the user **once** with all node names listed instead of\n * asking the same question N times.\n *\n * Maintained as an exported constant so the SKILL.md prose doesn't have to\n * keep a parallel whitelist in sync — vitest covers each rule's batch\n * behavior here, not in the LLM's prose interpretation. Add a rule here only\n * after confirming its `gotcha-question` text is actually phrased to accept a\n * single shared answer (the FILL-sizing question is, the\n * `non-semantic-name` question is not).\n */\nexport const BATCHABLE_RULE_IDS = [\n \"missing-size-constraint\",\n \"irregular-spacing\",\n \"no-auto-layout\",\n \"fixed-size-in-auto-layout\",\n] as const satisfies readonly RuleId[];\n\nconst BATCHABLE_SET: ReadonlySet<string> = new Set(BATCHABLE_RULE_IDS);\n\nconst NO_SOURCE_SENTINEL = \"_no-source\";\n\nexport interface SurveyQuestionBatch {\n ruleId: string;\n /**\n * `true` when every member's answer is uniformly applicable (rule is in\n * `BATCHABLE_RULE_IDS`). The SKILL still emits a single-question prompt\n * when `questions.length === 1`, but the flag stays useful: a batch of one\n * for a batchable rule keeps the prompt template aligned with subsequent\n * batches in the same group.\n */\n batchable: boolean;\n questions: GotchaSurveyQuestion[];\n /**\n * Sum of `max(question.replicas, 1)` across members. Counts the actual\n * Figma scene fan-out so the SKILL can render `N instances` accurately\n * even when one batch member already collapses multiple replicas via the\n * #356 source-component dedupe.\n */\n totalScenes: number;\n}\n\nexport interface SurveyQuestionGroup {\n /**\n * The shared `instanceContext` for this group, or `null` for the trailing\n * group of non-instance questions. The SKILL emits the \"Instance note\"\n * header **once** per non-null group instead of once per question (#370).\n */\n instanceContext: InstanceContext | null;\n batches: SurveyQuestionBatch[];\n}\n\nexport interface GroupedSurvey {\n groups: SurveyQuestionGroup[];\n}\n\n/**\n * Pre-process a survey's `questions` array into the shape the\n * `canicode-roundtrip` and `canicode-gotchas` SKILLs need to prompt the user\n * with two UX optimizations baked in:\n *\n * - **#370** — source-component grouping. Consecutive questions sharing the\n * same `instanceContext.sourceComponentId` go in one group so the SKILL\n * prints the verbose \"Instance note\" paragraph once per group instead of\n * once per question.\n * - **#369** — batch-prompt for repeated identical answers. Within each\n * group, consecutive questions sharing the same `ruleId` *and* a\n * batchable answer-shape are collapsed into a single batch so the user\n * answers `min-width: 320px, max-width: 1200px` once instead of seven\n * times.\n *\n * Sort key is `(sourceComponentId ?? \"_no-source\", ruleId, nodeName)`. The\n * sentinel keeps non-instance questions contiguous at the end so they form\n * one trailing `instanceContext: null` group.\n *\n * `gotcha-survey` MCP/CLI returns the result on the `groupedQuestions`\n * field; the SKILL.md files iterate over `groups[].batches[]` directly with\n * no sort/partition logic in prose. See ADR-016.\n */\nexport function groupAndBatchSurveyQuestions(\n questions: readonly GotchaSurveyQuestion[],\n): GroupedSurvey {\n if (questions.length === 0) {\n return { groups: [] };\n }\n\n const sorted = [...questions].sort(compareQuestions);\n\n const groups: SurveyQuestionGroup[] = [];\n let currentGroup: SurveyQuestionGroup | null = null;\n let lastGroupKey: string | null = null;\n\n for (const question of sorted) {\n const groupKey = sourceComponentKey(question);\n if (currentGroup === null || groupKey !== lastGroupKey) {\n currentGroup = {\n instanceContext: question.instanceContext ?? null,\n batches: [],\n };\n groups.push(currentGroup);\n lastGroupKey = groupKey;\n }\n pushIntoBatch(currentGroup, question);\n }\n\n return { groups };\n}\n\nfunction compareQuestions(\n a: GotchaSurveyQuestion,\n b: GotchaSurveyQuestion,\n): number {\n const aKey = sourceComponentKey(a);\n const bKey = sourceComponentKey(b);\n if (aKey !== bKey) {\n if (aKey === NO_SOURCE_SENTINEL) return 1;\n if (bKey === NO_SOURCE_SENTINEL) return -1;\n return aKey.localeCompare(bKey);\n }\n if (a.ruleId !== b.ruleId) return a.ruleId.localeCompare(b.ruleId);\n if (a.nodeName !== b.nodeName) return a.nodeName.localeCompare(b.nodeName);\n return a.nodeId.localeCompare(b.nodeId);\n}\n\nfunction sourceComponentKey(question: GotchaSurveyQuestion): string {\n return question.instanceContext?.sourceComponentId ?? NO_SOURCE_SENTINEL;\n}\n\nfunction pushIntoBatch(\n group: SurveyQuestionGroup,\n question: GotchaSurveyQuestion,\n): void {\n const sceneWeight = Math.max(question.replicas ?? 1, 1);\n const isBatchable = BATCHABLE_SET.has(question.ruleId);\n const last = group.batches.at(-1);\n\n if (\n last !== undefined &&\n last.ruleId === question.ruleId &&\n isBatchable &&\n last.batchable\n ) {\n last.questions.push(question);\n last.totalScenes += sceneWeight;\n return;\n }\n\n group.batches.push({\n ruleId: question.ruleId,\n batchable: isBatchable,\n questions: [question],\n totalScenes: sceneWeight,\n });\n}\n","import type { AnalysisResult, AnalysisIssue } from \"../engine/rule-engine.js\";\nimport type { ScoreReport } from \"../engine/scoring.js\";\nimport { isReadyForCodeGen } from \"../engine/scoring.js\";\nimport type {\n GotchaSurvey,\n GotchaSurveyQuestion,\n InstanceContext,\n} from \"../contracts/gotcha-survey.js\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport type { RuleId } from \"../contracts/rule.js\";\nimport { GOTCHA_QUESTIONS } from \"../rules/gotcha-questions.js\";\nimport {\n isInstanceChildNodeId,\n parseInstanceChildNodeId,\n} from \"../adapters/instance-id-parser.js\";\nimport { computeApplyContext } from \"./apply-context.js\";\nimport { groupAndBatchSurveyQuestions } from \"./group-and-batch-questions.js\";\n\nconst NODE_PATH_SEPARATOR = \" > \";\n\n/**\n * Generate a gotcha survey from analysis results.\n *\n * Filters to blocking and risk severity issues, deduplicates repeated rules\n * on sibling nodes (same parent + same ruleId), orders blocking first then\n * risk by original traversal order, and maps each issue to a survey question\n * using the GOTCHA_QUESTIONS lookup.\n */\nexport function generateGotchaSurvey(\n result: AnalysisResult,\n scores: ScoreReport,\n options: { designKey?: string } = {},\n): GotchaSurvey {\n const grade = scores.overall.grade;\n\n // Step 1: Filter to blocking and risk severity only\n const relevantIssues = result.issues.filter(\n (issue) => issue.config.severity === \"blocking\" || issue.config.severity === \"risk\",\n );\n\n // Step 2: Deduplicate — same ruleId on siblings (same parent path) → keep first\n const deduped = deduplicateSiblingIssues(relevantIssues);\n\n // Step 3: Sort — blocking first, then risk; within same severity, preserve traversal order\n const sorted = stableSortBySeverity(deduped);\n\n // Step 4: Map to survey questions\n const mapped = sorted\n .map((issue) => mapToQuestion(issue, result.file))\n .filter((q): q is GotchaSurveyQuestion => q !== null);\n\n // Step 5 (#356): collapse N instance-child questions that share the same\n // `(sourceComponentId, sourceNodeId, ruleId)` tuple into ONE question that\n // names the source component. Apply step iterates the merged\n // `replicaNodeIds` so every replica still gets the answer; this saves the\n // user from answering the same question N times when the answer is single-\n // valued (e.g. 7 FILL children of `Platform=Desktop` all need the same\n // max-width). Cross-source-component dedupe is intentionally not done —\n // different source components stay separate.\n const questions = deduplicateBySourceComponent(mapped);\n\n // Step 6 (#369, #370, #381): pre-compute the grouped+batched view so the\n // SKILLs (`canicode-gotchas`, `canicode-roundtrip`) can iterate over it\n // directly without re-implementing sort / partition / batchable-rule\n // logic in prose. ADR-016.\n const groupedQuestions = groupAndBatchSurveyQuestions(questions);\n\n return {\n designGrade: grade,\n isReadyForCodeGen: isReadyForCodeGen(grade),\n questions,\n groupedQuestions,\n designKey: options.designKey ?? \"\",\n };\n}\n\n/**\n * Deduplicate issues where the same ruleId fires on multiple children of the\n * same parent. Keeps the first occurrence (preserving traversal order).\n *\n * #373: skip instance-child issues here. They are routed to the\n * source-component dedupe in Step 5, which preserves dropped scene ids on\n * `replicaNodeIds` so the apply step can fan the answer out to every replica.\n * The pre-#373 behaviour collapsed sibling instance children (e.g. `Title` +\n * `Subtitle` on the same `Card` instance — different definition nodes, same\n * `Card` parent path, same ruleId) into a single question and lost the\n * dropped scenes entirely (no `replicaNodeIds`, no annotation, no write).\n * Source-component dedupe naturally keeps different `sourceNodeId`s separate,\n * so the previously-dropped siblings now surface as their own questions.\n */\nfunction deduplicateSiblingIssues(issues: AnalysisIssue[]): AnalysisIssue[] {\n const seen = new Set<string>();\n const result: AnalysisIssue[] = [];\n\n for (const issue of issues) {\n if (isInstanceChildNodeId(issue.violation.nodeId)) {\n result.push(issue);\n continue;\n }\n const parentPath = getParentPath(issue.violation.nodePath);\n const key = `${parentPath}||${issue.violation.ruleId}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n result.push(issue);\n }\n }\n\n return result;\n}\n\n/**\n * Extract the parent path from a full node path.\n * \"Root > Section > Child\" → \"Root > Section\"\n * \"Root\" → \"\" (root node has no parent)\n */\nfunction getParentPath(nodePath: string): string {\n const lastSep = nodePath.lastIndexOf(NODE_PATH_SEPARATOR);\n if (lastSep === -1) return \"\";\n return nodePath.slice(0, lastSep);\n}\n\n/**\n * Extract the node name from a full node path (last segment).\n * \"Root > Section > Child\" → \"Child\"\n */\nfunction getNodeName(nodePath: string): string {\n const lastSep = nodePath.lastIndexOf(NODE_PATH_SEPARATOR);\n if (lastSep === -1) return nodePath;\n return nodePath.slice(lastSep + NODE_PATH_SEPARATOR.length);\n}\n\n/**\n * Stable sort: blocking before risk, preserving original array order within\n * each severity group.\n */\nfunction stableSortBySeverity(issues: AnalysisIssue[]): AnalysisIssue[] {\n const blocking: AnalysisIssue[] = [];\n const risk: AnalysisIssue[] = [];\n\n for (const issue of issues) {\n if (issue.config.severity === \"blocking\") {\n blocking.push(issue);\n } else {\n risk.push(issue);\n }\n }\n\n return [...blocking, ...risk];\n}\n\n/**\n * Map an AnalysisIssue to a GotchaSurveyQuestion using the GOTCHA_QUESTIONS table.\n * Returns null if no mapping exists for the ruleId.\n */\nfunction mapToQuestion(\n issue: AnalysisIssue,\n file: AnalysisFile,\n): GotchaSurveyQuestion | null {\n const ruleId = issue.violation.ruleId as RuleId;\n const template = GOTCHA_QUESTIONS[ruleId];\n if (!template) return null;\n\n const nodeName = getNodeName(issue.violation.nodePath);\n const instanceContext = buildInstanceContext(issue.violation.nodeId, file);\n const applyContext = computeApplyContext(\n issue.violation,\n instanceContext ?? undefined,\n );\n const suggestedName = issue.violation.suggestedName;\n\n return {\n nodeId: issue.violation.nodeId,\n nodeName,\n ruleId,\n severity: issue.config.severity,\n question: template.question.replace(\"{nodeName}\", nodeName),\n hint: template.hint,\n example: template.example,\n ...(instanceContext ? { instanceContext } : {}),\n applyStrategy: applyContext.applyStrategy,\n ...(applyContext.targetProperty !== undefined\n ? { targetProperty: applyContext.targetProperty }\n : {}),\n ...(applyContext.annotationProperties !== undefined\n ? { annotationProperties: applyContext.annotationProperties }\n : {}),\n ...(suggestedName !== undefined ? { suggestedName } : {}),\n isInstanceChild: applyContext.isInstanceChild,\n ...(applyContext.sourceChildId !== undefined\n ? { sourceChildId: applyContext.sourceChildId }\n : {}),\n };\n}\n\n/**\n * Collapse questions that share the same `(sourceComponentId, sourceNodeId,\n * ruleId)` tuple. When N instance-child questions all point at the same\n * definition node inside the same source component for the same rule, the\n * answer is single-valued by definition (FILL children of `Platform=Desktop`\n * all need the same max-width) — so emit ONE question instead of N. The kept\n * question is the FIRST in the input order; subsequent matches are dropped\n * but their `nodeId`s are preserved on `replicaNodeIds` so the apply step can\n * iterate every instance scene node and land the answer on all of them.\n *\n * Out of scope: cross-source-component dedupe (e.g. \"Title\" missing-size-\n * constraint in 5 different components). Different sourceComponentIds always\n * stay separate.\n *\n * Questions without an `instanceContext` (or without both `sourceComponentId`\n * and `sourceNodeId`) are NOT touched — they pass through with no replicas\n * fields. This keeps non-instance-child questions and any partial-context\n * survivors behaving exactly as they did pre-#356.\n */\nfunction deduplicateBySourceComponent(\n questions: GotchaSurveyQuestion[],\n): GotchaSurveyQuestion[] {\n const groups = new Map<string, GotchaSurveyQuestion[]>();\n const order: string[] = [];\n let uniqueCounter = 0;\n\n for (const q of questions) {\n const ic = q.instanceContext;\n let key: string;\n if (ic && ic.sourceComponentId && ic.sourceNodeId) {\n key = `${ic.sourceComponentId}::${ic.sourceNodeId}::${q.ruleId}`;\n } else {\n // Non-deduplicable — assign a unique key so the question passes through\n // unchanged. Using a counter keeps insertion order stable.\n key = `__unique__${uniqueCounter++}`;\n }\n const bucket = groups.get(key);\n if (bucket) {\n bucket.push(q);\n } else {\n groups.set(key, [q]);\n order.push(key);\n }\n }\n\n return order.map((key) => {\n const group = groups.get(key)!;\n const first = group[0]!;\n if (group.length === 1) return first;\n\n const otherIds = group.slice(1).map((q) => q.nodeId);\n const sourceComponentName = first.instanceContext?.sourceComponentName;\n\n // Re-substitute `{nodeName}` with the source component name so the user-\n // facing question reads \"for Platform=Desktop\" instead of \"for Title\"\n // (the first instance's node name). Falls back silently when the source\n // component name was not resolved (rare — happens when the parent\n // instance's componentId is not in `file.components`).\n const template = GOTCHA_QUESTIONS[first.ruleId as RuleId];\n const renamed: GotchaSurveyQuestion = {\n ...first,\n replicas: group.length,\n replicaNodeIds: otherIds,\n };\n if (sourceComponentName) {\n renamed.nodeName = sourceComponentName;\n if (template) {\n renamed.question = template.question.replace(\n \"{nodeName}\",\n sourceComponentName,\n );\n }\n }\n return renamed;\n });\n}\n\n/**\n * Build instance context for a node id when it lives inside an instance.\n * Resolves source component name via the parent instance's componentId when\n * the parent is reachable in the analyzed subtree; falls back to the bare\n * parent/source ids otherwise so the apply pipeline can still resolve the\n * source component at runtime via `figma.getNodeById`.\n */\nfunction buildInstanceContext(\n nodeId: string,\n file: AnalysisFile,\n): InstanceContext | null {\n const parts = parseInstanceChildNodeId(nodeId);\n if (!parts) return null;\n\n const parentInstance = findNodeById(file.document, parts.parentInstanceId);\n const componentId = parentInstance?.componentId;\n const componentName = componentId ? file.components[componentId]?.name : undefined;\n\n return {\n parentInstanceNodeId: parts.parentInstanceId,\n sourceNodeId: parts.sourceNodeId,\n ...(componentId ? { sourceComponentId: componentId } : {}),\n ...(componentName ? { sourceComponentName: componentName } : {}),\n };\n}\n\n/**\n * Walk the document tree for a node id (exact match — no `-`/`:` normalization;\n * instance node ids natively use `:` and the input here is already in that form).\n */\nfunction findNodeById(node: AnalysisNode, id: string): AnalysisNode | null {\n if (node.id === id) return node;\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, id);\n if (found) return found;\n }\n }\n return null;\n}\n","import type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport type { RuleConfig, RuleId } from \"../../core/contracts/rule.js\";\nimport type { GotchaSurvey } from \"../../core/contracts/gotcha-survey.js\";\nimport { analyzeFile } from \"../../core/engine/rule-engine.js\";\nimport { loadFile, isJsonFile, isFixtureDir } from \"../../core/engine/loader.js\";\nimport { getFigmaToken } from \"../../core/engine/config-store.js\";\nimport { calculateScores } from \"../../core/engine/scoring.js\";\nimport { generateGotchaSurvey } from \"../../core/gotcha/survey-generator.js\";\nimport { computeDesignKey } from \"../../core/contracts/design-key.js\";\nimport { getConfigsWithPreset, RULE_CONFIGS } from \"../../core/rules/rule-config.js\";\nimport { loadConfigFile, mergeConfigs } from \"../../core/rules/config-loader.js\";\nimport { trackEvent, trackError, EVENTS } from \"../../core/monitoring/index.js\";\n\nconst GotchaSurveyOptionsSchema = z.object({\n preset: z.enum([\"relaxed\", \"dev-friendly\", \"ai-ready\", \"strict\"]).optional(),\n token: z.string().optional(),\n config: z.string().optional(),\n targetNodeId: z.string().optional(),\n json: z.boolean().optional(),\n});\n\nexport type GotchaSurveyOptions = z.infer<typeof GotchaSurveyOptionsSchema>;\n\n/**\n * Run the gotcha-survey pipeline against a Figma URL or fixture and return\n * the survey JSON. Mirrors the MCP `gotcha-survey` tool call sequence so both\n * channels produce the same `GotchaSurvey` object.\n */\nexport async function runGotchaSurvey(\n input: string,\n options: GotchaSurveyOptions,\n): Promise<GotchaSurvey> {\n const { file, nodeId } = await loadFile(input, options.token);\n const effectiveNodeId = options.targetNodeId ?? nodeId;\n\n let configs: Record<string, RuleConfig> = options.preset\n ? { ...getConfigsWithPreset(options.preset) }\n : { ...RULE_CONFIGS };\n\n if (options.config) {\n const configFile = await loadConfigFile(options.config);\n configs = mergeConfigs(configs, configFile);\n }\n\n const result = analyzeFile(file, {\n configs: configs as Record<RuleId, RuleConfig>,\n ...(effectiveNodeId ? { targetNodeId: effectiveNodeId } : {}),\n });\n\n const scores = calculateScores(result, configs as Record<RuleId, RuleConfig>);\n return generateGotchaSurvey(result, scores, { designKey: computeDesignKey(input) });\n}\n\nfunction formatHumanSummary(survey: GotchaSurvey): string {\n const lines = [\n `Design grade: ${survey.designGrade}`,\n `Ready for code generation: ${survey.isReadyForCodeGen ? \"yes\" : \"no\"}`,\n `Questions: ${survey.questions.length}`,\n ];\n if (survey.questions.length > 0) {\n lines.push(\"\");\n lines.push(\"Use --json to get the full GotchaSurvey JSON for programmatic use.\");\n }\n return lines.join(\"\\n\");\n}\n\nexport function registerGotchaSurvey(cli: CAC): void {\n cli\n .command(\"gotcha-survey <input>\", \"Generate a gotcha survey from a Figma design analysis\")\n .option(\"--preset <preset>\", \"Analysis preset (relaxed | dev-friendly | ai-ready | strict)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--config <path>\", \"Path to config JSON file (override rule scores/settings)\")\n .option(\"--target-node-id <id>\", \"Scope analysis to a specific node ID\")\n .option(\"--json\", \"Output GotchaSurvey JSON to stdout (same format as MCP)\")\n .example(\" canicode gotcha-survey https://www.figma.com/design/ABC123/MyDesign --json\")\n .example(\" canicode gotcha-survey ./fixtures/my-design --json\")\n .action(async (input: string, rawOptions: Record<string, unknown>) => {\n const parseResult = GotchaSurveyOptionsSchema.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, {\n source: isJsonFile(input) || isFixtureDir(input) ? \"fixture\" : \"figma\",\n tool: \"gotcha-survey\",\n });\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 try {\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 const survey = await runGotchaSurvey(input, options);\n\n if (options.json) {\n console.log(JSON.stringify(survey, null, 2));\n } else {\n log(formatHumanSummary(survey));\n }\n\n trackEvent(EVENTS.ANALYSIS_COMPLETED, {\n grade: survey.designGrade,\n questionCount: survey.questions.length,\n isReadyForCodeGen: survey.isReadyForCodeGen,\n duration: Date.now() - analysisStart,\n tool: \"gotcha-survey\",\n });\n } catch (error) {\n trackError(\n error instanceof Error ? error : new Error(String(error)),\n { command: \"gotcha-survey\", input },\n );\n trackEvent(EVENTS.ANALYSIS_FAILED, {\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - analysisStart,\n tool: \"gotcha-survey\",\n });\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error),\n );\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Deterministic helpers for the `canicode-gotchas` SKILL Step 4b — file-state\n * detection and `## #NNN — ...` section walking under `# Collected Gotchas`.\n *\n * Per ADR-016, deterministic markdown parsing + arithmetic must\n * live in TypeScript with vitest coverage rather than being re-derived from\n * SKILL.md prose on every run. The previous prose described two interacting\n * state machines (4-way file state + monotonic section numbering with\n * substring-matched Design key); a single misread (forgetting zero-padding,\n * matching across the workflow region, etc.) corrupts the user's gotchas\n * file. This module owns both behaviors so the SKILL can either invoke the\n * `canicode upsert-gotcha-section` CLI subcommand or call this helper\n * directly with no algorithm prose left in the SKILL. (#385)\n */\nimport { z } from \"zod\";\n\n/**\n * The four discriminable shapes the gotchas SKILL.md file can be in when\n * the workflow tries to upsert a per-design section. The discriminants are\n * the YAML frontmatter fence (`---` on the first line) and the\n * `# Collected Gotchas` H1 heading — both shipped together by the\n * post-#340 `canicode init` install.\n *\n * - `missing`: file does not exist on disk (`content === null`).\n * - `valid`: frontmatter present AND `# Collected Gotchas` heading present.\n * - `missing-heading`: frontmatter present but no Collected Gotchas heading\n * (older workflow install, or user-edited workflow that dropped the\n * trailing heading). Recoverable — the upsert will append the heading.\n * - `clobbered`: no frontmatter at all (a pre-#340 single-design overwrite\n * rewrote the description in the YAML to the per-design variant, leaving\n * no canonical canicode-gotchas frontmatter behind). Not auto-recoverable\n * — the SKILL tells the user to run `canicode init --force`.\n */\nexport const GotchasFileStateSchema = z.enum([\n \"missing\",\n \"valid\",\n \"missing-heading\",\n \"clobbered\",\n]);\nexport type GotchasFileState = z.infer<typeof GotchasFileStateSchema>;\n\n/** Heading that delimits the per-design region from the workflow region. */\nexport const COLLECTED_GOTCHAS_HEADING = \"# Collected Gotchas\";\n\n/** Regex for the per-design section header — captures the zero-padded NNN. */\nconst SECTION_HEADER_RE = /^## #(\\d{3,}) — /gm;\n\n/**\n * Pure inspection of the file's structural shape. Pass `null` when the file\n * does not exist on disk; pass the full UTF-8 contents otherwise.\n */\nexport function detectGotchasFileState(\n content: string | null,\n): GotchasFileState {\n if (content === null) return \"missing\";\n if (!hasFrontmatter(content)) return \"clobbered\";\n if (!hasCollectedGotchasHeading(content)) return \"missing-heading\";\n return \"valid\";\n}\n\nfunction hasFrontmatter(content: string): boolean {\n // A canicode-init frontmatter starts with `---` on the very first line and\n // is closed by another `---` on its own line. We look for the closing\n // fence anywhere after position 4 — the contents can be multi-line.\n if (!content.startsWith(\"---\\n\") && !content.startsWith(\"---\\r\\n\")) {\n return false;\n }\n const rest = content.slice(4);\n return /^---\\s*$/m.test(rest);\n}\n\nfunction hasCollectedGotchasHeading(content: string): boolean {\n return /^# Collected Gotchas\\s*$/m.test(content);\n}\n\n/**\n * Plan returned by `findOrAppendSection` — describes whether the upsert is\n * a replace (existing section matched by Design key) or an append (new\n * section for an unseen design).\n */\nexport interface AppendPlan {\n action: \"append\";\n /** Zero-padded next NNN, e.g. `\"001\"` on first run, `\"004\"` after #003. */\n sectionNumber: string;\n}\nexport interface ReplacePlan {\n action: \"replace\";\n /** Preserved zero-padded NNN of the existing section. */\n sectionNumber: string;\n /**\n * `[start, end)` byte range in the input `content` covering the matched\n * `## #NNN — ...` section, terminated by the next `## #NNN — ` header or\n * end-of-file. The renderer slices these out and substitutes the new\n * section markdown.\n */\n replaceRange: [number, number];\n}\nexport type SectionPlan = AppendPlan | ReplacePlan;\n\n/**\n * Walk the per-design sections under `# Collected Gotchas`, look for one\n * whose `- **Design key**:` bullet substring-matches `designKey`, and\n * return either:\n *\n * - `{ action: \"replace\", sectionNumber, replaceRange }` when a match is\n * found (preserves the existing NNN so external references stay stable),\n * or\n * - `{ action: \"append\", sectionNumber }` otherwise, with `sectionNumber`\n * being `(highest existing NNN) + 1`, zero-padded to three digits.\n *\n * Numbering is **monotonic** across deletions — a manually deleted middle\n * section leaves a numeric gap rather than getting reused, mirroring the\n * `.claude/docs/ADR.md` convention.\n *\n * Pass the full file `content`; only the region after the\n * `# Collected Gotchas` heading is scanned, so workflow-region prose that\n * happens to mention the same `Design key` substring will not produce a\n * false replace. When the heading is absent, scanning starts at end-of-file\n * (every call returns an append plan) — combine with\n * `detectGotchasFileState` upstream so the renderer can inject the heading\n * before invoking the helper.\n */\nexport function findOrAppendSection(\n content: string,\n designKey: string,\n): SectionPlan {\n const regionStart = locateCollectedGotchasRegion(content);\n const region = content.slice(regionStart);\n\n const sections = parseSections(region);\n\n let maxNumber = 0;\n for (const section of sections) {\n if (section.numericValue > maxNumber) maxNumber = section.numericValue;\n if (sectionMatchesDesignKey(section.body, designKey)) {\n return {\n action: \"replace\",\n sectionNumber: section.padded,\n replaceRange: [\n regionStart + section.start,\n regionStart + section.end,\n ],\n };\n }\n }\n\n const next = maxNumber + 1;\n return {\n action: \"append\",\n sectionNumber: padNumber(next),\n };\n}\n\ninterface ParsedSection {\n /** The original captured `NNN` string (preserved verbatim on replace). */\n padded: string;\n /** `parseInt(padded, 10)` for max-arithmetic. */\n numericValue: number;\n /** `[start, end)` offsets within the *region* (post-`# Collected Gotchas`). */\n start: number;\n end: number;\n /** Section body text (header + bullets + inner subsections). */\n body: string;\n}\n\nfunction parseSections(region: string): ParsedSection[] {\n const sections: ParsedSection[] = [];\n const matches = [...region.matchAll(SECTION_HEADER_RE)];\n\n for (let i = 0; i < matches.length; i += 1) {\n const match = matches[i]!;\n const start = match.index!;\n const next = matches[i + 1];\n const end = next?.index ?? region.length;\n const captured = match[1]!;\n sections.push({\n padded: captured,\n numericValue: parseInt(captured, 10),\n start,\n end,\n body: region.slice(start, end),\n });\n }\n\n return sections;\n}\n\n/**\n * Locate the offset where the per-design region begins. We anchor on the\n * line **after** `# Collected Gotchas\\n` so subsequent regex matches do not\n * scan workflow-region content. When the heading is absent, the region is\n * empty (`regionStart === content.length`) and every call returns append.\n */\nfunction locateCollectedGotchasRegion(content: string): number {\n const re = /^# Collected Gotchas\\s*$/m;\n const match = re.exec(content);\n if (!match) return content.length;\n return match.index + match[0].length;\n}\n\nfunction sectionMatchesDesignKey(body: string, designKey: string): boolean {\n // The bullet shape from the Output Template: `- **Design key**: <value>`.\n // Substring match against the bullet's value preserves the SKILL prose's\n // contract (URL fragments / prefixes still match) without coupling to a\n // specific delimiter.\n const re = /^-\\s+\\*\\*Design key\\*\\*:\\s+(.+?)\\s*$/m;\n const m = body.match(re);\n if (!m) return false;\n return m[1]!.includes(designKey);\n}\n\nfunction padNumber(n: number): string {\n return n.toString().padStart(3, \"0\");\n}\n\n/**\n * Renderer that combines `detectGotchasFileState` + `findOrAppendSection`\n * with the actual byte-level replace / append (and missing-heading\n * injection) so callers — the SKILL via the new CLI subcommand, or the\n * SKILL directly with the helper exposed on the gotcha-survey response —\n * never have to do the splice themselves.\n *\n * Returns `null` for unrecoverable states (`missing`, `clobbered`); the\n * caller surfaces the user-facing decision message (the SKILL keeps those\n * since they are interactive responses, not algorithm).\n *\n * For the recoverable states the function produces the new file contents\n * with the per-design section either replaced in place or appended at the\n * bottom. `missing-heading` injects the `# Collected Gotchas` heading\n * before appending — preserving everything above unchanged, exactly as\n * the SKILL prose described.\n */\nexport interface RenderUpsertedFileResult {\n state: GotchasFileState;\n /** New file contents — `null` when `state` is `missing` or `clobbered`. */\n newContent: string | null;\n /** Plan executed (omitted for non-recoverable states). */\n plan?: SectionPlan;\n}\n\nexport function renderUpsertedFile(args: {\n currentContent: string | null;\n designKey: string;\n /**\n * Already-rendered per-design section markdown. Must start with\n * `## #{NNN} — ...` and end with a trailing newline. The renderer\n * substitutes the placeholder NNN by string-replacing the literal\n * `{{SECTION_NUMBER}}` token if present, otherwise it trusts the caller\n * to have inserted the right number — see test coverage for both shapes.\n */\n sectionMarkdown: string;\n}): RenderUpsertedFileResult {\n const { currentContent, designKey, sectionMarkdown } = args;\n const state = detectGotchasFileState(currentContent);\n\n if (state === \"missing\" || state === \"clobbered\") {\n return { state, newContent: null };\n }\n\n // From here on, currentContent is non-null (state is \"valid\" or\n // \"missing-heading\").\n let working = currentContent as string;\n\n if (state === \"missing-heading\") {\n // Preserve everything above unchanged; append the heading at the bottom\n // (with a leading blank line if the file does not already end in two\n // newlines, to keep markdown spacing consistent).\n const sep = working.endsWith(\"\\n\\n\") ? \"\" : working.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n working = `${working}${sep}${COLLECTED_GOTCHAS_HEADING}\\n`;\n }\n\n const plan = findOrAppendSection(working, designKey);\n const sectionWithNumber = sectionMarkdown.includes(\"{{SECTION_NUMBER}}\")\n ? sectionMarkdown.replace(/\\{\\{SECTION_NUMBER\\}\\}/g, plan.sectionNumber)\n : sectionMarkdown;\n\n let newContent: string;\n if (plan.action === \"replace\") {\n const [start, end] = plan.replaceRange;\n const before = working.slice(0, start);\n const after = working.slice(end);\n newContent = `${before}${ensureTrailingNewline(sectionWithNumber)}${after}`;\n } else {\n // Append after a blank line for markdown spacing; use the heading offset\n // so we always anchor inside the per-design region.\n const trimmed = working.replace(/\\s+$/, \"\");\n newContent = `${trimmed}\\n\\n${ensureTrailingNewline(sectionWithNumber)}`;\n }\n\n return { state, newContent, plan };\n}\n\nfunction ensureTrailingNewline(s: string): string {\n return s.endsWith(\"\\n\") ? s : `${s}\\n`;\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport { renderUpsertedFile } from \"../../core/gotcha/upsert-gotcha-section.js\";\n\n/**\n * Atomic read → upsert → write of the per-design gotcha section into the\n * `canicode-gotchas` SKILL.md. Owns the deterministic markdown parsing\n * the SKILL used to inline as prose (file-state detection, `## #NNN — ...`\n * walking, monotonic numbering) — see ADR-016 and #385.\n *\n * Inputs:\n * - `--file <path>`: the SKILL.md path. Required.\n * - `--design-key <key>`: canonical design key from `gotcha-survey`'s\n * response. Required.\n * - `--section <markdown>`: the already-rendered per-design section body\n * the SKILL produced from its template. The header line is expected to\n * contain the literal `{{SECTION_NUMBER}}` placeholder, which this\n * command substitutes with either the preserved existing NNN (replace)\n * or the next monotonic NNN (append). If the placeholder is absent the\n * section markdown is written verbatim. Either pass via `--section` or\n * pipe through stdin (`--section -`).\n *\n * Outputs (stdout, JSON):\n * ```\n * {\n * \"state\": \"valid\" | \"missing\" | \"missing-heading\" | \"clobbered\",\n * \"action\": \"replace\" | \"append\" | null,\n * \"sectionNumber\": \"NNN\" | null,\n * \"wrote\": true | false,\n * \"userMessage\": string | null\n * }\n * ```\n *\n * For `state === \"missing\"` and `state === \"clobbered\"` the helper does\n * not write — the SKILL surfaces `userMessage` to the user (asking them to\n * run `canicode init` or `canicode init --force`) and stops.\n */\nconst UpsertOptionsSchema = z.object({\n file: z.string().min(1, \"--file is required\"),\n designKey: z.string().min(1, \"--design-key is required\"),\n section: z.string().min(1, \"--section is required (use '-' to read stdin)\"),\n});\n\ntype UpsertOptions = z.infer<typeof UpsertOptionsSchema>;\n\ninterface UpsertCliResult {\n state: string;\n action: \"replace\" | \"append\" | null;\n sectionNumber: string | null;\n wrote: boolean;\n userMessage: string | null;\n}\n\nconst USER_MESSAGES: Record<string, string> = {\n missing:\n \"Gotchas SKILL.md not found at the given path. Run `canicode init` first, then re-invoke this skill.\",\n clobbered:\n \"Your gotchas SKILL.md is missing the canicode YAML frontmatter (pre-#340 single-design clobber). Run `canicode init --force` to restore the workflow, then re-run this survey.\",\n};\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nexport async function runUpsertGotchaSection(\n options: UpsertOptions,\n): Promise<UpsertCliResult> {\n const sectionMarkdown =\n options.section === \"-\" ? await readStdin() : options.section;\n\n const currentContent = existsSync(options.file)\n ? readFileSync(options.file, \"utf-8\")\n : null;\n\n const { state, newContent, plan } = renderUpsertedFile({\n currentContent,\n designKey: options.designKey,\n sectionMarkdown,\n });\n\n if (newContent === null) {\n return {\n state,\n action: null,\n sectionNumber: null,\n wrote: false,\n userMessage: USER_MESSAGES[state] ?? null,\n };\n }\n\n writeFileSync(options.file, newContent, \"utf-8\");\n return {\n state,\n action: plan?.action ?? null,\n sectionNumber: plan?.sectionNumber ?? null,\n wrote: true,\n userMessage: null,\n };\n}\n\nexport function registerUpsertGotchaSection(cli: CAC): void {\n cli\n .command(\n \"upsert-gotcha-section\",\n \"Upsert a per-design section into the canicode-gotchas SKILL.md (used by the canicode-gotchas skill — Step 4b)\",\n )\n .option(\"--file <path>\", \"Path to the canicode-gotchas SKILL.md\")\n .option(\n \"--design-key <key>\",\n \"Canonical design key from gotcha-survey's response\",\n )\n .option(\n \"--section <markdown>\",\n \"Already-rendered per-design section markdown. Use '-' to read from stdin.\",\n )\n .action(async (rawOptions: Record<string, unknown>) => {\n const parseResult = UpsertOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues\n .map((i) => `--${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n\n try {\n const result = await runUpsertGotchaSection(parseResult.data);\n console.log(JSON.stringify(result, null, 2));\n if (!result.wrote && result.userMessage) {\n // Non-zero exit so a wrapping shell script / SKILL knows to\n // surface the userMessage and stop, rather than treating an\n // unwritten file as success.\n process.exitCode = 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 { 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 { 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 calibrate-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 {\n existsSync, mkdirSync, readdirSync, statSync, copyFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { z } from \"zod\";\n\nconst InstallSkillsOptionsSchema = z.object({\n target: z.enum([\"project\", \"global\"]),\n force: z.boolean(),\n cwd: z.string().optional(),\n sourceDir: z.string().optional(),\n});\n\nexport type InstallSkillsOptions = z.input<typeof InstallSkillsOptionsSchema>;\n\nexport interface InstallSummary {\n installed: string[];\n overwritten: string[];\n skipped: string[];\n targetDir: string;\n}\n\nconst SKILL_NAMES = [\"canicode\", \"canicode-gotchas\", \"canicode-roundtrip\"] as const;\n\n// Resolve the bundled `skills/` dir at runtime. tsup bundles this module\n// into the CLI entrypoint `<pkg>/dist/cli/index.js` (splitting: false), so\n// `import.meta.url` at runtime resolves to that entrypoint — depth 2 under\n// the package root. `../../skills/` therefore lands on `<pkg>/skills/`.\n// If tsup's output layout ever changes (new entrypoint depth, splitting\n// enabled, etc.), update this URL.\nfunction defaultSourceDir(): string {\n return fileURLToPath(new URL(\"../../skills/\", import.meta.url));\n}\n\nexport async function installSkills(rawOptions: InstallSkillsOptions): Promise<InstallSummary> {\n const options = InstallSkillsOptionsSchema.parse(rawOptions);\n const sourceDir = options.sourceDir ?? defaultSourceDir();\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Bundled skills directory not found: ${sourceDir}\\n` +\n `If you are developing canicode, run 'pnpm build' first.\\n` +\n `If you installed canicode from npm, please file a bug report — the tarball is missing skills/.`,\n );\n }\n\n const cwd = options.cwd ?? process.cwd();\n const targetDir = options.target === \"global\"\n ? join(homedir(), \".claude\", \"skills\")\n : join(cwd, \".claude\", \"skills\");\n\n mkdirSync(targetDir, { recursive: true });\n\n const summary: InstallSummary = {\n installed: [],\n overwritten: [],\n skipped: [],\n targetDir,\n };\n\n type Action = \"install\" | \"force-overwrite\" | \"needs-decision\";\n interface Op {\n src: string;\n dest: string;\n label: string;\n action: Action;\n }\n const ops: Op[] = [];\n\n for (const skillName of SKILL_NAMES) {\n const srcSkillDir = join(sourceDir, skillName);\n if (!existsSync(srcSkillDir)) {\n throw new Error(`Bundled skill directory missing: ${srcSkillDir}`);\n }\n\n const destSkillDir = join(targetDir, skillName);\n mkdirSync(destSkillDir, { recursive: true });\n\n const files = listFilesRecursive(srcSkillDir);\n for (const relPath of files) {\n const src = join(srcSkillDir, relPath);\n const dest = join(destSkillDir, relPath);\n mkdirSync(dirname(dest), { recursive: true });\n\n const label = join(skillName, relPath);\n let action: Action;\n if (!existsSync(dest)) {\n action = \"install\";\n } else if (options.force) {\n action = \"force-overwrite\";\n } else {\n action = \"needs-decision\";\n }\n ops.push({ src, dest, label, action });\n }\n }\n\n const candidates = ops.filter(op => op.action === \"needs-decision\");\n const decisions = candidates.length > 0\n ? await promptOverwriteBatch(candidates.map(op => ({ label: op.label, dest: op.dest })))\n : new Map<string, \"overwrite\" | \"skip\">();\n\n for (const op of ops) {\n if (op.action === \"install\") {\n copyFileSync(op.src, op.dest);\n summary.installed.push(op.label);\n } else if (op.action === \"force-overwrite\") {\n copyFileSync(op.src, op.dest);\n summary.overwritten.push(op.label);\n } else {\n const decision = decisions.get(op.label) ?? \"skip\";\n if (decision === \"overwrite\") {\n copyFileSync(op.src, op.dest);\n summary.overwritten.push(op.label);\n } else {\n summary.skipped.push(op.label);\n }\n }\n }\n\n return summary;\n}\n\nfunction listFilesRecursive(dir: string): string[] {\n const out: string[] = [];\n const walk = (current: string): void => {\n for (const entry of readdirSync(current)) {\n const full = join(current, entry);\n const stat = statSync(full);\n if (stat.isDirectory()) {\n walk(full);\n } else if (stat.isFile()) {\n out.push(relative(dir, full));\n }\n }\n };\n walk(dir);\n return out;\n}\n\nasync function promptOverwriteBatch(\n candidates: Array<{ label: string; dest: string }>,\n): Promise<Map<string, \"overwrite\" | \"skip\">> {\n const decisions = new Map<string, \"overwrite\" | \"skip\">();\n\n // Non-interactive (CI, piped stdin): default to skip — safer than silently\n // clobbering a user-edited skill file. Users who want unattended overwrite\n // pass --force.\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n for (const { label } of candidates) {\n decisions.set(label, \"skip\");\n }\n return decisions;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n let mode: \"ask\" | \"all\" | \"none\" = \"ask\";\n for (const { label, dest } of candidates) {\n if (mode === \"all\") {\n decisions.set(label, \"overwrite\");\n continue;\n }\n if (mode === \"none\") {\n decisions.set(label, \"skip\");\n continue;\n }\n const answer = (await rl.question(\n `File exists: ${dest}. Overwrite? [y/N/a=all/s=skip-all] `,\n )).trim().toLowerCase();\n if (answer === \"a\") {\n decisions.set(label, \"overwrite\");\n mode = \"all\";\n } else if (answer === \"s\") {\n decisions.set(label, \"skip\");\n mode = \"none\";\n } else if (answer.startsWith(\"y\")) {\n decisions.set(label, \"overwrite\");\n } else {\n decisions.set(label, \"skip\");\n }\n }\n } finally {\n rl.close();\n }\n return decisions;\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport {\n initAiready, getConfigPath, getReportsDir,\n} from \"../../core/engine/config-store.js\";\nimport { installSkills } from \"../skill-installer.js\";\nimport { trackEvent, EVENTS } from \"../../core/monitoring/index.js\";\n\nexport function figmaMcpRegistered(cwd: string = process.cwd()): boolean {\n try {\n const raw = readFileSync(join(cwd, \".mcp.json\"), \"utf-8\");\n const parsed = JSON.parse(raw) as { mcpServers?: Record<string, unknown> };\n const figma = parsed?.mcpServers?.[\"figma\"];\n return typeof figma === \"object\" && figma !== null;\n } catch {\n return false;\n }\n}\n\nexport function formatNextSteps(opts: {\n figmaMcpPresent: boolean;\n skillsInstalled: boolean;\n}): string {\n if (!opts.skillsInstalled) {\n return `\\n Next: canicode analyze \"https://www.figma.com/design/...\"`;\n }\n if (opts.figmaMcpPresent) {\n return [\n \"\",\n \" Next:\",\n \" 1. Restart Claude Code (the newly installed skills only load on a fresh session)\",\n \" 2. Run /canicode-roundtrip <figma-url>\",\n ].join(\"\\n\");\n }\n return [\n \"\",\n \" Next:\",\n \" 1. Install Figma MCP:\",\n \" claude mcp add -s project -t http figma https://mcp.figma.com/mcp\",\n \" 2. Restart Claude Code (so the new skills + Figma MCP tools both load)\",\n \" 3. Run /canicode-roundtrip <figma-url>\",\n ].join(\"\\n\");\n}\n\nconst InitOptionsSchema = z.object({\n token: z.string().optional(),\n global: z.boolean().optional(),\n // cac maps `--no-skills` to `skills: false` (mirrors `--no-telemetry`).\n skills: z.boolean().optional(),\n force: z.boolean().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 and install Claude Code skills to .claude/skills/\")\n .option(\"--global\", \"Install skills to ~/.claude/skills/ instead of ./.claude/skills/\")\n .option(\"--no-skills\", \"Skip skill installation (token only)\")\n .option(\"--force\", \"Overwrite existing skill files without prompting (also for non-TTY/CI)\")\n .action(async (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\n let skillStepOk = true;\n let skillSummary: { installed: number; overwritten: number; skipped: number } | undefined;\n if (options.skills !== false) {\n try {\n const summary = await installSkills({\n target: options.global ? \"global\" : \"project\",\n force: options.force ?? false,\n });\n console.log(`\\n Skills installed to: ${summary.targetDir}/`);\n console.log(` installed: ${summary.installed.length}`);\n console.log(` overwritten: ${summary.overwritten.length}`);\n console.log(` skipped: ${summary.skipped.length}`);\n if (summary.skipped.length > 0) {\n console.log(` (Re-run with --force to overwrite skipped files.)`);\n }\n skillSummary = {\n installed: summary.installed.length,\n overwritten: summary.overwritten.length,\n skipped: summary.skipped.length,\n };\n } catch (skillError) {\n console.error(\n `\\n Skill install failed: ${skillError instanceof Error ? skillError.message : String(skillError)}`,\n );\n process.exitCode = 1;\n skillStepOk = false;\n }\n }\n\n trackEvent(EVENTS.CLI_INIT, {\n skillsRequested: options.skills !== false,\n skillStepOk,\n target: options.global ? \"global\" : \"project\",\n force: options.force ?? false,\n ...(skillSummary ?? {}),\n });\n\n if (skillStepOk) {\n console.log(\n formatNextSteps({\n figmaMcpPresent: figmaMcpRegistered(),\n skillsInstalled: options.skills !== false,\n }),\n );\n }\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(`Skills:`);\n console.log(` --token also installs three Claude Code skills into ./.claude/skills/`);\n console.log(` (canicode, canicode-gotchas, canicode-roundtrip).`);\n console.log(` --global Install to ~/.claude/skills/ instead`);\n console.log(` --no-skills Skip skill install (token only)`);\n console.log(` --force Overwrite existing skill files without prompting\\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","// Internal command names — hidden from --help but still callable directly\nexport const INTERNAL_COMMANDS = [\n \"calibrate-analyze\",\n \"calibrate-evaluate\",\n \"calibrate-implement\",\n \"calibrate-gap-report\",\n \"calibrate-run\",\n \"calibrate-gather-evidence\",\n \"calibrate-finalize-debate\",\n \"calibrate-enrich-evidence\",\n \"calibrate-prune-evidence\",\n \"calibrate-save-fixture\",\n \"fixture-list\",\n \"fixture-done\",\n \"design-tree-strip\",\n \"html-postprocess\",\n \"code-metrics\",\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/calibration-compute.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/calibration-compute.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 \"./calibration-compute.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/calibration-compute.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)\"\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 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\";\nconst DEVELOP_DIR = \"logs/develop\";\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 * Create a development run directory and return its absolute path.\n * Format: `logs/develop/<issue-number>--<YYYY-MM-DD-HHMM>/`\n */\nexport function createDevelopRunDir(issueNumber: number): string {\n const timestamp = getDateTimeString();\n const dirName = buildRunDirName(String(issueNumber), timestamp);\n const dirPath = resolve(DEVELOP_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 { 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 registerCalibrateSaveFixture(cli: CAC): void {\n cli\n .command(\n \"calibrate-save-fixture <input>\",\n \"Save Figma design as a fixture directory for calibration\"\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 calibrate-save-fixture https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\")\n .example(\" canicode calibrate-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(\"calibrate-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 { 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 registerCalibrateImplement(cli: CAC): void {\n cli\n .command(\n \"calibrate-implement <input>\",\n \"Prepare design-to-code package for calibration: 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 calibrate-implement ./fixtures/my-design\")\n .example(\" canicode calibrate-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 promptPath = resolveFn(projectRoot, \".claude/agents/calibration/PROMPT.md\");\n\n let prompt = \"\";\n try {\n prompt = await rf(promptPath, \"utf-8\");\n } catch { /* not found */ }\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 { 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 { registerGotchaSurvey } from \"./commands/gotcha-survey.js\";\nimport { registerUpsertGotchaSection } from \"./commands/upsert-gotcha-section.js\";\nimport { registerDesignTree } from \"./commands/design-tree.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\";\n\nimport { INTERNAL_COMMANDS } from \"./internal-commands.js\";\n\n// Internal commands (used by subagents, hidden from user help)\n// When adding a new internal command, also add its name to internal-commands.ts\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 { registerCalibrateSaveFixture } from \"./commands/internal/calibrate-save-fixture.js\";\nimport { registerCalibrateImplement } from \"./commands/internal/calibrate-implement.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);\nregisterGotchaSurvey(cli);\nregisterUpsertGotchaSection(cli);\nregisterDesignTree(cli);\nregisterVisualCompare(cli);\nregisterInit(cli);\nregisterConfig(cli);\nregisterListRules(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);\nregisterCalibrateSaveFixture(cli);\nregisterCalibrateImplement(cli);\nregisterCodeMetrics(cli);\n\n// ============================================\n// Documentation command\n// ============================================\ncli\n .command(\"docs [topic]\", \"Show documentation (topics: setup, config, scoring, rules, visual-compare, design-tree)\")\n .action((topic?: string) => {\n handleDocs(topic);\n });\n\ncli.help((sections) => {\n // Filter internal commands from \"Commands\" and \"For more info\" sections\n for (const section of sections) {\n if (section.title === \"Commands\" || section.title?.startsWith(\"For more info\")) {\n section.body = section.body\n .split(\"\\n\")\n .filter((line: string) => !INTERNAL_COMMANDS.some((cmd) => line.includes(cmd)))\n .join(\"\\n\");\n }\n }\n\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 ` $ canicode gotcha-survey \"https://www.figma.com/design/...\" --json`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nInstallation\",\n body: [\n ` CLI: npm install -g canicode`,\n ` MCP: claude mcp add canicode -- npx --yes --package=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/contracts/acknowledgment.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","../../src/core/adapters/instance-id-parser.ts","../../src/core/gotcha/apply-context.ts","../../package.json","../../src/core/engine/scoring.ts","../../src/core/contracts/design-key.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/core/rules/gotcha-questions.ts","../../src/core/gotcha/group-and-batch-questions.ts","../../src/core/gotcha/survey-generator.ts","../../src/cli/commands/gotcha-survey.ts","../../src/core/gotcha/upsert-gotcha-section.ts","../../src/cli/commands/upsert-gotcha-section.ts","../../src/cli/commands/design-tree.ts","../../src/core/contracts/visual-compare.ts","../../src/cli/commands/visual-compare.ts","../../src/cli/skill-installer.ts","../../src/cli/commands/init.ts","../../src/cli/commands/config.ts","../../src/cli/commands/list-rules.ts","../../src/cli/internal-commands.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/calibration-compute.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/calibrate-save-fixture.ts","../../src/cli/commands/internal/calibrate-implement.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","isFigmaUrl","readFile","esc","countNodes","cli","findNodeById","generateDesignTreeWithStats","visualCompare","homedir","copyFileSync","dominantDifficulty","loadFile","writeFile","readdirSync","basename","result","resolveComponentDefinitions","resolveInteractionDestinations","FigmaClient","fileURLToPath","createRequire","pkg"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA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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 `calibrate-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\n // Roundtrip (ADR-012)\n // Wiring point for the roundtrip helper's `telemetry` callback. No Node-side\n // orchestrator reads this yet — the helper ships in a sandbox-pure IIFE that\n // cannot import `core/monitoring` directly, so the event fires through a\n // caller-supplied callback. Define the typed name here so a future consumer\n // has a single place to wire it up.\n ROUNDTRIP_DEFINITION_WRITE_SKIPPED: `${EVENT_PREFIX}roundtrip_definition_write_skipped`,\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 scoring Scoring model explanation\n canicode docs rules Pointer to rule list (canicode list-rules)\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 (saves token + installs skills — see section 2 for --no-skills)\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 SKILLS (requires FIGMA_TOKEN)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Setup:\n canicode init --token figd_xxxxxxxxxxxxx\n (installs three skills into ./.claude/skills/ alongside the token)\n\n Installed skills:\n canicode Lightweight CLI wrapper\n canicode-gotchas Standalone gotcha survey\n canicode-roundtrip Full analyze -> gotcha -> apply roundtrip\n\n Flags:\n --global Install to ~/.claude/skills/ instead of ./.claude/skills/\n --no-skills Skip skill install (token only — legacy behavior)\n --force Overwrite existing skill files without prompting\n\n Use (in Claude Code):\n /canicode https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\n /canicode-gotchas <url> Run a gotcha survey\n /canicode-roundtrip <url> Analyze, fix gotchas in Figma, re-analyze\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 calibrate-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 pointer to the rule list. */\nexport function printDocsRules(): void {\n console.log(`\nRULES\n\n Run 'canicode list-rules' for the full table of rule IDs, scores, and severity.\n\n Customize per-rule via config:\n canicode docs config\n\n Full reference:\n https://github.com/let-sunny/canicode/blob/main/docs/CUSTOMIZATION.md\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 scoring: printDocsScoring,\n rules: printDocsRules,\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\";\nimport type { AnnotationProperty } from \"../roundtrip/types.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 * Per-rule annotation `properties` hints surfaced in Dev Mode. Kept as a\n * sibling map rather than a field on `RuleConfig` so the existing\n * `RuleConfigSchema` Zod contract and preset helpers stay untouched.\n *\n * `bySubType` takes precedence over `default` — mirrors the ruleId+subType\n * resolution pattern already used for `targetProperty` in apply-context.ts.\n * The Experiment 09 node-type matrix is enforced at write time by\n * `upsertCanicodeAnnotation`'s retry path, so hints can be passed\n * speculatively without server-side filtering.\n */\nexport const RULE_ANNOTATION_PROPERTIES: Partial<\n Record<\n RuleId,\n {\n default?: AnnotationProperty[];\n bySubType?: Record<string, AnnotationProperty[]>;\n }\n >\n> = {\n \"missing-size-constraint\": {\n default: [{ type: \"width\" }, { type: \"height\" }],\n },\n \"irregular-spacing\": {\n bySubType: {\n gap: [{ type: \"itemSpacing\" }],\n padding: [{ type: \"padding\" }],\n },\n },\n \"fixed-size-in-auto-layout\": {\n default: [{ type: \"width\" }, { type: \"height\" }, { type: \"layoutMode\" }],\n },\n \"raw-value\": {\n bySubType: {\n color: [{ type: \"fills\" }],\n font: [\n { type: \"fontSize\" },\n { type: \"fontFamily\" },\n { type: \"fontWeight\" },\n { type: \"lineHeight\" },\n ],\n spacing: [{ type: \"itemSpacing\" }, { type: \"padding\" }],\n },\n },\n \"absolute-position-in-auto-layout\": {\n default: [{ type: \"layoutMode\" }],\n },\n};\n\n/**\n * Resolve the annotation `properties` hint for a ruleId (+ subType).\n * Returns `undefined` for rules with no entry.\n */\nexport function getAnnotationProperties(\n ruleId: RuleId,\n subType?: string\n): AnnotationProperty[] | undefined {\n const entry = RULE_ANNOTATION_PROPERTIES[ruleId];\n if (!entry) return undefined;\n if (subType !== undefined && entry.bySubType) {\n const match = entry.bySubType[subType];\n if (match) return match;\n }\n return entry.default;\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 * Pre-computed name to write to `node.name` in Figma — populated by naming\n * rules whose suggestion is a deterministic function of the node's existing\n * state (`non-standard-naming`, `inconsistent-naming-convention`).\n * Capitalized for direct Plugin-API use; the human-readable `suggestion`\n * string keeps lowercase prose.\n */\n suggestedName?: 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 capitalize(s: string): string {\n if (!s) return s;\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\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 // #372: suppress when the case-conversion produces the same string as\n // the current name. Single-character names (\"X\"), all-numeric names, and\n // any input whose every word maps to itself across cases all fall into\n // this bucket — flagging them produces a no-op rename, an empty diff\n // visible as a misleading \"✅ resolved\" wrap-up entry.\n if (suggested === node.name) return null;\n return {\n ruleId: inconsistentNamingConventionDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n suggestedName: suggested,\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 suggestedName: capitalize(suggestion),\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 * Master names that look like a single variant of a SET (e.g. `State=Default`,\n * `Variant=Primary, State=Default, Size=Medium`). When a fetched COMPONENT\n * carries this naming AND has no own `componentPropertyDefinitions`, the\n * variant axes live on the parent COMPONENT_SET — which the loader does not\n * fetch today (#397). Treat as undeterminable rather than asserting a missing\n * variant we cannot actually see.\n */\nconst VARIANT_POSITION_NAME_RE = /^[\\w ]+=[^,]+(,\\s*[\\w ]+=[^,]+)*$/;\n\nfunction hasUsablePropDefs(propDefs: unknown): boolean {\n // `undefined` = not fetched; `null` = REST returned blank (e.g. variant\n // INSIDE a SET — axes live on the SET parent, not here). Both are\n // non-evidence. `{}` (fetched-and-empty) IS positive evidence the master\n // truly has no axes — must keep firing per the test for #354.\n return propDefs != null && typeof propDefs === \"object\";\n}\n\n/**\n * Decide whether we have enough source data to assert a state variant is missing.\n *\n * The Figma REST API does not consistently mirror `componentPropertyDefinitions`\n * onto deeply-nested INSTANCE children, and `context.file.componentDefinitions`\n * only contains masters the loader actually fetched (external-library masters\n * stay null even after extra passes). When BOTH paths are empty for an INSTANCE\n * we cannot tell whether the master defines the variant or not — treat that as\n * \"unknown\" (return false here) rather than asserting a missing variant.\n *\n * The fetched master may also be a single variant of a SET (name like\n * `State=Default`); the variant axes live on the SET parent which we do not\n * fetch. Detect this via name pattern and treat as undeterminable too (#397).\n *\n * COMPONENT nodes are special: a COMPONENT IS the master, so the absence of\n * `componentPropertyDefinitions` on a COMPONENT is itself meaningful evidence\n * (standalone master with no variant axis at all) — UNLESS the COMPONENT name\n * follows the variant-position pattern, in which case the SET parent holds the\n * axes and we cannot decide.\n */\nfunction canDetermineVariants(node: AnalysisNode, context: RuleContext): boolean {\n if (hasUsablePropDefs(node.componentPropertyDefinitions)) return true;\n if (node.type === \"COMPONENT\") {\n return !VARIANT_POSITION_NAME_RE.test(node.name);\n }\n if (node.componentId !== undefined) {\n const defs = context.file.componentDefinitions;\n const master = defs?.[node.componentId];\n if (master) {\n if (hasUsablePropDefs(master.componentPropertyDefinitions)) return true;\n return !VARIANT_POSITION_NAME_RE.test(master.name);\n }\n }\n return false;\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 // Probe gate: only assert a missing variant when we can actually observe the\n // master's variant axes. For nested INSTANCE children whose master was not\n // fetched into `componentDefinitions` and whose own `componentPropertyDefinitions`\n // is undefined, treat the verdict as unknown and skip — this avoids the\n // false-positive class described in #354. The data-availability check is\n // per-node (not per-state), so it lives outside the for-loop below.\n if (!canDetermineVariants(node, context)) 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 { z } from \"zod\";\n\n/**\n * Acknowledgment marker — surfaced from a Figma Dev Mode annotation that\n * canicode itself wrote during a roundtrip. When the analysis pipeline\n * receives a list of acknowledgments, matching `(nodeId, ruleId)` issues are\n * flagged `acknowledged: true` and contribute half their normal weight to\n * the density score (#371).\n *\n * This contract is consumed by:\n * - The MCP `analyze` tool (`acknowledgments?: Acknowledgment[]` input)\n * - The CLI `analyze --acknowledgments <path>` flag\n * - `RuleEngineOptions.acknowledgments`\n *\n * It is produced by the Plugin-API helper\n * `extractAcknowledgmentsFromNode` / `readCanicodeAcknowledgments`\n * (see `src/core/roundtrip/read-acknowledgments.ts`).\n */\nexport const AcknowledgmentSchema = z.object({\n nodeId: z.string(),\n ruleId: z.string(),\n});\n\nexport type Acknowledgment = z.infer<typeof AcknowledgmentSchema>;\n\nexport const AcknowledgmentListSchema = z.array(AcknowledgmentSchema);\n\n/**\n * Normalize a Figma node id into `:`-separated form so callers can pass\n * either URL-style (`123-456`) or Plugin-API-style (`123:456`) ids and the\n * engine matches them consistently. Non-instance ids stay unchanged; the\n * `I…;…` instance-child format keeps its semicolon — only `-` → `:`\n * happens.\n */\nexport function normalizeNodeId(id: string): string {\n return id.replace(/-/g, \":\");\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\";\nimport {\n normalizeNodeId,\n type Acknowledgment,\n} from \"../contracts/acknowledgment.js\";\n\n/**\n * Analysis issue with calculated score and metadata.\n *\n * `acknowledged` (#371) — set when the analysis engine receives an\n * `acknowledgments` list (typically read from canicode-authored Figma\n * annotations) whose `(nodeId, ruleId)` matches this issue. Acknowledged\n * issues still surface in the result (so code-gen retains the context) but\n * contribute half their normal weight to the density score, so the grade\n * reflects \"the designer has a plan for this\" instead of treating the rule\n * as fully unaddressed.\n */\nexport interface AnalysisIssue {\n violation: RuleViolation;\n rule: Rule;\n config: RuleConfig;\n depth: number;\n maxDepth: number;\n calculatedScore: number;\n acknowledged?: boolean;\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 * `(nodeId, ruleId)` pairs sourced from canicode-authored Figma annotations\n * (#371). Issues whose violation matches an entry are flagged\n * `acknowledged: true` and contribute half their normal weight to the\n * density score in `calculateScores`. nodeId may be passed in URL form\n * (`123-456`) or Plugin-API form (`123:456`) — both normalize to `:`.\n */\n acknowledgments?: Acknowledgment[];\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 private acknowledgments: ReadonlySet<string>;\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 this.acknowledgments = new Set(\n (options.acknowledgments ?? []).map(\n (a) => `${normalizeNodeId(a.nodeId)}::${a.ruleId}`\n )\n );\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 if (this.acknowledgments.size > 0) {\n for (const issue of issues) {\n const key = `${normalizeNodeId(issue.violation.nodeId)}::${issue.violation.ruleId}`;\n if (this.acknowledgments.has(key)) {\n issue.acknowledged = true;\n }\n }\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 * Parse Figma instance-child node IDs.\n *\n * Nodes inside an instance carry an `I`-prefixed id with semicolon-separated\n * path segments: `I<parentInstanceId>;<sourceNodeId>`. For nested instances\n * the format chains further, e.g. `I<parentId>;<midId>;<sourceNodeId>` —\n * each `;` represents one additional level of instance expansion. The LAST\n * segment is always the id of the node inside the innermost source component,\n * which is reachable directly via `figma.getNodeById`.\n *\n * Siblings: `figma-url-parser.ts#toCommentableNodeId` handles the same id\n * format for a different purpose (stripping for the Comments API). That\n * helper is intentionally left alone — this module owns id parsing for the\n * apply pipeline.\n */\n\nexport interface InstanceChildIdParts {\n parentInstanceId: string;\n sourceNodeId: string;\n}\n\nexport function isInstanceChildNodeId(nodeId: string): boolean {\n return nodeId.startsWith(\"I\") && nodeId.includes(\";\");\n}\n\nexport function parseInstanceChildNodeId(\n nodeId: string,\n): InstanceChildIdParts | null {\n if (!isInstanceChildNodeId(nodeId)) return null;\n\n const segments = nodeId.split(\";\");\n if (segments.length < 2) return null;\n\n const parentInstanceId = segments[0]!.replace(/^I/, \"\");\n const sourceNodeId = segments[segments.length - 1]!;\n\n if (!parentInstanceId || !sourceNodeId) return null;\n\n return { parentInstanceId, sourceNodeId };\n}\n","import type { RuleId, RuleViolation } from \"../contracts/rule.js\";\nimport type { InstanceContext } from \"../contracts/gotcha-survey.js\";\nimport type { AnnotationProperty } from \"../roundtrip/types.js\";\nimport {\n isInstanceChildNodeId,\n parseInstanceChildNodeId,\n} from \"../adapters/instance-id-parser.js\";\nimport { getAnnotationProperties } from \"../rules/rule-config.js\";\n\n/**\n * Apply strategy for a rule violation. Tells the SKILL.md/`use_figma`\n * pipeline which Plugin-API path to take.\n *\n * - `property-mod` — Strategy A. Direct property write on the scene/instance node.\n * - `structural-mod` — Strategy B. Structural change; ask user to confirm before applying.\n * - `annotation` — Strategy C. Cannot be auto-fixed; record as a Figma annotation.\n * - `auto-fix` — Strategy D. Lower-severity rules from analyze output;\n * may be a property write (naming) or annotation-only.\n *\n * Sibling module `resolve-apply-target.ts` solves a different concern\n * (scene-vs-definition write target). Compose them — do not merge.\n */\nexport type RuleApplyStrategy =\n | \"property-mod\"\n | \"structural-mod\"\n | \"annotation\"\n | \"auto-fix\";\n\n/**\n * Pre-computed apply context attached to gotcha-survey questions and\n * analyze-output issues. Lets the SKILL.md consume the data directly\n * instead of re-deriving rule routing on every roundtrip run.\n *\n * `targetProperty` is `string` for single-property writes, `string[]`\n * for rules that require multiple writes (e.g. `irregular-spacing`\n * subType `padding` → 4 padding fields), and `undefined` for\n * annotation/structural strategies that have no single property target.\n */\nexport interface ApplyContext {\n applyStrategy: RuleApplyStrategy;\n targetProperty?: string | string[];\n annotationProperties?: AnnotationProperty[];\n isInstanceChild: boolean;\n sourceChildId?: string;\n}\n\nconst STRATEGY_BY_RULE: Record<RuleId, RuleApplyStrategy> = {\n // Strategy A — property modification\n \"no-auto-layout\": \"property-mod\",\n \"fixed-size-in-auto-layout\": \"property-mod\",\n \"missing-size-constraint\": \"property-mod\",\n \"irregular-spacing\": \"property-mod\",\n \"non-semantic-name\": \"property-mod\",\n // Strategy B — structural modification (needs user confirmation)\n \"non-layout-container\": \"structural-mod\",\n \"deep-nesting\": \"structural-mod\",\n \"missing-component\": \"structural-mod\",\n \"detached-instance\": \"structural-mod\",\n // Strategy C — annotation only\n \"absolute-position-in-auto-layout\": \"annotation\",\n \"variant-structure-mismatch\": \"annotation\",\n // Strategy D — auto-fix lower-severity issues from analyze output\n \"non-standard-naming\": \"auto-fix\",\n \"inconsistent-naming-convention\": \"auto-fix\",\n \"raw-value\": \"auto-fix\",\n \"missing-interaction-state\": \"auto-fix\",\n \"missing-prototype\": \"auto-fix\",\n};\n\n/**\n * Resolve the Figma Plugin-API target property (or properties) for a\n * violation. Returns `undefined` for rules whose strategy does not write\n * a single property (structural-mod, annotation), or for naming auto-fixes\n * where the value comes from `violation.suggestedName` rather than a\n * specific Figma property — except the `name` write itself, which we\n * surface so SKILL.md can branch uniformly on `targetProperty === 'name'`.\n */\nfunction resolveTargetProperty(\n ruleId: RuleId,\n subType: string | undefined,\n): string | string[] | undefined {\n switch (ruleId) {\n case \"no-auto-layout\":\n return [\"layoutMode\", \"itemSpacing\"];\n case \"fixed-size-in-auto-layout\":\n if (subType === \"horizontal\") return \"layoutSizingHorizontal\";\n // both-axes — write both axes\n return [\"layoutSizingHorizontal\", \"layoutSizingVertical\"];\n case \"missing-size-constraint\":\n // #374: always return BOTH bounds so `applyPropertyMod`'s array branch\n // iterates the full `{ minWidth, maxWidth }` answer shape. Pre-fix the\n // `wrap` subType returned `\"minWidth\"` and `max-width` returned\n // `\"maxWidth\"` as single strings — the user typically answered with\n // both keys (the gotcha hint asks for both) and the apply step\n // silently dropped half the intent because it only iterated the one\n // property in `targetProperty`. Partial answers still work: the per-\n // property lookup in `applyPropertyMod` returns `undefined` for the\n // missing key and the helper skips it.\n return [\"minWidth\", \"maxWidth\"];\n case \"irregular-spacing\":\n if (subType === \"gap\") return \"itemSpacing\";\n // padding — all four padding fields\n return [\"paddingTop\", \"paddingRight\", \"paddingBottom\", \"paddingLeft\"];\n case \"non-semantic-name\":\n return \"name\";\n case \"non-layout-container\":\n return \"layoutMode\";\n case \"non-standard-naming\":\n case \"inconsistent-naming-convention\":\n return \"name\";\n case \"deep-nesting\":\n case \"missing-component\":\n case \"detached-instance\":\n case \"absolute-position-in-auto-layout\":\n case \"variant-structure-mismatch\":\n case \"raw-value\":\n case \"missing-interaction-state\":\n case \"missing-prototype\":\n return undefined;\n }\n}\n\n/**\n * Compute the deterministic apply context for a rule violation.\n *\n * - `applyStrategy` and `targetProperty` come from the ruleId/subType tables above.\n * - `isInstanceChild` and `sourceChildId` are parsed from the violation `nodeId`\n * via `parseInstanceChildNodeId` — single source of truth for `I...;...` ids.\n * - `instanceContext`, when supplied, takes precedence for `sourceChildId` so\n * callers that already resolved the source component (gotcha-survey) do not\n * re-parse the id.\n *\n * Strategy D rules that target scene nodes (analyze output) can pass\n * `instanceContext: undefined` — the function still returns the parsed\n * `isInstanceChild`/`sourceChildId` so SKILL.md knows whether to walk the\n * instance fallback.\n */\nexport function computeApplyContext(\n violation: Pick<RuleViolation, \"ruleId\" | \"subType\" | \"nodeId\">,\n instanceContext?: InstanceContext,\n): ApplyContext {\n const ruleId = violation.ruleId as RuleId;\n const applyStrategy = STRATEGY_BY_RULE[ruleId] ?? \"annotation\";\n const targetProperty = resolveTargetProperty(ruleId, violation.subType);\n const annotationProperties = getAnnotationProperties(\n ruleId,\n violation.subType,\n );\n\n const parsed = parseInstanceChildNodeId(violation.nodeId);\n const isInstanceChild =\n parsed !== null || isInstanceChildNodeId(violation.nodeId);\n const sourceChildId = instanceContext?.sourceNodeId ?? parsed?.sourceNodeId;\n\n return {\n applyStrategy,\n ...(targetProperty !== undefined ? { targetProperty } : {}),\n ...(annotationProperties !== undefined ? { annotationProperties } : {}),\n isInstanceChild,\n ...(sourceChildId !== undefined ? { sourceChildId } : {}),\n };\n}\n","{\n \"name\": \"canicode\",\n \"version\": \"0.10.5\",\n \"mcpName\": \"io.github.let-sunny/canicode\",\n \"description\": \"Lint Figma designs for AI code-gen and roundtrip the answers back into the file. 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 && pnpm build:roundtrip && pnpm bundle:skills\",\n \"build:web\": \"bash scripts/build-web.sh\",\n \"build:roundtrip\": \"tsup --config tsup.roundtrip.config.ts\",\n \"bundle:skills\": \"bash scripts/bundle-skills.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 \"check:skill-determinism\": \"tsx scripts/check-skill-determinism.ts\",\n \"clean\": \"rm -rf dist skills\"\n },\n \"files\": [\n \"dist\",\n \"skills\",\n \"README.md\",\n \"docs/CUSTOMIZATION.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 { computeApplyContext } from \"../gotcha/apply-context.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 * Number of issues marked `acknowledged` by an upstream\n * acknowledgments list (#371). Acknowledged issues are still counted in\n * `totalIssues` and the per-severity tallies — the count here is purely\n * additive context so consumers can render\n * `N issues — A acknowledged / N-A unaddressed`. They contribute half\n * weight to the density score upstream.\n */\n acknowledgedCount: 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 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 * Returns true if the design is ready for code generation.\n * S, A+, and A grades (percentage >= 85) indicate the design has minimal blockers\n * and can be implemented accurately by AI or developers.\n */\nexport function isReadyForCodeGen(grade: Grade): boolean {\n return grade === \"S\" || grade === \"A+\" || grade === \"A\";\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 a per-issue weight: 1.0 for\n // unacknowledged issues, 0.5 for acknowledged ones (#371). The sqrt\n // damping below treats this sum as the \"occurrence count\" so the\n // half-weight flows through to density without changing the formula.\n // Diversity is left untouched — acknowledgment is per-issue, not\n // per-rule, and the rule still represents a kind of problem.\n const ruleCountMap = ruleIssueCountPerCategory.get(category)!;\n const weight = issue.acknowledged === true ? 0.5 : 1;\n ruleCountMap.set(ruleId, (ruleCountMap.get(ruleId) ?? 0) + weight);\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 acknowledgedCount: 0,\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 if (issue.acknowledged === true) summary.acknowledgedCount++;\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 if (report.summary.acknowledgedCount > 0) {\n const unaddressed =\n report.summary.totalIssues - report.summary.acknowledgedCount;\n lines.push(\n ` Total: ${report.summary.totalIssues} (${report.summary.acknowledgedCount} acknowledged via canicode annotations / ${unaddressed} unaddressed)`\n );\n } else {\n lines.push(` Total: ${report.summary.totalIssues}`);\n }\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; designKey?: 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 const applyContext = computeApplyContext(issue.violation);\n const suggestedName = issue.violation.suggestedName;\n return {\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 applyStrategy: applyContext.applyStrategy,\n ...(applyContext.targetProperty !== undefined\n ? { targetProperty: applyContext.targetProperty }\n : {}),\n ...(applyContext.annotationProperties !== undefined\n ? { annotationProperties: applyContext.annotationProperties }\n : {}),\n ...(suggestedName !== undefined ? { suggestedName } : {}),\n isInstanceChild: applyContext.isInstanceChild,\n ...(applyContext.sourceChildId !== undefined\n ? { sourceChildId: applyContext.sourceChildId }\n : {}),\n ...(issue.acknowledged === true ? { acknowledged: true as const } : {}),\n };\n });\n\n const json: Record<string, unknown> = {\n version: VERSION,\n analyzedAt: result.analyzedAt,\n ...(options?.fileKey && { fileKey: options.fileKey }),\n ...(options?.designKey && { designKey: options.designKey }),\n fileName,\n nodeCount: result.nodeCount,\n maxDepth: result.maxDepth,\n issueCount: result.issues.length,\n acknowledgedCount: scores.summary.acknowledgedCount,\n isReadyForCodeGen: isReadyForCodeGen(scores.overall.grade),\n blockingIssueCount: scores.summary.blocking,\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 { resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { parseFigmaUrl } from \"../adapters/figma-url-parser.js\";\n\n/**\n * Local copy of `isFigmaUrl` (lives in `core/engine/loader.ts`). Inlined to\n * avoid a contracts/ → engine/ dependency cycle: contracts/ is meant to be\n * importable by every other layer, including engine/.\n */\nfunction isFigmaUrl(input: string): boolean {\n return input.includes(\"figma.com/\");\n}\n\nexport const DesignKeySchema = z.string();\nexport type DesignKey = z.infer<typeof DesignKeySchema>;\n\n/**\n * Compute the canonical `designKey` that uniquely identifies a design across\n * canicode runs.\n *\n * - **Figma URL** → `<fileKey>#<nodeId>` with `-` → `:` normalization on the\n * nodeId (matching the Figma MCP convention). Example:\n * `https://figma.com/design/abc123/My-File?node-id=42-100&t=ref` →\n * `abc123#42:100`. Trailing query parameters other than `node-id`\n * (`?t=...`, `?mode=...`) are dropped — they would otherwise break\n * string-matching on re-runs.\n * - **Figma URL without `node-id`** → just `<fileKey>` (file-level key).\n * - **Anything else** (fixture directory, JSON path, raw filename) →\n * absolute path via `node:path.resolve(input)`. Keeps fixture-based\n * smoke tests stable across cwd.\n *\n * Both `gotcha-survey` and `analyze` MCP/CLI tools surface the result on\n * their response's top-level `designKey` field. The `canicode-gotchas` and\n * `canicode-roundtrip` SKILLs read that field directly — neither one\n * re-implements URL parsing in prose anymore (per ADR-016).\n */\nexport function computeDesignKey(input: string): string {\n if (isFigmaUrl(input)) {\n const { fileKey, nodeId } = parseFigmaUrl(input);\n if (!nodeId) return fileKey;\n return `${fileKey}#${nodeId.replace(/-/g, \":\")}`;\n }\n return resolve(input);\n}\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 { readFile, 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 AcknowledgmentListSchema,\n type Acknowledgment,\n} from \"../../core/contracts/acknowledgment.js\";\nimport {\n getFigmaToken, getReportsDir, ensureReportsDir,\n} from \"../../core/engine/config-store.js\";\nimport { calculateScores, formatScoreSummary, buildResultJson } from \"../../core/engine/scoring.js\";\nimport { computeDesignKey } from \"../../core/contracts/design-key.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 acknowledgments: z.string().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 .option(\"--acknowledgments <path>\", \"(#371) Path to a JSON file containing [{ nodeId, ruleId }] pairs harvested from canicode-authored Figma annotations. Matching issues are flagged acknowledged and contribute half weight to density.\")\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 let acknowledgments: Acknowledgment[] | undefined;\n if (options.acknowledgments) {\n const ackPath = resolve(options.acknowledgments);\n const raw = await readFile(ackPath, \"utf-8\");\n const parsed = AcknowledgmentListSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) {\n throw new Error(\n `Invalid --acknowledgments file at ${ackPath}: ${parsed.error.issues.map(i => `${i.path.join(\".\")}: ${i.message}`).join(\"; \")}`\n );\n }\n acknowledgments = parsed.data;\n log(`Acknowledgments loaded: ${acknowledgments.length} entries from ${ackPath}`);\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 ...(acknowledgments && { acknowledgments }),\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, designKey: computeDesignKey(input) }), 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 { z } from \"zod\";\nimport type { RuleId } from \"../contracts/rule.js\";\n\n/**\n * Gotcha question template for a single rule.\n * Used to generate user-facing surveys from analysis results (#236).\n *\n * - question: uses {nodeName} placeholder for the affected node\n * - hint: guides the user on what kind of answer is expected\n * - example: concrete example answer\n */\nexport const GotchaQuestionSchema = z.object({\n ruleId: z.string(),\n question: z.string(),\n hint: z.string(),\n example: z.string(),\n});\n\nexport type GotchaQuestion = z.infer<typeof GotchaQuestionSchema>;\n\n/**\n * Gotcha question mapping for all 16 rules.\n * Keyed by ruleId for O(1) lookup during survey generation.\n */\nexport const GOTCHA_QUESTIONS: Record<RuleId, GotchaQuestion> = {\n // ── Pixel Critical (blocking) ──\n\n \"no-auto-layout\": {\n ruleId: \"no-auto-layout\",\n question: 'Frame \"{nodeName}\" has no Auto Layout. How should this area be laid out?',\n hint: \"Describe the flex direction, gap, and alignment\",\n example: \"Vertical flex, gap 16px, items centered\",\n },\n \"absolute-position-in-auto-layout\": {\n ruleId: \"absolute-position-in-auto-layout\",\n question: '\"{nodeName}\" uses absolute positioning inside an Auto Layout parent. Is this an intentional overlay, or should it flow with the layout?',\n hint: \"Specify if this is a badge/overlay, or should be part of the normal flow\",\n example: \"This is a notification badge — position absolute, top-right corner\",\n },\n \"non-layout-container\": {\n ruleId: \"non-layout-container\",\n question: '\"{nodeName}\" is a Group/Section used as a layout container. What layout structure should it have?',\n hint: \"Describe the intended layout: flex direction, wrap, gap\",\n example: \"Horizontal flex, gap 12px, wrap on mobile\",\n },\n\n // ── Responsive Critical (risk) ──\n\n \"fixed-size-in-auto-layout\": {\n ruleId: \"fixed-size-in-auto-layout\",\n question: '\"{nodeName}\" has a fixed size inside Auto Layout. Should it be responsive?',\n hint: \"Specify which axis should be flexible (width, height, or both)\",\n example: \"Width should FILL the parent, height can stay fixed\",\n },\n \"missing-size-constraint\": {\n ruleId: \"missing-size-constraint\",\n question: '\"{nodeName}\" uses FILL sizing without min/max constraints. What are the size boundaries?',\n hint: \"Provide min-width, max-width, or both\",\n example: \"min-width 320px, max-width 1200px\",\n },\n\n // ── Code Quality (risk) ──\n\n \"missing-component\": {\n ruleId: \"missing-component\",\n question: '\"{nodeName}\" appears to be a repeated structure. Should it be a reusable component?',\n hint: \"Describe if this should be extracted as a component and what props it needs\",\n example: \"Yes, extract as ProductCard component with title, image, and price props\",\n },\n \"detached-instance\": {\n ruleId: \"detached-instance\",\n question: '\"{nodeName}\" looks like a detached component instance. Should it use the original component or is it a new variant?',\n hint: \"Specify whether to restore the component link or create a new variant\",\n example: \"This is a new variant — create a 'compact' variant of the original component\",\n },\n \"variant-structure-mismatch\": {\n ruleId: \"variant-structure-mismatch\",\n question: '\"{nodeName}\" has variants with different child structures. Which structure is the canonical one?',\n hint: \"Describe which variant has the correct structure, or if they should all match\",\n example: \"Default variant is canonical — other variants should toggle child visibility instead of adding/removing elements\",\n },\n \"deep-nesting\": {\n ruleId: \"deep-nesting\",\n question: '\"{nodeName}\" is deeply nested. Can some intermediate layers be flattened or extracted?',\n hint: \"Identify which wrapper layers are unnecessary or should become sub-components\",\n example: \"The inner wrapper is just for spacing — flatten it and use padding instead\",\n },\n\n // ── Token Management ──\n\n \"raw-value\": {\n ruleId: \"raw-value\",\n question: '\"{nodeName}\" uses raw values without design tokens. What tokens should be used?',\n hint: \"Specify the token names or variable references for colors, fonts, spacing, etc.\",\n example: \"Use $color-primary for the fill, $font-body for the text style\",\n },\n \"irregular-spacing\": {\n ruleId: \"irregular-spacing\",\n question: '\"{nodeName}\" has spacing values that are off the design grid. What should the correct spacing be?',\n hint: \"Provide the intended spacing value aligned to the grid system\",\n example: \"Gap should be 16px (4pt grid), not 15px\",\n },\n\n // ── Interaction ──\n\n \"missing-interaction-state\": {\n ruleId: \"missing-interaction-state\",\n question: '\"{nodeName}\" appears interactive but is missing state variants. What interaction states are needed?',\n hint: \"List the needed states: Hover, Active, Disabled, Focus\",\n example: \"Needs Hover (darken 10%) and Disabled (opacity 50%, no pointer events)\",\n },\n \"missing-prototype\": {\n ruleId: \"missing-prototype\",\n question: '\"{nodeName}\" looks interactive but has no prototype interaction. What should happen on click/interaction?',\n hint: \"Describe the interaction behavior: navigation, overlay, state change, etc.\",\n example: \"On click, navigate to the product detail page\",\n },\n\n // ── Semantic ──\n\n \"non-standard-naming\": {\n ruleId: \"non-standard-naming\",\n question: '\"{nodeName}\" uses non-standard state names. What naming convention should be followed?',\n hint: \"Specify the expected state name format (e.g., Hover, Disabled, Active)\",\n example: 'Use \"Hover\" instead of \"hover_v1\", \"Disabled\" instead of \"off\"',\n },\n \"non-semantic-name\": {\n ruleId: \"non-semantic-name\",\n question: '\"{nodeName}\" has a non-semantic name. What is the purpose of this element?',\n hint: \"Provide a descriptive name that reflects the element's role in the UI\",\n example: 'Rename \"Frame 12\" to \"HeroSection\" or \"ProductGrid\"',\n },\n \"inconsistent-naming-convention\": {\n ruleId: \"inconsistent-naming-convention\",\n question: '\"{nodeName}\" uses a different naming convention than its siblings. Which convention should be used?',\n hint: \"Choose one: camelCase, kebab-case, PascalCase, or Title Case\",\n example: \"Use PascalCase for all component layers (e.g., CardTitle, CardBody)\",\n },\n};\n\n/**\n * Get the gotcha question for a specific rule.\n */\nexport function getGotchaQuestion(ruleId: RuleId): GotchaQuestion {\n return GOTCHA_QUESTIONS[ruleId];\n}\n\n/**\n * Format a gotcha question by replacing the {nodeName} placeholder.\n */\nexport function formatGotchaQuestion(ruleId: RuleId, nodeName: string): string {\n return GOTCHA_QUESTIONS[ruleId].question.replace(\"{nodeName}\", nodeName);\n}\n","import type {\n GotchaSurveyQuestion,\n InstanceContext,\n} from \"../contracts/gotcha-survey.js\";\nimport type { RuleId } from \"../contracts/rule.js\";\n\n/**\n * Rules whose answer is uniformly applicable to every member of a batch\n * (e.g. \"What min/max width should these layers share?\"). When N consecutive\n * questions in the same source-component group share one of these `ruleId`s,\n * the SKILL prompts the user **once** with all node names listed instead of\n * asking the same question N times.\n *\n * Maintained as an exported constant so the SKILL.md prose doesn't have to\n * keep a parallel whitelist in sync — vitest covers each rule's batch\n * behavior here, not in the LLM's prose interpretation. Add a rule here only\n * after confirming its `gotcha-question` text is actually phrased to accept a\n * single shared answer (the FILL-sizing question is, the\n * `non-semantic-name` question is not).\n */\nexport const BATCHABLE_RULE_IDS = [\n \"missing-size-constraint\",\n \"irregular-spacing\",\n \"no-auto-layout\",\n \"fixed-size-in-auto-layout\",\n] as const satisfies readonly RuleId[];\n\nconst BATCHABLE_SET: ReadonlySet<string> = new Set(BATCHABLE_RULE_IDS);\n\nconst NO_SOURCE_SENTINEL = \"_no-source\";\n\nexport interface SurveyQuestionBatch {\n ruleId: string;\n /**\n * `true` when every member's answer is uniformly applicable (rule is in\n * `BATCHABLE_RULE_IDS`). The SKILL still emits a single-question prompt\n * when `questions.length === 1`, but the flag stays useful: a batch of one\n * for a batchable rule keeps the prompt template aligned with subsequent\n * batches in the same group.\n */\n batchable: boolean;\n questions: GotchaSurveyQuestion[];\n /**\n * Sum of `max(question.replicas, 1)` across members. Counts the actual\n * Figma scene fan-out so the SKILL can render `N instances` accurately\n * even when one batch member already collapses multiple replicas via the\n * #356 source-component dedupe.\n */\n totalScenes: number;\n}\n\nexport interface SurveyQuestionGroup {\n /**\n * The shared `instanceContext` for this group, or `null` for the trailing\n * group of non-instance questions. The SKILL emits the \"Instance note\"\n * header **once** per non-null group instead of once per question (#370).\n */\n instanceContext: InstanceContext | null;\n batches: SurveyQuestionBatch[];\n}\n\nexport interface GroupedSurvey {\n groups: SurveyQuestionGroup[];\n}\n\n/**\n * Pre-process a survey's `questions` array into the shape the\n * `canicode-roundtrip` and `canicode-gotchas` SKILLs need to prompt the user\n * with two UX optimizations baked in:\n *\n * - **#370** — source-component grouping. Consecutive questions sharing the\n * same `instanceContext.sourceComponentId` go in one group so the SKILL\n * prints the verbose \"Instance note\" paragraph once per group instead of\n * once per question.\n * - **#369** — batch-prompt for repeated identical answers. Within each\n * group, consecutive questions sharing the same `ruleId` *and* a\n * batchable answer-shape are collapsed into a single batch so the user\n * answers `min-width: 320px, max-width: 1200px` once instead of seven\n * times.\n *\n * Sort key is `(sourceComponentId ?? \"_no-source\", ruleId, nodeName)`. The\n * sentinel keeps non-instance questions contiguous at the end so they form\n * one trailing `instanceContext: null` group.\n *\n * `gotcha-survey` MCP/CLI returns the result on the `groupedQuestions`\n * field; the SKILL.md files iterate over `groups[].batches[]` directly with\n * no sort/partition logic in prose. See ADR-016.\n */\nexport function groupAndBatchSurveyQuestions(\n questions: readonly GotchaSurveyQuestion[],\n): GroupedSurvey {\n if (questions.length === 0) {\n return { groups: [] };\n }\n\n const sorted = [...questions].sort(compareQuestions);\n\n const groups: SurveyQuestionGroup[] = [];\n let currentGroup: SurveyQuestionGroup | null = null;\n let lastGroupKey: string | null = null;\n\n for (const question of sorted) {\n const groupKey = sourceComponentKey(question);\n if (currentGroup === null || groupKey !== lastGroupKey) {\n currentGroup = {\n instanceContext: question.instanceContext ?? null,\n batches: [],\n };\n groups.push(currentGroup);\n lastGroupKey = groupKey;\n }\n pushIntoBatch(currentGroup, question);\n }\n\n return { groups };\n}\n\nfunction compareQuestions(\n a: GotchaSurveyQuestion,\n b: GotchaSurveyQuestion,\n): number {\n const aKey = sourceComponentKey(a);\n const bKey = sourceComponentKey(b);\n if (aKey !== bKey) {\n if (aKey === NO_SOURCE_SENTINEL) return 1;\n if (bKey === NO_SOURCE_SENTINEL) return -1;\n return aKey.localeCompare(bKey);\n }\n if (a.ruleId !== b.ruleId) return a.ruleId.localeCompare(b.ruleId);\n if (a.nodeName !== b.nodeName) return a.nodeName.localeCompare(b.nodeName);\n return a.nodeId.localeCompare(b.nodeId);\n}\n\nfunction sourceComponentKey(question: GotchaSurveyQuestion): string {\n return question.instanceContext?.sourceComponentId ?? NO_SOURCE_SENTINEL;\n}\n\nfunction pushIntoBatch(\n group: SurveyQuestionGroup,\n question: GotchaSurveyQuestion,\n): void {\n const sceneWeight = Math.max(question.replicas ?? 1, 1);\n const isBatchable = BATCHABLE_SET.has(question.ruleId);\n const last = group.batches.at(-1);\n\n if (\n last !== undefined &&\n last.ruleId === question.ruleId &&\n isBatchable &&\n last.batchable\n ) {\n last.questions.push(question);\n last.totalScenes += sceneWeight;\n return;\n }\n\n group.batches.push({\n ruleId: question.ruleId,\n batchable: isBatchable,\n questions: [question],\n totalScenes: sceneWeight,\n });\n}\n","import type { AnalysisResult, AnalysisIssue } from \"../engine/rule-engine.js\";\nimport type { ScoreReport } from \"../engine/scoring.js\";\nimport { isReadyForCodeGen } from \"../engine/scoring.js\";\nimport type {\n GotchaSurvey,\n GotchaSurveyQuestion,\n InstanceContext,\n} from \"../contracts/gotcha-survey.js\";\nimport type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport type { RuleId } from \"../contracts/rule.js\";\nimport { GOTCHA_QUESTIONS } from \"../rules/gotcha-questions.js\";\nimport {\n isInstanceChildNodeId,\n parseInstanceChildNodeId,\n} from \"../adapters/instance-id-parser.js\";\nimport { computeApplyContext } from \"./apply-context.js\";\nimport { groupAndBatchSurveyQuestions } from \"./group-and-batch-questions.js\";\n\nconst NODE_PATH_SEPARATOR = \" > \";\n\n/**\n * Generate a gotcha survey from analysis results.\n *\n * Filters to blocking and risk severity issues, deduplicates repeated rules\n * on sibling nodes (same parent + same ruleId), orders blocking first then\n * risk by original traversal order, and maps each issue to a survey question\n * using the GOTCHA_QUESTIONS lookup.\n */\nexport function generateGotchaSurvey(\n result: AnalysisResult,\n scores: ScoreReport,\n options: { designKey?: string } = {},\n): GotchaSurvey {\n const grade = scores.overall.grade;\n\n // Step 1: Filter to blocking and risk severity only\n const relevantIssues = result.issues.filter(\n (issue) => issue.config.severity === \"blocking\" || issue.config.severity === \"risk\",\n );\n\n // Step 2: Deduplicate — same ruleId on siblings (same parent path) → keep first\n const deduped = deduplicateSiblingIssues(relevantIssues);\n\n // Step 3: Sort — blocking first, then risk; within same severity, preserve traversal order\n const sorted = stableSortBySeverity(deduped);\n\n // Step 4: Map to survey questions\n const mapped = sorted\n .map((issue) => mapToQuestion(issue, result.file))\n .filter((q): q is GotchaSurveyQuestion => q !== null);\n\n // Step 5 (#356): collapse N instance-child questions that share the same\n // `(sourceComponentId, sourceNodeId, ruleId)` tuple into ONE question that\n // names the source component. Apply step iterates the merged\n // `replicaNodeIds` so every replica still gets the answer; this saves the\n // user from answering the same question N times when the answer is single-\n // valued (e.g. 7 FILL children of `Platform=Desktop` all need the same\n // max-width). Cross-source-component dedupe is intentionally not done —\n // different source components stay separate.\n const questions = deduplicateBySourceComponent(mapped);\n\n // Step 6 (#369, #370, #381): pre-compute the grouped+batched view so the\n // SKILLs (`canicode-gotchas`, `canicode-roundtrip`) can iterate over it\n // directly without re-implementing sort / partition / batchable-rule\n // logic in prose. ADR-016.\n const groupedQuestions = groupAndBatchSurveyQuestions(questions);\n\n return {\n designGrade: grade,\n isReadyForCodeGen: isReadyForCodeGen(grade),\n questions,\n groupedQuestions,\n designKey: options.designKey ?? \"\",\n };\n}\n\n/**\n * Deduplicate issues where the same ruleId fires on multiple children of the\n * same parent. Keeps the first occurrence (preserving traversal order).\n *\n * #373: skip instance-child issues here. They are routed to the\n * source-component dedupe in Step 5, which preserves dropped scene ids on\n * `replicaNodeIds` so the apply step can fan the answer out to every replica.\n * The pre-#373 behaviour collapsed sibling instance children (e.g. `Title` +\n * `Subtitle` on the same `Card` instance — different definition nodes, same\n * `Card` parent path, same ruleId) into a single question and lost the\n * dropped scenes entirely (no `replicaNodeIds`, no annotation, no write).\n * Source-component dedupe naturally keeps different `sourceNodeId`s separate,\n * so the previously-dropped siblings now surface as their own questions.\n */\nfunction deduplicateSiblingIssues(issues: AnalysisIssue[]): AnalysisIssue[] {\n const seen = new Set<string>();\n const result: AnalysisIssue[] = [];\n\n for (const issue of issues) {\n if (isInstanceChildNodeId(issue.violation.nodeId)) {\n result.push(issue);\n continue;\n }\n const parentPath = getParentPath(issue.violation.nodePath);\n const key = `${parentPath}||${issue.violation.ruleId}`;\n\n if (!seen.has(key)) {\n seen.add(key);\n result.push(issue);\n }\n }\n\n return result;\n}\n\n/**\n * Extract the parent path from a full node path.\n * \"Root > Section > Child\" → \"Root > Section\"\n * \"Root\" → \"\" (root node has no parent)\n */\nfunction getParentPath(nodePath: string): string {\n const lastSep = nodePath.lastIndexOf(NODE_PATH_SEPARATOR);\n if (lastSep === -1) return \"\";\n return nodePath.slice(0, lastSep);\n}\n\n/**\n * Extract the node name from a full node path (last segment).\n * \"Root > Section > Child\" → \"Child\"\n */\nfunction getNodeName(nodePath: string): string {\n const lastSep = nodePath.lastIndexOf(NODE_PATH_SEPARATOR);\n if (lastSep === -1) return nodePath;\n return nodePath.slice(lastSep + NODE_PATH_SEPARATOR.length);\n}\n\n/**\n * Stable sort: blocking before risk, preserving original array order within\n * each severity group.\n */\nfunction stableSortBySeverity(issues: AnalysisIssue[]): AnalysisIssue[] {\n const blocking: AnalysisIssue[] = [];\n const risk: AnalysisIssue[] = [];\n\n for (const issue of issues) {\n if (issue.config.severity === \"blocking\") {\n blocking.push(issue);\n } else {\n risk.push(issue);\n }\n }\n\n return [...blocking, ...risk];\n}\n\n/**\n * Map an AnalysisIssue to a GotchaSurveyQuestion using the GOTCHA_QUESTIONS table.\n * Returns null if no mapping exists for the ruleId.\n */\nfunction mapToQuestion(\n issue: AnalysisIssue,\n file: AnalysisFile,\n): GotchaSurveyQuestion | null {\n const ruleId = issue.violation.ruleId as RuleId;\n const template = GOTCHA_QUESTIONS[ruleId];\n if (!template) return null;\n\n const nodeName = getNodeName(issue.violation.nodePath);\n const instanceContext = buildInstanceContext(issue.violation.nodeId, file);\n const applyContext = computeApplyContext(\n issue.violation,\n instanceContext ?? undefined,\n );\n const suggestedName = issue.violation.suggestedName;\n\n return {\n nodeId: issue.violation.nodeId,\n nodeName,\n ruleId,\n severity: issue.config.severity,\n question: template.question.replace(\"{nodeName}\", nodeName),\n hint: template.hint,\n example: template.example,\n ...(instanceContext ? { instanceContext } : {}),\n applyStrategy: applyContext.applyStrategy,\n ...(applyContext.targetProperty !== undefined\n ? { targetProperty: applyContext.targetProperty }\n : {}),\n ...(applyContext.annotationProperties !== undefined\n ? { annotationProperties: applyContext.annotationProperties }\n : {}),\n ...(suggestedName !== undefined ? { suggestedName } : {}),\n isInstanceChild: applyContext.isInstanceChild,\n ...(applyContext.sourceChildId !== undefined\n ? { sourceChildId: applyContext.sourceChildId }\n : {}),\n };\n}\n\n/**\n * Collapse questions that share the same `(sourceComponentId, sourceNodeId,\n * ruleId)` tuple. When N instance-child questions all point at the same\n * definition node inside the same source component for the same rule, the\n * answer is single-valued by definition (FILL children of `Platform=Desktop`\n * all need the same max-width) — so emit ONE question instead of N. The kept\n * question is the FIRST in the input order; subsequent matches are dropped\n * but their `nodeId`s are preserved on `replicaNodeIds` so the apply step can\n * iterate every instance scene node and land the answer on all of them.\n *\n * Out of scope: cross-source-component dedupe (e.g. \"Title\" missing-size-\n * constraint in 5 different components). Different sourceComponentIds always\n * stay separate.\n *\n * Questions without an `instanceContext` (or without both `sourceComponentId`\n * and `sourceNodeId`) are NOT touched — they pass through with no replicas\n * fields. This keeps non-instance-child questions and any partial-context\n * survivors behaving exactly as they did pre-#356.\n */\nfunction deduplicateBySourceComponent(\n questions: GotchaSurveyQuestion[],\n): GotchaSurveyQuestion[] {\n const groups = new Map<string, GotchaSurveyQuestion[]>();\n const order: string[] = [];\n let uniqueCounter = 0;\n\n for (const q of questions) {\n const ic = q.instanceContext;\n let key: string;\n if (ic && ic.sourceComponentId && ic.sourceNodeId) {\n key = `${ic.sourceComponentId}::${ic.sourceNodeId}::${q.ruleId}`;\n } else {\n // Non-deduplicable — assign a unique key so the question passes through\n // unchanged. Using a counter keeps insertion order stable.\n key = `__unique__${uniqueCounter++}`;\n }\n const bucket = groups.get(key);\n if (bucket) {\n bucket.push(q);\n } else {\n groups.set(key, [q]);\n order.push(key);\n }\n }\n\n return order.map((key) => {\n const group = groups.get(key)!;\n const first = group[0]!;\n if (group.length === 1) return first;\n\n const otherIds = group.slice(1).map((q) => q.nodeId);\n const sourceComponentName = first.instanceContext?.sourceComponentName;\n\n // Re-substitute `{nodeName}` with the source component name so the user-\n // facing question reads \"for Platform=Desktop\" instead of \"for Title\"\n // (the first instance's node name). Falls back silently when the source\n // component name was not resolved (rare — happens when the parent\n // instance's componentId is not in `file.components`).\n const template = GOTCHA_QUESTIONS[first.ruleId as RuleId];\n const renamed: GotchaSurveyQuestion = {\n ...first,\n replicas: group.length,\n replicaNodeIds: otherIds,\n };\n if (sourceComponentName) {\n renamed.nodeName = sourceComponentName;\n if (template) {\n renamed.question = template.question.replace(\n \"{nodeName}\",\n sourceComponentName,\n );\n }\n }\n return renamed;\n });\n}\n\n/**\n * Build instance context for a node id when it lives inside an instance.\n * Resolves source component name via the parent instance's componentId when\n * the parent is reachable in the analyzed subtree; falls back to the bare\n * parent/source ids otherwise so the apply pipeline can still resolve the\n * source component at runtime via `figma.getNodeById`.\n */\nfunction buildInstanceContext(\n nodeId: string,\n file: AnalysisFile,\n): InstanceContext | null {\n const parts = parseInstanceChildNodeId(nodeId);\n if (!parts) return null;\n\n const parentInstance = findNodeById(file.document, parts.parentInstanceId);\n const componentId = parentInstance?.componentId;\n const componentName = componentId ? file.components[componentId]?.name : undefined;\n\n return {\n parentInstanceNodeId: parts.parentInstanceId,\n sourceNodeId: parts.sourceNodeId,\n ...(componentId ? { sourceComponentId: componentId } : {}),\n ...(componentName ? { sourceComponentName: componentName } : {}),\n };\n}\n\n/**\n * Walk the document tree for a node id (exact match — no `-`/`:` normalization;\n * instance node ids natively use `:` and the input here is already in that form).\n */\nfunction findNodeById(node: AnalysisNode, id: string): AnalysisNode | null {\n if (node.id === id) return node;\n if (node.children) {\n for (const child of node.children) {\n const found = findNodeById(child, id);\n if (found) return found;\n }\n }\n return null;\n}\n","import type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport type { RuleConfig, RuleId } from \"../../core/contracts/rule.js\";\nimport type { GotchaSurvey } from \"../../core/contracts/gotcha-survey.js\";\nimport { analyzeFile } from \"../../core/engine/rule-engine.js\";\nimport { loadFile, isJsonFile, isFixtureDir } from \"../../core/engine/loader.js\";\nimport { getFigmaToken } from \"../../core/engine/config-store.js\";\nimport { calculateScores } from \"../../core/engine/scoring.js\";\nimport { generateGotchaSurvey } from \"../../core/gotcha/survey-generator.js\";\nimport { computeDesignKey } from \"../../core/contracts/design-key.js\";\nimport { getConfigsWithPreset, RULE_CONFIGS } from \"../../core/rules/rule-config.js\";\nimport { loadConfigFile, mergeConfigs } from \"../../core/rules/config-loader.js\";\nimport { trackEvent, trackError, EVENTS } from \"../../core/monitoring/index.js\";\n\nconst GotchaSurveyOptionsSchema = z.object({\n preset: z.enum([\"relaxed\", \"dev-friendly\", \"ai-ready\", \"strict\"]).optional(),\n token: z.string().optional(),\n config: z.string().optional(),\n targetNodeId: z.string().optional(),\n json: z.boolean().optional(),\n});\n\nexport type GotchaSurveyOptions = z.infer<typeof GotchaSurveyOptionsSchema>;\n\n/**\n * Run the gotcha-survey pipeline against a Figma URL or fixture and return\n * the survey JSON. Mirrors the MCP `gotcha-survey` tool call sequence so both\n * channels produce the same `GotchaSurvey` object.\n */\nexport async function runGotchaSurvey(\n input: string,\n options: GotchaSurveyOptions,\n): Promise<GotchaSurvey> {\n const { file, nodeId } = await loadFile(input, options.token);\n const effectiveNodeId = options.targetNodeId ?? nodeId;\n\n let configs: Record<string, RuleConfig> = options.preset\n ? { ...getConfigsWithPreset(options.preset) }\n : { ...RULE_CONFIGS };\n\n if (options.config) {\n const configFile = await loadConfigFile(options.config);\n configs = mergeConfigs(configs, configFile);\n }\n\n const result = analyzeFile(file, {\n configs: configs as Record<RuleId, RuleConfig>,\n ...(effectiveNodeId ? { targetNodeId: effectiveNodeId } : {}),\n });\n\n const scores = calculateScores(result, configs as Record<RuleId, RuleConfig>);\n return generateGotchaSurvey(result, scores, { designKey: computeDesignKey(input) });\n}\n\nfunction formatHumanSummary(survey: GotchaSurvey): string {\n const lines = [\n `Design grade: ${survey.designGrade}`,\n `Ready for code generation: ${survey.isReadyForCodeGen ? \"yes\" : \"no\"}`,\n `Questions: ${survey.questions.length}`,\n ];\n if (survey.questions.length > 0) {\n lines.push(\"\");\n lines.push(\"Use --json to get the full GotchaSurvey JSON for programmatic use.\");\n }\n return lines.join(\"\\n\");\n}\n\nexport function registerGotchaSurvey(cli: CAC): void {\n cli\n .command(\"gotcha-survey <input>\", \"Generate a gotcha survey from a Figma design analysis\")\n .option(\"--preset <preset>\", \"Analysis preset (relaxed | dev-friendly | ai-ready | strict)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .option(\"--config <path>\", \"Path to config JSON file (override rule scores/settings)\")\n .option(\"--target-node-id <id>\", \"Scope analysis to a specific node ID\")\n .option(\"--json\", \"Output GotchaSurvey JSON to stdout (same format as MCP)\")\n .example(\" canicode gotcha-survey https://www.figma.com/design/ABC123/MyDesign --json\")\n .example(\" canicode gotcha-survey ./fixtures/my-design --json\")\n .action(async (input: string, rawOptions: Record<string, unknown>) => {\n const parseResult = GotchaSurveyOptionsSchema.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, {\n source: isJsonFile(input) || isFixtureDir(input) ? \"fixture\" : \"figma\",\n tool: \"gotcha-survey\",\n });\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 try {\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 const survey = await runGotchaSurvey(input, options);\n\n if (options.json) {\n console.log(JSON.stringify(survey, null, 2));\n } else {\n log(formatHumanSummary(survey));\n }\n\n trackEvent(EVENTS.ANALYSIS_COMPLETED, {\n grade: survey.designGrade,\n questionCount: survey.questions.length,\n isReadyForCodeGen: survey.isReadyForCodeGen,\n duration: Date.now() - analysisStart,\n tool: \"gotcha-survey\",\n });\n } catch (error) {\n trackError(\n error instanceof Error ? error : new Error(String(error)),\n { command: \"gotcha-survey\", input },\n );\n trackEvent(EVENTS.ANALYSIS_FAILED, {\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - analysisStart,\n tool: \"gotcha-survey\",\n });\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error),\n );\n process.exitCode = 1;\n }\n });\n}\n","/**\n * Deterministic helpers for the `canicode-gotchas` SKILL Step 4b — file-state\n * detection and `## #NNN — ...` section walking under `# Collected Gotchas`.\n *\n * Per ADR-016, deterministic markdown parsing + arithmetic must\n * live in TypeScript with vitest coverage rather than being re-derived from\n * SKILL.md prose on every run. The previous prose described two interacting\n * state machines (4-way file state + monotonic section numbering with\n * substring-matched Design key); a single misread (forgetting zero-padding,\n * matching across the workflow region, etc.) corrupts the user's gotchas\n * file. This module owns both behaviors so the SKILL can either invoke the\n * `canicode upsert-gotcha-section` CLI subcommand or call this helper\n * directly with no algorithm prose left in the SKILL. (#385)\n */\nimport { z } from \"zod\";\n\n/**\n * The four discriminable shapes the gotchas SKILL.md file can be in when\n * the workflow tries to upsert a per-design section. The discriminants are\n * the YAML frontmatter fence (`---` on the first line) and the\n * `# Collected Gotchas` H1 heading — both shipped together by the\n * post-#340 `canicode init` install.\n *\n * - `missing`: file does not exist on disk (`content === null`).\n * - `valid`: frontmatter present AND `# Collected Gotchas` heading present.\n * - `missing-heading`: frontmatter present but no Collected Gotchas heading\n * (older workflow install, or user-edited workflow that dropped the\n * trailing heading). Recoverable — the upsert will append the heading.\n * - `clobbered`: no frontmatter at all (a pre-#340 single-design overwrite\n * rewrote the description in the YAML to the per-design variant, leaving\n * no canonical canicode-gotchas frontmatter behind). Not auto-recoverable\n * — the SKILL tells the user to run `canicode init --force`.\n */\nexport const GotchasFileStateSchema = z.enum([\n \"missing\",\n \"valid\",\n \"missing-heading\",\n \"clobbered\",\n]);\nexport type GotchasFileState = z.infer<typeof GotchasFileStateSchema>;\n\n/** Heading that delimits the per-design region from the workflow region. */\nexport const COLLECTED_GOTCHAS_HEADING = \"# Collected Gotchas\";\n\n/** Regex for the per-design section header — captures the zero-padded NNN. */\nconst SECTION_HEADER_RE = /^## #(\\d{3,}) — /gm;\n\n/**\n * Pure inspection of the file's structural shape. Pass `null` when the file\n * does not exist on disk; pass the full UTF-8 contents otherwise.\n */\nexport function detectGotchasFileState(\n content: string | null,\n): GotchasFileState {\n if (content === null) return \"missing\";\n if (!hasFrontmatter(content)) return \"clobbered\";\n if (!hasCollectedGotchasHeading(content)) return \"missing-heading\";\n return \"valid\";\n}\n\nfunction hasFrontmatter(content: string): boolean {\n // A canicode-init frontmatter starts with `---` on the very first line and\n // is closed by another `---` on its own line. We look for the closing\n // fence anywhere after position 4 — the contents can be multi-line.\n if (!content.startsWith(\"---\\n\") && !content.startsWith(\"---\\r\\n\")) {\n return false;\n }\n const rest = content.slice(4);\n return /^---\\s*$/m.test(rest);\n}\n\nfunction hasCollectedGotchasHeading(content: string): boolean {\n return /^# Collected Gotchas\\s*$/m.test(content);\n}\n\n/**\n * Plan returned by `findOrAppendSection` — describes whether the upsert is\n * a replace (existing section matched by Design key) or an append (new\n * section for an unseen design).\n */\nexport interface AppendPlan {\n action: \"append\";\n /** Zero-padded next NNN, e.g. `\"001\"` on first run, `\"004\"` after #003. */\n sectionNumber: string;\n}\nexport interface ReplacePlan {\n action: \"replace\";\n /** Preserved zero-padded NNN of the existing section. */\n sectionNumber: string;\n /**\n * `[start, end)` byte range in the input `content` covering the matched\n * `## #NNN — ...` section, terminated by the next `## #NNN — ` header or\n * end-of-file. The renderer slices these out and substitutes the new\n * section markdown.\n */\n replaceRange: [number, number];\n}\nexport type SectionPlan = AppendPlan | ReplacePlan;\n\n/**\n * Walk the per-design sections under `# Collected Gotchas`, look for one\n * whose `- **Design key**:` bullet substring-matches `designKey`, and\n * return either:\n *\n * - `{ action: \"replace\", sectionNumber, replaceRange }` when a match is\n * found (preserves the existing NNN so external references stay stable),\n * or\n * - `{ action: \"append\", sectionNumber }` otherwise, with `sectionNumber`\n * being `(highest existing NNN) + 1`, zero-padded to three digits.\n *\n * Numbering is **monotonic** across deletions — a manually deleted middle\n * section leaves a numeric gap rather than getting reused, mirroring the\n * `.claude/docs/ADR.md` convention.\n *\n * Pass the full file `content`; only the region after the\n * `# Collected Gotchas` heading is scanned, so workflow-region prose that\n * happens to mention the same `Design key` substring will not produce a\n * false replace. When the heading is absent, scanning starts at end-of-file\n * (every call returns an append plan) — combine with\n * `detectGotchasFileState` upstream so the renderer can inject the heading\n * before invoking the helper.\n */\nexport function findOrAppendSection(\n content: string,\n designKey: string,\n): SectionPlan {\n const regionStart = locateCollectedGotchasRegion(content);\n const region = content.slice(regionStart);\n\n const sections = parseSections(region);\n\n let maxNumber = 0;\n for (const section of sections) {\n if (section.numericValue > maxNumber) maxNumber = section.numericValue;\n if (sectionMatchesDesignKey(section.body, designKey)) {\n return {\n action: \"replace\",\n sectionNumber: section.padded,\n replaceRange: [\n regionStart + section.start,\n regionStart + section.end,\n ],\n };\n }\n }\n\n const next = maxNumber + 1;\n return {\n action: \"append\",\n sectionNumber: padNumber(next),\n };\n}\n\ninterface ParsedSection {\n /** The original captured `NNN` string (preserved verbatim on replace). */\n padded: string;\n /** `parseInt(padded, 10)` for max-arithmetic. */\n numericValue: number;\n /** `[start, end)` offsets within the *region* (post-`# Collected Gotchas`). */\n start: number;\n end: number;\n /** Section body text (header + bullets + inner subsections). */\n body: string;\n}\n\nfunction parseSections(region: string): ParsedSection[] {\n const sections: ParsedSection[] = [];\n const matches = [...region.matchAll(SECTION_HEADER_RE)];\n\n for (let i = 0; i < matches.length; i += 1) {\n const match = matches[i]!;\n const start = match.index!;\n const next = matches[i + 1];\n const end = next?.index ?? region.length;\n const captured = match[1]!;\n sections.push({\n padded: captured,\n numericValue: parseInt(captured, 10),\n start,\n end,\n body: region.slice(start, end),\n });\n }\n\n return sections;\n}\n\n/**\n * Locate the offset where the per-design region begins. We anchor on the\n * line **after** `# Collected Gotchas\\n` so subsequent regex matches do not\n * scan workflow-region content. When the heading is absent, the region is\n * empty (`regionStart === content.length`) and every call returns append.\n */\nfunction locateCollectedGotchasRegion(content: string): number {\n const re = /^# Collected Gotchas\\s*$/m;\n const match = re.exec(content);\n if (!match) return content.length;\n return match.index + match[0].length;\n}\n\nfunction sectionMatchesDesignKey(body: string, designKey: string): boolean {\n // The bullet shape from the Output Template: `- **Design key**: <value>`.\n // Substring match against the bullet's value preserves the SKILL prose's\n // contract (URL fragments / prefixes still match) without coupling to a\n // specific delimiter.\n const re = /^-\\s+\\*\\*Design key\\*\\*:\\s+(.+?)\\s*$/m;\n const m = body.match(re);\n if (!m) return false;\n return m[1]!.includes(designKey);\n}\n\nfunction padNumber(n: number): string {\n return n.toString().padStart(3, \"0\");\n}\n\n/**\n * Renderer that combines `detectGotchasFileState` + `findOrAppendSection`\n * with the actual byte-level replace / append (and missing-heading\n * injection) so callers — the SKILL via the new CLI subcommand, or the\n * SKILL directly with the helper exposed on the gotcha-survey response —\n * never have to do the splice themselves.\n *\n * Returns `null` for unrecoverable states (`missing`, `clobbered`); the\n * caller surfaces the user-facing decision message (the SKILL keeps those\n * since they are interactive responses, not algorithm).\n *\n * For the recoverable states the function produces the new file contents\n * with the per-design section either replaced in place or appended at the\n * bottom. `missing-heading` injects the `# Collected Gotchas` heading\n * before appending — preserving everything above unchanged, exactly as\n * the SKILL prose described.\n */\nexport interface RenderUpsertedFileResult {\n state: GotchasFileState;\n /** New file contents — `null` when `state` is `missing` or `clobbered`. */\n newContent: string | null;\n /** Plan executed (omitted for non-recoverable states). */\n plan?: SectionPlan;\n}\n\nexport function renderUpsertedFile(args: {\n currentContent: string | null;\n designKey: string;\n /**\n * Already-rendered per-design section markdown. Must start with\n * `## #{NNN} — ...` and end with a trailing newline. The renderer\n * substitutes the placeholder NNN by string-replacing the literal\n * `{{SECTION_NUMBER}}` token if present, otherwise it trusts the caller\n * to have inserted the right number — see test coverage for both shapes.\n */\n sectionMarkdown: string;\n}): RenderUpsertedFileResult {\n const { currentContent, designKey, sectionMarkdown } = args;\n const state = detectGotchasFileState(currentContent);\n\n if (state === \"missing\" || state === \"clobbered\") {\n return { state, newContent: null };\n }\n\n // From here on, currentContent is non-null (state is \"valid\" or\n // \"missing-heading\").\n let working = currentContent as string;\n\n if (state === \"missing-heading\") {\n // Preserve everything above unchanged; append the heading at the bottom\n // (with a leading blank line if the file does not already end in two\n // newlines, to keep markdown spacing consistent).\n const sep = working.endsWith(\"\\n\\n\") ? \"\" : working.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n working = `${working}${sep}${COLLECTED_GOTCHAS_HEADING}\\n`;\n }\n\n const plan = findOrAppendSection(working, designKey);\n const sectionWithNumber = sectionMarkdown.includes(\"{{SECTION_NUMBER}}\")\n ? sectionMarkdown.replace(/\\{\\{SECTION_NUMBER\\}\\}/g, plan.sectionNumber)\n : sectionMarkdown;\n\n let newContent: string;\n if (plan.action === \"replace\") {\n const [start, end] = plan.replaceRange;\n const before = working.slice(0, start);\n const after = working.slice(end);\n newContent = `${before}${ensureTrailingNewline(sectionWithNumber)}${after}`;\n } else {\n // Append after a blank line for markdown spacing; use the heading offset\n // so we always anchor inside the per-design region.\n const trimmed = working.replace(/\\s+$/, \"\");\n newContent = `${trimmed}\\n\\n${ensureTrailingNewline(sectionWithNumber)}`;\n }\n\n return { state, newContent, plan };\n}\n\nfunction ensureTrailingNewline(s: string): string {\n return s.endsWith(\"\\n\") ? s : `${s}\\n`;\n}\n","import { existsSync, readFileSync, writeFileSync } from \"node:fs\";\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport { renderUpsertedFile } from \"../../core/gotcha/upsert-gotcha-section.js\";\n\n/**\n * Atomic read → upsert → write of the per-design gotcha section into the\n * `canicode-gotchas` SKILL.md. Owns the deterministic markdown parsing\n * the SKILL used to inline as prose (file-state detection, `## #NNN — ...`\n * walking, monotonic numbering) — see ADR-016 and #385.\n *\n * Inputs:\n * - `--file <path>`: the SKILL.md path. Required.\n * - `--design-key <key>`: canonical design key from `gotcha-survey`'s\n * response. Required.\n * - `--section <markdown>`: the already-rendered per-design section body\n * the SKILL produced from its template. The header line is expected to\n * contain the literal `{{SECTION_NUMBER}}` placeholder, which this\n * command substitutes with either the preserved existing NNN (replace)\n * or the next monotonic NNN (append). If the placeholder is absent the\n * section markdown is written verbatim. Either pass via `--section` or\n * pipe through stdin (`--section -`).\n *\n * Outputs (stdout, JSON):\n * ```\n * {\n * \"state\": \"valid\" | \"missing\" | \"missing-heading\" | \"clobbered\",\n * \"action\": \"replace\" | \"append\" | null,\n * \"sectionNumber\": \"NNN\" | null,\n * \"wrote\": true | false,\n * \"userMessage\": string | null\n * }\n * ```\n *\n * For `state === \"missing\"` and `state === \"clobbered\"` the helper does\n * not write — the SKILL surfaces `userMessage` to the user (asking them to\n * run `canicode init` or `canicode init --force`) and stops.\n */\nconst UpsertOptionsSchema = z.object({\n file: z.string().min(1, \"--file is required\"),\n designKey: z.string().min(1, \"--design-key is required\"),\n section: z.string().min(1, \"--section is required (use '-' to read stdin)\"),\n});\n\ntype UpsertOptions = z.infer<typeof UpsertOptionsSchema>;\n\ninterface UpsertCliResult {\n state: string;\n action: \"replace\" | \"append\" | null;\n sectionNumber: string | null;\n wrote: boolean;\n userMessage: string | null;\n}\n\nconst USER_MESSAGES: Record<string, string> = {\n missing:\n \"Gotchas SKILL.md not found at the given path. Run `canicode init` first, then re-invoke this skill.\",\n clobbered:\n \"Your gotchas SKILL.md is missing the canicode YAML frontmatter (pre-#340 single-design clobber). Run `canicode init --force` to restore the workflow, then re-run this survey.\",\n};\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n return Buffer.concat(chunks).toString(\"utf-8\");\n}\n\nexport async function runUpsertGotchaSection(\n options: UpsertOptions,\n): Promise<UpsertCliResult> {\n const sectionMarkdown =\n options.section === \"-\" ? await readStdin() : options.section;\n\n const currentContent = existsSync(options.file)\n ? readFileSync(options.file, \"utf-8\")\n : null;\n\n const { state, newContent, plan } = renderUpsertedFile({\n currentContent,\n designKey: options.designKey,\n sectionMarkdown,\n });\n\n if (newContent === null) {\n return {\n state,\n action: null,\n sectionNumber: null,\n wrote: false,\n userMessage: USER_MESSAGES[state] ?? null,\n };\n }\n\n writeFileSync(options.file, newContent, \"utf-8\");\n return {\n state,\n action: plan?.action ?? null,\n sectionNumber: plan?.sectionNumber ?? null,\n wrote: true,\n userMessage: null,\n };\n}\n\nexport function registerUpsertGotchaSection(cli: CAC): void {\n cli\n .command(\n \"upsert-gotcha-section\",\n \"Upsert a per-design section into the canicode-gotchas SKILL.md (used by the canicode-gotchas skill — Step 4b)\",\n )\n .option(\"--file <path>\", \"Path to the canicode-gotchas SKILL.md\")\n .option(\n \"--design-key <key>\",\n \"Canonical design key from gotcha-survey's response\",\n )\n .option(\n \"--section <markdown>\",\n \"Already-rendered per-design section markdown. Use '-' to read from stdin.\",\n )\n .action(async (rawOptions: Record<string, unknown>) => {\n const parseResult = UpsertOptionsSchema.safeParse(rawOptions);\n if (!parseResult.success) {\n const msg = parseResult.error.issues\n .map((i) => `--${i.path.join(\".\")}: ${i.message}`)\n .join(\"\\n\");\n console.error(`\\nInvalid options:\\n${msg}`);\n process.exit(1);\n }\n\n try {\n const result = await runUpsertGotchaSection(parseResult.data);\n console.log(JSON.stringify(result, null, 2));\n if (!result.wrote && result.userMessage) {\n // Non-zero exit so a wrapping shell script / SKILL knows to\n // surface the userMessage and stop, rather than treating an\n // unwritten file as success.\n process.exitCode = 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 { 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 { 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 calibrate-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 {\n existsSync, mkdirSync, readdirSync, statSync, copyFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, relative } from \"node:path\";\nimport { createInterface } from \"node:readline/promises\";\nimport { fileURLToPath } from \"node:url\";\nimport { z } from \"zod\";\n\nconst InstallSkillsOptionsSchema = z.object({\n target: z.enum([\"project\", \"global\"]),\n force: z.boolean(),\n cwd: z.string().optional(),\n sourceDir: z.string().optional(),\n});\n\nexport type InstallSkillsOptions = z.input<typeof InstallSkillsOptionsSchema>;\n\nexport interface InstallSummary {\n installed: string[];\n overwritten: string[];\n skipped: string[];\n targetDir: string;\n}\n\nconst SKILL_NAMES = [\"canicode\", \"canicode-gotchas\", \"canicode-roundtrip\"] as const;\n\n// Resolve the bundled `skills/` dir at runtime. tsup bundles this module\n// into the CLI entrypoint `<pkg>/dist/cli/index.js` (splitting: false), so\n// `import.meta.url` at runtime resolves to that entrypoint — depth 2 under\n// the package root. `../../skills/` therefore lands on `<pkg>/skills/`.\n// If tsup's output layout ever changes (new entrypoint depth, splitting\n// enabled, etc.), update this URL.\nfunction defaultSourceDir(): string {\n return fileURLToPath(new URL(\"../../skills/\", import.meta.url));\n}\n\nexport async function installSkills(rawOptions: InstallSkillsOptions): Promise<InstallSummary> {\n const options = InstallSkillsOptionsSchema.parse(rawOptions);\n const sourceDir = options.sourceDir ?? defaultSourceDir();\n\n if (!existsSync(sourceDir)) {\n throw new Error(\n `Bundled skills directory not found: ${sourceDir}\\n` +\n `If you are developing canicode, run 'pnpm build' first.\\n` +\n `If you installed canicode from npm, please file a bug report — the tarball is missing skills/.`,\n );\n }\n\n const cwd = options.cwd ?? process.cwd();\n const targetDir = options.target === \"global\"\n ? join(homedir(), \".claude\", \"skills\")\n : join(cwd, \".claude\", \"skills\");\n\n mkdirSync(targetDir, { recursive: true });\n\n const summary: InstallSummary = {\n installed: [],\n overwritten: [],\n skipped: [],\n targetDir,\n };\n\n type Action = \"install\" | \"force-overwrite\" | \"needs-decision\";\n interface Op {\n src: string;\n dest: string;\n label: string;\n action: Action;\n }\n const ops: Op[] = [];\n\n for (const skillName of SKILL_NAMES) {\n const srcSkillDir = join(sourceDir, skillName);\n if (!existsSync(srcSkillDir)) {\n throw new Error(`Bundled skill directory missing: ${srcSkillDir}`);\n }\n\n const destSkillDir = join(targetDir, skillName);\n mkdirSync(destSkillDir, { recursive: true });\n\n const files = listFilesRecursive(srcSkillDir);\n for (const relPath of files) {\n const src = join(srcSkillDir, relPath);\n const dest = join(destSkillDir, relPath);\n mkdirSync(dirname(dest), { recursive: true });\n\n const label = join(skillName, relPath);\n let action: Action;\n if (!existsSync(dest)) {\n action = \"install\";\n } else if (options.force) {\n action = \"force-overwrite\";\n } else {\n action = \"needs-decision\";\n }\n ops.push({ src, dest, label, action });\n }\n }\n\n const candidates = ops.filter(op => op.action === \"needs-decision\");\n const decisions = candidates.length > 0\n ? await promptOverwriteBatch(candidates.map(op => ({ label: op.label, dest: op.dest })))\n : new Map<string, \"overwrite\" | \"skip\">();\n\n for (const op of ops) {\n if (op.action === \"install\") {\n copyFileSync(op.src, op.dest);\n summary.installed.push(op.label);\n } else if (op.action === \"force-overwrite\") {\n copyFileSync(op.src, op.dest);\n summary.overwritten.push(op.label);\n } else {\n const decision = decisions.get(op.label) ?? \"skip\";\n if (decision === \"overwrite\") {\n copyFileSync(op.src, op.dest);\n summary.overwritten.push(op.label);\n } else {\n summary.skipped.push(op.label);\n }\n }\n }\n\n return summary;\n}\n\nfunction listFilesRecursive(dir: string): string[] {\n const out: string[] = [];\n const walk = (current: string): void => {\n for (const entry of readdirSync(current)) {\n const full = join(current, entry);\n const stat = statSync(full);\n if (stat.isDirectory()) {\n walk(full);\n } else if (stat.isFile()) {\n out.push(relative(dir, full));\n }\n }\n };\n walk(dir);\n return out;\n}\n\nasync function promptOverwriteBatch(\n candidates: Array<{ label: string; dest: string }>,\n): Promise<Map<string, \"overwrite\" | \"skip\">> {\n const decisions = new Map<string, \"overwrite\" | \"skip\">();\n\n // Non-interactive (CI, piped stdin): default to skip — safer than silently\n // clobbering a user-edited skill file. Users who want unattended overwrite\n // pass --force.\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n for (const { label } of candidates) {\n decisions.set(label, \"skip\");\n }\n return decisions;\n }\n\n const rl = createInterface({ input: process.stdin, output: process.stdout });\n try {\n let mode: \"ask\" | \"all\" | \"none\" = \"ask\";\n for (const { label, dest } of candidates) {\n if (mode === \"all\") {\n decisions.set(label, \"overwrite\");\n continue;\n }\n if (mode === \"none\") {\n decisions.set(label, \"skip\");\n continue;\n }\n const answer = (await rl.question(\n `File exists: ${dest}. Overwrite? [y/N/a=all/s=skip-all] `,\n )).trim().toLowerCase();\n if (answer === \"a\") {\n decisions.set(label, \"overwrite\");\n mode = \"all\";\n } else if (answer === \"s\") {\n decisions.set(label, \"skip\");\n mode = \"none\";\n } else if (answer.startsWith(\"y\")) {\n decisions.set(label, \"overwrite\");\n } else {\n decisions.set(label, \"skip\");\n }\n }\n } finally {\n rl.close();\n }\n return decisions;\n}\n","import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nimport type { CAC } from \"cac\";\nimport { z } from \"zod\";\n\nimport {\n initAiready, getConfigPath, getReportsDir,\n} from \"../../core/engine/config-store.js\";\nimport { installSkills } from \"../skill-installer.js\";\nimport { trackEvent, EVENTS } from \"../../core/monitoring/index.js\";\n\nexport function figmaMcpRegistered(cwd: string = process.cwd()): boolean {\n try {\n const raw = readFileSync(join(cwd, \".mcp.json\"), \"utf-8\");\n const parsed = JSON.parse(raw) as { mcpServers?: Record<string, unknown> };\n const figma = parsed?.mcpServers?.[\"figma\"];\n return typeof figma === \"object\" && figma !== null;\n } catch {\n return false;\n }\n}\n\nexport function formatNextSteps(opts: {\n figmaMcpPresent: boolean;\n skillsInstalled: boolean;\n}): string {\n if (!opts.skillsInstalled) {\n return `\\n Next: canicode analyze \"https://www.figma.com/design/...\"`;\n }\n if (opts.figmaMcpPresent) {\n return [\n \"\",\n \" Next:\",\n \" 1. Restart Claude Code (the newly installed skills only load on a fresh session)\",\n \" 2. Run /canicode-roundtrip <figma-url>\",\n ].join(\"\\n\");\n }\n return [\n \"\",\n \" Next:\",\n \" 1. Install Figma MCP:\",\n \" claude mcp add -s project -t http figma https://mcp.figma.com/mcp\",\n \" 2. Restart Claude Code (so the new skills + Figma MCP tools both load)\",\n \" 3. Run /canicode-roundtrip <figma-url>\",\n ].join(\"\\n\");\n}\n\nconst InitOptionsSchema = z.object({\n token: z.string().optional(),\n global: z.boolean().optional(),\n // cac maps `--no-skills` to `skills: false` (mirrors `--no-telemetry`).\n skills: z.boolean().optional(),\n force: z.boolean().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 and install Claude Code skills to .claude/skills/\")\n .option(\"--global\", \"Install skills to ~/.claude/skills/ instead of ./.claude/skills/\")\n .option(\"--no-skills\", \"Skip skill installation (token only)\")\n .option(\"--force\", \"Overwrite existing skill files without prompting (also for non-TTY/CI)\")\n .action(async (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\n let skillStepOk = true;\n let skillSummary: { installed: number; overwritten: number; skipped: number } | undefined;\n if (options.skills !== false) {\n try {\n const summary = await installSkills({\n target: options.global ? \"global\" : \"project\",\n force: options.force ?? false,\n });\n console.log(`\\n Skills installed to: ${summary.targetDir}/`);\n console.log(` installed: ${summary.installed.length}`);\n console.log(` overwritten: ${summary.overwritten.length}`);\n console.log(` skipped: ${summary.skipped.length}`);\n if (summary.skipped.length > 0) {\n console.log(` (Re-run with --force to overwrite skipped files.)`);\n }\n skillSummary = {\n installed: summary.installed.length,\n overwritten: summary.overwritten.length,\n skipped: summary.skipped.length,\n };\n } catch (skillError) {\n console.error(\n `\\n Skill install failed: ${skillError instanceof Error ? skillError.message : String(skillError)}`,\n );\n process.exitCode = 1;\n skillStepOk = false;\n }\n }\n\n trackEvent(EVENTS.CLI_INIT, {\n skillsRequested: options.skills !== false,\n skillStepOk,\n target: options.global ? \"global\" : \"project\",\n force: options.force ?? false,\n ...(skillSummary ?? {}),\n });\n\n if (skillStepOk) {\n console.log(\n formatNextSteps({\n figmaMcpPresent: figmaMcpRegistered(),\n skillsInstalled: options.skills !== false,\n }),\n );\n }\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(`Skills:`);\n console.log(` --token also installs three Claude Code skills into ./.claude/skills/`);\n console.log(` (canicode, canicode-gotchas, canicode-roundtrip).`);\n console.log(` --global Install to ~/.claude/skills/ instead`);\n console.log(` --no-skills Skip skill install (token only)`);\n console.log(` --force Overwrite existing skill files without prompting\\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","// Internal command names — hidden from --help but still callable directly\nexport const INTERNAL_COMMANDS = [\n \"calibrate-analyze\",\n \"calibrate-evaluate\",\n \"calibrate-implement\",\n \"calibrate-gap-report\",\n \"calibrate-run\",\n \"calibrate-gather-evidence\",\n \"calibrate-finalize-debate\",\n \"calibrate-enrich-evidence\",\n \"calibrate-prune-evidence\",\n \"calibrate-save-fixture\",\n \"fixture-list\",\n \"fixture-done\",\n \"design-tree-strip\",\n \"html-postprocess\",\n \"code-metrics\",\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/calibration-compute.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/calibration-compute.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 \"./calibration-compute.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/calibration-compute.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)\"\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 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\";\nconst DEVELOP_DIR = \"logs/develop\";\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 * Create a development run directory and return its absolute path.\n * Format: `logs/develop/<issue-number>--<YYYY-MM-DD-HHMM>/`\n */\nexport function createDevelopRunDir(issueNumber: number): string {\n const timestamp = getDateTimeString();\n const dirName = buildRunDirName(String(issueNumber), timestamp);\n const dirPath = resolve(DEVELOP_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 { 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 registerCalibrateSaveFixture(cli: CAC): void {\n cli\n .command(\n \"calibrate-save-fixture <input>\",\n \"Save Figma design as a fixture directory for calibration\"\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 calibrate-save-fixture https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\")\n .example(\" canicode calibrate-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(\"calibrate-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 { 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 registerCalibrateImplement(cli: CAC): void {\n cli\n .command(\n \"calibrate-implement <input>\",\n \"Prepare design-to-code package for calibration: 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 calibrate-implement ./fixtures/my-design\")\n .example(\" canicode calibrate-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 promptPath = resolveFn(projectRoot, \".claude/agents/calibration/PROMPT.md\");\n\n let prompt = \"\";\n try {\n prompt = await rf(promptPath, \"utf-8\");\n } catch { /* not found */ }\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 { 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 { registerGotchaSurvey } from \"./commands/gotcha-survey.js\";\nimport { registerUpsertGotchaSection } from \"./commands/upsert-gotcha-section.js\";\nimport { registerDesignTree } from \"./commands/design-tree.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\";\n\nimport { INTERNAL_COMMANDS } from \"./internal-commands.js\";\n\n// Internal commands (used by subagents, hidden from user help)\n// When adding a new internal command, also add its name to internal-commands.ts\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 { registerCalibrateSaveFixture } from \"./commands/internal/calibrate-save-fixture.js\";\nimport { registerCalibrateImplement } from \"./commands/internal/calibrate-implement.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);\nregisterGotchaSurvey(cli);\nregisterUpsertGotchaSection(cli);\nregisterDesignTree(cli);\nregisterVisualCompare(cli);\nregisterInit(cli);\nregisterConfig(cli);\nregisterListRules(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);\nregisterCalibrateSaveFixture(cli);\nregisterCalibrateImplement(cli);\nregisterCodeMetrics(cli);\n\n// ============================================\n// Documentation command\n// ============================================\ncli\n .command(\"docs [topic]\", \"Show documentation (topics: setup, config, scoring, rules, visual-compare, design-tree)\")\n .action((topic?: string) => {\n handleDocs(topic);\n });\n\ncli.help((sections) => {\n // Filter internal commands from \"Commands\" and \"For more info\" sections\n for (const section of sections) {\n if (section.title === \"Commands\" || section.title?.startsWith(\"For more info\")) {\n section.body = section.body\n .split(\"\\n\")\n .filter((line: string) => !INTERNAL_COMMANDS.some((cmd) => line.includes(cmd)))\n .join(\"\\n\");\n }\n }\n\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 ` $ canicode gotcha-survey \"https://www.figma.com/design/...\" --json`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nInstallation\",\n body: [\n ` CLI: npm install -g canicode`,\n ` MCP: claude mcp add canicode -- npx --yes --package=canicode canicode-mcp`,\n ` Skills: github.com/let-sunny/canicode`,\n ].join(\"\\n\"),\n },\n );\n});\ncli.version(pkg.version);\n\ncli.parse();\n"]}