canicode 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/adapters/figma-url-parser.ts","../../src/contracts/category.ts","../../src/contracts/severity.ts","../../src/contracts/rule.ts","../../src/rules/rule-config.ts","../../src/rules/rule-registry.ts","../../src/core/rule-engine.ts","../../src/adapters/figma-client.ts","../../src/adapters/figma-transformer.ts","../../src/adapters/figma-file-loader.ts","../../src/adapters/figma-mcp-adapter.ts","../../src/core/config-store.ts","../../src/core/loader.ts","../../src/core/scoring.ts","../../src/rules/custom/custom-rule-schema.ts","../../src/rules/custom/custom-rule-loader.ts","../../src/rules/custom/config-loader.ts","../../src/report-html/index.ts","../../src/agents/contracts/calibration.ts","../../src/agents/analysis-agent.ts","../../src/agents/conversion-agent.ts","../../src/agents/evaluation-agent.ts","../../src/agents/tuning-agent.ts","../../src/agents/report-generator.ts","../../src/agents/activity-logger.ts","../../src/agents/orchestrator.ts","../../src/cli/docs.ts","../../src/rules/layout/index.ts","../../src/rules/token/index.ts","../../src/rules/component/index.ts","../../src/rules/naming/index.ts","../../src/rules/ai-readability/index.ts","../../src/rules/handoff-risk/index.ts","../../src/cli/index.ts"],"names":["z","config","existsSync","resolve","readFile","mkdirSync","isFigmaUrl","isJsonFile","loadFile","writeFile","hasAutoLayout","isContainerNode","countNodes","dirname"],"mappings":"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","file":"index.js","sourcesContent":["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\nexport function buildFigmaDeepLink(fileKey: string, nodeId: string): string {\n return `https://www.figma.com/design/${fileKey}?node-id=${encodeURIComponent(nodeId)}`;\n}\n","import { z } from \"zod\";\n\nexport const CategorySchema = z.enum([\n \"layout\",\n \"token\",\n \"component\",\n \"naming\",\n \"ai-readability\",\n \"handoff-risk\",\n]);\n\nexport type Category = z.infer<typeof CategorySchema>;\n\nexport const CATEGORIES = CategorySchema.options;\n\nexport const CATEGORY_LABELS: Record<Category, string> = {\n layout: \"Layout\",\n token: \"Design Token\",\n component: \"Component\",\n naming: \"Naming\",\n \"ai-readability\": \"AI Readability\",\n \"handoff-risk\": \"Handoff Risk\",\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 maxDepth: number;\n path: string[];\n siblings?: AnalysisNode[] | undefined;\n}\n\n/**\n * Rule violation result from check function\n */\nexport interface RuleViolation {\n ruleId: string;\n nodeId: string;\n nodePath: string;\n message: 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 // Layout (11)\n | \"no-auto-layout\"\n | \"absolute-position-in-auto-layout\"\n | \"fixed-width-in-responsive-context\"\n | \"missing-responsive-behavior\"\n | \"group-usage\"\n | \"fixed-size-in-auto-layout\"\n | \"missing-min-width\"\n | \"missing-max-width\"\n | \"deep-nesting\"\n | \"overflow-hidden-abuse\"\n | \"inconsistent-sibling-layout-direction\"\n // Token (7)\n | \"raw-color\"\n | \"raw-font\"\n | \"inconsistent-spacing\"\n | \"magic-number-spacing\"\n | \"raw-shadow\"\n | \"raw-opacity\"\n | \"multiple-fill-colors\"\n // Component (6)\n | \"missing-component\"\n | \"detached-instance\"\n | \"nested-instance-override\"\n | \"variant-not-used\"\n | \"component-property-unused\"\n | \"single-use-component\"\n // Naming (5)\n | \"default-name\"\n | \"non-semantic-name\"\n | \"inconsistent-naming-convention\"\n | \"numeric-suffix-name\"\n | \"too-long-name\"\n // AI Readability (5)\n | \"ambiguous-structure\"\n | \"z-index-dependent-layout\"\n | \"missing-layout-hint\"\n | \"invisible-layer\"\n | \"empty-frame\"\n // Handoff Risk (5)\n | \"hardcode-risk\"\n | \"text-truncation-unhandled\"\n | \"image-no-placeholder\"\n | \"prototype-link-in-design\"\n | \"no-dev-status\";\n\n/**\n * Categories that support depthWeight\n */\nexport const DEPTH_WEIGHT_CATEGORIES: Category[] = [\"layout\", \"handoff-risk\"];\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 { RuleConfig, RuleId } from \"../contracts/rule.js\";\n\n/**\n * Central configuration for all rules\n * Edit scores/severity here without touching rule logic\n */\nexport const RULE_CONFIGS: Record<RuleId, RuleConfig> = {\n // ============================================\n // Layout (11 rules)\n // ============================================\n \"no-auto-layout\": {\n severity: \"blocking\",\n score: -7,\n depthWeight: 1.5,\n enabled: true,\n },\n \"absolute-position-in-auto-layout\": {\n severity: \"blocking\",\n score: -10,\n depthWeight: 1.3,\n enabled: true,\n },\n \"fixed-width-in-responsive-context\": {\n severity: \"risk\",\n score: -4,\n depthWeight: 1.3,\n enabled: true,\n },\n \"missing-responsive-behavior\": {\n severity: \"risk\",\n score: -4,\n depthWeight: 1.5,\n enabled: true,\n },\n \"group-usage\": {\n severity: \"risk\",\n score: -5,\n depthWeight: 1.2,\n enabled: true,\n },\n \"fixed-size-in-auto-layout\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n },\n \"missing-min-width\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n },\n \"missing-max-width\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n },\n \"deep-nesting\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n options: {\n maxDepth: 5,\n },\n },\n \"overflow-hidden-abuse\": {\n severity: \"missing-info\",\n score: -3,\n enabled: true,\n },\n \"inconsistent-sibling-layout-direction\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n\n // ============================================\n // Token (7 rules)\n // ============================================\n \"raw-color\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n \"raw-font\": {\n severity: \"blocking\",\n score: -8,\n enabled: true,\n },\n \"inconsistent-spacing\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n options: {\n gridBase: 8,\n },\n },\n \"magic-number-spacing\": {\n severity: \"risk\",\n score: -4,\n enabled: true,\n options: {\n gridBase: 8,\n },\n },\n \"raw-shadow\": {\n severity: \"missing-info\",\n score: -3,\n enabled: true,\n },\n \"raw-opacity\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n \"multiple-fill-colors\": {\n severity: \"missing-info\",\n score: -3,\n enabled: true,\n options: {\n tolerance: 10,\n },\n },\n\n // ============================================\n // Component (6 rules)\n // ============================================\n \"missing-component\": {\n severity: \"risk\",\n score: -7,\n enabled: true,\n options: {\n minRepetitions: 3,\n },\n },\n \"detached-instance\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n },\n \"nested-instance-override\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n },\n \"variant-not-used\": {\n severity: \"missing-info\",\n score: -3,\n enabled: true,\n },\n \"component-property-unused\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n \"single-use-component\": {\n severity: \"suggestion\",\n score: -1,\n enabled: true,\n },\n\n // ============================================\n // Naming (5 rules)\n // ============================================\n \"default-name\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n \"non-semantic-name\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n \"inconsistent-naming-convention\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n \"numeric-suffix-name\": {\n severity: \"suggestion\",\n score: -1,\n enabled: true,\n },\n \"too-long-name\": {\n severity: \"suggestion\",\n score: -1,\n enabled: true,\n options: {\n maxLength: 50,\n },\n },\n\n // ============================================\n // AI Readability (5 rules)\n // ============================================\n \"ambiguous-structure\": {\n severity: \"blocking\",\n score: -10,\n depthWeight: 1.3,\n enabled: true,\n },\n \"z-index-dependent-layout\": {\n severity: \"risk\",\n score: -5,\n depthWeight: 1.3,\n enabled: true,\n },\n \"missing-layout-hint\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n },\n \"invisible-layer\": {\n severity: \"blocking\",\n score: -10,\n enabled: true,\n },\n \"empty-frame\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n\n // ============================================\n // Handoff Risk (5 rules)\n // ============================================\n \"hardcode-risk\": {\n severity: \"risk\",\n score: -5,\n depthWeight: 1.5,\n enabled: true,\n },\n \"text-truncation-unhandled\": {\n severity: \"risk\",\n score: -5,\n enabled: true,\n },\n \"image-no-placeholder\": {\n severity: \"missing-info\",\n score: -3,\n enabled: true,\n },\n \"prototype-link-in-design\": {\n severity: \"missing-info\",\n score: -2,\n enabled: true,\n },\n \"no-dev-status\": {\n severity: \"missing-info\",\n score: -2,\n enabled: false, // Disabled by default\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 layout and handoff issues\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n if (\n !ruleId.includes(\"layout\") &&\n !ruleId.includes(\"handoff\") &&\n !ruleId.includes(\"responsive\")\n ) {\n configs[ruleId] = { ...config, enabled: false };\n }\n }\n break;\n\n case \"ai-ready\":\n // Boost AI readability and naming rules\n for (const [id, config] of Object.entries(configs)) {\n const ruleId = id as RuleId;\n if (\n ruleId.includes(\"ambiguous\") ||\n ruleId.includes(\"structure\") ||\n ruleId.includes(\"name\")\n ) {\n configs[ruleId] = {\n ...config,\n score: Math.round(config.score * 1.5),\n };\n }\n }\n break;\n\n case \"strict\":\n // Enable all rules, increase scores\n for (const [id, config] of Object.entries(configs)) {\n configs[id as RuleId] = {\n ...config,\n enabled: true,\n score: Math.round(config.score * 1.5),\n };\n }\n break;\n }\n\n return configs;\n}\n\n/**\n * Get option value for a rule with type safety\n */\nexport function getRuleOption<T>(\n ruleId: RuleId,\n optionKey: string,\n defaultValue: T\n): T {\n const config = RULE_CONFIGS[ruleId];\n if (!config.options) return defaultValue;\n const value = config.options[optionKey];\n return (value as T) ?? defaultValue;\n}\n","import type { Rule, RuleConfig, RuleId } from \"../contracts/rule.js\";\nimport type { Category } from \"../contracts/category.js\";\nimport { RULE_CONFIGS } from \"./rule-config.js\";\n\n/**\n * Registry for all rules\n */\nclass RuleRegistry {\n private rules: Map<RuleId, Rule> = new Map();\n\n /**\n * Register a rule\n */\n register(rule: Rule): void {\n this.rules.set(rule.definition.id as RuleId, rule);\n }\n\n /**\n * Get a rule by ID\n */\n get(id: RuleId): Rule | undefined {\n return this.rules.get(id);\n }\n\n /**\n * Get all registered rules\n */\n getAll(): Rule[] {\n return Array.from(this.rules.values());\n }\n\n /**\n * Get rules by category\n */\n getByCategory(category: Category): Rule[] {\n return this.getAll().filter((rule) => rule.definition.category === category);\n }\n\n /**\n * Get enabled rules with their configs\n */\n getEnabled(configs: Record<RuleId, RuleConfig> = RULE_CONFIGS): Rule[] {\n return this.getAll().filter((rule) => {\n const config = configs[rule.definition.id as RuleId];\n return config?.enabled ?? true;\n });\n }\n\n /**\n * Get config for a rule\n */\n getConfig(\n id: RuleId,\n configs: Record<RuleId, RuleConfig> = RULE_CONFIGS\n ): RuleConfig {\n return configs[id];\n }\n\n /**\n * Check if a rule is registered\n */\n has(id: RuleId): boolean {\n return this.rules.has(id);\n }\n\n /**\n * Get count of registered rules\n */\n get size(): number {\n return this.rules.size;\n }\n}\n\n/**\n * Global rule registry instance\n */\nexport const ruleRegistry = new RuleRegistry();\n\n/**\n * Helper to create and register a rule\n */\nexport function defineRule(rule: Rule): Rule {\n ruleRegistry.register(rule);\n return rule;\n}\n","import type { AnalysisFile, AnalysisNode } from \"../contracts/figma-node.js\";\nimport type {\n Rule,\n RuleConfig,\n RuleContext,\n RuleId,\n RuleViolation,\n} from \"../contracts/rule.js\";\nimport { supportsDepthWeight } from \"../contracts/rule.js\";\nimport { ruleRegistry } from \"../rules/rule-registry.js\";\nimport { RULE_CONFIGS } from \"../rules/rule-config.js\";\n\n/**\n * Analysis issue with calculated score and metadata\n */\nexport interface AnalysisIssue {\n violation: RuleViolation;\n rule: Rule;\n config: RuleConfig;\n depth: number;\n maxDepth: number;\n calculatedScore: number;\n}\n\n/**\n * Analysis result from the rule engine\n */\nexport interface AnalysisResult {\n file: AnalysisFile;\n issues: AnalysisIssue[];\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}\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\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 }\n\n /**\n * Analyze a Figma file and return issues\n */\n analyze(file: AnalysisFile): AnalysisResult {\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 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 0,\n [],\n undefined,\n undefined\n );\n\n return {\n file,\n issues,\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 depth: number,\n path: string[],\n parent?: AnalysisNode,\n siblings?: AnalysisNode[]\n ): void {\n const nodePath = [...path, node.name];\n\n // Build context for this node\n const context: RuleContext = {\n file,\n parent,\n depth,\n maxDepth,\n path: nodePath,\n siblings,\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 // Log but don't fail on rule errors\n console.error(`Rule \"${ruleId}\" threw error on node \"${node.name}\":`, error);\n }\n }\n\n // Recurse into children\n if (node.children && node.children.length > 0) {\n for (const child of node.children) {\n this.traverseAndCheck(\n child,\n file,\n rules,\n maxDepth,\n issues,\n depth + 1,\n nodePath,\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 type { GetFileResponse } from \"@figma/rest-api-spec\";\n\nconst FIGMA_API_BASE = \"https://api.figma.com/v1\";\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 * 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<GetFileResponse> {\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<GetFileResponse>;\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 { 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 (\"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/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 (\"effects\" in node) {\n base.effects = node.effects as unknown[];\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\n // Handoff status\n if (\"devStatus\" in node && node.devStatus) {\n base.devStatus = node.devStatus as AnalysisNode[\"devStatus\"];\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\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 { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport type { GetFileResponse } from \"@figma/rest-api-spec\";\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\nimport { transformFigmaResponse } from \"./figma-transformer.js\";\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\n // Extract fileKey from filename (e.g., ABC123.json -> ABC123)\n const fileKey = basename(filePath, \".json\");\n\n return transformFigmaResponse(fileKey, data);\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 type { AnalysisFile, AnalysisNode, AnalysisNodeType } from \"../contracts/figma-node.js\";\n\n/**\n * Map MCP XML tag names to Figma AnalysisNodeType\n */\nconst TAG_TYPE_MAP: Record<string, AnalysisNodeType> = {\n canvas: \"CANVAS\",\n frame: \"FRAME\",\n group: \"GROUP\",\n section: \"SECTION\",\n component: \"COMPONENT\",\n \"component-set\": \"COMPONENT_SET\",\n instance: \"INSTANCE\",\n rectangle: \"RECTANGLE\",\n \"rounded-rectangle\": \"RECTANGLE\",\n ellipse: \"ELLIPSE\",\n vector: \"VECTOR\",\n text: \"TEXT\",\n line: \"LINE\",\n \"boolean-operation\": \"BOOLEAN_OPERATION\",\n star: \"STAR\",\n \"regular-polygon\": \"REGULAR_POLYGON\",\n slice: \"SLICE\",\n sticky: \"STICKY\",\n table: \"TABLE\",\n \"table-cell\": \"TABLE_CELL\",\n symbol: \"COMPONENT\",\n slot: \"FRAME\",\n};\n\ninterface ParsedXmlNode {\n tag: string;\n attrs: Record<string, string>;\n children: ParsedXmlNode[];\n}\n\n/**\n * Minimal XML parser for MCP metadata output.\n * Handles self-closing tags and nested elements.\n */\nfunction parseXml(xml: string): ParsedXmlNode[] {\n const nodes: ParsedXmlNode[] = [];\n const stack: ParsedXmlNode[] = [];\n // Match opening tags (with attrs), closing tags, and self-closing tags\n const tagRegex = /<(\\/?)([\\w-]+)([^>]*?)(\\/?)>/g;\n let match: RegExpExecArray | null;\n\n while ((match = tagRegex.exec(xml)) !== null) {\n const isClosing = match[1] === \"/\";\n const tagName = match[2]!;\n const attrString = match[3] ?? \"\";\n const isSelfClosing = match[4] === \"/\";\n\n if (isClosing) {\n // Pop from stack\n const finished = stack.pop();\n if (finished) {\n const parent = stack[stack.length - 1];\n if (parent) {\n parent.children.push(finished);\n } else {\n nodes.push(finished);\n }\n }\n } else {\n const attrs = parseAttributes(attrString);\n const node: ParsedXmlNode = { tag: tagName, attrs, children: [] };\n\n if (isSelfClosing) {\n const parent = stack[stack.length - 1];\n if (parent) {\n parent.children.push(node);\n } else {\n nodes.push(node);\n }\n } else {\n stack.push(node);\n }\n }\n }\n\n // Flush remaining stack\n while (stack.length > 0) {\n const finished = stack.pop()!;\n const parent = stack[stack.length - 1];\n if (parent) {\n parent.children.push(finished);\n } else {\n nodes.push(finished);\n }\n }\n\n return nodes;\n}\n\nfunction parseAttributes(attrString: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const attrRegex = /([\\w-]+)=\"([^\"]*)\"/g;\n let match: RegExpExecArray | null;\n while ((match = attrRegex.exec(attrString)) !== null) {\n const key = match[1];\n const value = match[2];\n if (key && value !== undefined) {\n attrs[key] = value;\n }\n }\n return attrs;\n}\n\n/**\n * Convert a parsed XML node to an AnalysisNode\n */\nfunction toAnalysisNode(xmlNode: ParsedXmlNode): AnalysisNode {\n const type = TAG_TYPE_MAP[xmlNode.tag] ?? \"FRAME\";\n const id = xmlNode.attrs[\"id\"] ?? \"0:0\";\n const name = xmlNode.attrs[\"name\"] ?? xmlNode.tag;\n const hidden = xmlNode.attrs[\"hidden\"] === \"true\";\n\n const x = parseFloat(xmlNode.attrs[\"x\"] ?? \"0\");\n const y = parseFloat(xmlNode.attrs[\"y\"] ?? \"0\");\n const width = parseFloat(xmlNode.attrs[\"width\"] ?? \"0\");\n const height = parseFloat(xmlNode.attrs[\"height\"] ?? \"0\");\n\n const node: AnalysisNode = {\n id,\n name,\n type,\n visible: !hidden,\n absoluteBoundingBox: { x, y, width, height },\n };\n\n if (xmlNode.children.length > 0) {\n node.children = xmlNode.children.map(toAnalysisNode);\n }\n\n return node;\n}\n\n/**\n * Parse MCP get_metadata XML output into an AnalysisFile.\n *\n * The XML represents a subtree of the Figma file. We wrap it in a\n * DOCUMENT node and fill in minimal file metadata.\n */\nexport function parseMcpMetadataXml(\n xml: string,\n fileKey: string,\n fileName?: string\n): AnalysisFile {\n const parsed = parseXml(xml);\n\n // The root XML elements become children of the document\n const children = parsed.map(toAnalysisNode);\n\n // If there's exactly one root element, use it directly as the document root\n // Otherwise wrap in a DOCUMENT node\n let document: AnalysisNode;\n if (children.length === 1 && children[0]) {\n document = children[0];\n } else {\n document = {\n id: \"0:0\",\n name: \"Document\",\n type: \"DOCUMENT\",\n visible: true,\n children,\n };\n }\n\n return {\n fileKey,\n name: fileName ?? fileKey,\n lastModified: new Date().toISOString(),\n version: \"mcp\",\n document,\n components: {},\n styles: {},\n };\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\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}\n\nfunction ensureDir(dir: string): void {\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\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\", \"utf-8\");\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(REPORTS_DIR);\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","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { FigmaClient } from \"../adapters/figma-client.js\";\nimport { loadFigmaFileFromJson } from \"../adapters/figma-file-loader.js\";\nimport { transformFigmaResponse } from \"../adapters/figma-transformer.js\";\nimport { parseFigmaUrl } from \"../adapters/figma-url-parser.js\";\nimport { parseMcpMetadataXml } from \"../adapters/figma-mcp-adapter.js\";\nimport { getFigmaToken } from \"./config-store.js\";\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\n\nexport type LoadMode = \"mcp\" | \"api\" | \"auto\";\n\nexport interface LoadResult {\n file: AnalysisFile;\n nodeId?: string | undefined;\n}\n\nexport function isFigmaUrl(input: string): boolean {\n return input.includes(\"figma.com/\");\n}\n\nexport function isJsonFile(input: string): boolean {\n return input.endsWith(\".json\");\n}\n\nexport async function loadFile(\n input: string,\n token?: string,\n mode: LoadMode = \"auto\"\n): Promise<LoadResult> {\n if (isJsonFile(input)) {\n const filePath = resolve(input);\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n console.log(`Loading from JSON: ${filePath}`);\n return { file: await loadFigmaFileFromJson(filePath) };\n }\n\n if (isFigmaUrl(input)) {\n const { fileKey, nodeId, fileName } = parseFigmaUrl(input);\n\n if (mode === \"mcp\") {\n return loadFromMcp(fileKey, nodeId, fileName);\n }\n\n if (mode === \"api\") {\n return loadFromApi(fileKey, nodeId, token);\n }\n\n // Auto mode: try MCP first, fallback to API\n try {\n console.log(\"Auto-detecting data source... trying MCP first.\");\n return await loadFromMcp(fileKey, nodeId, fileName);\n } catch (mcpError) {\n const mcpMsg = mcpError instanceof Error ? mcpError.message : String(mcpError);\n console.log(`MCP unavailable (${mcpMsg}). Falling back to REST API.`);\n return loadFromApi(fileKey, nodeId, token);\n }\n }\n\n throw new Error(\n `Invalid input: ${input}. Provide a Figma URL or JSON file path.`\n );\n}\n\nasync function loadFromMcp(\n fileKey: string,\n nodeId: string | undefined,\n fileName: string | undefined\n): Promise<LoadResult> {\n console.log(`Loading via MCP: ${fileKey} (node: ${nodeId ?? \"root\"})`);\n const file = await loadViaMcp(fileKey, nodeId ?? \"0:1\", fileName);\n return { file, nodeId };\n}\n\nasync function loadFromApi(\n fileKey: string,\n nodeId: string | undefined,\n token?: string\n): Promise<LoadResult> {\n console.log(`Fetching from Figma REST API: ${fileKey}`);\n if (nodeId) {\n console.log(`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 const response = await client.getFile(fileKey);\n return {\n file: transformFigmaResponse(fileKey, response),\n nodeId,\n };\n}\n\n/**\n * Load Figma data via MCP Desktop bridge (no REST API, no rate limit).\n * Only works when called from CLI with Claude Code available.\n */\nasync function loadViaMcp(\n fileKey: string,\n nodeId: string,\n fileName?: string\n): Promise<AnalysisFile> {\n const { execSync } = await import(\"node:child_process\");\n\n const result = execSync(\n `claude --print \"Use the mcp__figma__get_metadata tool with fileKey=\\\\\"${fileKey}\\\\\" and nodeId=\\\\\"${nodeId.replace(/-/g, \":\")}\\\\\" — return ONLY the raw XML output, nothing else.\"`,\n { encoding: \"utf-8\", timeout: 120000 }\n );\n\n const xmlStart = result.indexOf(\"<\");\n const xmlEnd = result.lastIndexOf(\">\");\n if (xmlStart === -1 || xmlEnd === -1) {\n throw new Error(\"MCP did not return valid XML metadata\");\n }\n const xml = result.slice(xmlStart, xmlEnd + 1);\n\n return parseMcpMetadataXml(xml, fileKey, fileName);\n}\n","import type { Category } from \"../contracts/category.js\";\nimport { CATEGORIES } from \"../contracts/category.js\";\nimport type { Severity } from \"../contracts/severity.js\";\nimport type { AnalysisResult } from \"./rule-engine.js\";\n\n/**\n * Score breakdown for a single category\n */\nexport interface CategoryScoreResult {\n category: Category;\n score: number;\n maxScore: number;\n percentage: number;\n issueCount: number;\n uniqueRuleCount: number;\n weightedIssueCount: number;\n densityScore: number;\n diversityScore: number;\n bySeverity: Record<Severity, number>;\n}\n\n/**\n * Overall score report\n */\nexport interface ScoreReport {\n overall: {\n score: number;\n maxScore: number;\n percentage: number;\n grade: Grade;\n };\n byCategory: Record<Category, CategoryScoreResult>;\n summary: {\n totalIssues: number;\n blocking: number;\n risk: number;\n missingInfo: number;\n suggestion: number;\n nodeCount: number;\n };\n}\n\n/**\n * Grade levels based on percentage\n */\nexport type Grade = \"S\" | \"A+\" | \"A\" | \"B+\" | \"B\" | \"C+\" | \"C\" | \"D\" | \"F\";\n\n/**\n * Severity weights for density calculation\n */\nconst SEVERITY_DENSITY_WEIGHT: Record<Severity, number> = {\n blocking: 3.0,\n risk: 2.0,\n \"missing-info\": 1.0,\n suggestion: 0.5,\n};\n\n/**\n * Total rules per category\n */\nconst TOTAL_RULES_PER_CATEGORY: Record<Category, number> = {\n layout: 11,\n token: 7,\n component: 6,\n naming: 5,\n \"ai-readability\": 5,\n \"handoff-risk\": 5,\n};\n\n/**\n * Category weights for overall score (all equal by default)\n */\nconst CATEGORY_WEIGHT: Record<Category, number> = {\n layout: 1.0,\n token: 1.0,\n component: 1.0,\n naming: 1.0,\n \"ai-readability\": 1.0,\n \"handoff-risk\": 1.0,\n};\n\n/**\n * Score composition weights\n */\nconst DENSITY_WEIGHT = 0.7;\nconst DIVERSITY_WEIGHT = 0.3;\n\n/**\n * Minimum score floor\n */\nconst SCORE_FLOOR = 5;\n\n/**\n * Calculate grade from percentage\n */\nfunction calculateGrade(percentage: number): Grade {\n if (percentage >= 95) return \"S\";\n if (percentage >= 90) return \"A+\";\n if (percentage >= 85) return \"A\";\n if (percentage >= 80) return \"B+\";\n if (percentage >= 75) return \"B\";\n if (percentage >= 70) return \"C+\";\n if (percentage >= 65) return \"C\";\n if (percentage >= 50) return \"D\";\n return \"F\";\n}\n\n/**\n * Convert grade to a CSS-safe class name suffix\n * e.g. \"A+\" -> \"Aplus\", \"B+\" -> \"Bplus\", \"C+\" -> \"Cplus\"\n */\nexport function gradeToClassName(grade: Grade): string {\n return grade.replace(\"+\", \"plus\");\n}\n\n/**\n * Clamp a value between min and max\n */\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * Calculate scores from analysis result using density + diversity scoring\n *\n * Density Score = 100 - (weighted issue count / node count) * 100\n * Diversity Score = (1 - unique rules / total category rules) * 100\n * Final Score = density * 0.7 + diversity * 0.3\n */\nexport function calculateScores(result: AnalysisResult): ScoreReport {\n const categoryScores = initializeCategoryScores();\n const nodeCount = result.nodeCount;\n\n // Track unique rules per category\n const uniqueRulesPerCategory = new Map<Category, Set<string>>();\n for (const category of CATEGORIES) {\n uniqueRulesPerCategory.set(category, new Set());\n }\n\n // Count issues by severity per category and track unique rules\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 categoryScores[category].weightedIssueCount += SEVERITY_DENSITY_WEIGHT[severity];\n uniqueRulesPerCategory.get(category)!.add(ruleId);\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 const totalRules = TOTAL_RULES_PER_CATEGORY[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: fewer unique rules = higher score (issues are concentrated)\n // If no issues, diversity score is 100 (perfect)\n let diversityScore = 100;\n if (catScore.issueCount > 0) {\n const diversityRatio = uniqueRules.size / totalRules;\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 weighted average of categories\n let totalWeight = 0;\n let weightedSum = 0;\n\n for (const category of CATEGORIES) {\n const weight = CATEGORY_WEIGHT[category];\n weightedSum += categoryScores[category].percentage * weight;\n totalWeight += weight;\n }\n\n const overallPercentage = totalWeight > 0\n ? Math.round(weightedSum / totalWeight)\n : 100;\n\n // Count issues by severity\n const summary = {\n totalIssues: result.issues.length,\n blocking: 0,\n risk: 0,\n missingInfo: 0,\n suggestion: 0,\n nodeCount,\n };\n\n for (const issue of result.issues) {\n switch (issue.config.severity) {\n case \"blocking\":\n summary.blocking++;\n break;\n case \"risk\":\n summary.risk++;\n break;\n case \"missing-info\":\n summary.missingInfo++;\n break;\n case \"suggestion\":\n summary.suggestion++;\n break;\n }\n }\n\n return {\n overall: {\n score: overallPercentage,\n maxScore: 100,\n percentage: overallPercentage,\n grade: calculateGrade(overallPercentage),\n },\n byCategory: categoryScores,\n summary,\n };\n}\n\n/**\n * Initialize empty category scores\n */\nfunction initializeCategoryScores(): Record<Category, CategoryScoreResult> {\n const scores: Partial<Record<Category, CategoryScoreResult>> = {};\n\n for (const category of CATEGORIES) {\n scores[category] = {\n category,\n score: 100,\n maxScore: 100,\n percentage: 100,\n issueCount: 0,\n uniqueRuleCount: 0,\n weightedIssueCount: 0,\n densityScore: 100,\n diversityScore: 100,\n bySeverity: {\n blocking: 0,\n risk: 0,\n \"missing-info\": 0,\n suggestion: 0,\n },\n };\n }\n\n return scores as Record<Category, CategoryScoreResult>;\n}\n\n/**\n * Format score report as a summary string\n */\nexport function formatScoreSummary(report: ScoreReport): string {\n const lines: string[] = [];\n\n lines.push(`Overall: ${report.overall.grade} (${report.overall.percentage}%)`);\n lines.push(\"\");\n lines.push(\"By Category:\");\n\n for (const category of CATEGORIES) {\n const cat = report.byCategory[category];\n lines.push(` ${category}: ${cat.percentage}% (${cat.issueCount} issues, ${cat.uniqueRuleCount} rules)`);\n }\n\n lines.push(\"\");\n lines.push(\"Issues:\");\n lines.push(` Blocking: ${report.summary.blocking}`);\n lines.push(` Risk: ${report.summary.risk}`);\n lines.push(` Missing Info: ${report.summary.missingInfo}`);\n lines.push(` Suggestion: ${report.summary.suggestion}`);\n lines.push(` Total: ${report.summary.totalIssues}`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get category label for display\n */\nexport function getCategoryLabel(category: Category): string {\n const labels: Record<Category, string> = {\n layout: \"Layout\",\n token: \"Design Token\",\n component: \"Component\",\n naming: \"Naming\",\n \"ai-readability\": \"AI Readability\",\n \"handoff-risk\": \"Handoff Risk\",\n };\n return 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","import { z } from \"zod\";\nimport { CategorySchema } from \"../../contracts/category.js\";\nimport { SeveritySchema } from \"../../contracts/severity.js\";\n\nexport const CustomRuleSchema = z.object({\n id: z.string(),\n category: CategorySchema,\n severity: SeveritySchema,\n score: z.number().int().max(0),\n prompt: z.string(),\n why: z.string(),\n impact: z.string(),\n fix: z.string(),\n});\n\nexport type CustomRule = z.infer<typeof CustomRuleSchema>;\n\nexport const CustomRulesFileSchema = z.array(CustomRuleSchema);\n","import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { Rule, RuleConfig, RuleViolation, RuleContext } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { CustomRulesFileSchema, type CustomRule } from \"./custom-rule-schema.js\";\n\n/**\n * Load custom rules from a JSON file and return Rule objects + their configs\n */\nexport async function loadCustomRules(filePath: string): Promise<{\n rules: Rule[];\n configs: Record<string, RuleConfig>;\n}> {\n const absPath = resolve(filePath);\n const raw = await readFile(absPath, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n const customRules = CustomRulesFileSchema.parse(parsed);\n\n const rules: Rule[] = [];\n const configs: Record<string, RuleConfig> = {};\n\n for (const cr of customRules) {\n rules.push(toRule(cr));\n configs[cr.id] = {\n severity: cr.severity,\n score: cr.score,\n enabled: true,\n };\n }\n\n return { rules, configs };\n}\n\nfunction toRule(cr: CustomRule): Rule {\n return {\n definition: {\n id: cr.id,\n name: cr.id.replace(/-/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()),\n category: cr.category,\n why: cr.why,\n impact: cr.impact,\n fix: cr.fix,\n },\n check: createPromptBasedCheck(cr),\n };\n}\n\n/**\n * Custom rules use a prompt-based check that pattern-matches on node properties.\n * The prompt field describes what to look for - this is a simple heuristic check\n * that flags nodes matching the category/type pattern.\n *\n * For now, custom rules are registered as no-ops (they return null).\n * Future: integrate with LLM for prompt-based evaluation.\n */\nfunction createPromptBasedCheck(_cr: CustomRule) {\n return (\n node: AnalysisNode,\n _context: RuleContext,\n ): RuleViolation | null => {\n // Custom rules are prompt-based - they need LLM evaluation or explicit matchers.\n // Skip non-visual nodes\n if (node.type === \"DOCUMENT\" || node.type === \"CANVAS\") return null;\n\n // Placeholder: custom rules need LLM evaluation or explicit matcher\n return null;\n };\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\";\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 colorTolerance: z.number().int().positive().optional(),\n rules: z.record(z.string(), RuleOverrideSchema).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 global colorTolerance\n if (overrides.colorTolerance !== undefined) {\n for (const [id, config] of Object.entries(merged)) {\n if (config.options && \"tolerance\" in config.options) {\n merged[id] = {\n ...config,\n options: { ...config.options, tolerance: overrides.colorTolerance },\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","// Report HTML module - shadcn/ui styled HTML report generation\n\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\nimport type { Category } from \"../contracts/category.js\";\nimport type { Severity } from \"../contracts/severity.js\";\nimport { CATEGORIES, CATEGORY_LABELS } from \"../contracts/category.js\";\nimport { SEVERITY_LABELS } from \"../contracts/severity.js\";\nimport type { AnalysisResult, AnalysisIssue } from \"../core/rule-engine.js\";\nimport type { ScoreReport, Grade } from \"../core/scoring.js\";\nimport { buildFigmaDeepLink } from \"../adapters/figma-url-parser.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\n// Gauge geometry\nconst GAUGE_R = 54;\nconst GAUGE_C = Math.round(2 * Math.PI * GAUGE_R); // ~339\n\nconst CATEGORY_DESCRIPTIONS: Record<Category, string> = {\n layout: \"Auto Layout, responsive constraints, nesting depth, absolute positioning\",\n token: \"Design token binding for colors, fonts, shadows, spacing grid\",\n component: \"Component reuse, detached instances, variant coverage\",\n naming: \"Semantic layer names, naming conventions, default names\",\n \"ai-readability\": \"Structure clarity for AI code generation, z-index, empty frames\",\n \"handoff-risk\": \"Hardcoded values, text truncation, image placeholders, dev status\",\n};\n\nconst SEVERITY_ORDER: Severity[] = [\"blocking\", \"risk\", \"missing-info\", \"suggestion\"];\n\nfunction gaugeColor(pct: number): string {\n if (pct >= 75) return \"#22c55e\";\n if (pct >= 50) return \"#f59e0b\";\n return \"#ef4444\";\n}\n\nfunction severityBadge(sev: Severity): string {\n const map: Record<Severity, string> = {\n blocking: \"bg-red-500/10 text-red-600 border-red-500/20\",\n risk: \"bg-amber-500/10 text-amber-600 border-amber-500/20\",\n \"missing-info\": \"bg-zinc-500/10 text-zinc-600 border-zinc-500/20\",\n suggestion: \"bg-green-500/10 text-green-600 border-green-500/20\",\n };\n return map[sev];\n}\n\nfunction scoreBadgeStyle(pct: number): string {\n if (pct >= 75) return \"bg-green-500/10 text-green-700 border-green-500/20\";\n if (pct >= 50) return \"bg-amber-500/10 text-amber-700 border-amber-500/20\";\n return \"bg-red-500/10 text-red-700 border-red-500/20\";\n}\n\nfunction severityDot(sev: Severity): string {\n const map: Record<Severity, string> = {\n blocking: \"bg-red-500\",\n risk: \"bg-amber-500\",\n \"missing-info\": \"bg-zinc-400\",\n suggestion: \"bg-green-500\",\n };\n return map[sev];\n}\n\n// ---- Main ----\n\nexport function generateHtmlReport(\n file: AnalysisFile,\n result: AnalysisResult,\n scores: ScoreReport,\n options?: HtmlReportOptions\n): string {\n const screenshotMap = new Map(\n (options?.nodeScreenshots ?? []).map((ns) => [ns.nodeId, ns])\n );\n const figmaToken = options?.figmaToken;\n const quickWins = getQuickWins(result.issues, 5);\n const issuesByCategory = groupIssuesByCategory(result.issues);\n\n return `<!DOCTYPE html>\n<html lang=\"en\" class=\"antialiased\">\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 <script src=\"https://cdn.tailwindcss.com\"></script>\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 <script>\n tailwind.config = {\n theme: {\n extend: {\n fontFamily: { sans: ['Inter', 'ui-sans-serif', 'system-ui', '-apple-system', 'sans-serif'] },\n colors: {\n border: 'hsl(240 5.9% 90%)',\n ring: 'hsl(240 5.9% 10%)',\n background: 'hsl(0 0% 100%)',\n foreground: 'hsl(240 10% 3.9%)',\n muted: { DEFAULT: 'hsl(240 4.8% 95.9%)', foreground: 'hsl(240 3.8% 46.1%)' },\n card: { DEFAULT: 'hsl(0 0% 100%)', foreground: 'hsl(240 10% 3.9%)' },\n },\n borderRadius: { lg: '0.5rem', md: 'calc(0.5rem - 2px)', sm: 'calc(0.5rem - 4px)' },\n }\n }\n }\n </script>\n <style>\n details summary::-webkit-details-marker { display: none; }\n details summary::marker { content: \"\"; }\n details summary { list-style: none; }\n .gauge-fill { transition: stroke-dashoffset 0.8s cubic-bezier(0.4,0,0.2,1); }\n @media print {\n .no-print { display: none !important; }\n .topbar-print { position: static !important; background: white !important; color: hsl(240 10% 3.9%) !important; }\n }\n </style>\n</head>\n<body class=\"bg-muted font-sans text-foreground min-h-screen\">\n\n <!-- Top Bar -->\n <header class=\"topbar-print sticky top-0 z-50 bg-zinc-950 text-white border-b border-zinc-800\">\n <div class=\"max-w-[960px] mx-auto px-6 py-3 flex items-center gap-4\">\n <span class=\"font-semibold text-sm tracking-tight\">CanICode</span>\n <span class=\"text-zinc-400 text-sm truncate\">${esc(file.name)}</span>\n <span class=\"ml-auto text-zinc-500 text-xs no-print\">${new Date().toLocaleDateString()}</span>\n </div>\n </header>\n\n <main class=\"max-w-[960px] mx-auto px-6 pb-16\">\n\n <!-- Overall Score -->\n <section class=\"flex flex-col items-center pt-12 pb-6\">\n ${renderGaugeSvg(scores.overall.percentage, 200, 10, scores.overall.grade)}\n <div class=\"mt-3 text-center\">\n <span class=\"text-lg font-semibold\">${scores.overall.percentage}</span>\n <span class=\"text-muted-foreground text-sm ml-1\">/ 100</span>\n </div>\n <p class=\"text-muted-foreground text-sm mt-1\">Overall Score</p>\n </section>\n\n <!-- Category Gauges -->\n <section class=\"bg-card border border-border rounded-lg shadow-sm p-6 mb-6\">\n <div class=\"grid grid-cols-3 sm:grid-cols-6 gap-4\">\n${CATEGORIES.map(cat => {\n const cs = scores.byCategory[cat];\n const desc = CATEGORY_DESCRIPTIONS[cat];\n return ` <div class=\"flex flex-col items-center group relative\">\n ${renderGaugeSvg(cs.percentage, 100, 7)}\n <span class=\"text-xs font-medium mt-2.5 text-center leading-tight\">${CATEGORY_LABELS[cat]}</span>\n <span class=\"text-[11px] text-muted-foreground\">${cs.issueCount} issues</span>\n <div class=\"absolute bottom-full mb-2 left-1/2 -translate-x-1/2 hidden group-hover:block bg-zinc-900 text-white text-xs px-3 py-2 rounded-md whitespace-nowrap z-10 shadow-lg pointer-events-none\">\n ${esc(desc)}\n <div class=\"absolute top-full left-1/2 -translate-x-1/2 border-4 border-transparent border-t-zinc-900\"></div>\n </div>\n </div>`;\n }).join(\"\\n\")}\n </div>\n </section>\n\n <!-- Issue Summary -->\n <section class=\"bg-card border border-border rounded-lg shadow-sm p-4 mb-6\">\n <div class=\"flex flex-wrap items-center justify-center gap-6\">\n ${renderSummaryDot(\"bg-red-500\", scores.summary.blocking, \"Blocking\")}\n ${renderSummaryDot(\"bg-amber-500\", scores.summary.risk, \"Risk\")}\n ${renderSummaryDot(\"bg-zinc-400\", scores.summary.missingInfo, \"Missing Info\")}\n ${renderSummaryDot(\"bg-green-500\", scores.summary.suggestion, \"Suggestion\")}\n <div class=\"border-l border-border pl-6 flex items-center gap-2\">\n <span class=\"text-xl font-bold tracking-tight\">${scores.summary.totalIssues}</span>\n <span class=\"text-sm text-muted-foreground\">Total</span>\n </div>\n </div>\n </section>\n\n${quickWins.length > 0 ? renderOpportunities(quickWins, file.fileKey) : \"\"}\n\n <!-- Categories -->\n <div class=\"space-y-3\">\n${CATEGORIES.map(cat => renderCategory(cat, scores, issuesByCategory.get(cat) ?? [], file.fileKey, screenshotMap, figmaToken)).join(\"\\n\")}\n </div>\n\n <!-- Footer -->\n <footer class=\"mt-12 pt-6 border-t border-border text-center\">\n <p class=\"text-sm text-muted-foreground\">Generated by <span class=\"font-semibold text-foreground\">CanICode</span></p>\n <p class=\"text-xs text-muted-foreground/60 mt-1\">${new Date().toLocaleString()} · ${result.nodeCount} nodes · Max depth ${result.maxDepth}</p>\n </footer>\n\n </main>\n\n${figmaToken ? ` <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 rule = btn.dataset.rule;\n const message = btn.dataset.message;\n const path = btn.dataset.path;\n const fix = btn.dataset.fix;\n const why = btn.dataset.why;\n const impact = btn.dataset.impact;\n\n const commentBody = '[CanICode] ' + rule + '\\\\n\\\\nFix: ' + fix + '\\\\nWhy: ' + why + '\\\\nImpact: ' + impact + '\\\\n\\\\n' + message + '\\\\nNode: ' + path;\n\n btn.disabled = true;\n btn.textContent = 'Sending...';\n\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: nodeId } }),\n });\n if (!res.ok) throw new Error(await res.text());\n btn.textContent = 'Sent \\\\u2713';\n btn.classList.remove('hover:bg-muted');\n btn.classList.add('text-green-600', 'border-green-500/30');\n } catch (e) {\n btn.textContent = 'Failed \\\\u2717';\n btn.classList.remove('hover:bg-muted');\n btn.classList.add('text-red-600', 'border-red-500/30');\n btn.disabled = false;\n console.error('Failed to post Figma comment:', e);\n }\n }\n </script>` : \"\"}\n</body>\n</html>`;\n}\n\n// ---- Components ----\n\nfunction renderGaugeSvg(pct: number, size: number, strokeW: number, grade?: Grade): string {\n const offset = GAUGE_C * (1 - pct / 100);\n const color = gaugeColor(pct);\n if (grade) {\n // Large gauge with grade inside\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" class=\"block\">\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke-width=\"${strokeW}\" class=\"stroke-border\" />\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=\"52\" font-weight=\"700\" class=\"font-sans\">${esc(grade)}</text>\n </svg>`;\n }\n const fontSize = 32;\n return `<svg width=\"${size}\" height=\"${size}\" viewBox=\"0 0 120 120\" class=\"block\">\n <circle cx=\"60\" cy=\"60\" r=\"${GAUGE_R}\" fill=\"none\" stroke-width=\"${strokeW}\" class=\"stroke-border\" />\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=\"${fontSize}\" font-weight=\"700\" class=\"font-sans\">${pct}</text>\n </svg>`;\n}\n\nfunction renderSummaryDot(dotClass: string, count: number, label: string): string {\n return `<div class=\"flex items-center gap-2\">\n <span class=\"w-2.5 h-2.5 rounded-full ${dotClass}\"></span>\n <span class=\"text-lg font-bold tracking-tight\">${count}</span>\n <span class=\"text-sm text-muted-foreground\">${label}</span>\n </div>`;\n}\n\n\nfunction renderOpportunities(issues: AnalysisIssue[], fileKey: string): string {\n const maxAbs = issues.reduce((m, i) => Math.max(m, Math.abs(i.calculatedScore)), 1);\n return `\n <!-- Opportunities -->\n <section class=\"bg-card border border-border rounded-lg shadow-sm mb-6 overflow-hidden\">\n <div class=\"px-6 py-4 border-b border-border\">\n <h2 class=\"text-sm font-semibold flex items-center gap-2\">\n <span class=\"w-2 h-2 rounded-full bg-red-500\"></span>\n Opportunities\n </h2>\n <p class=\"text-xs text-muted-foreground mt-1\">Top blocking issues — fix these first for the biggest improvement.</p>\n </div>\n <div class=\"divide-y divide-border\">\n${issues.map(issue => {\n const def = issue.rule.definition;\n const link = buildFigmaDeepLink(fileKey, issue.violation.nodeId);\n const barW = Math.round((Math.abs(issue.calculatedScore) / maxAbs) * 100);\n return ` <div class=\"px-6 py-3 flex items-center gap-4 hover:bg-muted/50 transition-colors\">\n <div class=\"flex-1 min-w-0\">\n <div class=\"text-sm font-medium truncate\">${esc(def.name)}</div>\n <div class=\"text-xs text-muted-foreground truncate mt-0.5\">${esc(issue.violation.message)}</div>\n </div>\n <div class=\"w-32 flex items-center gap-2 shrink-0\">\n <div class=\"flex-1 h-1.5 bg-muted rounded-full overflow-hidden\">\n <div class=\"h-full bg-red-500 rounded-full\" style=\"width:${barW}%\"></div>\n </div>\n <span class=\"text-xs font-medium text-red-600 w-12 text-right\">${issue.calculatedScore}</span>\n </div>\n <a href=\"${link}\" target=\"_blank\" rel=\"noopener\" class=\"text-xs text-muted-foreground hover:text-foreground shrink-0 no-print\">Figma →</a>\n </div>`;\n }).join(\"\\n\")}\n </div>\n </section>`;\n}\n\nfunction renderCategory(\n cat: Category,\n scores: ScoreReport,\n issues: AnalysisIssue[],\n fileKey: string,\n screenshotMap: Map<string, NodeScreenshot>,\n figmaToken?: string\n): string {\n const cs = scores.byCategory[cat];\n const hasProblems = issues.some(i => i.config.severity === \"blocking\" || i.config.severity === \"risk\");\n\n const bySeverity = new Map<Severity, AnalysisIssue[]>();\n for (const sev of SEVERITY_ORDER) bySeverity.set(sev, []);\n for (const issue of issues) bySeverity.get(issue.config.severity)?.push(issue);\n\n return `\n <details class=\"bg-card border border-border rounded-lg shadow-sm overflow-hidden group\"${hasProblems ? \" open\" : \"\"}>\n <summary class=\"px-5 py-3.5 flex items-center gap-3 cursor-pointer hover:bg-muted/50 transition-colors select-none\">\n <span class=\"inline-flex items-center justify-center w-10 h-6 rounded-md text-xs font-bold border ${scoreBadgeStyle(cs.percentage)}\">${cs.percentage}</span>\n <div class=\"flex-1 min-w-0\">\n <div class=\"text-sm font-semibold\">${CATEGORY_LABELS[cat]}</div>\n <div class=\"text-xs text-muted-foreground\">${esc(CATEGORY_DESCRIPTIONS[cat])}</div>\n </div>\n <span class=\"text-xs text-muted-foreground\">${cs.issueCount} issues</span>\n <svg class=\"w-4 h-4 text-muted-foreground transition-transform group-open:rotate-180 shrink-0 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=\"border-t border-border\">\n${issues.length === 0\n ? ' <div class=\"px-5 py-4 text-sm text-green-600 font-medium\">No issues found</div>'\n : SEVERITY_ORDER\n .filter(sev => (bySeverity.get(sev)?.length ?? 0) > 0)\n .map(sev => renderSeverityGroup(sev, bySeverity.get(sev) ?? [], fileKey, screenshotMap, figmaToken))\n .join(\"\\n\")\n}\n </div>\n </details>`;\n}\n\nfunction renderSeverityGroup(\n sev: Severity,\n issues: AnalysisIssue[],\n fileKey: string,\n screenshotMap: Map<string, NodeScreenshot>,\n figmaToken?: string\n): string {\n return ` <div class=\"px-5 py-3\">\n <div class=\"flex items-center gap-2 mb-2\">\n <span class=\"w-2 h-2 rounded-full ${severityDot(sev)}\"></span>\n <span class=\"text-xs font-semibold uppercase tracking-wider\">${SEVERITY_LABELS[sev]}</span>\n <span class=\"text-xs text-muted-foreground ml-auto\">${issues.length}</span>\n </div>\n <div class=\"space-y-1\">\n${issues.map(issue => renderIssueRow(issue, fileKey, screenshotMap, figmaToken)).join(\"\\n\")}\n </div>\n </div>`;\n}\n\nfunction renderIssueRow(\n issue: AnalysisIssue,\n fileKey: string,\n screenshotMap: Map<string, NodeScreenshot>,\n figmaToken?: string\n): string {\n const sev = issue.config.severity;\n const def = issue.rule.definition;\n const link = buildFigmaDeepLink(fileKey, issue.violation.nodeId);\n const screenshot = screenshotMap.get(issue.violation.nodeId);\n\n const screenshotHtml = screenshot\n ? `<div class=\"mt-3\"><a href=\"${link}\" target=\"_blank\" rel=\"noopener\"><img src=\"data:image/png;base64,${screenshot.screenshotBase64}\" alt=\"${esc(screenshot.nodePath)}\" class=\"max-w-[240px] border border-border rounded-md\"></a></div>`\n : \"\";\n\n return ` <details class=\"border border-border rounded-md overflow-hidden\">\n <summary class=\"flex items-center gap-2.5 px-3 py-2 text-sm cursor-pointer hover:bg-muted/50 transition-colors\">\n <span class=\"w-1.5 h-1.5 rounded-full ${severityDot(sev)} shrink-0\"></span>\n <span class=\"font-medium shrink-0\">${esc(def.name)}</span>\n <span class=\"text-muted-foreground truncate text-xs flex-1\">${esc(issue.violation.message)}</span>\n <span class=\"inline-flex items-center px-1.5 py-0.5 text-[10px] font-medium rounded border ${severityBadge(sev)} shrink-0\">${issue.calculatedScore}</span>\n </summary>\n <div class=\"px-3 py-3 bg-muted/30 border-t border-border text-sm space-y-2\">\n <div class=\"font-mono text-xs text-muted-foreground break-all\">${esc(issue.violation.nodePath)}</div>\n <div class=\"text-muted-foreground leading-relaxed space-y-1\">\n <p><span class=\"font-medium text-foreground\">Why:</span> ${esc(def.why)}</p>\n <p><span class=\"font-medium text-foreground\">Impact:</span> ${esc(def.impact)}</p>\n <p><span class=\"font-medium text-foreground\">Fix:</span> ${esc(def.fix)}</p>\n </div>${screenshotHtml}\n <div class=\"flex items-center gap-2 mt-1 no-print\">\n <a href=\"${link}\" target=\"_blank\" rel=\"noopener\" class=\"inline-flex items-center gap-1 px-2.5 py-1 text-xs font-medium border border-border rounded-md hover:bg-muted transition-colors\">Open in Figma <span>→</span></a>${figmaToken ? `\n <button onclick=\"postComment(this)\" data-file-key=\"${esc(fileKey)}\" data-node-id=\"${esc(issue.violation.nodeId)}\" data-rule=\"${esc(def.name)}\" data-message=\"${esc(issue.violation.message)}\" data-path=\"${esc(issue.violation.nodePath)}\" data-fix=\"${esc(def.fix)}\" data-why=\"${esc(def.why)}\" data-impact=\"${esc(def.impact)}\" class=\"inline-flex items-center gap-1 px-2.5 py-1 text-xs font-medium border border-border rounded-md hover:bg-muted transition-colors cursor-pointer\">Comment on Figma</button>` : \"\"}\n </div>\n </div>\n </details>`;\n}\n\n// ---- Utils ----\n\nfunction getQuickWins(issues: AnalysisIssue[], limit: number): AnalysisIssue[] {\n return issues\n .filter(issue => issue.config.severity === \"blocking\")\n .sort((a, b) => a.calculatedScore - b.calculatedScore)\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\nfunction esc(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","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});\n\nexport type CalibrationConfig = z.infer<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/rule-engine.js\";\nimport { calculateScores } from \"@/core/scoring.js\";\nimport type { RuleId } from \"@/contracts/rule.js\";\nimport type { Severity } from \"@/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","import type {\n ConversionAgentInput,\n ConversionAgentOutput,\n ConversionExecutor,\n ConversionRecord,\n} from \"./contracts/conversion-agent.js\";\n\n/**\n * Conversion Agent - Step 2 of calibration pipeline\n *\n * Attempts code conversion for each node via an injected executor.\n * Uses dependency inversion: the executor handles actual LLM/MCP calls.\n * Failures on individual nodes are captured, not thrown.\n */\nexport async function runConversionAgent(\n input: ConversionAgentInput,\n executor: ConversionExecutor\n): Promise<ConversionAgentOutput> {\n const records: ConversionRecord[] = [];\n const skippedNodeIds: string[] = [];\n\n for (const node of input.nodes) {\n const startTime = Date.now();\n\n try {\n const result = await executor(\n node.nodeId,\n input.fileKey,\n node.flaggedRuleIds\n );\n\n const durationMs = Date.now() - startTime;\n\n records.push({\n nodeId: node.nodeId,\n nodePath: node.nodePath,\n generatedCode: result.generatedCode,\n difficulty: result.difficulty,\n notes: result.notes,\n ruleRelatedStruggles: result.ruleRelatedStruggles,\n uncoveredStruggles: result.uncoveredStruggles,\n durationMs,\n });\n } catch {\n skippedNodeIds.push(node.nodeId);\n }\n }\n\n return { records, skippedNodeIds };\n}\n","import type {\n EvaluationAgentInput,\n EvaluationAgentOutput,\n MismatchCase,\n MismatchType,\n} from \"./contracts/evaluation-agent.js\";\nimport type { Difficulty } from \"./contracts/conversion-agent.js\";\nimport type { Severity } from \"@/contracts/severity.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 * 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 = 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 (potential overscoring)\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\n // Use overall node difficulty as reference, but lean toward \"overscored\"\n if (difficulty === \"easy\" || difficulty === \"moderate\") {\n mismatches.push({\n type: \"overscored\",\n nodeId: record.nodeId,\n nodePath: record.nodePath,\n ruleId,\n currentScore: ruleInfo.score,\n currentSeverity: ruleInfo.severity as Severity,\n actualDifficulty: \"easy\",\n reasoning: `Rule \"${ruleId}\" was flagged but caused no struggle during conversion (overall node difficulty: \"${difficulty}\").`,\n });\n } else {\n // Hard/failed overall but this specific rule wasn't mentioned — validate it 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 and overall conversion was \"${difficulty}\" — conservatively validated.`,\n });\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 });\n }\n }\n\n return {\n mismatches,\n validatedRules: [...validatedRuleSet],\n };\n}\n","import type { Severity } from \"@/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 * Propose a score based on the dominant actual difficulty\n */\nfunction proposedScoreFromDifficulties(difficulties: string[]): number {\n // Count occurrences of each difficulty\n const counts: Record<string, number> = {};\n for (const d of difficulties) {\n counts[d] = (counts[d] ?? 0) + 1;\n }\n\n // Find the dominant difficulty\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\n return DIFFICULTY_MIDPOINT[dominant] ?? -5;\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 // Generate score reduction proposals for overscored rules\n for (const [ruleId, cases] of overscoredByRule) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const difficulties = cases.map((c) => c.actualDifficulty);\n const proposedScore = proposedScoreFromDifficulties(difficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\n\n adjustments.push({\n ruleId,\n currentScore: ruleInfo.score,\n proposedScore,\n currentSeverity,\n proposedSeverity: newSeverity,\n reasoning: `Overscored in ${cases.length} case(s). Actual difficulties: [${difficulties.join(\", \")}]. Current score ${ruleInfo.score} is too harsh.`,\n confidence: getConfidence(cases.length),\n supportingCases: cases.length,\n });\n }\n\n // Generate score increase proposals for underscored rules\n for (const [ruleId, cases] of underscoredByRule) {\n const ruleInfo = input.ruleScores[ruleId];\n if (!ruleInfo) continue;\n\n const difficulties = cases.map((c) => c.actualDifficulty);\n const proposedScore = proposedScoreFromDifficulties(difficulties);\n const currentSeverity = ruleInfo.severity as Severity;\n const newSeverity = proposeSeverity(currentSeverity, proposedScore);\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). Actual difficulties: [${difficulties.join(\", \")}]. Current score ${ruleInfo.score} is too lenient.`,\n confidence: getConfidence(cases.length),\n supportingCases: cases.length,\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 // Extract category from reasoning pattern: \"category: <value>\"\n const categoryMatch = c.reasoning.match(/category:\\s*([^,)]+)/);\n const category = categoryMatch?.[1]?.trim() ?? \"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) => {\n const descMatch = c.reasoning.match(/Uncovered struggle: \"([^\"]+)\"/);\n return descMatch?.[1] ?? c.reasoning;\n });\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/scoring.js\";\nimport type { MismatchCase } from \"./contracts/evaluation-agent.js\";\nimport type { ScoreAdjustment, NewRuleProposal } from \"./contracts/tuning-agent.js\";\n\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}\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}%) |\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 | 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\n lines.push(\n `| ${adj.ruleId} | ${adj.currentScore} | ${adj.proposedScore} | ${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/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 lines.push(`// ${adj.ruleId}: ${adj.currentScore} -> ${adj.proposedScore} (${adj.confidence} confidence)`);\n if (adj.proposedSeverity) {\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 { existsSync, mkdirSync } from \"node:fs\";\nimport { appendFile, writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\n\nexport interface ActivityStep {\n step: string;\n nodePath?: string;\n result: string;\n durationMs: number;\n}\n\nfunction getTimestamp(): string {\n const now = new Date();\n return now.toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\", hour12: false });\n}\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 file path.\n * e.g. \"fixtures/http-design.json\" → \"http-design\"\n */\nfunction extractFixtureName(fixturePath: string): string {\n const fileName = fixturePath.split(\"/\").pop() ?? fixturePath;\n return fileName.replace(/\\.json$/, \"\");\n}\n\nexport class ActivityLogger {\n private logPath: string;\n private initialized = false;\n\n constructor(fixturePath?: string, logDir = \"logs/activity\") {\n const dateTimeStr = getDateTimeString();\n const fixtureName = fixturePath ? extractFixtureName(fixturePath) : \"unknown\";\n this.logPath = resolve(logDir, `${dateTimeStr}-${fixtureName}.md`);\n }\n\n /**\n * Ensure the log directory and file header exist\n */\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return;\n\n const dir = dirname(this.logPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n if (!existsSync(this.logPath)) {\n const ts = getDateTimeString();\n await writeFile(this.logPath, `# Calibration Activity Log — ${ts}\\n\\n`, \"utf-8\");\n }\n\n this.initialized = true;\n }\n\n /**\n * Log a pipeline step\n */\n async logStep(activity: ActivityStep): Promise<void> {\n await this.ensureInitialized();\n\n const lines: string[] = [];\n lines.push(`## ${getTimestamp()} — ${activity.step}`);\n if (activity.nodePath) {\n lines.push(`- Node: ${activity.nodePath}`);\n }\n lines.push(`- Result: ${activity.result}`);\n lines.push(`- Duration: ${activity.durationMs}ms`);\n lines.push(\"\");\n\n await appendFile(this.logPath, lines.join(\"\\n\") + \"\\n\", \"utf-8\");\n }\n\n /**\n * Log a summary at pipeline completion\n */\n async logSummary(summary: {\n totalDurationMs: number;\n nodesAnalyzed: number;\n nodesConverted: number;\n mismatches: number;\n adjustments: number;\n status: string;\n }): Promise<void> {\n await this.ensureInitialized();\n\n const lines: string[] = [];\n lines.push(`## ${getTimestamp()} — Pipeline Summary`);\n lines.push(`- Status: ${summary.status}`);\n lines.push(`- Total Duration: ${summary.totalDurationMs}ms`);\n lines.push(`- Nodes Analyzed: ${summary.nodesAnalyzed}`);\n lines.push(`- Nodes Converted: ${summary.nodesConverted}`);\n lines.push(`- Mismatches Found: ${summary.mismatches}`);\n lines.push(`- Adjustments Proposed: ${summary.adjustments}`);\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n\n await appendFile(this.logPath, lines.join(\"\\n\") + \"\\n\", \"utf-8\");\n }\n\n getLogPath(): string {\n return this.logPath;\n }\n}\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\n\nimport type { AnalysisFile, AnalysisNode, AnalysisNodeType } from \"@/contracts/figma-node.js\";\nimport { analyzeFile } from \"@/core/rule-engine.js\";\nimport { FigmaClient } from \"@/adapters/figma-client.js\";\nimport { loadFigmaFileFromJson } from \"@/adapters/figma-file-loader.js\";\nimport { transformFigmaResponse } from \"@/adapters/figma-transformer.js\";\nimport { parseFigmaUrl } from \"@/adapters/figma-url-parser.js\";\nimport { RULE_CONFIGS } from \"@/rules/rule-config.js\";\n\nimport type {\n CalibrationConfig,\n CalibrationStatus,\n} from \"./contracts/calibration.js\";\nimport { CalibrationConfigSchema } from \"./contracts/calibration.js\";\nimport type { ConversionExecutor } from \"./contracts/conversion-agent.js\";\nimport type { NodeIssueSummary } from \"./contracts/analysis-agent.js\";\nimport type { ScoreAdjustment, NewRuleProposal } from \"./contracts/tuning-agent.js\";\nimport type { MismatchCase } from \"./contracts/evaluation-agent.js\";\nimport type { ScoreReport } from \"@/core/scoring.js\";\n\nimport { runAnalysisAgent, extractRuleScores } from \"./analysis-agent.js\";\nimport { runConversionAgent } from \"./conversion-agent.js\";\nimport { runEvaluationAgent } from \"./evaluation-agent.js\";\nimport { runTuningAgent } from \"./tuning-agent.js\";\nimport { generateCalibrationReport } from \"./report-generator.js\";\nimport { ActivityLogger } from \"./activity-logger.js\";\n\nexport interface CalibrationRunOptions {\n enableActivityLog?: boolean;\n}\n\nexport interface CalibrationRunResult {\n status: CalibrationStatus;\n scoreReport: ScoreReport;\n nodeIssueSummaries: NodeIssueSummary[];\n mismatches: MismatchCase[];\n validatedRules: string[];\n adjustments: ScoreAdjustment[];\n newRuleProposals: NewRuleProposal[];\n reportPath: string;\n logPath?: string | undefined;\n error?: string;\n}\n\n/**\n * Select nodes for conversion based on sampling strategy\n */\nfunction selectNodes(\n summaries: NodeIssueSummary[],\n strategy: string,\n maxNodes: number\n): NodeIssueSummary[] {\n if (summaries.length === 0) return [];\n\n switch (strategy) {\n case \"all\":\n return summaries.slice(0, maxNodes);\n\n case \"random\": {\n const shuffled = [...summaries];\n // Fisher-Yates shuffle\n for (let i = shuffled.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n const temp = shuffled[i]!;\n shuffled[i] = shuffled[j]!;\n shuffled[j] = temp;\n }\n return shuffled.slice(0, maxNodes);\n }\n\n case \"top-issues\":\n default:\n // Already sorted by totalScore (most negative first)\n return summaries.slice(0, maxNodes);\n }\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;\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\n/**\n * Name patterns that indicate icon/badge nodes (case-insensitive)\n */\nconst ICON_NAME_PATTERN = /\\b(icon|ico|badge|indicator)\\b/i;\n\n/**\n * Filter node summaries to meaningful conversion candidates.\n *\n * 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 return summaries.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 icon/badge/indicator by name\n if (ICON_NAME_PATTERN.test(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\nfunction isFigmaUrl(input: string): boolean {\n return input.includes(\"figma.com/\");\n}\n\nfunction isJsonFile(input: string): boolean {\n return input.endsWith(\".json\");\n}\n\n/**\n * Load a Figma file from URL or JSON path\n */\nasync function loadFile(\n input: string,\n token?: string\n): Promise<{ file: AnalysisFile; fileKey: string; nodeId: string | undefined }> {\n if (isJsonFile(input)) {\n const filePath = resolve(input);\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`);\n }\n const file = await loadFigmaFileFromJson(filePath);\n return { file, fileKey: file.fileKey, nodeId: undefined };\n }\n\n if (isFigmaUrl(input)) {\n const { fileKey, nodeId } = parseFigmaUrl(input);\n const figmaToken = token ?? process.env[\"FIGMA_TOKEN\"];\n if (!figmaToken) {\n throw new Error(\n \"Figma token required. Provide token or set FIGMA_TOKEN environment variable.\"\n );\n }\n const client = new FigmaClient({ token: figmaToken });\n const response = await client.getFile(fileKey);\n const file = transformFigmaResponse(fileKey, response);\n return { file, fileKey, nodeId };\n }\n\n throw new Error(\n `Invalid input: ${input}. Provide a Figma URL or JSON file path.`\n );\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: CalibrationConfig\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: {\n records: Array<{\n nodeId: string;\n nodePath: string;\n difficulty: string;\n ruleRelatedStruggles: Array<{\n ruleId: string;\n description: string;\n actualImpact: string;\n }>;\n uncoveredStruggles: Array<{\n description: string;\n suggestedCategory: string;\n estimatedImpact: string;\n }>;\n }>;\n skippedNodeIds: string[];\n },\n ruleScores: Record<string, { score: number; severity: string }>\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: conversionJson.records,\n ruleScores,\n });\n\n const tuningOutput = runTuningAgent({\n mismatches: evaluationOutput.mismatches,\n ruleScores,\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: conversionJson.records.length,\n skippedNodeCount: conversionJson.skippedNodeIds.length,\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/**\n * Run the full calibration pipeline\n *\n * Sequence: validate -> load file -> analysis -> node selection -> conversion -> evaluation -> tuning -> report\n */\nexport async function runCalibration(\n config: CalibrationConfig,\n executor: ConversionExecutor,\n options?: CalibrationRunOptions\n): Promise<CalibrationRunResult> {\n const parsed = CalibrationConfigSchema.parse(config);\n const pipelineStart = Date.now();\n const startedAt = new Date().toISOString();\n const logger = options?.enableActivityLog ? new ActivityLogger(parsed.input) : null;\n\n try {\n // Step 1: Load and analyze\n let stepStart = Date.now();\n const { file, fileKey, nodeId } = await loadFile(parsed.input, parsed.token);\n const analyzeOptions = nodeId ? { targetNodeId: nodeId } : {};\n const analysisResult = analyzeFile(file, analyzeOptions);\n const analysisOutput = runAnalysisAgent({ analysisResult });\n\n const ruleScores = {\n ...buildRuleScoresMap(),\n ...extractRuleScores(analysisResult),\n };\n\n await logger?.logStep({\n step: \"Analysis\",\n result: `${analysisResult.nodeCount} nodes, ${analysisResult.issues.length} issues, grade ${analysisOutput.scoreReport.overall.grade}`,\n durationMs: Date.now() - stepStart,\n });\n\n // Step 2: Filter and select nodes for conversion\n stepStart = Date.now();\n const candidates = filterConversionCandidates(\n analysisOutput.nodeIssueSummaries,\n analysisResult.file.document\n );\n const selectedNodes = selectNodes(\n candidates,\n parsed.samplingStrategy,\n parsed.maxConversionNodes\n );\n\n const conversionOutput = await runConversionAgent(\n {\n fileKey,\n nodes: selectedNodes.map((n) => ({\n nodeId: n.nodeId,\n nodePath: n.nodePath,\n flaggedRuleIds: n.flaggedRuleIds,\n })),\n },\n executor\n );\n\n await logger?.logStep({\n step: \"Conversion\",\n result: `${conversionOutput.records.length} converted, ${conversionOutput.skippedNodeIds.length} skipped`,\n durationMs: Date.now() - stepStart,\n });\n\n // Step 3: Evaluate\n stepStart = Date.now();\n const evaluationOutput = runEvaluationAgent({\n nodeIssueSummaries: selectedNodes.map((n) => ({\n nodeId: n.nodeId,\n nodePath: n.nodePath,\n flaggedRuleIds: n.flaggedRuleIds,\n })),\n conversionRecords: conversionOutput.records,\n ruleScores,\n });\n\n await logger?.logStep({\n step: \"Evaluation\",\n result: `${evaluationOutput.mismatches.length} mismatches, ${evaluationOutput.validatedRules.length} validated`,\n durationMs: Date.now() - stepStart,\n });\n\n // Step 4: Tune\n stepStart = Date.now();\n const tuningOutput = runTuningAgent({\n mismatches: evaluationOutput.mismatches,\n ruleScores,\n });\n\n await logger?.logStep({\n step: \"Tuning\",\n result: `${tuningOutput.adjustments.length} adjustments, ${tuningOutput.newRuleProposals.length} new rule proposals`,\n durationMs: Date.now() - stepStart,\n });\n\n // Generate report\n const report = generateCalibrationReport({\n fileKey,\n fileName: file.name,\n analyzedAt: startedAt,\n nodeCount: analysisResult.nodeCount,\n issueCount: analysisResult.issues.length,\n convertedNodeCount: conversionOutput.records.length,\n skippedNodeCount: conversionOutput.skippedNodeIds.length,\n scoreReport: analysisOutput.scoreReport,\n mismatches: evaluationOutput.mismatches,\n validatedRules: evaluationOutput.validatedRules,\n adjustments: tuningOutput.adjustments,\n newRuleProposals: tuningOutput.newRuleProposals,\n });\n\n // Write markdown report\n const reportPath = resolve(parsed.outputPath);\n const reportDir = resolve(parsed.outputPath, \"..\");\n if (!existsSync(reportDir)) {\n mkdirSync(reportDir, { recursive: true });\n }\n await writeFile(reportPath, report, \"utf-8\");\n\n await logger?.logSummary({\n totalDurationMs: Date.now() - pipelineStart,\n nodesAnalyzed: analysisResult.nodeCount,\n nodesConverted: conversionOutput.records.length,\n mismatches: evaluationOutput.mismatches.length,\n adjustments: tuningOutput.adjustments.length,\n status: \"completed\",\n });\n\n return {\n status: \"completed\",\n scoreReport: analysisOutput.scoreReport,\n nodeIssueSummaries: analysisOutput.nodeIssueSummaries,\n mismatches: evaluationOutput.mismatches,\n validatedRules: evaluationOutput.validatedRules,\n adjustments: tuningOutput.adjustments,\n newRuleProposals: tuningOutput.newRuleProposals,\n reportPath,\n logPath: logger?.getLogPath(),\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n await logger?.logSummary({\n totalDurationMs: Date.now() - pipelineStart,\n nodesAnalyzed: 0,\n nodesConverted: 0,\n mismatches: 0,\n adjustments: 0,\n status: `failed: ${errorMessage}`,\n });\n\n return {\n status: \"failed\",\n scoreReport: {\n overall: { score: 0, maxScore: 100, percentage: 0, grade: \"F\" },\n byCategory: {} as ScoreReport[\"byCategory\"],\n summary: { totalIssues: 0, blocking: 0, risk: 0, missingInfo: 0, suggestion: 0, nodeCount: 0 },\n },\n nodeIssueSummaries: [],\n mismatches: [],\n validatedRules: [],\n adjustments: [],\n newRuleProposals: [],\n reportPath: parsed.outputPath,\n error: errorMessage,\n };\n }\n}\n","/**\n * Built-in documentation for canicode CLI\n */\n\nexport function printDocsIndex(): void {\n console.log(`\nCANICODE DOCUMENTATION\n\n canicode docs setup Full setup guide (CLI, MCP, Skills)\n canicode docs rules Custom rules guide + example\n canicode docs config Config override guide + example\n\nFull documentation: github.com/let-sunny/canicode#readme\n`.trimStart());\n}\n\nexport function printDocsSetup(): void {\n console.log(`\nCANICODE SETUP GUIDE\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n 1. CLI\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Install:\n npm install -g canicode\n\n Setup:\n canicode init --token figd_xxxxxxxxxxxxx\n (saved to ~/.canicode/config.json, reports go to ~/.canicode/reports/)\n\n Use:\n canicode analyze \"https://www.figma.com/design/ABC123/MyDesign?node-id=1-234\"\n (opens report in browser automatically, use --no-open to disable)\n\n Data source flags:\n --api REST API (uses saved token)\n --mcp Figma MCP bridge (Claude Code only, no token needed)\n (none) Auto: try MCP first, fallback to API\n\n Options:\n --preset strict|relaxed|dev-friendly|ai-ready\n --config ./my-config.json\n --custom-rules ./my-rules.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. MCP SERVER (Claude Code integration)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Route A — Figma MCP relay (no token needed):\n\n Install (once):\n claude mcp add figma -- npx -y @anthropic-ai/claude-code-mcp-figma\n claude mcp add --transport stdio canicode npx canicode-mcp\n\n Flow:\n Claude Code\n -> Figma MCP get_metadata(fileKey, nodeId) -> XML node tree\n -> canicode MCP analyze(designData: XML) -> analysis result\n\n Route B — REST API direct (token needed):\n\n Install (once):\n claude mcp add --transport stdio canicode npx canicode-mcp\n canicode init --token figd_xxxxxxxxxxxxx\n\n Flow:\n Claude Code\n -> canicode MCP analyze(input: URL) -> internal REST API fetch -> result\n\n Use (both routes — just ask Claude Code):\n \"Analyze this Figma design: https://www.figma.com/design/...\"\n\n Route A vs B:\n A: No token, 2 MCP servers, Claude orchestrates 2 calls\n B: Token needed, 1 MCP server, canicode fetches directly\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n 3. CLAUDE SKILLS (lightweight)\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n Install:\n cp -r path/to/canicode/.claude/skills/canicode .claude/skills/\n\n Setup (for REST API):\n npx canicode init --token figd_xxxxxxxxxxxxx\n\n Use (in Claude Code):\n /canicode analyze \"https://www.figma.com/design/...\"\n\n Runs CLI under the hood — all flags work (--mcp, --api, --preset, etc.)\n\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n TOKEN PRIORITY (all methods)\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, interactive -> MCP Server (Route A)\n No token, Claude Code -> MCP Server (Route A)\n Quick trial -> Skills\n`.trimStart());\n}\n\nexport function printDocsRules(): void {\n console.log(`\nCUSTOM RULES GUIDE\n\nCustom rules let you add project-specific checks beyond canicode's built-in 39 rules.\n\nSTRUCTURE\n - id: unique identifier (kebab-case)\n - category: layout | token | component | naming | ai-readability | handoff-risk\n - severity: blocking | risk | missing-info | suggestion\n - score: negative number (-1 to -15)\n - prompt: what Claude checks for (used in AI-based evaluation)\n - why: reason this matters\n - impact: consequence if ignored\n - fix: how to resolve\n\nEXAMPLE\n [\n {\n \"id\": \"icon-missing-component\",\n \"category\": \"component\",\n \"severity\": \"blocking\",\n \"score\": -10,\n \"prompt\": \"Check if this node is an icon (small size, vector children, no text) and is not a component or instance.\",\n \"why\": \"Icon nodes that are not components cannot be reused consistently.\",\n \"impact\": \"Developers will hardcode icons instead of using a shared component.\",\n \"fix\": \"Convert this icon node to a component and publish it to the library.\"\n }\n ]\n\nUSAGE\n canicode analyze <url> --custom-rules ./my-rules.json\n See full example: examples/custom-rules.json\n`.trimStart());\n}\n\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 8\n - colorTolerance: color diff tolerance, default 10\n - rules: per-rule overrides (score, severity, enabled)\n\nEXAMPLE\n {\n \"excludeNodeTypes\": [],\n \"excludeNodeNames\": [],\n \"gridBase\": 4,\n \"rules\": {\n \"no-auto-layout\": { \"score\": -15, \"severity\": \"blocking\" },\n \"raw-color\": { \"score\": -12 },\n \"default-name\": { \"enabled\": false }\n }\n }\n\nUSAGE\n canicode analyze <url> --config ./my-config.json\n See full example: examples/config.json\n`.trimStart());\n}\n\nconst DOCS_TOPICS: Record<string, () => void> = {\n setup: printDocsSetup,\n install: printDocsSetup, // alias\n rules: printDocsRules,\n config: printDocsConfig,\n};\n\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: setup, rules, config`);\n process.exit(1);\n }\n}\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\nfunction isContainerNode(node: AnalysisNode): boolean {\n return node.type === \"FRAME\" || node.type === \"GROUP\" || node.type === \"COMPONENT\";\n}\n\nfunction hasAutoLayout(node: AnalysisNode): boolean {\n return node.layoutMode !== undefined && node.layoutMode !== \"NONE\";\n}\n\nfunction hasTextContent(node: AnalysisNode): boolean {\n return node.type === \"TEXT\" || (node.children?.some((c) => c.type === \"TEXT\") ?? false);\n}\n\n// ============================================\n// no-auto-layout\n// ============================================\n\nconst noAutoLayoutDef: RuleDefinition = {\n id: \"no-auto-layout\",\n name: \"No Auto Layout\",\n category: \"layout\",\n why: \"Frames without Auto Layout require manual positioning for every element\",\n impact: \"Layout breaks on content changes, harder to maintain and scale\",\n fix: \"Apply Auto Layout to the frame with appropriate direction and spacing\",\n};\n\nconst noAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (node.type !== \"FRAME\") return null;\n if (hasAutoLayout(node)) return null;\n // Skip if frame has no children (might be intentional placeholder)\n if (!node.children || node.children.length === 0) return null;\n\n return {\n ruleId: noAutoLayoutDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `Frame \"${node.name}\" has no Auto Layout`,\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: \"layout\",\n why: \"Absolute positioning inside Auto Layout breaks the automatic flow\",\n impact: \"Element will not respond to sibling changes, may overlap unexpectedly\",\n fix: \"Remove absolute positioning or use proper Auto Layout alignment\",\n};\n\n/**\n * Name patterns that indicate intentional absolute positioning\n * (badges, close buttons, decorations, overlays, floating elements)\n */\nconst INTENTIONAL_ABSOLUTE_PATTERNS = /^(badge|close|dismiss|overlay|float|fab|dot|indicator|corner|decoration|tag|status|notification|x|icon[-_ ]?(close|dismiss|x)|btn[-_ ]?(close|dismiss))/i;\n\n/**\n * Check if a node is small relative to its parent (decoration/badge pattern).\n * Returns true if the node is less than 25% of the parent's width AND height.\n */\nfunction isSmallRelativeToParent(node: AnalysisNode, parent: AnalysisNode): boolean {\n const nodeBB = node.absoluteBoundingBox;\n const parentBB = parent.absoluteBoundingBox;\n if (!nodeBB || !parentBB) return false;\n if (parentBB.width === 0 || parentBB.height === 0) return false;\n\n const widthRatio = nodeBB.width / parentBB.width;\n const heightRatio = nodeBB.height / parentBB.height;\n return widthRatio < 0.25 && heightRatio < 0.25;\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 // Exception: intentional name patterns (badge, close, overlay, etc.)\n if (INTENTIONAL_ABSOLUTE_PATTERNS.test(node.name)) return null;\n\n // Exception: small decoration relative to parent (< 25% size)\n if (isSmallRelativeToParent(node, context.parent)) return null;\n\n // Exception: inside a component definition (designer's intentional layout)\n if (context.parent.type === \"COMPONENT\") return null;\n\n return {\n ruleId: absolutePositionInAutoLayoutDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" uses absolute positioning inside Auto Layout parent \"${context.parent.name}\". If intentional (badge, overlay, close button), rename to badge-*, overlay-*, close-* to suppress this warning.`,\n };\n};\n\nexport const absolutePositionInAutoLayout = defineRule({\n definition: absolutePositionInAutoLayoutDef,\n check: absolutePositionInAutoLayoutCheck,\n});\n\n// ============================================\n// fixed-width-in-responsive-context\n// ============================================\n\nconst fixedWidthInResponsiveContextDef: RuleDefinition = {\n id: \"fixed-width-in-responsive-context\",\n name: \"Fixed Width in Responsive Context\",\n category: \"layout\",\n why: \"Fixed width inside Auto Layout prevents responsive behavior\",\n impact: \"Content will not adapt to container size changes\",\n fix: \"Use 'Fill' or 'Hug' instead of fixed width\",\n};\n\nconst fixedWidthInResponsiveContextCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n if (!isContainerNode(node)) return null;\n // Check if using fixed sizing (not Fill/Hug)\n if (node.layoutAlign === \"STRETCH\") return null;\n\n const bbox = node.absoluteBoundingBox;\n if (!bbox) return null;\n // Heuristic: if width is set and not stretching, it's likely fixed\n if (node.layoutAlign !== \"INHERIT\") return null;\n\n return {\n ruleId: fixedWidthInResponsiveContextDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has fixed width inside Auto Layout`,\n };\n};\n\nexport const fixedWidthInResponsiveContext = defineRule({\n definition: fixedWidthInResponsiveContextDef,\n check: fixedWidthInResponsiveContextCheck,\n});\n\n// ============================================\n// missing-responsive-behavior\n// ============================================\n\nconst missingResponsiveBehaviorDef: RuleDefinition = {\n id: \"missing-responsive-behavior\",\n name: \"Missing Responsive Behavior\",\n category: \"layout\",\n why: \"Elements without constraints won't adapt to different screen sizes\",\n impact: \"Layout will break or look wrong on different devices\",\n fix: \"Set appropriate constraints (left/right, top/bottom, scale, etc.)\",\n};\n\nconst missingResponsiveBehaviorCheck: RuleCheckFn = (node, context) => {\n if (!isContainerNode(node)) return null;\n // Skip if inside Auto Layout (Auto Layout handles responsiveness)\n if (context.parent && hasAutoLayout(context.parent)) return null;\n // Skip root-level frames (they define the viewport)\n if (context.depth < 2) return null;\n\n // Check for missing layout mode and no parent auto layout\n if (!hasAutoLayout(node) && !node.layoutAlign) {\n return {\n ruleId: missingResponsiveBehaviorDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has no responsive behavior configured`,\n };\n }\n\n return null;\n};\n\nexport const missingResponsiveBehavior = defineRule({\n definition: missingResponsiveBehaviorDef,\n check: missingResponsiveBehaviorCheck,\n});\n\n// ============================================\n// group-usage\n// ============================================\n\nconst groupUsageDef: RuleDefinition = {\n id: \"group-usage\",\n name: \"Group Usage\",\n category: \"layout\",\n why: \"Groups don't support Auto Layout and have limited layout control\",\n impact: \"Harder to maintain consistent spacing and alignment\",\n fix: \"Convert Group to Frame and apply Auto Layout\",\n};\n\nconst groupUsageCheck: RuleCheckFn = (node, context) => {\n if (node.type !== \"GROUP\") return null;\n\n return {\n ruleId: groupUsageDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" is a Group - consider converting to Frame with Auto Layout`,\n };\n};\n\nexport const groupUsage = defineRule({\n definition: groupUsageDef,\n check: groupUsageCheck,\n});\n\n// ============================================\n// fixed-size-in-auto-layout\n// ============================================\n\nconst fixedSizeInAutoLayoutDef: RuleDefinition = {\n id: \"fixed-size-in-auto-layout\",\n name: \"Fixed Size in Auto Layout\",\n category: \"layout\",\n why: \"Fixed sizes inside Auto Layout limit flexibility\",\n impact: \"Element won't adapt to content or container changes\",\n fix: \"Consider using 'Hug' for content-driven sizing\",\n};\n\nconst fixedSizeInAutoLayoutCheck: RuleCheckFn = (node, context) => {\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n // Only check containers, not leaf nodes\n if (!isContainerNode(node)) return null;\n if (!node.absoluteBoundingBox) return null;\n\n // Skip if it's intentionally a small fixed element (icon, avatar, etc.)\n const { width, height } = node.absoluteBoundingBox;\n if (width <= 48 && height <= 48) return null;\n\n // This is a heuristic - in practice you'd check layoutSizingHorizontal/Vertical\n // For now, we flag containers that might benefit from flexible sizing\n return null; // Disabled for now - needs more context from Figma API\n};\n\nexport const fixedSizeInAutoLayout = defineRule({\n definition: fixedSizeInAutoLayoutDef,\n check: fixedSizeInAutoLayoutCheck,\n});\n\n// ============================================\n// missing-min-width\n// ============================================\n\nconst missingMinWidthDef: RuleDefinition = {\n id: \"missing-min-width\",\n name: \"Missing Min Width\",\n category: \"layout\",\n why: \"Without min-width, containers can collapse to unusable sizes\",\n impact: \"Text truncation or layout collapse on narrow screens\",\n fix: \"Set a minimum width constraint on the container\",\n};\n\nconst missingMinWidthCheck: RuleCheckFn = (node, context) => {\n // Only check containers and text-containing nodes\n if (!isContainerNode(node) && !hasTextContent(node)) return null;\n // Skip small fixed elements (icons, dividers)\n if (node.absoluteBoundingBox) {\n const { width, height } = node.absoluteBoundingBox;\n if (width <= 48 && height <= 24) return null;\n }\n // Skip if not in Auto Layout context\n if (!context.parent || !hasAutoLayout(context.parent)) return null;\n\n // Check for min-width in boundVariables or explicit constraint\n // This is a simplified check - full implementation needs more Figma data\n return null; // Needs minWidth property from Figma API\n};\n\nexport const missingMinWidth = defineRule({\n definition: missingMinWidthDef,\n check: missingMinWidthCheck,\n});\n\n// ============================================\n// missing-max-width\n// ============================================\n\nconst missingMaxWidthDef: RuleDefinition = {\n id: \"missing-max-width\",\n name: \"Missing Max Width\",\n category: \"layout\",\n why: \"Without max-width, content can stretch too wide on large screens\",\n impact: \"Poor readability and layout on wide screens\",\n fix: \"Set a maximum width constraint, especially for text containers\",\n};\n\nconst missingMaxWidthCheck: RuleCheckFn = (node, _context) => {\n // Only check containers and text-containing nodes\n if (!isContainerNode(node) && !hasTextContent(node)) return null;\n // Skip small elements\n if (node.absoluteBoundingBox) {\n const { width } = node.absoluteBoundingBox;\n if (width <= 200) return null;\n }\n\n // Check for max-width constraint\n // This is a simplified check - full implementation needs more Figma data\n return null; // Needs maxWidth property from Figma API\n};\n\nexport const missingMaxWidth = defineRule({\n definition: missingMaxWidthDef,\n check: missingMaxWidthCheck,\n});\n\n// ============================================\n// deep-nesting\n// ============================================\n\nconst deepNestingDef: RuleDefinition = {\n id: \"deep-nesting\",\n name: \"Deep Nesting\",\n category: \"layout\",\n why: \"Deep nesting makes the structure hard to understand and maintain\",\n impact: \"Increases complexity, harder to debug layout issues\",\n fix: \"Flatten the structure by removing unnecessary wrapper frames\",\n};\n\nconst deepNestingCheck: RuleCheckFn = (node, context, options) => {\n const maxDepth = (options?.[\"maxDepth\"] as number) ?? getRuleOption(\"deep-nesting\", \"maxDepth\", 5);\n\n if (context.depth < 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 message: `\"${node.name}\" is nested ${context.depth} levels deep (max: ${maxDepth})`,\n };\n};\n\nexport const deepNesting = defineRule({\n definition: deepNestingDef,\n check: deepNestingCheck,\n});\n\n// ============================================\n// overflow-hidden-abuse\n// ============================================\n\nconst overflowHiddenAbuseDef: RuleDefinition = {\n id: \"overflow-hidden-abuse\",\n name: \"Overflow Hidden Abuse\",\n category: \"layout\",\n why: \"Using clip content to hide layout problems masks underlying issues\",\n impact: \"Content may be unintentionally cut off, problems harder to diagnose\",\n fix: \"Fix the underlying layout issue instead of hiding overflow\",\n};\n\nconst overflowHiddenAbuseCheck: RuleCheckFn = (_node, _context) => {\n // This would check for clipsContent property\n // Simplified for now - needs more Figma API data\n return null;\n};\n\nexport const overflowHiddenAbuse = defineRule({\n definition: overflowHiddenAbuseDef,\n check: overflowHiddenAbuseCheck,\n});\n\n// ============================================\n// inconsistent-sibling-layout-direction\n// ============================================\n\nconst inconsistentSiblingLayoutDirectionDef: RuleDefinition = {\n id: \"inconsistent-sibling-layout-direction\",\n name: \"Inconsistent Sibling Layout Direction\",\n category: \"layout\",\n why: \"Sibling containers with mixed layout directions without clear reason create confusion\",\n impact: \"Harder to understand and maintain the design structure\",\n fix: \"Use consistent layout direction for similar sibling elements\",\n};\n\nconst inconsistentSiblingLayoutDirectionCheck: RuleCheckFn = (node, context) => {\n // Only check container nodes with siblings\n if (!isContainerNode(node)) return null;\n if (!context.siblings || context.siblings.length < 2) return null;\n\n // Get layout directions of sibling containers\n const siblingContainers = context.siblings.filter(\n (s) => isContainerNode(s) && s.id !== node.id\n );\n\n if (siblingContainers.length === 0) return null;\n\n const myDirection = node.layoutMode;\n if (!myDirection || myDirection === \"NONE\") return null;\n\n // Check if siblings have different directions\n const siblingDirections = siblingContainers\n .map((s) => s.layoutMode)\n .filter((d) => d && d !== \"NONE\");\n\n if (siblingDirections.length === 0) return null;\n\n // If all siblings have the same direction, but this node is different\n const allSameSiblingDirection = siblingDirections.every(\n (d) => d === siblingDirections[0]\n );\n\n if (allSameSiblingDirection && siblingDirections[0] !== myDirection) {\n // Check for valid patterns: parent row -> child column (card layout)\n if (context.parent?.layoutMode === \"HORIZONTAL\" && myDirection === \"VERTICAL\") {\n return null; // This is a valid card-in-row pattern\n }\n\n return {\n ruleId: inconsistentSiblingLayoutDirectionDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has ${myDirection} layout while siblings use ${siblingDirections[0]}`,\n };\n }\n\n return null;\n};\n\nexport const inconsistentSiblingLayoutDirection = defineRule({\n definition: inconsistentSiblingLayoutDirectionDef,\n check: inconsistentSiblingLayoutDirectionCheck,\n});\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\nfunction hasStyleReference(node: AnalysisNode, styleType: string): boolean {\n return node.styles !== undefined && styleType in node.styles;\n}\n\nfunction hasBoundVariable(node: AnalysisNode, key: string): boolean {\n return node.boundVariables !== undefined && key in node.boundVariables;\n}\n\nfunction isOnGrid(value: number, gridBase: number): boolean {\n return value % gridBase === 0;\n}\n\n// ============================================\n// raw-color\n// ============================================\n\nconst rawColorDef: RuleDefinition = {\n id: \"raw-color\",\n name: \"Raw Color\",\n category: \"token\",\n why: \"Raw hex colors are not connected to the design system\",\n impact: \"Color changes require manual updates across the entire design\",\n fix: \"Use a color style or variable instead of raw hex values\",\n};\n\nconst rawColorCheck: RuleCheckFn = (node, context) => {\n // Skip nodes without fills\n if (!node.fills || !Array.isArray(node.fills)) return null;\n if (node.fills.length === 0) return null;\n\n // Check if fill style is applied\n if (hasStyleReference(node, \"fill\")) return null;\n\n // Check if color variable is bound\n if (hasBoundVariable(node, \"fills\")) return null;\n\n // Check each fill for raw colors\n for (const fill of node.fills) {\n const fillObj = fill as Record<string, unknown>;\n if (fillObj[\"type\"] === \"SOLID\" && fillObj[\"color\"]) {\n return {\n ruleId: rawColorDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" uses raw color without style or variable`,\n };\n }\n }\n\n return null;\n};\n\nexport const rawColor = defineRule({\n definition: rawColorDef,\n check: rawColorCheck,\n});\n\n// ============================================\n// raw-font\n// ============================================\n\nconst rawFontDef: RuleDefinition = {\n id: \"raw-font\",\n name: \"Raw Font\",\n category: \"token\",\n why: \"Text without text styles is disconnected from the type system\",\n impact: \"Typography changes require manual updates across the design\",\n fix: \"Apply a text style to maintain consistency\",\n};\n\nconst rawFontCheck: RuleCheckFn = (node, context) => {\n if (node.type !== \"TEXT\") return null;\n\n // Check if text style is applied\n if (hasStyleReference(node, \"text\")) return null;\n\n // Check for text variable bindings\n if (hasBoundVariable(node, \"fontFamily\") || hasBoundVariable(node, \"fontSize\")) {\n return null;\n }\n\n return {\n ruleId: rawFontDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has no text style applied`,\n };\n};\n\nexport const rawFont = defineRule({\n definition: rawFontDef,\n check: rawFontCheck,\n});\n\n// ============================================\n// inconsistent-spacing\n// ============================================\n\nconst inconsistentSpacingDef: RuleDefinition = {\n id: \"inconsistent-spacing\",\n name: \"Inconsistent Spacing\",\n category: \"token\",\n why: \"Spacing values outside the grid system break visual consistency\",\n impact: \"Inconsistent visual rhythm and harder to maintain\",\n fix: \"Use spacing values from the design system grid (e.g., 8pt increments)\",\n};\n\nconst inconsistentSpacingCheck: RuleCheckFn = (node, context, options) => {\n const gridBase = (options?.[\"gridBase\"] as number) ?? getRuleOption(\"inconsistent-spacing\", \"gridBase\", 8);\n\n // Check padding values\n const paddings = [\n node.paddingLeft,\n node.paddingRight,\n node.paddingTop,\n node.paddingBottom,\n ].filter((p): p is number => p !== undefined && p > 0);\n\n for (const padding of paddings) {\n if (!isOnGrid(padding, gridBase)) {\n return {\n ruleId: inconsistentSpacingDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has padding ${padding}px not on ${gridBase}pt grid`,\n };\n }\n }\n\n // Check item spacing\n if (node.itemSpacing !== undefined && node.itemSpacing > 0) {\n if (!isOnGrid(node.itemSpacing, gridBase)) {\n return {\n ruleId: inconsistentSpacingDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has item spacing ${node.itemSpacing}px not on ${gridBase}pt grid`,\n };\n }\n }\n\n return null;\n};\n\nexport const inconsistentSpacing = defineRule({\n definition: inconsistentSpacingDef,\n check: inconsistentSpacingCheck,\n});\n\n// ============================================\n// magic-number-spacing\n// ============================================\n\nconst magicNumberSpacingDef: RuleDefinition = {\n id: \"magic-number-spacing\",\n name: \"Magic Number Spacing\",\n category: \"token\",\n why: \"Arbitrary spacing values make the system harder to understand\",\n impact: \"Unpredictable spacing, harder to create consistent layouts\",\n fix: \"Round spacing to the nearest grid value or use spacing tokens\",\n};\n\nconst magicNumberSpacingCheck: RuleCheckFn = (node, context, options) => {\n const gridBase = (options?.[\"gridBase\"] as number) ?? getRuleOption(\"magic-number-spacing\", \"gridBase\", 8);\n\n // Similar to inconsistent-spacing but focuses on finding \"magic\" numbers\n // Magic numbers are often odd values like 13, 17, 23, etc.\n const allSpacings = [\n node.paddingLeft,\n node.paddingRight,\n node.paddingTop,\n node.paddingBottom,\n node.itemSpacing,\n ].filter((s): s is number => s !== undefined && s > 0);\n\n for (const spacing of allSpacings) {\n // Check if it's not on grid AND not a common intentional value\n const commonValues = [1, 2, 4]; // Allow 1, 2, 4 as intentional small values\n if (!isOnGrid(spacing, gridBase) && !commonValues.includes(spacing)) {\n // Only flag truly \"magic\" numbers (prime-ish, odd values)\n if (spacing % 2 !== 0 && spacing > 4) {\n return {\n ruleId: magicNumberSpacingDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" uses magic number spacing: ${spacing}px`,\n };\n }\n }\n }\n\n return null;\n};\n\nexport const magicNumberSpacing = defineRule({\n definition: magicNumberSpacingDef,\n check: magicNumberSpacingCheck,\n});\n\n// ============================================\n// raw-shadow\n// ============================================\n\nconst rawShadowDef: RuleDefinition = {\n id: \"raw-shadow\",\n name: \"Raw Shadow\",\n category: \"token\",\n why: \"Shadow effects without styles are disconnected from the design system\",\n impact: \"Shadow changes require manual updates across the design\",\n fix: \"Create and apply an effect style for shadows\",\n};\n\nconst rawShadowCheck: RuleCheckFn = (node, context) => {\n if (!node.effects || !Array.isArray(node.effects)) return null;\n if (node.effects.length === 0) return null;\n\n // Check if effect style is applied\n if (hasStyleReference(node, \"effect\")) return null;\n\n // Check for shadow effects\n for (const effect of node.effects) {\n const effectObj = effect as Record<string, unknown>;\n if (\n effectObj[\"type\"] === \"DROP_SHADOW\" ||\n effectObj[\"type\"] === \"INNER_SHADOW\"\n ) {\n return {\n ruleId: rawShadowDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has shadow effect without effect style`,\n };\n }\n }\n\n return null;\n};\n\nexport const rawShadow = defineRule({\n definition: rawShadowDef,\n check: rawShadowCheck,\n});\n\n// ============================================\n// raw-opacity\n// ============================================\n\nconst rawOpacityDef: RuleDefinition = {\n id: \"raw-opacity\",\n name: \"Raw Opacity\",\n category: \"token\",\n why: \"Hardcoded opacity values are not connected to design tokens\",\n impact: \"Opacity changes require manual updates\",\n fix: \"Use opacity variables or consider if opacity is truly needed\",\n};\n\nconst rawOpacityCheck: RuleCheckFn = (node, _context) => {\n // Check if opacity variable is bound\n if (hasBoundVariable(node, \"opacity\")) return null;\n\n // This would need to check node opacity property\n // Simplified for now - needs more Figma API data\n return null;\n};\n\nexport const rawOpacity = defineRule({\n definition: rawOpacityDef,\n check: rawOpacityCheck,\n});\n\n// ============================================\n// multiple-fill-colors\n// ============================================\n\nconst multipleFillColorsDef: RuleDefinition = {\n id: \"multiple-fill-colors\",\n name: \"Multiple Fill Colors\",\n category: \"token\",\n why: \"Similar but slightly different colors indicate inconsistent token usage\",\n impact: \"Visual inconsistency and harder to maintain brand colors\",\n fix: \"Consolidate to a single color token or style\",\n};\n\nconst multipleFillColorsCheck: RuleCheckFn = (_node, _context, _options) => {\n // This rule needs to analyze colors across multiple nodes\n // It's better suited for a post-processing analysis phase\n // Simplified implementation - would need global context\n return null;\n};\n\nexport const multipleFillColors = defineRule({\n definition: multipleFillColorsDef,\n check: multipleFillColorsCheck,\n});\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\nfunction isComponentInstance(node: AnalysisNode): boolean {\n return node.type === \"INSTANCE\";\n}\n\nfunction isComponent(node: AnalysisNode): boolean {\n return node.type === \"COMPONENT\" || node.type === \"COMPONENT_SET\";\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// missing-component\n// ============================================\n\nconst missingComponentDef: RuleDefinition = {\n id: \"missing-component\",\n name: \"Missing Component\",\n category: \"component\",\n why: \"Repeated identical structures should be componentized\",\n impact: \"Changes require manual updates in multiple places\",\n fix: \"Create a component from the repeated structure\",\n};\n\nconst missingComponentCheck: RuleCheckFn = (node, context, options) => {\n // Only check at frame level\n if (node.type !== \"FRAME\") return null;\n\n const minRepetitions = (options?.[\"minRepetitions\"] as number) ??\n getRuleOption(\"missing-component\", \"minRepetitions\", 3);\n\n // Collect frame names in the file (cached per analysis run would be better)\n const frameNames = collectFrameNames(context.file.document);\n const sameNameFrames = frameNames.get(node.name);\n\n if (sameNameFrames && sameNameFrames.length >= minRepetitions) {\n // Only report on the first occurrence to avoid duplicate issues\n if (sameNameFrames[0] === node.id) {\n return {\n ruleId: missingComponentDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" appears ${sameNameFrames.length} times - consider making it a component`,\n };\n }\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: \"component\",\n why: \"Detached instances lose their connection to the source component\",\n impact: \"Updates to the component won't propagate to this instance\",\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 similar name\n const components = context.file.components;\n const nodeName = node.name.toLowerCase();\n\n for (const [, component] of Object.entries(components)) {\n if (nodeName.includes(component.name.toLowerCase())) {\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 message: `\"${node.name}\" may be a detached instance of component \"${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// nested-instance-override\n// ============================================\n\nconst nestedInstanceOverrideDef: RuleDefinition = {\n id: \"nested-instance-override\",\n name: \"Nested Instance Override\",\n category: \"component\",\n why: \"Excessive overrides in instances make components harder to maintain\",\n impact: \"Component updates may not work as expected\",\n fix: \"Create a variant or new component for significantly different use cases\",\n};\n\nconst nestedInstanceOverrideCheck: RuleCheckFn = (node, context) => {\n if (!isComponentInstance(node)) return null;\n\n // Check for component property overrides\n if (!node.componentProperties) return null;\n\n const overrideCount = Object.keys(node.componentProperties).length;\n\n // Flag if there are too many overrides\n if (overrideCount > 5) {\n return {\n ruleId: nestedInstanceOverrideDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has ${overrideCount} property overrides - consider creating a variant`,\n };\n }\n\n return null;\n};\n\nexport const nestedInstanceOverride = defineRule({\n definition: nestedInstanceOverrideDef,\n check: nestedInstanceOverrideCheck,\n});\n\n// ============================================\n// variant-not-used\n// ============================================\n\nconst variantNotUsedDef: RuleDefinition = {\n id: \"variant-not-used\",\n name: \"Variant Not Used\",\n category: \"component\",\n why: \"Using instances but not leveraging variants defeats their purpose\",\n impact: \"Manual changes instead of using designed variants\",\n fix: \"Use the appropriate variant instead of overriding the default\",\n};\n\nconst variantNotUsedCheck: RuleCheckFn = (_node, _context) => {\n // This would require checking if an instance is using default variant\n // when other variants exist that better match the current state\n // Needs more context from component definitions\n return null;\n};\n\nexport const variantNotUsed = defineRule({\n definition: variantNotUsedDef,\n check: variantNotUsedCheck,\n});\n\n// ============================================\n// component-property-unused\n// ============================================\n\nconst componentPropertyUnusedDef: RuleDefinition = {\n id: \"component-property-unused\",\n name: \"Component Property Unused\",\n category: \"component\",\n why: \"Component properties should be utilized to expose customization\",\n impact: \"Hardcoded values that should be configurable\",\n fix: \"Connect the value to a component property\",\n};\n\nconst componentPropertyUnusedCheck: RuleCheckFn = (node, _context) => {\n if (!isComponent(node)) return null;\n\n // Check if component has property definitions but children don't use them\n if (!node.componentPropertyDefinitions) return null;\n\n const definedProps = Object.keys(node.componentPropertyDefinitions);\n if (definedProps.length === 0) return null;\n\n // This would require checking if properties are actually bound\n // Simplified for now\n return null;\n};\n\nexport const componentPropertyUnused = defineRule({\n definition: componentPropertyUnusedDef,\n check: componentPropertyUnusedCheck,\n});\n\n// ============================================\n// single-use-component\n// ============================================\n\nconst singleUseComponentDef: RuleDefinition = {\n id: \"single-use-component\",\n name: \"Single Use Component\",\n category: \"component\",\n why: \"Components used only once add complexity without reuse benefit\",\n impact: \"Unnecessary abstraction increases maintenance overhead\",\n fix: \"Consider inlining if this component won't be reused\",\n};\n\nconst singleUseComponentCheck: RuleCheckFn = (node, context) => {\n if (!isComponent(node)) return null;\n\n // Count instances of this component in the file\n let instanceCount = 0;\n\n function countInstances(n: AnalysisNode): void {\n if (n.type === \"INSTANCE\" && n.componentId === node.id) {\n instanceCount++;\n }\n if (n.children) {\n for (const child of n.children) {\n countInstances(child);\n }\n }\n }\n\n countInstances(context.file.document);\n\n if (instanceCount === 1) {\n return {\n ruleId: singleUseComponentDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `Component \"${node.name}\" is only used once`,\n };\n }\n\n return null;\n};\n\nexport const singleUseComponent = defineRule({\n definition: singleUseComponentDef,\n check: singleUseComponentCheck,\n});\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\n// AnalysisNode type used in helper functions\nimport { defineRule } from \"../rule-registry.js\";\nimport { getRuleOption } from \"../rule-config.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\nconst 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\nconst NON_SEMANTIC_NAMES = [\n \"rectangle\",\n \"ellipse\",\n \"vector\",\n \"line\",\n \"polygon\",\n \"star\",\n \"path\",\n \"shape\",\n \"image\",\n \"fill\",\n \"stroke\",\n];\n\nfunction isDefaultName(name: string): boolean {\n return DEFAULT_NAME_PATTERNS.some((pattern) => pattern.test(name));\n}\n\nfunction isNonSemanticName(name: string): boolean {\n const normalized = name.toLowerCase().trim();\n return NON_SEMANTIC_NAMES.includes(normalized);\n}\n\nfunction hasNumericSuffix(name: string): boolean {\n return /\\s+\\d+$/.test(name);\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// ============================================\n// default-name\n// ============================================\n\nconst defaultNameDef: RuleDefinition = {\n id: \"default-name\",\n name: \"Default Name\",\n category: \"naming\",\n why: \"Default names like 'Frame 123' provide no context about the element's purpose\",\n impact: \"Designers and developers cannot understand the structure\",\n fix: \"Rename with a descriptive, semantic name (e.g., 'Header', 'ProductCard')\",\n};\n\nconst defaultNameCheck: RuleCheckFn = (node, context) => {\n if (!node.name) return null;\n if (!isDefaultName(node.name)) return null;\n\n return {\n ruleId: defaultNameDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" is a default name - provide a meaningful name`,\n };\n};\n\nexport const defaultName = defineRule({\n definition: defaultNameDef,\n check: defaultNameCheck,\n});\n\n// ============================================\n// non-semantic-name\n// ============================================\n\nconst nonSemanticNameDef: RuleDefinition = {\n id: \"non-semantic-name\",\n name: \"Non-Semantic Name\",\n category: \"naming\",\n why: \"Names like 'Rectangle' describe shape, not purpose\",\n impact: \"Structure is hard to understand without context\",\n fix: \"Use names that describe what the element represents (e.g., 'Divider', 'Avatar')\",\n};\n\nconst nonSemanticNameCheck: RuleCheckFn = (node, context) => {\n if (!node.name) return null;\n if (!isNonSemanticName(node.name)) return null;\n\n // Allow non-semantic 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 nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" is a non-semantic name - describe its purpose`,\n };\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: \"naming\",\n why: \"Mixed naming conventions at the same level create confusion\",\n impact: \"Harder to navigate and maintain the design\",\n fix: \"Use a consistent naming convention for sibling elements\",\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\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 }\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 return {\n ruleId: inconsistentNamingConventionDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" uses ${nodeConvention} while siblings use ${dominantConvention}`,\n };\n }\n\n return null;\n};\n\nexport const inconsistentNamingConvention = defineRule({\n definition: inconsistentNamingConventionDef,\n check: inconsistentNamingConventionCheck,\n});\n\n// ============================================\n// numeric-suffix-name\n// ============================================\n\nconst numericSuffixNameDef: RuleDefinition = {\n id: \"numeric-suffix-name\",\n name: \"Numeric Suffix Name\",\n category: \"naming\",\n why: \"Names with numeric suffixes often indicate copy-paste duplication\",\n impact: \"Suggests the element might need componentization\",\n fix: \"Remove the suffix or create a component if duplicated\",\n};\n\nconst numericSuffixNameCheck: RuleCheckFn = (node, context) => {\n if (!node.name) return null;\n if (isDefaultName(node.name)) return null; // Already caught by default-name\n if (!hasNumericSuffix(node.name)) return null;\n\n return {\n ruleId: numericSuffixNameDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has a numeric suffix - consider renaming`,\n };\n};\n\nexport const numericSuffixName = defineRule({\n definition: numericSuffixNameDef,\n check: numericSuffixNameCheck,\n});\n\n// ============================================\n// too-long-name\n// ============================================\n\nconst tooLongNameDef: RuleDefinition = {\n id: \"too-long-name\",\n name: \"Too Long Name\",\n category: \"naming\",\n why: \"Very long names are hard to read and use in code\",\n impact: \"Clutters the layer panel and makes selectors unwieldy\",\n fix: \"Shorten the name while keeping it descriptive\",\n};\n\nconst tooLongNameCheck: RuleCheckFn = (node, context, options) => {\n if (!node.name) return null;\n\n const maxLength = (options?.[\"maxLength\"] as number) ??\n getRuleOption(\"too-long-name\", \"maxLength\", 50);\n\n if (node.name.length <= maxLength) return null;\n\n return {\n ruleId: tooLongNameDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name.substring(0, 30)}...\" is ${node.name.length} chars (max: ${maxLength})`,\n };\n};\n\nexport const tooLongName = defineRule({\n definition: tooLongNameDef,\n check: tooLongNameCheck,\n});\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\nfunction hasAutoLayout(node: AnalysisNode): boolean {\n return node.layoutMode !== undefined && node.layoutMode !== \"NONE\";\n}\n\nfunction isContainerNode(node: AnalysisNode): boolean {\n return node.type === \"FRAME\" || node.type === \"GROUP\" || node.type === \"COMPONENT\";\n}\n\nfunction 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// ============================================\n// ambiguous-structure\n// ============================================\n\nconst ambiguousStructureDef: RuleDefinition = {\n id: \"ambiguous-structure\",\n name: \"Ambiguous Structure\",\n category: \"ai-readability\",\n why: \"Overlapping nodes without Auto Layout create ambiguous visual hierarchy\",\n impact: \"AI cannot reliably determine the reading order or structure\",\n fix: \"Use Auto Layout to create clear, explicit structure\",\n};\n\nconst ambiguousStructureCheck: RuleCheckFn = (node, context) => {\n if (!isContainerNode(node)) return null;\n if (hasAutoLayout(node)) return null; // Auto Layout provides clear structure\n if (!node.children || node.children.length < 2) return null;\n\n // Check for overlapping children\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\n if (childA && childB && hasOverlappingBounds(childA, childB)) {\n // Check if this is intentional layering (both visible)\n if (childA.visible !== false && childB.visible !== false) {\n return {\n ruleId: ambiguousStructureDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has overlapping children without Auto Layout`,\n };\n }\n }\n }\n }\n\n return null;\n};\n\nexport const ambiguousStructure = defineRule({\n definition: ambiguousStructureDef,\n check: ambiguousStructureCheck,\n});\n\n// ============================================\n// z-index-dependent-layout\n// ============================================\n\nconst zIndexDependentLayoutDef: RuleDefinition = {\n id: \"z-index-dependent-layout\",\n name: \"Z-Index Dependent Layout\",\n category: \"ai-readability\",\n why: \"Using overlapping layers to create visual layout is hard to interpret\",\n impact: \"Code generation may misinterpret the intended layout\",\n fix: \"Restructure using Auto Layout to express the visual relationship explicitly\",\n};\n\nconst zIndexDependentLayoutCheck: RuleCheckFn = (node, context) => {\n if (!isContainerNode(node)) return null;\n if (!node.children || node.children.length < 2) return null;\n\n // Look for patterns where position overlap is used to create visual effects\n // e.g., badge on card, avatar overlapping header\n let significantOverlapCount = 0;\n\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\n if (!childA || !childB) continue;\n if (childA.visible === false || childB.visible === false) continue;\n\n const boxA = childA.absoluteBoundingBox;\n const boxB = childB.absoluteBoundingBox;\n\n if (!boxA || !boxB) continue;\n\n if (hasOverlappingBounds(childA, childB)) {\n // Calculate overlap percentage\n const overlapX = Math.min(boxA.x + boxA.width, boxB.x + boxB.width) -\n Math.max(boxA.x, boxB.x);\n const overlapY = Math.min(boxA.y + boxA.height, boxB.y + boxB.height) -\n Math.max(boxA.y, boxB.y);\n\n if (overlapX > 0 && overlapY > 0) {\n const overlapArea = overlapX * overlapY;\n const smallerArea = Math.min(\n boxA.width * boxA.height,\n boxB.width * boxB.height\n );\n\n // If overlap is significant (> 20% of smaller element)\n if (overlapArea > smallerArea * 0.2) {\n significantOverlapCount++;\n }\n }\n }\n }\n }\n\n if (significantOverlapCount > 0) {\n return {\n ruleId: zIndexDependentLayoutDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" uses layer stacking for layout (${significantOverlapCount} overlaps)`,\n };\n }\n\n return null;\n};\n\nexport const zIndexDependentLayout = defineRule({\n definition: zIndexDependentLayoutDef,\n check: zIndexDependentLayoutCheck,\n});\n\n// ============================================\n// missing-layout-hint\n// ============================================\n\nconst missingLayoutHintDef: RuleDefinition = {\n id: \"missing-layout-hint\",\n name: \"Missing Layout Hint\",\n category: \"ai-readability\",\n why: \"Complex nesting without Auto Layout makes structure unpredictable\",\n impact: \"AI may generate incorrect code due to ambiguous relationships\",\n fix: \"Add Auto Layout or simplify the nesting structure\",\n};\n\nconst missingLayoutHintCheck: 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 // Check for nested containers without layout hints\n const nestedContainers = node.children.filter((c) => isContainerNode(c));\n\n // If there are multiple nested containers without layout direction\n if (nestedContainers.length >= 2) {\n const withoutLayout = nestedContainers.filter((c) => !hasAutoLayout(c));\n\n if (withoutLayout.length >= 2) {\n return {\n ruleId: missingLayoutHintDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has ${withoutLayout.length} nested containers without layout hints`,\n };\n }\n }\n\n return null;\n};\n\nexport const missingLayoutHint = defineRule({\n definition: missingLayoutHintDef,\n check: missingLayoutHintCheck,\n});\n\n// ============================================\n// invisible-layer\n// ============================================\n\nconst invisibleLayerDef: RuleDefinition = {\n id: \"invisible-layer\",\n name: \"Invisible Layer\",\n category: \"ai-readability\",\n why: \"Hidden layers add noise and may confuse analysis tools\",\n impact: \"Exported code may include unnecessary elements\",\n fix: \"Delete hidden layers or move them to a separate 'archive' page\",\n};\n\nconst invisibleLayerCheck: RuleCheckFn = (node, context) => {\n if (node.visible !== false) return null;\n\n // Skip if parent is also invisible (only report top-level invisible)\n if (context.parent?.visible === false) return null;\n\n return {\n ruleId: invisibleLayerDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" is hidden - consider removing if not needed`,\n };\n};\n\nexport const invisibleLayer = defineRule({\n definition: invisibleLayerDef,\n check: invisibleLayerCheck,\n});\n\n// ============================================\n// empty-frame\n// ============================================\n\nconst emptyFrameDef: RuleDefinition = {\n id: \"empty-frame\",\n name: \"Empty Frame\",\n category: \"ai-readability\",\n why: \"Empty frames add noise and may indicate incomplete design\",\n impact: \"Generates unnecessary wrapper elements in code\",\n fix: \"Remove the frame or add content\",\n};\n\nconst emptyFrameCheck: RuleCheckFn = (node, context) => {\n if (node.type !== \"FRAME\") return null;\n if (node.children && node.children.length > 0) return null;\n\n // Allow empty frames that are clearly placeholders (small size)\n if (node.absoluteBoundingBox) {\n const { width, height } = node.absoluteBoundingBox;\n // Allow small placeholder frames (icons, spacers)\n if (width <= 48 && height <= 48) return null;\n }\n\n return {\n ruleId: emptyFrameDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" is an empty frame`,\n };\n};\n\nexport const emptyFrame = defineRule({\n definition: emptyFrameDef,\n check: emptyFrameCheck,\n});\n","import type { RuleCheckFn, RuleDefinition } from \"../../contracts/rule.js\";\nimport type { AnalysisNode } from \"../../contracts/figma-node.js\";\nimport { defineRule } from \"../rule-registry.js\";\n\n// ============================================\n// Helper functions\n// ============================================\n\nfunction hasAutoLayout(node: AnalysisNode): boolean {\n return node.layoutMode !== undefined && node.layoutMode !== \"NONE\";\n}\n\nfunction isContainerNode(node: AnalysisNode): boolean {\n return node.type === \"FRAME\" || node.type === \"GROUP\" || node.type === \"COMPONENT\";\n}\n\nfunction isTextNode(node: AnalysisNode): boolean {\n return node.type === \"TEXT\";\n}\n\nfunction isImageNode(node: AnalysisNode): boolean {\n // Images are often rectangles with image fills\n if (node.type === \"RECTANGLE\" && node.fills) {\n for (const fill of node.fills) {\n const fillObj = fill as Record<string, unknown>;\n if (fillObj[\"type\"] === \"IMAGE\") return true;\n }\n }\n return false;\n}\n\n// ============================================\n// hardcode-risk\n// ============================================\n\nconst hardcodeRiskDef: RuleDefinition = {\n id: \"hardcode-risk\",\n name: \"Hardcode Risk\",\n category: \"handoff-risk\",\n why: \"Absolute positioning with fixed values creates inflexible layouts\",\n impact: \"Layout will break when content changes or on different screens\",\n fix: \"Use Auto Layout with relative positioning\",\n};\n\nconst hardcodeRiskCheck: RuleCheckFn = (node, context) => {\n if (!isContainerNode(node)) return null;\n\n // Check for absolute positioning\n if (node.layoutPositioning !== \"ABSOLUTE\") return null;\n\n // Check if parent has Auto Layout\n if (context.parent && hasAutoLayout(context.parent)) {\n return {\n ruleId: hardcodeRiskDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" uses absolute positioning with fixed values`,\n };\n }\n\n return null;\n};\n\nexport const hardcodeRisk = defineRule({\n definition: hardcodeRiskDef,\n check: hardcodeRiskCheck,\n});\n\n// ============================================\n// text-truncation-unhandled\n// ============================================\n\nconst textTruncationUnhandledDef: RuleDefinition = {\n id: \"text-truncation-unhandled\",\n name: \"Text Truncation Unhandled\",\n category: \"handoff-risk\",\n why: \"Text nodes without truncation handling may overflow\",\n impact: \"Long text will break the layout\",\n fix: \"Set text truncation (ellipsis) or ensure container can grow\",\n};\n\nconst textTruncationUnhandledCheck: RuleCheckFn = (node, context) => {\n if (!isTextNode(node)) return null;\n\n // Check if parent is Auto Layout with fixed size\n if (!context.parent) return null;\n if (!hasAutoLayout(context.parent)) return null;\n\n // Check if text has fixed width in the Auto Layout direction\n // This is a heuristic - would need more Figma API data for accuracy\n // Parent direction would be: context.parent.layoutMode\n\n // If parent is horizontal and text doesn't have truncation configured\n // Simplified check - full implementation would examine text truncation property\n if (node.absoluteBoundingBox) {\n const { width } = node.absoluteBoundingBox;\n // Flag if text is in a constrained space but long\n if (node.characters && node.characters.length > 50 && width < 300) {\n return {\n ruleId: textTruncationUnhandledDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" may need text truncation handling`,\n };\n }\n }\n\n return null;\n};\n\nexport const textTruncationUnhandled = defineRule({\n definition: textTruncationUnhandledDef,\n check: textTruncationUnhandledCheck,\n});\n\n// ============================================\n// image-no-placeholder\n// ============================================\n\nconst imageNoPlaceholderDef: RuleDefinition = {\n id: \"image-no-placeholder\",\n name: \"Image No Placeholder\",\n category: \"handoff-risk\",\n why: \"Images without placeholder state may cause layout shifts\",\n impact: \"Poor user experience during image loading\",\n fix: \"Define a placeholder state or background color\",\n};\n\nconst imageNoPlaceholderCheck: RuleCheckFn = (node, context) => {\n if (!isImageNode(node)) return null;\n\n // Check if there's a background color or placeholder indicator\n // This is a heuristic - images should have fallback fills\n if (node.fills && Array.isArray(node.fills) && node.fills.length === 1) {\n const fill = node.fills[0] as Record<string, unknown>;\n if (fill[\"type\"] === \"IMAGE\") {\n return {\n ruleId: imageNoPlaceholderDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" image has no placeholder fill`,\n };\n }\n }\n\n return null;\n};\n\nexport const imageNoPlaceholder = defineRule({\n definition: imageNoPlaceholderDef,\n check: imageNoPlaceholderCheck,\n});\n\n// ============================================\n// prototype-link-in-design\n// ============================================\n\nconst prototypeLinkInDesignDef: RuleDefinition = {\n id: \"prototype-link-in-design\",\n name: \"Prototype Link in Design\",\n category: \"handoff-risk\",\n why: \"Prototype connections may affect how the design is interpreted\",\n impact: \"Developers may misunderstand which elements should be interactive\",\n fix: \"Document interactions separately or use clear naming\",\n};\n\nconst prototypeLinkInDesignCheck: RuleCheckFn = (_node, _context) => {\n // This would require checking prototype/interaction data\n // Not available in basic node structure - needs more Figma API data\n return null;\n};\n\nexport const prototypeLinkInDesign = defineRule({\n definition: prototypeLinkInDesignDef,\n check: prototypeLinkInDesignCheck,\n});\n\n// ============================================\n// no-dev-status\n// ============================================\n\nconst noDevStatusDef: RuleDefinition = {\n id: \"no-dev-status\",\n name: \"No Dev Status\",\n category: \"handoff-risk\",\n why: \"Without dev status, developers cannot know if a design is ready\",\n impact: \"May implement designs that are still in progress\",\n fix: \"Mark frames as 'Ready for Dev' or 'Completed' when appropriate\",\n};\n\nconst noDevStatusCheck: RuleCheckFn = (node, context) => {\n // Only check top-level frames (likely screens/pages)\n if (node.type !== \"FRAME\") return null;\n if (context.depth > 1) return null;\n\n // Check for devStatus\n if (node.devStatus) return null;\n\n return {\n ruleId: noDevStatusDef.id,\n nodeId: node.id,\n nodePath: context.path.join(\" > \"),\n message: `\"${node.name}\" has no dev status set`,\n };\n};\n\nexport const noDevStatus = defineRule({\n definition: noDevStatusDef,\n check: noDevStatusCheck,\n});\n","#!/usr/bin/env node\nimport { existsSync, mkdirSync } from \"node:fs\";\nimport { writeFile } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport { config } from \"dotenv\";\nimport cac from \"cac\";\n\n// Load .env file\nconfig();\n\nimport { parseFigmaUrl } from \"../adapters/figma-url-parser.js\";\nimport type { AnalysisFile } from \"../contracts/figma-node.js\";\nimport type { RuleConfig, RuleId } from \"../contracts/rule.js\";\nimport { analyzeFile } from \"../core/rule-engine.js\";\nimport { loadFile, isFigmaUrl, isJsonFile, type LoadMode } from \"../core/loader.js\";\nimport { getFigmaToken, initAiready, getConfigPath, getReportsDir, ensureReportsDir } from \"../core/config-store.js\";\nimport { calculateScores, formatScoreSummary } from \"../core/scoring.js\";\nimport { getConfigsWithPreset, RULE_CONFIGS, type Preset } from \"../rules/rule-config.js\";\nimport { ruleRegistry } from \"../rules/rule-registry.js\";\nimport { loadCustomRules } from \"../rules/custom/custom-rule-loader.js\";\nimport { loadConfigFile, mergeConfigs } from \"../rules/custom/config-loader.js\";\nimport { generateHtmlReport } from \"../report-html/index.js\";\nimport {\n runCalibration,\n runCalibrationAnalyze,\n runCalibrationEvaluate,\n filterConversionCandidates,\n} from \"../agents/orchestrator.js\";\nimport { handleDocs } from \"./docs.js\";\n\n// Import rules to register them\nimport \"../rules/index.js\";\n\nconst cli = cac(\"canicode\");\n\nconst 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 */\nfunction 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\nfunction 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\ninterface AnalyzeOptions {\n preset?: Preset;\n output?: string;\n token?: string;\n mcp?: boolean;\n api?: boolean;\n screenshot?: boolean;\n customRules?: string;\n config?: string;\n noOpen?: boolean;\n}\n\ncli\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(\"--mcp\", \"Load via Figma MCP (no FIGMA_TOKEN needed)\")\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(\"--custom-rules <path>\", \"Path to custom rules JSON file\")\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 .example(\" canicode analyze https://www.figma.com/design/ABC123/MyDesign\")\n .example(\" canicode analyze https://www.figma.com/design/ABC123/MyDesign --mcp\")\n .example(\" canicode analyze https://www.figma.com/design/ABC123/MyDesign --api --token YOUR_TOKEN\")\n .example(\" canicode analyze ./fixtures/design.json --output report.html\")\n .example(\" canicode analyze ./fixtures/design.json --custom-rules ./my-rules.json\")\n .example(\" canicode analyze ./fixtures/design.json --config ./my-config.json\")\n .action(async (input: string, options: AnalyzeOptions) => {\n try {\n // Validate mutually exclusive flags\n if (options.mcp && options.api) {\n throw new Error(\"Cannot use --mcp and --api together. Choose one.\");\n }\n\n // Check init for non-MCP mode\n if (!options.mcp && !options.token && !getFigmaToken() && !isJsonFile(input)) {\n throw new Error(\n \"canicode is not configured. Run 'canicode init --token YOUR_TOKEN' first.\\n\" +\n \"Or use --mcp flag for Figma MCP mode (no token needed).\"\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 console.log(\"Screenshot comparison mode enabled (coming soon).\\n\");\n }\n\n // Determine load mode\n const mode: LoadMode = options.mcp ? \"mcp\" : options.api ? \"api\" : \"auto\";\n\n // Load file\n const { file, nodeId } = await loadFile(input, options.token, mode);\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)) {\n // Fixture: auto-pick a random suitable FRAME\n const picked = pickRandomScope(file.document);\n if (picked) {\n effectiveNodeId = picked.id;\n console.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 console.log(`\\nAnalyzing: ${file.name}`);\n console.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 if (options.config) {\n const configFile = await loadConfigFile(options.config);\n configs = mergeConfigs(configs, configFile);\n console.log(`Config loaded: ${options.config}`);\n }\n\n // Load and register custom rules\n if (options.customRules) {\n const { rules, configs: customConfigs } = await loadCustomRules(options.customRules);\n for (const rule of rules) {\n ruleRegistry.register(rule);\n }\n configs = { ...configs, ...customConfigs };\n console.log(`Custom rules loaded: ${rules.length} rules from ${options.customRules}`);\n }\n\n // Build analysis options\n const analyzeOptions = {\n configs: configs as Record<RuleId, RuleConfig>,\n ...(effectiveNodeId && { targetNodeId: effectiveNodeId }),\n };\n\n // Run analysis\n const result = analyzeFile(file, analyzeOptions);\n console.log(`Nodes: ${result.nodeCount} (max depth: ${result.maxDepth})`);\n\n // Calculate scores\n const scores = calculateScores(result);\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 // 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.exit(1);\n }\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n// ============================================\n// Internal calibration commands (used by subagents, hidden from user help)\n// ============================================\n\ninterface CalibrateAnalyzeOptions {\n output?: string;\n token?: string;\n targetNodeId?: string;\n}\n\ncli\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(\"--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 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 scoreReport: analysisOutput.scoreReport,\n nodeIssueSummaries: filteredSummaries,\n ruleScores,\n };\n\n const outputPath = 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} (${outputData.scoreReport.overall.percentage}%)`);\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.exit(1);\n }\n });\n\ninterface CalibrateEvaluateOptions {\n output?: string;\n}\n\ncli\n .command(\n \"calibrate-evaluate <analysisJson> <conversionJson>\",\n \"Evaluate conversion results and generate calibration report\"\n )\n .option(\"--output <path>\", \"Report output path\")\n .action(async (analysisJsonPath: string, conversionJsonPath: string, options: CalibrateEvaluateOptions) => {\n try {\n console.log(\"Running calibration evaluation...\");\n\n const analysisPath = resolve(analysisJsonPath);\n const conversionPath = 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 const { evaluationOutput, tuningOutput, report } = runCalibrationEvaluate(\n analysisData,\n conversionData,\n analysisData.ruleScores\n );\n\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 const defaultCalOutput = `logs/calibration/calibration-${calTs}.md`;\n const outputPath = resolve(options.output ?? defaultCalOutput);\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 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.exit(1);\n }\n });\n\ninterface CalibrateRunOptions {\n output?: string;\n token?: string;\n maxNodes?: number;\n sampling?: string;\n}\n\ncli\n .command(\n \"calibrate-run <input>\",\n \"Run full calibration pipeline (analysis-only, conversion via /calibrate-loop)\"\n )\n .option(\"--output <path>\", \"Markdown report output path\")\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(` Max nodes: ${options.maxNodes ?? 5}`);\n console.log(` Sampling: ${options.sampling ?? \"top-issues\"}`);\n console.log(\"\");\n\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 const defaultOutput = `logs/calibration/calibration-${calTs}.md`;\n\n // Stub executor — code conversion is handled by the calibration-converter\n // subagent in /calibrate-loop, not by this CLI command.\n const executor = async (_nodeId: string, _fileKey: string, flaggedRuleIds: string[]) => ({\n generatedCode: `<!-- conversion skipped — use /calibrate-loop for full pipeline -->`,\n difficulty: \"moderate\" as const,\n notes: \"Skipped — CLI runs analysis only. Use /calibrate-loop in Claude Code for full pipeline with code conversion.\",\n ruleRelatedStruggles: flaggedRuleIds.map((r) => ({\n ruleId: r,\n description: \"Unable to assess — conversion skipped\",\n actualImpact: \"moderate\" as const,\n })),\n uncoveredStruggles: [],\n });\n\n const result = await runCalibration(\n {\n input,\n maxConversionNodes: options.maxNodes ?? 5,\n samplingStrategy: (options.sampling as \"all\" | \"top-issues\" | \"random\") ?? \"top-issues\",\n outputPath: options.output ?? defaultOutput,\n ...(figmaToken && { token: figmaToken }),\n },\n executor,\n { enableActivityLog: true }\n );\n\n if (result.status === \"failed\") {\n throw new Error(result.error ?? \"Calibration pipeline failed\");\n }\n\n console.log(\"\\nCalibration complete (analysis-only).\");\n console.log(` Grade: ${result.scoreReport.overall.grade} (${result.scoreReport.overall.percentage}%)`);\n console.log(` Nodes with issues: ${result.nodeIssueSummaries.length}`);\n console.log(` Report: ${result.reportPath}`);\n if (result.logPath) {\n console.log(` Activity log: ${result.logPath}`);\n }\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n// ============================================\n// Utility commands\n// ============================================\n\ninterface SaveFixtureOptions {\n output?: string;\n mcp?: boolean;\n api?: boolean;\n token?: string;\n}\n\ncli\n .command(\n \"save-fixture <input>\",\n \"Save Figma file data as a JSON fixture for offline analysis\"\n )\n .option(\"--output <path>\", \"Output JSON path (default: fixtures/<filekey>.json)\")\n .option(\"--mcp\", \"Load via Figma MCP (no FIGMA_TOKEN needed)\")\n .option(\"--api\", \"Load via Figma REST API (requires FIGMA_TOKEN)\")\n .option(\"--token <token>\", \"Figma API token (or use FIGMA_TOKEN env var)\")\n .example(\" canicode save-fixture https://www.figma.com/design/ABC123/MyDesign --mcp\")\n .example(\" canicode save-fixture https://www.figma.com/design/ABC123/MyDesign --api --token YOUR_TOKEN\")\n .action(async (input: string, options: SaveFixtureOptions) => {\n try {\n if (options.mcp && options.api) {\n throw new Error(\"Cannot use --mcp and --api together. Choose one.\");\n }\n\n if (isFigmaUrl(input) && !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 mode: LoadMode = options.mcp ? \"mcp\" : options.api ? \"api\" : \"auto\";\n const { file } = await loadFile(input, options.token, mode);\n\n const outputPath = resolve(\n options.output ?? `fixtures/${file.fileKey}.json`\n );\n const outputDir = dirname(outputPath);\n if (!existsSync(outputDir)) {\n mkdirSync(outputDir, { recursive: true });\n }\n\n await writeFile(outputPath, JSON.stringify(file, null, 2), \"utf-8\");\n\n console.log(`Fixture saved: ${outputPath}`);\n console.log(` File: ${file.name}`);\n console.log(` Nodes: ${countNodes(file.document)}`);\n } catch (error) {\n console.error(\n \"\\nError:\",\n error instanceof Error ? error.message : String(error)\n );\n process.exit(1);\n }\n });\n\n// ============================================\n// Setup command\n// ============================================\n\ninterface InitOptions {\n token?: string;\n mcp?: boolean;\n}\n\ncli\n .command(\"init\", \"Set up canicode (Figma token or MCP)\")\n .option(\"--token <token>\", \"Save Figma API token to ~/.canicode/\")\n .option(\"--mcp\", \"Show Figma MCP setup instructions\")\n .action((options: InitOptions) => {\n try {\n if (options.token) {\n initAiready(options.token);\n\n console.log(` Config saved: ${getConfigPath()}`);\n console.log(` Reports will be saved to: ${getReportsDir()}/`);\n console.log(`\\n Next: canicode analyze \"https://www.figma.com/design/...\"`);\n return;\n }\n\n if (options.mcp) {\n console.log(`MCP SETUP\\n`);\n console.log(`1. Install Figma MCP in Claude Code:`);\n console.log(` claude mcp add figma -- npx -y @anthropic-ai/claude-code-mcp-figma\\n`);\n console.log(`2. Add canicode MCP server:`);\n console.log(` claude mcp add --transport stdio canicode npx canicode-mcp\\n`);\n console.log(`3. Set Figma token (for MCP server's REST API fallback):`);\n console.log(` canicode init --token YOUR_TOKEN\\n`);\n console.log(`4. Use in Claude Code:`);\n console.log(` \"Analyze this Figma design: https://www.figma.com/design/...\"`);\n return;\n }\n\n // No flags: show setup guide\n console.log(`CANICODE SETUP\\n`);\n console.log(`Choose your Figma data source:\\n`);\n console.log(`Option 1: REST API (recommended for CI/automation)`);\n console.log(` canicode init --token YOUR_FIGMA_TOKEN`);\n console.log(` Get token: figma.com > Settings > Personal access tokens\\n`);\n console.log(`Option 2: Figma MCP (recommended for Claude Code)`);\n console.log(` canicode init --mcp`);\n console.log(` No token needed for CLI — uses Claude Code's Figma MCP bridge\\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.exit(1);\n }\n });\n\n// ============================================\n// Documentation command\n// ============================================\n\ncli\n .command(\"docs [topic]\", \"Show documentation (topics: setup, rules, config)\")\n .action((topic?: string) => {\n handleDocs(topic);\n });\n\ncli.help((sections) => {\n sections.push(\n {\n title: \"\\nSetup\",\n body: [\n ` canicode init --token <token> Save Figma token to ~/.canicode/`,\n ` canicode init --mcp Show MCP setup instructions`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nData source\",\n body: [\n ` --mcp Load via Figma MCP (no token needed)`,\n ` --api Load via Figma REST API (needs FIGMA_TOKEN)`,\n ` (default) Auto-detect: try MCP first, then API`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nCustomization\",\n body: [\n ` --custom-rules <path> Add custom rules (see: canicode docs rules)`,\n ` --config <path> Override rule settings (see: canicode docs config)`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nExamples\",\n body: [\n ` $ canicode analyze \"https://www.figma.com/design/...\" --mcp`,\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 analyze \"https://www.figma.com/design/...\" --custom-rules ./my-rules.json`,\n ].join(\"\\n\"),\n },\n {\n title: \"\\nInstallation\",\n body: [\n ` CLI: npm install -g canicode`,\n ` MCP: claude mcp add --transport stdio canicode npx canicode-mcp`,\n ` Skills: github.com/let-sunny/canicode`,\n ].join(\"\\n\"),\n },\n );\n});\ncli.version(\"0.1.0\");\n\ncli.parse();\n"]}