@atomixstudio/mcp 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/tokens.ts","../src/utils.ts","../src/component-tokens.ts","../src/user-tokens.ts","../src/ai-rules-generator.ts"],"sourcesContent":["/**\n * Atomix MCP Server\n * \n * Exposes design tokens to AI tools via the Model Context Protocol.\n * \n * Tools:\n * - getToken: Get a specific token by path\n * - listTokens: List all tokens in a category\n * - getComponentTokens: Get tokens for a specific component\n * - validateUsage: Check if a value follows the design system\n * - generateCursorRules: Generate .cursorrules for a project\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nimport { loadPrimitives } from \"./tokens.js\";\nimport { \n getTokenByPath, \n listTokensInCategory, \n flattenTokens,\n getTokenCategories,\n getCssVariableName,\n getTokenMetadata,\n isSemanticToken,\n type TokenTier,\n} from \"./utils.js\";\nimport { COMPONENT_TOKENS } from \"./component-tokens.js\";\nimport {\n parseCLIArgs,\n isUserDSMode,\n fetchUserDesignSystem,\n transformUserTokens,\n} from \"./user-tokens.js\";\nimport { \n generateCursorRules,\n generateRulesForTool,\n generateRulesForAllTools,\n getSupportedAITools,\n generateToolSetupGuide,\n generateMCPConfig,\n generateAllMCPConfigs,\n getSetupInstructions,\n AI_TOOLS,\n type AIToolId,\n type MCPConfigToolId,\n} from \"./ai-rules-generator.js\";\n\n// ============================================\n// HELPERS\n// ============================================\n\n/**\n * Format a timestamp as a human-readable \"time ago\" string\n */\nfunction formatTimeAgo(timestamp: number): string {\n const now = Date.now();\n const diffMs = now - timestamp;\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n\n if (diffSec < 60) return \"just now\";\n if (diffMin < 60) return `${diffMin} minute${diffMin > 1 ? \"s\" : \"\"} ago`;\n if (diffHour < 24) return `${diffHour} hour${diffHour > 1 ? \"s\" : \"\"} ago`;\n if (diffDay < 7) return `${diffDay} day${diffDay > 1 ? \"s\" : \"\"} ago`;\n \n // For older dates, show the date\n const date = new Date(timestamp);\n return date.toLocaleDateString(\"en-US\", { \n month: \"short\", \n day: \"numeric\", \n year: date.getFullYear() !== new Date().getFullYear() ? \"numeric\" : undefined \n });\n}\n\n// ============================================\n// SERVER SETUP\n// ============================================\n\nconst server = new Server(\n {\n name: \"atomix-mcp\",\n version: \"0.1.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n);\n\n// ============================================\n// TOOL DEFINITIONS\n// ============================================\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: \"getToken\",\n description: \"Get a specific design token by its path. Returns value, CSS variable, and tier metadata. IMPORTANT: Tokens are tiered - 'primitive' tokens are read-only reference values, 'semantic' tokens are the primary API for styling.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Token path in dot notation. Prefer semantic paths (colors.modes.light.bgPage) over primitive paths (colors.scales.green.500)\",\n },\n tenantId: {\n type: \"string\",\n description: \"Tenant ID for multi-tenant support (optional, defaults to 'default')\",\n },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"listTokens\",\n description: \"List tokens in a category. Use 'tier' filter to get only semantic tokens (recommended) or primitives (reference only). Semantic tokens are the primary API; primitives are read-only reference values.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n enum: [\"colors\", \"typography\", \"spacing\", \"sizing\", \"shadows\", \"radius\", \"motion\", \"zIndex\", \"borders\"],\n description: \"Token category to list\",\n },\n subcategory: {\n type: \"string\",\n description: \"Optional subcategory, e.g., 'modes.light' for semantic colors, 'scale' for primitive spacing\",\n },\n tier: {\n type: \"string\",\n enum: [\"semantic\", \"primitive\", \"all\"],\n description: \"Filter by token tier. 'semantic' (recommended) returns purpose-driven tokens for styling. 'primitive' returns raw reference values. Default: 'all'\",\n },\n tenantId: {\n type: \"string\",\n description: \"Tenant ID for multi-tenant support (optional, defaults to 'default')\",\n },\n },\n required: [\"category\"],\n },\n },\n {\n name: \"getComponentTokens\",\n description: \"Get all design tokens used by a specific component (Button, Card, Dialog, etc.)\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n enum: [\"button\", \"card\", \"dialog\", \"input\", \"select\", \"heading\", \"checkbox\", \"radio\", \"toggle\", \"selectionControls\"],\n description: \"Component name\",\n },\n variant: {\n type: \"string\",\n description: \"Optional variant name (e.g., 'primary', 'outline', 'ghost')\",\n },\n size: {\n type: \"string\",\n description: \"Optional size name (e.g., 'sm', 'md', 'lg')\",\n },\n tenantId: {\n type: \"string\",\n description: \"Tenant ID for multi-tenant support (optional, defaults to 'default')\",\n },\n },\n required: [\"component\"],\n },\n },\n {\n name: \"validateUsage\",\n description: \"Check if a CSS value follows the Atomix design system. Detects arbitrary values that should use tokens.\",\n inputSchema: {\n type: \"object\",\n properties: {\n value: {\n type: \"string\",\n description: \"CSS value to validate, e.g., '#ff0000', '16px', 'rgb(0,112,97)'\",\n },\n context: {\n type: \"string\",\n enum: [\"color\", \"spacing\", \"radius\", \"shadow\", \"typography\", \"any\"],\n description: \"Context of the value (helps find the right token)\",\n },\n },\n required: [\"value\"],\n },\n },\n {\n name: \"generateCursorRules\",\n description: \"[DEPRECATED] Use 'getAIToolRules' instead. Generate .cursorrules content for a project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectName: {\n type: \"string\",\n description: \"Name of the project\",\n },\n strict: {\n type: \"boolean\",\n description: \"Whether to enforce strict token usage (no arbitrary values)\",\n },\n },\n required: [],\n },\n },\n {\n name: \"getAIToolRules\",\n description: \"Generate design system rules for AI coding tools. Supports Cursor, GitHub Copilot, Windsurf, Cline, Continue, Zed, and more.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"generic\", \"all\"],\n description: \"AI tool to generate rules for. Use 'all' to generate for all supported tools.\",\n },\n projectName: {\n type: \"string\",\n description: \"Name of the project (default: 'My Project')\",\n },\n strict: {\n type: \"boolean\",\n description: \"Enforce strict token usage - no arbitrary values allowed (default: true)\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"listAITools\",\n description: \"List all supported AI coding tools and their rules file conventions.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n },\n {\n name: \"getAIToolSetupGuide\",\n description: \"Get a complete setup guide for integrating Atomix with AI coding tools.\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectName: {\n type: \"string\",\n description: \"Name of the project\",\n },\n },\n required: [],\n },\n },\n {\n name: \"exportMCPConfig\",\n description: \"Generate MCP configuration file for AI tools. Creates ready-to-use config for Cursor (.cursor/mcp.json), Claude Desktop, Windsurf, Continue, or VS Code.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"claude-desktop\", \"windsurf\", \"continue\", \"vscode\", \"all\"],\n description: \"AI tool to generate MCP config for. Use 'all' to generate for all supported tools.\",\n },\n tenantId: {\n type: \"string\",\n description: \"Tenant ID for multi-tenant setups (optional, defaults to 'default')\",\n },\n projectName: {\n type: \"string\",\n description: \"Project name for identification (optional)\",\n },\n useNpx: {\n type: \"boolean\",\n description: \"Use npx to run the server (default: true). Set to false for local development.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"getSetupInstructions\",\n description: \"Get detailed step-by-step setup instructions for a specific AI tool. Includes MCP configuration, rules file setup, and verification steps.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"claude-desktop\", \"generic\"],\n description: \"AI tool to get setup instructions for.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"searchTokens\",\n description: \"Search for tokens by name or value. Results include tier metadata - prefer using 'semantic' tier tokens in code, use 'primitive' tier only for reference/validation.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (matches token paths or values)\",\n },\n tier: {\n type: \"string\",\n enum: [\"semantic\", \"primitive\", \"all\"],\n description: \"Filter results by tier. 'semantic' recommended for styling. Default: 'all'\",\n },\n },\n required: [\"query\"],\n },\n },\n ],\n };\n});\n\n// ============================================\n// TOOL HANDLERS\n// ============================================\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n switch (name) {\n case \"getToken\": {\n const path = args?.path as string;\n const value = getTokenByPath(primitives, path);\n \n if (value === undefined) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: `Token not found: ${path}`,\n suggestion: `Use listTokens to see available tokens. Available categories: ${getTokenCategories().join(\", \")}`,\n }, null, 2),\n },\n ],\n };\n }\n\n const cssVar = getCssVariableName(path);\n const metadata = getTokenMetadata(path);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n path,\n value,\n cssVariable: cssVar,\n // Token tier classification\n tier: metadata.tier,\n mutable: metadata.mutable,\n editVia: metadata.editVia || null,\n guidance: metadata.guidance,\n // Usage examples\n usage: metadata.tier === \"semantic\" ? {\n css: `var(${cssVar})`,\n tailwind: getTailwindClass(path, value),\n recommendation: \"Use this token in your components.\",\n } : {\n css: `var(${cssVar})`,\n tailwind: getTailwindClass(path, value),\n recommendation: \"This is a primitive (read-only reference). Consider using a semantic token instead.\",\n semanticAlternatives: getSuggestedSemanticTokens(path),\n },\n }, null, 2),\n },\n ],\n };\n }\n\n case \"listTokens\": {\n const category = args?.category as string;\n const subcategory = args?.subcategory as string | undefined;\n const tierFilter = (args?.tier as TokenTier | \"all\") || \"all\";\n \n const rawTokens = listTokensInCategory(primitives, category, subcategory);\n \n // Apply tier filter and add metadata\n const tokensWithMetadata: Record<string, {\n value: unknown;\n tier: TokenTier;\n mutable: boolean;\n guidance: string;\n }> = {};\n \n for (const [tokenPath, value] of Object.entries(rawTokens)) {\n const fullPath = subcategory \n ? `${category}.${subcategory}.${tokenPath}`\n : `${category}.${tokenPath}`;\n const metadata = getTokenMetadata(fullPath);\n \n // Apply tier filter\n if (tierFilter !== \"all\" && metadata.tier !== tierFilter) {\n continue;\n }\n \n tokensWithMetadata[tokenPath] = {\n value,\n tier: metadata.tier,\n mutable: metadata.mutable,\n guidance: metadata.guidance,\n };\n }\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n category,\n subcategory: subcategory || null,\n tierFilter,\n count: Object.keys(tokensWithMetadata).length,\n note: tierFilter === \"all\" \n ? \"Results include both primitive (read-only) and semantic (usable) tokens. Use tier='semantic' for styling recommendations.\"\n : tierFilter === \"semantic\"\n ? \"Showing semantic tokens - these are the recommended tokens for styling.\"\n : \"Showing primitive tokens - use these for reference/validation only, not direct styling.\",\n tokens: tokensWithMetadata,\n }, null, 2),\n },\n ],\n };\n }\n\n case \"getComponentTokens\": {\n const component = args?.component as string;\n const variant = args?.variant as string | undefined;\n const size = args?.size as string | undefined;\n \n const componentKey = component.toLowerCase();\n const componentData = COMPONENT_TOKENS[componentKey];\n \n if (!componentData) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: `Component not found: ${component}`,\n available: Object.keys(COMPONENT_TOKENS),\n }, null, 2),\n },\n ],\n };\n }\n\n let result = { ...componentData };\n \n // Filter by variant if specified\n if (variant && result.variants) {\n result.variants = { [variant]: result.variants[variant] };\n }\n \n // Filter by size if specified\n if (size && result.sizes) {\n result.sizes = { [size]: result.sizes[size] };\n }\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n\n case \"validateUsage\": {\n const value = args?.value as string;\n const context = (args?.context as string) || \"any\";\n \n const validation = validateValue(value, context);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(validation, null, 2),\n },\n ],\n };\n }\n\n case \"generateCursorRules\": {\n // DEPRECATED: Forward to getAIToolRules\n const projectName = (args?.projectName as string) || \"My Project\";\n const strict = (args?.strict as boolean) ?? true;\n \n const rules = generateCursorRules(projectName, strict);\n \n return {\n content: [\n {\n type: \"text\",\n text: `<!-- DEPRECATED: Use getAIToolRules instead -->\\n${rules}`,\n },\n ],\n };\n }\n\n case \"getAIToolRules\": {\n const tool = args?.tool as string;\n const projectName = (args?.projectName as string) || \"My Project\";\n const strict = (args?.strict as boolean) ?? true;\n \n if (tool === \"all\") {\n // Generate for all tools\n const allRules = generateRulesForAllTools(projectName, strict);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n message: `Generated rules for ${allRules.length} AI tools`,\n tools: allRules.map(r => ({\n tool: r.tool.name,\n filename: r.filename,\n path: r.path,\n description: r.tool.description,\n })),\n files: allRules.map(r => ({\n path: r.path,\n content: r.content,\n })),\n }, null, 2),\n },\n ],\n };\n }\n \n // Generate for specific tool\n try {\n const result = generateRulesForTool(tool as AIToolId, projectName, strict);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n tool: result.tool.name,\n filename: result.filename,\n path: result.path,\n description: result.tool.description,\n content: result.content,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: String(error),\n availableTools: Object.keys(AI_TOOLS),\n }, null, 2),\n },\n ],\n };\n }\n }\n\n case \"listAITools\": {\n const tools = getSupportedAITools();\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n count: tools.length,\n tools: tools.map(t => ({\n id: t.id,\n name: t.name,\n rulesFile: t.rulesPath,\n description: t.description,\n })),\n note: \"Use getAIToolRules({ tool: 'toolId' }) to generate rules for a specific tool.\",\n }, null, 2),\n },\n ],\n };\n }\n\n case \"getAIToolSetupGuide\": {\n const projectName = (args?.projectName as string) || \"My Project\";\n const guide = generateToolSetupGuide(projectName);\n \n return {\n content: [\n {\n type: \"text\",\n text: guide,\n },\n ],\n };\n }\n\n case \"exportMCPConfig\": {\n const tool = args?.tool as string;\n const tenantId = (args?.tenantId as string) || \"default\";\n const projectName = (args?.projectName as string) || \"my-project\";\n const useNpx = (args?.useNpx as boolean) ?? true;\n \n const options = { tenantId, projectName, useNpx };\n \n if (tool === \"all\") {\n // Generate for all tools\n const allConfigs = generateAllMCPConfigs(options);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n message: `Generated MCP configs for ${allConfigs.length} AI tools`,\n configs: allConfigs.map(c => ({\n tool: c.tool,\n path: c.path,\n filename: c.filename,\n })),\n files: allConfigs.map(c => ({\n tool: c.tool,\n path: c.path,\n content: c.content,\n instructions: c.instructions,\n })),\n }, null, 2),\n },\n ],\n };\n }\n \n // Generate for specific tool\n try {\n const config = generateMCPConfig(tool as MCPConfigToolId, options);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n tool: config.tool,\n path: config.path,\n filename: config.filename,\n content: config.content,\n instructions: config.instructions,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: String(error),\n availableTools: [\"cursor\", \"claude-desktop\", \"windsurf\", \"continue\", \"vscode\", \"all\"],\n }, null, 2),\n },\n ],\n };\n }\n }\n\n case \"getSetupInstructions\": {\n const toolId = args?.tool as AIToolId;\n \n try {\n const instructions = getSetupInstructions(toolId);\n \n return {\n content: [\n {\n type: \"text\",\n text: instructions,\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: String(error),\n availableTools: Object.keys(AI_TOOLS),\n }, null, 2),\n },\n ],\n };\n }\n }\n\n case \"searchTokens\": {\n const query = (args?.query as string).toLowerCase();\n const tierFilter = (args?.tier as TokenTier | \"all\") || \"all\";\n const allTokens = flattenTokens(primitives);\n \n const matches = Object.entries(allTokens)\n .filter(([path, value]) => {\n const pathLower = path.toLowerCase();\n const valueStr = String(value).toLowerCase();\n const matchesQuery = pathLower.includes(query) || valueStr.includes(query);\n \n if (!matchesQuery) return false;\n \n // Apply tier filter\n if (tierFilter !== \"all\") {\n const metadata = getTokenMetadata(path);\n if (metadata.tier !== tierFilter) return false;\n }\n \n return true;\n })\n .slice(0, 50) // Limit results\n .map(([path, value]) => {\n const metadata = getTokenMetadata(path);\n return {\n path,\n value,\n cssVariable: getCssVariableName(path),\n tier: metadata.tier,\n mutable: metadata.mutable,\n guidance: metadata.guidance,\n };\n });\n \n // Sort semantic tokens first\n matches.sort((a, b) => {\n if (a.tier === \"semantic\" && b.tier !== \"semantic\") return -1;\n if (a.tier !== \"semantic\" && b.tier === \"semantic\") return 1;\n return 0;\n });\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n query,\n tierFilter,\n count: matches.length,\n note: \"Semantic tokens are listed first. Use semantic tokens for styling; primitives are for reference only.\",\n matches,\n }, null, 2),\n },\n ],\n };\n }\n\n default:\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: `Unknown tool: ${name}` }),\n },\n ],\n };\n }\n});\n\n// ============================================\n// RESOURCE DEFINITIONS\n// ============================================\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: \"atomix://tokens/all\",\n name: \"All Atomix Tokens\",\n description: \"Complete design token reference\",\n mimeType: \"application/json\",\n },\n {\n uri: \"atomix://tokens/colors\",\n name: \"Color Tokens\",\n description: \"All color tokens (static, scales, modes)\",\n mimeType: \"application/json\",\n },\n {\n uri: \"atomix://tokens/typography\",\n name: \"Typography Tokens\",\n description: \"Font families, sizes, weights, line heights\",\n mimeType: \"application/json\",\n },\n {\n uri: \"atomix://tokens/spacing\",\n name: \"Spacing Tokens\",\n description: \"Spacing scale, insets, gaps\",\n mimeType: \"application/json\",\n },\n {\n uri: \"atomix://components\",\n name: \"Component Tokens\",\n description: \"Token mappings for all components\",\n mimeType: \"application/json\",\n },\n ],\n };\n});\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri;\n \n switch (uri) {\n case \"atomix://tokens/all\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(primitives, null, 2),\n },\n ],\n };\n \n case \"atomix://tokens/colors\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(primitives.colors, null, 2),\n },\n ],\n };\n \n case \"atomix://tokens/typography\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(primitives.typography, null, 2),\n },\n ],\n };\n \n case \"atomix://tokens/spacing\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(primitives.spacing, null, 2),\n },\n ],\n };\n \n case \"atomix://components\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(COMPONENT_TOKENS, null, 2),\n },\n ],\n };\n \n default:\n throw new Error(`Unknown resource: ${uri}`);\n }\n});\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\nfunction getTailwindClass(path: string, value: unknown): string | null {\n // Map common token paths to Tailwind classes\n if (path.startsWith(\"colors.static.brand.primary\")) return \"bg-brand text-brand\";\n // Spacing: flat structure (spacing.xs, spacing.md, etc.)\n if (path.startsWith(\"spacing.\") && !path.includes(\".inset\")) {\n const size = path.split(\".\").pop();\n return `p-${size} m-${size} gap-${size}`;\n }\n // Radius: flat structure (radius.xs, radius.md, etc.)\n if (path.startsWith(\"radius.\")) {\n const size = path.split(\".\").pop();\n return `rounded-${size}`;\n }\n return null;\n}\n\n/**\n * Suggest semantic token alternatives for a primitive token path\n */\nfunction getSuggestedSemanticTokens(primitivePath: string): string[] {\n const suggestions: string[] = [];\n \n // Color scale → Mode colors\n if (primitivePath.startsWith(\"colors.scales.\")) {\n suggestions.push(\n \"colors.modes.light.bgPage (page background)\",\n \"colors.modes.light.bgSurface (card/panel background)\",\n \"colors.modes.light.textPrimary (main text)\",\n \"colors.modes.light.borderPrimary (borders)\",\n \"colors.modes.light.actionPrimary (interactive elements)\"\n );\n }\n \n // Spacing → Use flat spacing tokens (spacing.xs, spacing.md, etc.)\n if (primitivePath.startsWith(\"spacing.\")) {\n suggestions.push(\n \"Use spacing tokens (spacing.xs, spacing.sm, spacing.md, spacing.lg, etc.)\",\n \"These resolve to CSS variables automatically\"\n );\n }\n \n // Typography fontSize → TypeSets\n if (primitivePath.startsWith(\"typography.fontSize.\")) {\n suggestions.push(\n \"typography.typeSets.title-lg (large titles)\",\n \"typography.typeSets.title-md (medium titles)\",\n \"typography.typeSets.text-normal-regular (body text)\",\n \"typography.typeSets.label-md (form labels)\"\n );\n }\n \n // Radius → Use flat radius tokens (radius.sm, radius.md, etc.)\n if (primitivePath.startsWith(\"radius.\")) {\n suggestions.push(\n \"Use radius tokens (radius.sm, radius.md, radius.lg, radius.full, etc.)\",\n \"Describe semantic usage in AI guidance (e.g., 'Buttons use @radius.md')\"\n );\n }\n \n // Shadow elevation → Use elevation keys\n if (primitivePath.startsWith(\"shadows.elevation.\")) {\n suggestions.push(\n \"Use elevation keys (none, sm, md, lg, xl) in component defaults\",\n \"These resolve to CSS variables automatically\"\n );\n }\n \n return suggestions;\n}\n\nfunction validateValue(value: string, context: string): {\n valid: boolean;\n issue?: string;\n suggestion?: string;\n matchingTokens?: Array<{ path: string; value: unknown; cssVariable: string }>;\n} {\n // Check for hex colors\n if (/^#[0-9A-Fa-f]{3,8}$/.test(value)) {\n const allTokens = flattenTokens(primitives);\n const matches = Object.entries(allTokens)\n .filter(([path, v]) => {\n if (typeof v !== \"string\") return false;\n return v.toLowerCase() === value.toLowerCase();\n })\n .map(([path, v]) => ({\n path,\n value: v,\n cssVariable: getCssVariableName(path),\n }));\n \n if (matches.length > 0) {\n return {\n valid: false,\n issue: \"Hardcoded hex color detected\",\n suggestion: `Use token instead: ${matches[0].cssVariable}`,\n matchingTokens: matches,\n };\n }\n \n return {\n valid: false,\n issue: \"Hardcoded hex color with no matching token\",\n suggestion: \"Check colors.static, colors.scales, or colors.modes for appropriate tokens\",\n };\n }\n\n // Check for rgb/rgba/hsl colors\n if (/^(rgb|rgba|hsl|hsla)\\(/.test(value)) {\n return {\n valid: false,\n issue: \"Hardcoded color function detected\",\n suggestion: \"Use CSS variable: var(--atomix-colors-*) or primitives.colors.*\",\n };\n }\n\n // Check for pixel values in spacing context\n if (context === \"spacing\" && /^\\d+px$/.test(value)) {\n return {\n valid: false,\n issue: \"Hardcoded pixel value for spacing\",\n suggestion: \"Use spacing.* tokens (e.g., @spacing.md, @spacing.lg)\",\n };\n }\n\n // Check for pixel values in any context\n if (/^\\d+px$/.test(value)) {\n return {\n valid: false,\n issue: \"Hardcoded pixel value detected\",\n suggestion: \"Consider using design tokens from spacing, sizing, or typography\",\n };\n }\n\n // Check for Tailwind arbitrary values\n if (/\\[.*\\]/.test(value)) {\n return {\n valid: false,\n issue: \"Tailwind arbitrary value detected\",\n suggestion: \"Replace with token-based class or CSS variable\",\n };\n }\n\n return { valid: true };\n}\n\n// ============================================\n// START SERVER\n// ============================================\n\n// Global primitives reference (loaded on startup)\nlet primitives: Record<string, unknown> = {};\n\n// Global governance reference (for user DS mode)\nlet userGovernance: { rules: string[]; categories?: Record<string, string[]> } | undefined;\n\n// Global DS mode flag\nlet isUserMode = false;\nlet userDsId: string | undefined;\n\nasync function main() {\n // Parse CLI arguments\n const cliArgs = parseCLIArgs();\n \n if (isUserDSMode(cliArgs)) {\n // User DS mode: fetch tokens from Atomix API\n console.error(`[atomix-mcp] User DS mode: loading design system ${cliArgs.dsId}`);\n isUserMode = true;\n userDsId = cliArgs.dsId;\n \n const result = await fetchUserDesignSystem({\n dsId: cliArgs.dsId!,\n apiKey: cliArgs.apiKey,\n baseUrl: cliArgs.baseUrl,\n });\n \n if (!result.success || !result.tokens) {\n console.error(`[atomix-mcp] Failed to load user DS: ${result.error}`);\n console.error(\"[atomix-mcp] Falling back to Atomix internal tokens\");\n \n // Fallback to internal tokens\n primitives = await loadPrimitives();\n } else {\n // Transform user tokens to MCP-compatible format\n primitives = transformUserTokens(result.tokens);\n userGovernance = result.governance;\n \n // Display startup summary\n const meta = result.meta;\n const dsName = meta?.name || cliArgs.dsId;\n const tokenCategories = Object.keys(primitives);\n const rulesCount = userGovernance?.rules?.length || 0;\n \n console.error(\"\");\n console.error(`[atomix-mcp] ========================================`);\n console.error(`[atomix-mcp] Design System: ${dsName}`);\n console.error(`[atomix-mcp] ----------------------------------------`);\n \n // Show publish info\n if (meta?.publishedAt) {\n const publishedDate = new Date(meta.publishedAt);\n const timeAgo = formatTimeAgo(meta.publishedAt);\n console.error(`[atomix-mcp] Published: ${timeAgo}`);\n console.error(`[atomix-mcp] (${publishedDate.toLocaleString()})`);\n }\n if (meta?.version) {\n console.error(`[atomix-mcp] Version: ${meta.version}`);\n }\n \n console.error(`[atomix-mcp] ----------------------------------------`);\n console.error(`[atomix-mcp] Tokens: ${tokenCategories.length} categories`);\n console.error(`[atomix-mcp] ${tokenCategories.join(\", \")}`);\n console.error(`[atomix-mcp] Rules: ${rulesCount} governance rules`);\n console.error(`[atomix-mcp] ========================================`);\n console.error(\"\");\n }\n } else {\n // Standard mode: load Atomix internal primitives\n console.error(\"[atomix-mcp] Loading Atomix internal primitives...\");\n primitives = await loadPrimitives();\n console.error(`[atomix-mcp] Loaded ${Object.keys(primitives).length} token categories`);\n }\n \n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n console.error(\"[atomix-mcp] Atomix MCP server started\");\n if (isUserMode) {\n console.error(`[atomix-mcp] Serving design system: ${userDsId}`);\n }\n}\n\nmain().catch((error) => {\n console.error(\"[atomix-mcp] Fatal error:\", error);\n process.exit(1);\n});\n\n// ============================================\n// EXPORTS (for programmatic use)\n// ============================================\n\nexport {\n // AI rules generator functions\n generateCursorRules,\n generateRulesForTool,\n generateRulesForAllTools,\n getSupportedAITools,\n generateToolSetupGuide,\n generateMCPConfig,\n generateAllMCPConfigs,\n getSetupInstructions,\n AI_TOOLS,\n // User tokens functions\n parseCLIArgs,\n isUserDSMode,\n fetchUserDesignSystem,\n transformUserTokens,\n // Types\n type AIToolId,\n type MCPConfigToolId,\n};\n\n","/**\n * Token data for MCP server\n * \n * Loads primitives dynamically from the local @atomix/tokens package.\n * This module provides the single source of truth for all design tokens.\n */\n\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\n// Get the directory of this file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Load primitives from the sibling atomix package\n// Path: packages/atomix-mcp/dist -> packages/atomix/dist\nconst atomixPath = join(__dirname, \"../../atomix/dist/index.mjs\");\n\n// Dynamic import with fallback to inline primitives\nlet loadedPrimitives: Record<string, unknown> | null = null;\n\nasync function loadPrimitives(): Promise<Record<string, unknown>> {\n if (loadedPrimitives) return loadedPrimitives;\n \n try {\n const module = await import(atomixPath);\n loadedPrimitives = module.primitives as Record<string, unknown>;\n return loadedPrimitives;\n } catch (error) {\n console.error(`Failed to load @atomix/tokens from ${atomixPath}:`, error);\n console.error(\"Falling back to inline primitives...\");\n loadedPrimitives = FALLBACK_PRIMITIVES;\n return FALLBACK_PRIMITIVES;\n }\n}\n\n// Export a synchronous reference (populated on first use)\n// For the MCP server, we'll use loadPrimitives() to ensure it's loaded\nexport { loadPrimitives };\n\n// Synchronous export (may be empty until loadPrimitives is called)\nexport let primitives: Record<string, unknown> = {};\n\n// Initialize primitives immediately\nloadPrimitives().then((p) => {\n primitives = p;\n});\n\nexport const TOKEN_CATEGORIES = [\n \"colors\",\n \"typography\", \n \"spacing\",\n \"sizing\",\n \"shadows\",\n \"radius\",\n \"motion\",\n \"zIndex\",\n \"borders\",\n] as const;\n\nexport type TokenCategory = typeof TOKEN_CATEGORIES[number];\n\n// Fallback primitives (minimal set for testing when @atomix/tokens isn't available)\nconst FALLBACK_PRIMITIVES: Record<string, unknown> = {\n colors: {\n static: {\n brand: {\n primary: \"#007061\",\n primaryLight: \"#00A389\",\n primaryDark: \"#005A4D\",\n primaryForeground: \"#FFFFFF\",\n },\n white: \"#FFFFFF\",\n black: \"#000000\",\n },\n modes: {\n light: {\n bgPage: \"#FFFFFF\",\n bgSurface: \"#FFFFFF\",\n bgMuted: \"#F5F5F5\",\n textPrimary: \"#171717\",\n textSecondary: \"#525252\",\n textMuted: \"#A3A3A3\",\n // Icon colors (derived from brand/text)\n iconBrand: \"#007061\", // = brand.primary\n iconStrong: \"#171717\", // = textPrimary\n iconSubtle: \"#525252\", // = textSecondary\n iconDisabled: \"#A3A3A3\", // = textMuted\n borderPrimary: \"#E5E5E5\",\n },\n dark: {\n bgPage: \"#0A0A0A\",\n bgSurface: \"#1A1A1A\",\n bgMuted: \"#262626\",\n textPrimary: \"#FAFAFA\",\n textSecondary: \"#A3A3A3\",\n textMuted: \"#737373\",\n // Icon colors (derived from brand/text)\n iconBrand: \"#007061\", // = brand.primary\n iconStrong: \"#FAFAFA\", // = textPrimary\n iconSubtle: \"#A3A3A3\", // = textSecondary\n iconDisabled: \"#737373\", // = textMuted\n borderPrimary: \"#404040\",\n },\n },\n scales: {\n green: {\n 50: \"#E6F5F2\",\n 500: \"#007061\",\n 900: \"#002E28\",\n },\n },\n },\n typography: {\n fontFamily: {\n sans: \"Inter, system-ui, sans-serif\",\n mono: \"JetBrains Mono, monospace\",\n },\n fontSize: {\n xs: \"0.75rem\",\n sm: \"0.875rem\",\n md: \"1rem\",\n lg: \"1.125rem\",\n xl: \"1.25rem\",\n },\n fontWeight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.625,\n },\n },\n spacing: {\n scale: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n },\n inset: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n },\n },\n sizing: {\n button: {\n sm: { height: \"32px\" },\n md: { height: \"40px\" },\n lg: { height: \"48px\" },\n },\n },\n shadows: {\n elevation: {\n none: \"none\",\n sm: \"0 1px 2px rgba(0, 0, 0, 0.05)\",\n md: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n lg: \"0 10px 15px rgba(0, 0, 0, 0.1)\",\n },\n focus: {\n ring: \"0 0 0 2px var(--atomix-brand)\",\n },\n },\n radius: {\n scale: {\n none: \"0\",\n sm: \"0.25rem\",\n md: \"0.5rem\",\n lg: \"0.75rem\",\n xl: \"1rem\",\n full: \"9999px\",\n },\n },\n motion: {\n duration: {\n instant: \"0ms\",\n fast: \"150ms\",\n normal: \"200ms\",\n slow: \"300ms\",\n },\n easing: {\n ease: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n easeIn: \"cubic-bezier(0.4, 0, 1, 1)\",\n easeOut: \"cubic-bezier(0, 0, 0.2, 1)\",\n },\n },\n zIndex: {\n dropdown: 1000,\n modal: 1100,\n tooltip: 1200,\n },\n borders: {\n width: {\n none: \"0\",\n thin: \"1px\",\n medium: \"2px\",\n },\n },\n};\n\n","/**\n * Utility functions for token traversal and manipulation\n */\n\nimport { TOKEN_CATEGORIES, type TokenCategory } from \"./tokens.js\";\n\n/**\n * Get a token value by its dot-notation path\n * @example getTokenByPath(primitives, \"colors.static.brand.primary\")\n */\nexport function getTokenByPath(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n \n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n \n return current;\n}\n\n/**\n * List all tokens in a category, optionally filtered by subcategory\n */\nexport function listTokensInCategory(\n primitives: Record<string, unknown>,\n category: string,\n subcategory?: string\n): Record<string, unknown> {\n let base = primitives[category];\n \n if (!base) return {};\n \n if (subcategory) {\n const subParts = subcategory.split(\".\");\n for (const part of subParts) {\n if (typeof base !== \"object\" || base === null) return {};\n base = (base as Record<string, unknown>)[part];\n }\n }\n \n if (typeof base !== \"object\" || base === null) {\n return { [subcategory || category]: base };\n }\n \n return flattenTokens(base as Record<string, unknown>);\n}\n\n/**\n * Flatten a nested token object into dot-notation paths\n */\nexport function flattenTokens(\n obj: Record<string, unknown>,\n prefix = \"\"\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n \n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n \n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(result, flattenTokens(value as Record<string, unknown>, path));\n } else {\n result[path] = value;\n }\n }\n \n return result;\n}\n\n/**\n * Get all available token categories\n */\nexport function getTokenCategories(): TokenCategory[] {\n return [...TOKEN_CATEGORIES];\n}\n\n/**\n * Convert a token path to a CSS variable name\n * @example getCssVariableName(\"colors.static.brand.primary\") → \"--atomix-colors-static-brand-primary\"\n */\nexport function getCssVariableName(path: string): string {\n // Convert dot notation to dash notation\n const dashPath = path\n .replace(/\\./g, \"-\")\n .replace(/([a-z])([A-Z])/g, \"$1-$2\") // camelCase to kebab-case\n .toLowerCase();\n \n return `--atomix-${dashPath}`;\n}\n\n/**\n * Parse a CSS variable name back to a token path\n * @example parseVariableName(\"--atomix-colors-static-brand-primary\") → \"colors.static.brand.primary\"\n */\nexport function parseVariableName(varName: string): string | null {\n if (!varName.startsWith(\"--atomix-\")) return null;\n \n return varName\n .replace(\"--atomix-\", \"\")\n .replace(/-/g, \".\");\n}\n\n/**\n * Check if a value looks like a hardcoded token (hex, rgb, px, etc.)\n */\nexport function isHardcodedValue(value: string): {\n isHardcoded: boolean;\n type?: \"color\" | \"spacing\" | \"unknown\";\n details?: string;\n} {\n // Hex colors\n if (/^#[0-9A-Fa-f]{3,8}$/.test(value)) {\n return { isHardcoded: true, type: \"color\", details: \"Hex color\" };\n }\n \n // RGB/RGBA/HSL\n if (/^(rgb|rgba|hsl|hsla)\\(/.test(value)) {\n return { isHardcoded: true, type: \"color\", details: \"Color function\" };\n }\n \n // Pixel values\n if (/^\\d+px$/.test(value)) {\n return { isHardcoded: true, type: \"spacing\", details: \"Pixel value\" };\n }\n \n // Rem values (outside of tokens)\n if (/^\\d+(\\.\\d+)?rem$/.test(value)) {\n return { isHardcoded: true, type: \"spacing\", details: \"Rem value\" };\n }\n \n // Tailwind arbitrary values\n if (/\\[.+\\]/.test(value)) {\n return { isHardcoded: true, type: \"unknown\", details: \"Tailwind arbitrary value\" };\n }\n \n return { isHardcoded: false };\n}\n\n/**\n * Find tokens matching a hex color value\n */\nexport function findTokensByColor(\n primitives: Record<string, unknown>,\n hexColor: string\n): Array<{ path: string; value: string }> {\n const allTokens = flattenTokens(primitives);\n const normalizedHex = hexColor.toLowerCase();\n \n return Object.entries(allTokens)\n .filter(([_, value]) => {\n if (typeof value !== \"string\") return false;\n return value.toLowerCase() === normalizedHex;\n })\n .map(([path, value]) => ({ path, value: value as string }));\n}\n\n/**\n * Get semantic alias for a token path (for shorter CSS variable names)\n */\nexport function getSemanticAlias(path: string): string | null {\n // Common semantic aliases\n const aliases: Record<string, string> = {\n \"colors.static.brand.primary\": \"--atomix-brand\",\n \"colors.modes.light.bgPage\": \"--atomix-bg-page\",\n \"colors.modes.light.bgSurface\": \"--atomix-bg-surface\",\n \"colors.modes.light.textPrimary\": \"--atomix-text-primary\",\n \"colors.modes.light.borderPrimary\": \"--atomix-border-primary\",\n // Icon colors\n \"colors.modes.light.iconBrand\": \"--atomix-icon-brand\",\n \"colors.modes.light.iconStrong\": \"--atomix-icon-strong\",\n \"colors.modes.light.iconSubtle\": \"--atomix-icon-subtle\",\n \"colors.modes.light.iconDisabled\": \"--atomix-icon-disabled\",\n \"typography.fontFamily.sans\": \"--atomix-font-sans\",\n };\n \n return aliases[path] || null;\n}\n\n// ============================================\n// TOKEN TIER CLASSIFICATION\n// ============================================\n\nexport type TokenTier = \"primitive\" | \"semantic\" | \"component\";\n\nexport interface TokenMetadata {\n /** Token tier: primitive (raw values), semantic (purpose-driven), component (usage-specific) */\n tier: TokenTier;\n /** Whether this token can be modified by external tools */\n mutable: boolean;\n /** How to edit this token if mutable */\n editVia?: \"designer\" | \"code\" | \"api\";\n /** Usage guidance for AI tools */\n guidance: string;\n}\n\n/**\n * Determine the tier and metadata for a token path.\n * \n * TIER DEFINITIONS:\n * - Primitive: Raw foundational values (scales, raw colors, px/rem values)\n * → Read-only reference for validation/a11y/docs\n * \n * - Semantic: Purpose-driven mappings that reference primitives\n * → The primary API for styling, editable via Designer\n * \n * - Component: Token assignments for specific components\n * → Editable via Designer, specific to component variants/sizes\n */\nexport function getTokenMetadata(path: string): TokenMetadata {\n // ============================================\n // PRIMITIVE TIER (Read-Only Reference)\n // Raw values that should not be modified by AI\n // ============================================\n \n // Color scales (raw palette)\n if (path.match(/^colors\\.scales\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Raw color palette. Use semantic colors (colors.modes.*) in components instead.\",\n };\n }\n \n // Alpha scales\n if (path.match(/^colors\\.scales\\.(black|white|green)Alpha\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Alpha transparency scale. Reference only for overlays/effects.\",\n };\n }\n \n // Spacing scale\n if (path.match(/^spacing\\.scale\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Spacing scale values. Use semantic spacing keys (xs, sm, md, lg) in components.\",\n };\n }\n \n // Spacing inset/stack/inline (derived from scale)\n if (path.match(/^spacing\\.(inset|stack|inline|gap)\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Spacing presets derived from scale. Reference only.\",\n };\n }\n \n // Typography raw values (fontSize, fontWeight, lineHeight)\n if (path.match(/^typography\\.(fontSize|fontWeight|lineHeight|lineHeightPx|letterSpacing|paragraphSpacing)\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Raw typography values. Use typeSets (title-lg, text-normal-regular) in components.\",\n };\n }\n \n // Radius scale\n if (path.match(/^radius\\.scale\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Border radius scale. Use semantic radius (radius.semantic.*) or scale keys in components.\",\n };\n }\n \n // Border width scale\n if (path.match(/^borders\\.width\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Border width scale. Use semantic border keys in components.\",\n };\n }\n \n // Shadow elevation (raw shadows)\n if (path.match(/^shadows\\.elevation\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Elevation shadow values. Use elevation keys (sm, md, lg) in components.\",\n };\n }\n \n // Motion duration/easing (raw values)\n if (path.match(/^motion\\.(duration|easing)\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Motion primitives. Use semantic motion presets (motion.semantic.*) when available.\",\n };\n }\n \n // Z-index scale\n if (path.match(/^zIndex\\.scale\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Z-index scale. Use semantic z-index (zIndex.semantic.*) in components.\",\n };\n }\n \n // Sizing raw values\n if (path.match(/^sizing\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Component sizing values. Reference only for layout calculations.\",\n };\n }\n \n // ============================================\n // SEMANTIC TIER (Primary API)\n // Purpose-driven tokens, editable via Designer\n // ============================================\n \n // Mode colors (light/dark semantic colors)\n if (path.match(/^colors\\.modes\\.(light|dark)\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic color for theming. Use this in components. Editable via Atomix Designer.\",\n };\n }\n \n // Adaptive colors (feedback colors)\n if (path.match(/^colors\\.adaptive\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Adaptive feedback color (error, warning, success, info). Use for validation states.\",\n };\n }\n \n // Static brand colors\n if (path.match(/^colors\\.static\\.brand/)) {\n return {\n tier: \"semantic\",\n mutable: false, // Brand colors are locked\n guidance: \"Brand identity color. Use for primary brand elements. Protected from modification.\",\n };\n }\n \n // Static utility colors (white, black, transparent)\n if (path.match(/^colors\\.static\\.(white|black|transparent)/)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Static utility color. Use for absolute white/black when needed.\",\n };\n }\n \n // Semantic radius\n if (path.match(/^radius\\.semantic\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic border radius for component types. Use this in component styling.\",\n };\n }\n \n // Semantic borders\n if (path.match(/^borders\\.semantic\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic border width for component types. Use this in component styling.\",\n };\n }\n \n // Semantic motion\n if (path.match(/^motion\\.semantic\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic animation preset. Use for consistent motion patterns.\",\n };\n }\n \n // Semantic z-index\n if (path.match(/^zIndex\\.semantic\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic z-index for UI layers. Use for proper stacking order.\",\n };\n }\n \n // Focus shadows\n if (path.match(/^shadows\\.focus\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Focus ring styles for accessibility. Use for keyboard focus indicators.\",\n };\n }\n \n // Typography typeSets\n if (path.match(/^typography\\.typeSets\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Composed typography style. Use these for consistent text styling.\",\n };\n }\n \n // Typography font families\n if (path.match(/^typography\\.fontFamily\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Font family selection. Use 'sans', 'mono', or 'display' keys.\",\n };\n }\n \n // Typography text styles\n if (path.match(/^typography\\.textStyles\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Complete text style definition. Use for consistent typography.\",\n };\n }\n \n // ============================================\n // DEFAULT: Assume primitive if unknown\n // ============================================\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Token classification unknown. Treat as read-only reference.\",\n };\n}\n\n/**\n * Check if a token path is a semantic token (the primary API for AI tools)\n */\nexport function isSemanticToken(path: string): boolean {\n const metadata = getTokenMetadata(path);\n return metadata.tier === \"semantic\";\n}\n\n/**\n * Check if a token path is a primitive (read-only reference)\n */\nexport function isPrimitiveToken(path: string): boolean {\n const metadata = getTokenMetadata(path);\n return metadata.tier === \"primitive\";\n}\n\n","/**\n * Component Token Mappings\n * \n * AUTO-GENERATED from apps/atomix-lab/src/config/component-defaults.ts\n * DO NOT EDIT MANUALLY - run `npm run sync` to regenerate.\n * \n * Maps each component to its design tokens.\n * This allows AI tools to understand which tokens apply to which components.\n * \n * Last synced: 2026-01-04T21:35:13.413Z\n * Tenant: default\n */\n\nexport interface ComponentTokenConfig {\n description: string;\n variants?: Record<string, VariantTokens>;\n sizes?: Record<string, SizeTokens>;\n shared?: Record<string, string>;\n cssVariables?: string[];\n tailwindClasses?: string[];\n}\n\nexport interface VariantTokens {\n description?: string;\n tokens: Record<string, string>;\n}\n\nexport interface SizeTokens {\n description?: string;\n tokens: Record<string, string>;\n}\n\n// Multi-tenant ready token store\nexport interface MCPTokenStore {\n version: string;\n tenantId: string;\n generatedAt: string;\n components: Record<string, ComponentTokenConfig>;\n}\n\nexport const COMPONENT_TOKENS: Record<string, ComponentTokenConfig> = {\n \"button\": {\n \"description\": \"Interactive button component with multiple variants and sizes\",\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"top\": \"xs\",\n \"right\": \"sm\",\n \"bottom\": \"xs\",\n \"left\": \"sm\",\n \"borderRadius\": \"radius.scale.lg\",\n \"typeSet\": \"typography.typeSets.text-small-bold\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"xs\",\n \"right\": \"sm\",\n \"bottom\": \"xs\",\n \"left\": \"sm\",\n \"borderRadius\": \"radius.scale.lg\",\n \"typeSet\": \"typography.typeSets.text-small-bold\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"top\": \"sm\",\n \"right\": \"lg\",\n \"bottom\": \"sm\",\n \"left\": \"lg\",\n \"borderRadius\": \"radius.scale.4xl\",\n \"typeSet\": \"typography.typeSets.text-normal-bold\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"top\": \"sm\",\n \"right\": \"lg\",\n \"bottom\": \"sm\",\n \"left\": \"lg\",\n \"borderRadius\": \"radius.scale.4xl\",\n \"typeSet\": \"typography.typeSets.text-large-bold\"\n }\n }\n }\n },\n \"card\": {\n \"description\": \"Container component for grouping related content\",\n \"variants\": {\n \"default\": {\n \"description\": \"default variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgSurface\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderWidth\": \"sm\",\n \"borderRadius\": \"xl\",\n \"shadow\": \"none\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"interaction\": \"elevation\",\n \"hoverShadow\": \"elevation-lg\",\n \"hoverTranslateY\": \"-2px\",\n \"hoverBorderColor\": \"colors.modes.{mode}.borderStrong\"\n }\n },\n \"elevated\": {\n \"description\": \"elevated variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgSurface\",\n \"borderColor\": \"colors.modes.{mode}.borderPrimary\",\n \"borderWidth\": \"sm\",\n \"borderRadius\": \"2xl\",\n \"shadow\": \"elevation-md\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"interaction\": \"elevation\",\n \"hoverShadow\": \"elevation-lg\",\n \"hoverTranslateY\": \"-2px\",\n \"hoverBorderColor\": \"transparent\"\n }\n },\n \"outlined\": {\n \"description\": \"outlined variant\",\n \"tokens\": {\n \"background\": \"transparent\",\n \"borderColor\": \"colors.modes.{mode}.borderSecondary\",\n \"borderWidth\": \"lg\",\n \"borderRadius\": \"2xl\",\n \"shadow\": \"none\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"interaction\": \"border\",\n \"hoverShadow\": \"none\",\n \"hoverTranslateY\": \"0\",\n \"hoverBorderColor\": \"colors.modes.{mode}.borderStrong\"\n }\n },\n \"ghost\": {\n \"description\": \"ghost variant\",\n \"tokens\": {\n \"background\": \"transparent\",\n \"borderColor\": \"transparent\",\n \"borderWidth\": \"none\",\n \"borderRadius\": \"xl\",\n \"shadow\": \"none\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textMuted\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"interaction\": \"none\",\n \"hoverShadow\": \"none\",\n \"hoverTranslateY\": \"0\",\n \"hoverBorderColor\": \"transparent\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"top\": \"lg\",\n \"right\": \"xl\",\n \"bottom\": \"lg\",\n \"left\": \"xl\",\n \"headingSize\": \"sm\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"lg\",\n \"right\": \"xl\",\n \"bottom\": \"lg\",\n \"left\": \"xl\",\n \"headingSize\": \"sm\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"top\": \"xl\",\n \"right\": \"2xl\",\n \"bottom\": \"xl\",\n \"left\": \"2xl\",\n \"headingSize\": \"md\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"top\": \"2xl\",\n \"right\": \"3xl\",\n \"bottom\": \"2xl\",\n \"left\": \"3xl\",\n \"headingSize\": \"lg\"\n }\n }\n },\n \"shared\": {\n \"titleFontFamily\": \"typography.fontFamily.sans\",\n \"bodyFontFamily\": \"typography.fontFamily.sans\"\n }\n },\n \"input\": {\n \"description\": \"Text input field component with validation states\",\n \"variants\": {\n \"default\": {\n \"description\": \"default variant\",\n \"tokens\": {\n \"borderWidth\": \"sm\",\n \"borderColor\": \"colors.modes.{mode}.borderPrimary\",\n \"borderColorFocus\": \"colors.modes.{mode}.borderStrong\",\n \"helperTextColor\": \"colors.modes.{mode}.textMuted\"\n }\n },\n \"error\": {\n \"description\": \"error variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.adaptive.error.{mode}.border\",\n \"borderColorFocus\": \"colors.adaptive.error.{mode}.border\",\n \"helperTextColor\": \"colors.adaptive.error.{mode}.text\"\n }\n },\n \"success\": {\n \"description\": \"success variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.ring\",\n \"borderColorFocus\": \"colors.modes.{mode}.ring\",\n \"helperTextColor\": \"colors.adaptive.success.{mode}.text\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"fieldHeight\": \"32px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.lg\",\n \"top\": \"xs\",\n \"right\": \"md\",\n \"bottom\": \"xs\",\n \"left\": \"md\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"xs\",\n \"right\": \"md\",\n \"bottom\": \"xs\",\n \"left\": \"md\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"fieldHeight\": \"40px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.xl\",\n \"top\": \"sm\",\n \"right\": \"md\",\n \"bottom\": \"sm\",\n \"left\": \"md\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"fieldHeight\": \"48px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.2xl\",\n \"top\": \"xl\",\n \"right\": \"lg\",\n \"bottom\": \"xl\",\n \"left\": \"lg\"\n }\n }\n }\n },\n \"select\": {\n \"description\": \"Unified text field component supporting input, select, and textarea\",\n \"variants\": {\n \"default\": {\n \"description\": \"default variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderPrimary\",\n \"borderColorFocus\": \"colors.modes.{mode}.borderSecondary\",\n \"helperTextColor\": \"colors.modes.{mode}.textMuted\"\n }\n },\n \"error\": {\n \"description\": \"error variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.adaptive.error.{mode}.border\",\n \"borderColorFocus\": \"colors.adaptive.error.{mode}.border\",\n \"helperTextColor\": \"colors.adaptive.error.{mode}.text\"\n }\n },\n \"success\": {\n \"description\": \"success variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.ring\",\n \"borderColorFocus\": \"colors.modes.{mode}.ring\",\n \"helperTextColor\": \"colors.adaptive.success.{mode}.text\"\n }\n },\n \"disabled\": {\n \"description\": \"disabled variant\",\n \"tokens\": {\n \"borderWidth\": \"sm\",\n \"borderColor\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorFocus\": \"colors.modes.{mode}.borderSecondary\",\n \"helperTextColor\": \"colors.modes.{mode}.textDisabled\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"fieldHeight\": \"32px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.lg\",\n \"top\": \"xs\",\n \"right\": \"md\",\n \"bottom\": \"xs\",\n \"left\": \"md\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"xs\",\n \"right\": \"md\",\n \"bottom\": \"xs\",\n \"left\": \"md\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"fieldHeight\": \"44px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"none\",\n \"top\": \"sm\",\n \"right\": \"md\",\n \"bottom\": \"sm\",\n \"left\": \"md\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"fieldHeight\": \"48px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.2xl\",\n \"top\": \"xl\",\n \"right\": \"lg\",\n \"bottom\": \"xl\",\n \"left\": \"lg\"\n }\n }\n }\n },\n \"dialog\": {\n \"description\": \"Modal dialog for focused interactions\",\n \"variants\": {\n \"default\": {\n \"description\": \"default variant\",\n \"tokens\": {\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"contentAlign\": \"center\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"buttonAlign\": \"center\"\n }\n },\n \"with-footer\": {\n \"description\": \"with-footer variant\",\n \"tokens\": {\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"contentAlign\": \"left\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"buttonAlign\": \"space-between\"\n }\n },\n \"minimal\": {\n \"description\": \"minimal variant\",\n \"tokens\": {\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textMuted\",\n \"contentAlign\": \"center\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"buttonAlign\": \"center\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"headingSize\": \"sm\",\n \"top\": \"xl\",\n \"right\": \"xl\",\n \"bottom\": \"xl\",\n \"left\": \"xl\",\n \"buttonSize\": \"sm\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"xl\",\n \"right\": \"xl\",\n \"bottom\": \"xl\",\n \"left\": \"xl\",\n \"buttonSize\": \"sm\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"headingSize\": \"md\",\n \"top\": \"xl\",\n \"right\": \"xl\",\n \"bottom\": \"xl\",\n \"left\": \"xl\",\n \"buttonSize\": \"md\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"headingSize\": \"lg\",\n \"top\": \"xl\",\n \"right\": \"xl\",\n \"bottom\": \"xl\",\n \"left\": \"xl\",\n \"buttonSize\": \"lg\"\n }\n }\n },\n \"shared\": {\n \"titleFontFamily\": \"typography.fontFamily.sans\",\n \"bodyFontFamily\": \"typography.fontFamily.sans\"\n }\n },\n \"heading\": {\n \"description\": \"Typography component for titles, descriptions, and eyebrows\",\n \"variants\": {\n \"title-only\": {\n \"description\": \"title-only variant\",\n \"tokens\": {\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"descriptionColor\": \"colors.modes.{mode}.textSecondary\",\n \"textAlign\": \"left\",\n \"eyebrowGap\": \"xs\",\n \"descriptionGap\": \"sm\",\n \"footerGap\": \"sm\"\n }\n },\n \"title-description\": {\n \"description\": \"title-description variant\",\n \"tokens\": {\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"descriptionColor\": \"colors.modes.{mode}.textSecondary\",\n \"textAlign\": \"left\",\n \"eyebrowGap\": \"xs\",\n \"descriptionGap\": \"xs\",\n \"footerGap\": \"sm\"\n }\n },\n \"full\": {\n \"description\": \"full variant\",\n \"tokens\": {\n \"eyebrowColor\": \"colors.modes.{mode}.textSecondary\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"descriptionColor\": \"colors.modes.{mode}.textSecondary\",\n \"textAlign\": \"left\",\n \"eyebrowGap\": \"xs\",\n \"descriptionGap\": \"xs\",\n \"footerGap\": \"sm\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"eyebrowTypeSet\": \"typography.typeSets.title-sm\",\n \"titleTypeSet\": \"typography.typeSets.title-md\",\n \"descriptionTypeSet\": \"typography.typeSets.text-normal-regular\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"eyebrowTypeSet\": \"typography.typeSets.title-sm\",\n \"titleTypeSet\": \"typography.typeSets.title-lg\",\n \"descriptionTypeSet\": \"typography.typeSets.text-normal-regular\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"eyebrowTypeSet\": \"typography.typeSets.title-sm\",\n \"titleTypeSet\": \"typography.typeSets.title-2xl\",\n \"descriptionTypeSet\": \"typography.typeSets.text-normal-regular\"\n }\n }\n },\n \"shared\": {\n \"fontFamily\": \"typography.fontFamily.sans\"\n }\n },\n \"selectionControls\": {\n \"description\": \"Selection control components: checkbox, radio, and toggle switch\",\n \"variants\": {\n \"checkbox\": {\n \"description\": \"checkbox variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"subtle\"\n }\n },\n \"radio\": {\n \"description\": \"radio variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"subtle\"\n }\n },\n \"toggle\": {\n \"description\": \"toggle variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"press\"\n }\n }\n },\n \"sizes\": {\n \"md\": {\n \"tokens\": {\n \"controlSize\": \"20px\",\n \"labelTypeSet\": \"typography.typeSets.text-normal-regular\",\n \"gap\": \"spacing.scale.sm\",\n \"borderRadius\": \"radius.scale.lg\"\n }\n }\n }\n },\n \"checkbox\": {\n \"description\": \"Checkbox selection control\",\n \"variants\": {\n \"default\": {\n \"description\": \"checkbox variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"subtle\"\n }\n }\n },\n \"sizes\": {\n \"md\": {\n \"tokens\": {\n \"controlSize\": \"20px\",\n \"labelTypeSet\": \"typography.typeSets.text-normal-regular\",\n \"gap\": \"spacing.scale.sm\",\n \"borderRadius\": \"radius.scale.lg\"\n }\n }\n },\n \"shared\": {\n \"transitionDuration\": \"motion.duration.fast\",\n \"focusRing\": \"shadows.focus.ring\"\n }\n },\n \"radio\": {\n \"description\": \"Radio selection control\",\n \"variants\": {\n \"default\": {\n \"description\": \"radio variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"subtle\"\n }\n }\n },\n \"sizes\": {\n \"md\": {\n \"tokens\": {\n \"controlSize\": \"20px\",\n \"labelTypeSet\": \"typography.typeSets.text-normal-regular\",\n \"gap\": \"spacing.scale.sm\",\n \"borderRadius\": \"radius.scale.lg\"\n }\n }\n },\n \"shared\": {\n \"transitionDuration\": \"motion.duration.fast\",\n \"focusRing\": \"shadows.focus.ring\"\n }\n },\n \"toggle\": {\n \"description\": \"Toggle selection control\",\n \"variants\": {\n \"default\": {\n \"description\": \"toggle variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"press\"\n }\n }\n },\n \"sizes\": {\n \"md\": {\n \"tokens\": {\n \"controlSize\": \"20px\",\n \"labelTypeSet\": \"typography.typeSets.text-normal-regular\",\n \"gap\": \"spacing.scale.sm\",\n \"borderRadius\": \"radius.scale.lg\"\n }\n }\n },\n \"shared\": {\n \"transitionDuration\": \"motion.duration.fast\",\n \"focusRing\": \"shadows.focus.ring\"\n }\n }\n};\n\n// Multi-tenant wrapper (backward compatible)\nexport const TOKEN_STORE: MCPTokenStore = {\n version: \"1.0.0\",\n tenantId: \"default\",\n generatedAt: \"2026-01-04T21:35:13.413Z\",\n components: COMPONENT_TOKENS,\n};\n","/**\n * User Tokens Fetcher\n * -------------------\n * Fetches user-specific design system tokens from Atomix API.\n * \n * Used when MCP server is run with --ds-id flag to serve a user's\n * custom design system instead of Atomix's internal tokens.\n */\n\n// ============================================\n// TYPES\n// ============================================\n\nexport interface UserDesignSystem {\n id: string;\n name: string;\n tokens: Record<string, unknown>;\n governance?: {\n rules: string[];\n categories?: Record<string, string[]>;\n };\n}\n\nexport interface FetchUserDSOptions {\n /** User's design system ID */\n dsId: string;\n /** API key for authentication */\n apiKey?: string;\n /** Base URL for the Atomix API (default: https://atomix.design) */\n baseUrl?: string;\n}\n\nexport interface UserDSMeta {\n id: string;\n name: string;\n publishedAt?: number;\n updatedAt?: number;\n version?: number;\n}\n\nexport interface UserDSResponse {\n success: boolean;\n tokens?: Record<string, unknown>;\n governance?: UserDesignSystem['governance'];\n meta?: UserDSMeta;\n error?: string;\n}\n\n// ============================================\n// API ENDPOINTS\n// ============================================\n\nconst DEFAULT_BASE_URL = 'https://atomixstudio.eu';\n\n/**\n * Fetch user's design system tokens from Atomix API\n * \n * @param options - Fetch options including dsId and apiKey\n * @returns User's tokens and governance rules\n * \n * @example\n * ```ts\n * const { tokens, governance } = await fetchUserDesignSystem({\n * dsId: 'abc123',\n * apiKey: 'user-api-key'\n * });\n * ```\n */\nexport async function fetchUserDesignSystem(\n options: FetchUserDSOptions\n): Promise<UserDSResponse> {\n const { dsId, apiKey, baseUrl = DEFAULT_BASE_URL } = options;\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n // Fetch tokens\n const tokensResponse = await fetch(`${baseUrl}/api/ds/${dsId}/tokens`, {\n method: 'GET',\n headers,\n });\n\n if (!tokensResponse.ok) {\n const error = await tokensResponse.text();\n return {\n success: false,\n error: `Failed to fetch tokens: ${tokensResponse.status} ${error}`,\n };\n }\n\n const tokensData = await tokensResponse.json() as { \n tokens?: Record<string, unknown>;\n meta?: UserDSMeta;\n } | Record<string, unknown>;\n\n // Extract metadata\n const meta: UserDSMeta | undefined = 'meta' in tokensData && tokensData.meta\n ? tokensData.meta as UserDSMeta\n : undefined;\n\n // Fetch governance rules\n let governance: UserDesignSystem['governance'] | undefined;\n \n try {\n const rulesResponse = await fetch(`${baseUrl}/api/ds/${dsId}/rules`, {\n method: 'GET',\n headers,\n });\n\n if (rulesResponse.ok) {\n const rulesData = await rulesResponse.json() as UserDesignSystem['governance'];\n governance = rulesData;\n }\n } catch {\n // Governance is optional, continue without it\n console.error('[atomix-mcp] Could not fetch governance rules, continuing without them');\n }\n\n // Extract tokens - handle both { tokens: {...} } and direct {...} formats\n const tokens = 'tokens' in tokensData && tokensData.tokens \n ? tokensData.tokens as Record<string, unknown>\n : tokensData as Record<string, unknown>;\n\n return {\n success: true,\n tokens,\n governance,\n meta,\n };\n } catch (error) {\n return {\n success: false,\n error: `Network error: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: unknown): key is string {\n if (typeof key !== 'string') return false;\n // API keys should be at least 20 characters (UUID-ish)\n return key.length >= 20;\n}\n\n/**\n * Validate design system ID format\n */\nexport function isValidDsId(id: unknown): id is string {\n if (typeof id !== 'string') return false;\n // DS IDs should be non-empty strings\n return id.length > 0;\n}\n\n// ============================================\n// CLI ARGUMENT PARSING\n// ============================================\n\nexport interface CLIArgs {\n /** User's design system ID */\n dsId?: string;\n /** API key for authentication */\n apiKey?: string;\n /** Tenant ID (legacy, mapped to dsId) */\n tenant?: string;\n /** Base URL for the Atomix API */\n baseUrl?: string;\n}\n\n/**\n * Parse command line arguments for user DS mode\n * \n * Supported args:\n * - --ds-id <id>: User's design system ID\n * - --api-key <key>: API key for authentication\n * - --tenant <id>: Legacy tenant ID (mapped to dsId)\n * - --base-url <url>: Custom API base URL\n * \n * @param argv - Command line arguments (default: process.argv)\n * @returns Parsed CLI arguments\n */\nexport function parseCLIArgs(argv: string[] = process.argv): CLIArgs {\n const args: CLIArgs = {};\n \n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n const next = argv[i + 1];\n\n switch (arg) {\n case '--ds-id':\n if (next && !next.startsWith('--')) {\n args.dsId = next;\n i++;\n }\n break;\n\n case '--api-key':\n if (next && !next.startsWith('--')) {\n args.apiKey = next;\n i++;\n }\n break;\n\n case '--tenant':\n // Legacy support: map tenant to dsId\n if (next && !next.startsWith('--')) {\n args.tenant = next;\n args.dsId = args.dsId || next;\n i++;\n }\n break;\n\n case '--base-url':\n if (next && !next.startsWith('--')) {\n args.baseUrl = next;\n i++;\n }\n break;\n }\n }\n\n return args;\n}\n\n/**\n * Check if CLI args indicate user DS mode\n */\nexport function isUserDSMode(args: CLIArgs): boolean {\n return Boolean(args.dsId);\n}\n\n// ============================================\n// TOKEN TRANSFORMATION\n// ============================================\n\n/**\n * Transform user DS tokens to match the structure expected by MCP server.\n * \n * User DS tokens come in the StoredDesignSystem format from InstantDB.\n * This transforms them to the flat primitives structure used by MCP tools.\n * \n * @param userTokens - User's tokens from InstantDB\n * @returns Tokens in MCP-compatible format\n */\nexport function transformUserTokens(\n userTokens: Record<string, unknown>\n): Record<string, unknown> {\n // If tokens are already in the right format, return as-is\n if (userTokens.colors && userTokens.typography && userTokens.spacing) {\n return userTokens;\n }\n\n // If tokens have a 'tokens' wrapper, unwrap it\n if (typeof userTokens.tokens === 'object' && userTokens.tokens !== null) {\n return userTokens.tokens as Record<string, unknown>;\n }\n\n // Return as-is and let the MCP tools handle the structure\n return userTokens;\n}\n\n","/**\n * AI Rules Generator\n * \n * Generates project-specific rules and MCP configurations for AI coding tools\n * using the Atomix design system.\n * \n * SUPPORTED MCP CLIENTS (from modelcontextprotocol.io/clients):\n * \n * IDE/Editors:\n * - Cursor (.cursorrules)\n * - VS Code + GitHub Copilot (.github/copilot-instructions.md)\n * - Windsurf (.windsurfrules)\n * - Zed (MCP native)\n * - Continue (.continuerules)\n * - Cline (.clinerules)\n * - CodeGPT (MCP native)\n * - Amazon Q IDE (MCP native)\n * - Augment Code (MCP native)\n * - VT Code (MCP native)\n * \n * Desktop Apps:\n * - Claude Desktop (MCP native)\n * - BoltAI (MCP native)\n * - Chatbox (MCP native)\n * - ChatGPT (MCP native)\n * \n * CLI/Terminal:\n * - Warp (.warp/workflows or MCP)\n * - Amazon Q CLI (MCP native)\n * - goose (MCP native)\n * \n * Frameworks/Libraries:\n * - Genkit (MCP native)\n * - LangChain (MCP native)\n * - fast-agent (MCP native)\n */\n\nimport { TOKEN_CATEGORIES } from \"./tokens.js\";\nimport { COMPONENT_TOKENS } from \"./component-tokens.js\";\n\n// ============================================\n// SUPPORTED AI TOOLS\n// ============================================\n\nexport type AIToolId = \n | \"cursor\" \n | \"copilot\" \n | \"windsurf\" \n | \"cline\" \n | \"continue\"\n | \"zed\"\n | \"claude-desktop\"\n | \"generic\";\n\nexport interface AIToolConfig {\n id: AIToolId;\n name: string;\n rulesFilename: string;\n rulesPath: string; // Relative to project root\n mcpConfigPath?: string; // Where MCP config lives for this tool\n supportsMarkdown: boolean;\n supportsMCP: boolean;\n description: string;\n}\n\n/**\n * Registry of supported AI coding tools and their rules file conventions\n */\nexport const AI_TOOLS: Record<AIToolId, AIToolConfig> = {\n cursor: {\n id: \"cursor\",\n name: \"Cursor\",\n rulesFilename: \".cursorrules\",\n rulesPath: \".cursorrules\",\n mcpConfigPath: \".cursor/mcp.json\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Cursor IDE - AI-first code editor\",\n },\n copilot: {\n id: \"copilot\",\n name: \"GitHub Copilot\",\n rulesFilename: \"copilot-instructions.md\",\n rulesPath: \".github/copilot-instructions.md\",\n supportsMarkdown: true,\n supportsMCP: false, // Uses rules file instead\n description: \"GitHub Copilot in VS Code, JetBrains, etc.\",\n },\n windsurf: {\n id: \"windsurf\",\n name: \"Windsurf\",\n rulesFilename: \".windsurfrules\",\n rulesPath: \".windsurfrules\",\n mcpConfigPath: \".windsurf/mcp.json\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Windsurf Editor by Codeium\",\n },\n cline: {\n id: \"cline\",\n name: \"Cline\",\n rulesFilename: \".clinerules\",\n rulesPath: \".clinerules\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Cline VS Code extension (formerly Claude Dev)\",\n },\n continue: {\n id: \"continue\",\n name: \"Continue\",\n rulesFilename: \".continuerules\",\n rulesPath: \".continuerules\",\n mcpConfigPath: \".continue/config.json\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Continue - open source AI code assistant\",\n },\n zed: {\n id: \"zed\",\n name: \"Zed\",\n rulesFilename: \".zed/assistant/rules.md\",\n rulesPath: \".zed/assistant/rules.md\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Zed Editor with AI assistant\",\n },\n \"claude-desktop\": {\n id: \"claude-desktop\",\n name: \"Claude Desktop\",\n rulesFilename: \"\",\n rulesPath: \"\",\n mcpConfigPath: \"~/Library/Application Support/Claude/claude_desktop_config.json\",\n supportsMarkdown: false,\n supportsMCP: true,\n description: \"Claude Desktop App by Anthropic\",\n },\n generic: {\n id: \"generic\",\n name: \"Generic AI\",\n rulesFilename: \"AI_GUIDELINES.md\",\n rulesPath: \"AI_GUIDELINES.md\",\n supportsMarkdown: true,\n supportsMCP: false,\n description: \"Generic guidelines for any AI tool\",\n },\n};\n\n// ============================================\n// MCP CONFIG GENERATION\n// ============================================\n\nexport type MCPConfigToolId = \"cursor\" | \"claude-desktop\" | \"windsurf\" | \"continue\" | \"vscode\";\n\nexport interface MCPConfigOptions {\n /** Path to the MCP server (default: npx @atomixstudio/mcp) */\n serverPath?: string;\n /** Use npx to run the server */\n useNpx?: boolean;\n /** Design system ID for per-user MCP mode */\n dsId?: string;\n /** API key for authentication (required for per-user mode) */\n apiKey?: string;\n /** @deprecated Use dsId instead. Tenant ID for backwards compatibility */\n tenantId?: string;\n /** Project name for identification */\n projectName?: string;\n}\n\nexport interface MCPConfig {\n tool: MCPConfigToolId;\n filename: string;\n path: string;\n content: string;\n instructions: string;\n}\n\n/**\n * Generate MCP configuration file for a specific AI tool\n */\nexport function generateMCPConfig(\n tool: MCPConfigToolId,\n options: MCPConfigOptions = {}\n): MCPConfig {\n const {\n serverPath,\n useNpx = true,\n dsId,\n apiKey,\n tenantId, // Legacy support\n projectName = \"my-project\",\n } = options;\n\n const npxCommand = useNpx ? \"npx\" : \"node\";\n const npxArgs = useNpx \n ? [\"@atomixstudio/mcp@latest\"]\n : [serverPath || \"./node_modules/@atomixstudio/mcp/dist/index.js\"];\n\n // Use dsId + apiKey (new format) or fall back to tenantId (legacy)\n const effectiveDsId = dsId || tenantId;\n \n if (effectiveDsId && effectiveDsId !== \"default\") {\n npxArgs.push(\"--ds-id\", effectiveDsId);\n \n // Only add API key if provided\n if (apiKey) {\n npxArgs.push(\"--api-key\", apiKey);\n }\n }\n\n switch (tool) {\n case \"cursor\": {\n const config = {\n mcpServers: {\n atomix: {\n command: npxCommand,\n args: npxArgs,\n },\n },\n };\n\n return {\n tool: \"cursor\",\n filename: \"mcp.json\",\n path: \".cursor/mcp.json\",\n content: JSON.stringify(config, null, 2),\n instructions: `\n## Cursor MCP Setup\n\n1. Create the file \\`.cursor/mcp.json\\` in your project root\n2. Paste the configuration below\n3. Restart Cursor IDE\n4. The Atomix MCP server will be available in Cursor's AI features\n\n### Configuration File\n\\`\\`\\`json\n${JSON.stringify(config, null, 2)}\n\\`\\`\\`\n\n### Verify Setup\nAfter restarting Cursor, you can verify the MCP server is working by:\n- Opening the AI chat (Cmd/Ctrl + L)\n- Asking: \"What design tokens are available?\"\n- The AI should query the Atomix MCP server and list token categories\n`.trim(),\n };\n }\n\n case \"claude-desktop\": {\n const config = {\n mcpServers: {\n atomix: {\n command: npxCommand,\n args: npxArgs,\n },\n },\n };\n\n const configPath = process.platform === \"darwin\"\n ? \"~/Library/Application Support/Claude/claude_desktop_config.json\"\n : process.platform === \"win32\"\n ? \"%APPDATA%\\\\Claude\\\\claude_desktop_config.json\"\n : \"~/.config/Claude/claude_desktop_config.json\";\n\n return {\n tool: \"claude-desktop\",\n filename: \"claude_desktop_config.json\",\n path: configPath,\n content: JSON.stringify(config, null, 2),\n instructions: `\n## Claude Desktop MCP Setup\n\n1. Locate your Claude Desktop config file:\n - **macOS**: \\`${configPath}\\`\n - **Windows**: \\`%APPDATA%\\\\Claude\\\\claude_desktop_config.json\\`\n - **Linux**: \\`~/.config/Claude/claude_desktop_config.json\\`\n\n2. Create or edit the file with the configuration below\n\n3. Restart Claude Desktop\n\n4. The Atomix MCP server will be available when chatting with Claude\n\n### Configuration File\n\\`\\`\\`json\n${JSON.stringify(config, null, 2)}\n\\`\\`\\`\n\n### Verify Setup\nAfter restarting Claude Desktop:\n- Start a new conversation\n- Ask: \"Can you check what Atomix design tokens are available?\"\n- Claude should use the MCP server to query tokens\n`.trim(),\n };\n }\n\n case \"windsurf\": {\n const config = {\n mcpServers: {\n atomix: {\n command: npxCommand,\n args: npxArgs,\n },\n },\n };\n\n return {\n tool: \"windsurf\",\n filename: \"mcp.json\",\n path: \".windsurf/mcp.json\",\n content: JSON.stringify(config, null, 2),\n instructions: `\n## Windsurf MCP Setup\n\n1. Create the file \\`.windsurf/mcp.json\\` in your project root\n2. Paste the configuration below\n3. Restart Windsurf Editor\n4. The Atomix MCP server will be available in Cascade\n\n### Configuration File\n\\`\\`\\`json\n${JSON.stringify(config, null, 2)}\n\\`\\`\\`\n`.trim(),\n };\n }\n\n case \"continue\": {\n const config = {\n models: [],\n mcpServers: [\n {\n name: \"atomix\",\n command: npxCommand,\n args: npxArgs,\n },\n ],\n };\n\n return {\n tool: \"continue\",\n filename: \"config.json\",\n path: \".continue/config.json\",\n content: JSON.stringify(config, null, 2),\n instructions: `\n## Continue MCP Setup\n\n1. Create or edit \\`.continue/config.json\\` in your project root\n2. Add the mcpServers section below\n3. Restart VS Code\n4. The Atomix MCP server will be available in Continue\n\n### Configuration File\n\\`\\`\\`json\n${JSON.stringify(config, null, 2)}\n\\`\\`\\`\n\nNote: If you already have a config.json, merge the mcpServers array.\n`.trim(),\n };\n }\n\n case \"vscode\": {\n // VS Code uses settings.json or extension-specific configs\n return {\n tool: \"vscode\",\n filename: \"settings.json\",\n path: \".vscode/settings.json\",\n content: JSON.stringify({\n \"mcp.servers\": {\n atomix: {\n command: npxCommand,\n args: npxArgs,\n },\n },\n }, null, 2),\n instructions: `\n## VS Code MCP Setup\n\nFor VS Code, MCP support depends on your AI extension:\n\n### Option 1: Use GitHub Copilot Instructions\nCreate \\`.github/copilot-instructions.md\\` with Atomix rules (use getAIToolRules)\n\n### Option 2: Use Continue Extension\nSee Continue setup instructions above\n\n### Option 3: Use Cline Extension\n1. Install Cline extension\n2. Cline will auto-detect MCP servers in .cursor/mcp.json or .vscode/settings.json\n\n### Settings.json (for MCP-aware extensions)\n\\`\\`\\`json\n{\n \"mcp.servers\": {\n \"atomix\": {\n \"command\": \"${npxCommand}\",\n \"args\": ${JSON.stringify(npxArgs)}\n }\n }\n}\n\\`\\`\\`\n`.trim(),\n };\n }\n\n default:\n throw new Error(`Unknown MCP config tool: ${tool}`);\n }\n}\n\n/**\n * Generate MCP configs for all supported tools\n */\nexport function generateAllMCPConfigs(options: MCPConfigOptions = {}): MCPConfig[] {\n const tools: MCPConfigToolId[] = [\"cursor\", \"claude-desktop\", \"windsurf\", \"continue\", \"vscode\"];\n return tools.map(tool => generateMCPConfig(tool, options));\n}\n\n// ============================================\n// SETUP INSTRUCTIONS\n// ============================================\n\n/**\n * Get detailed setup instructions for a specific AI tool\n */\nexport function getSetupInstructions(toolId: AIToolId): string {\n const tool = AI_TOOLS[toolId];\n \n if (!tool) {\n throw new Error(`Unknown AI tool: ${toolId}. Available: ${Object.keys(AI_TOOLS).join(\", \")}`);\n }\n\n const baseInstructions = `\n# ${tool.name} Setup for Atomix Design System\n\n${tool.description}\n\n## Overview\n\n${tool.supportsMCP ? `${tool.name} supports MCP (Model Context Protocol), allowing direct integration with the Atomix design token server.` : `${tool.name} uses a rules file to understand the Atomix design system.`}\n\n`;\n\n switch (toolId) {\n case \"cursor\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Add MCP Configuration\n\nCreate \\`.cursor/mcp.json\\` in your project root:\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\"]\n }\n }\n}\n\\`\\`\\`\n\n### Step 2: Add Rules File (Optional but Recommended)\n\nCreate \\`.cursorrules\\` in your project root with Atomix guidelines.\nUse \\`getAIToolRules({ tool: \"cursor\" })\\` to generate this file.\n\n### Step 3: Restart Cursor\n\nAfter adding the MCP config, restart Cursor IDE completely.\n\n## Verification\n\n1. Open AI chat (Cmd/Ctrl + L)\n2. Ask: \"What Atomix design tokens are available?\"\n3. Cursor should query the MCP server and respond with token information\n\n## Available MCP Tools\n\nOnce configured, you can use these in conversations:\n- \\`getToken(\"colors.static.brand.primary\")\\` - Get a specific token\n- \\`listTokens(\"colors\")\\` - List tokens in a category\n- \\`getComponentTokens(\"button\")\\` - Get component tokens\n- \\`validateUsage(\"#ff0000\")\\` - Check if a value is allowed\n- \\`searchTokens(\"brand\")\\` - Search for tokens\n`;\n\n case \"claude-desktop\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Locate Config File\n\n- **macOS**: \\`~/Library/Application Support/Claude/claude_desktop_config.json\\`\n- **Windows**: \\`%APPDATA%\\\\Claude\\\\claude_desktop_config.json\\`\n- **Linux**: \\`~/.config/Claude/claude_desktop_config.json\\`\n\n### Step 2: Add MCP Configuration\n\nCreate or edit the config file:\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\"]\n }\n }\n}\n\\`\\`\\`\n\n### Step 3: Restart Claude Desktop\n\nCompletely quit and reopen Claude Desktop.\n\n## Verification\n\nStart a new conversation and ask:\n\"Can you check what Atomix design tokens are available?\"\n\nClaude should use the MCP server to query and list tokens.\n`;\n\n case \"copilot\":\n return baseInstructions + `\n## Quick Setup\n\nGitHub Copilot doesn't support MCP directly, but uses instruction files.\n\n### Step 1: Create Instructions File\n\nCreate \\`.github/copilot-instructions.md\\` in your project:\n\nUse \\`getAIToolRules({ tool: \"copilot\" })\\` to generate the content.\n\n### Step 2: Enable Custom Instructions\n\nIn VS Code settings, ensure:\n\\`\\`\\`json\n{\n \"github.copilot.chat.codeGeneration.useInstructionFiles\": true\n}\n\\`\\`\\`\n\n## Verification\n\n1. Open Copilot Chat\n2. Ask about design tokens\n3. Copilot should follow the Atomix guidelines from the instructions file\n`;\n\n case \"windsurf\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Add MCP Configuration\n\nCreate \\`.windsurf/mcp.json\\` in your project root:\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\"]\n }\n }\n}\n\\`\\`\\`\n\n### Step 2: Add Rules File\n\nCreate \\`.windsurfrules\\` in your project root.\nUse \\`getAIToolRules({ tool: \"windsurf\" })\\` to generate this file.\n\n### Step 3: Restart Windsurf\n\nRestart the editor to load the MCP configuration.\n`;\n\n case \"cline\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Create Rules File\n\nCreate \\`.clinerules\\` in your project root.\nUse \\`getAIToolRules({ tool: \"cline\" })\\` to generate this file.\n\n### Step 2: MCP Auto-Detection\n\nCline can auto-detect MCP servers from:\n- \\`.cursor/mcp.json\\`\n- Project configuration\n\nIf you have Cursor's MCP config, Cline will use it automatically.\n\n### Step 3: Manual MCP Setup (if needed)\n\nIn Cline settings, add MCP server configuration:\n- Command: \\`npx\\`\n- Args: \\`@atomixstudio/mcp@latest\\`\n`;\n\n case \"continue\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Add MCP Configuration\n\nCreate or edit \\`.continue/config.json\\`:\n\n\\`\\`\\`json\n{\n \"mcpServers\": [\n {\n \"name\": \"atomix\",\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\"]\n }\n ]\n}\n\\`\\`\\`\n\n### Step 2: Add Rules File (Optional)\n\nCreate \\`.continuerules\\` in your project root.\nUse \\`getAIToolRules({ tool: \"continue\" })\\` to generate this file.\n\n### Step 3: Restart VS Code\n\nRestart VS Code to load the Continue configuration.\n`;\n\n case \"zed\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Add Rules File\n\nCreate \\`.zed/assistant/rules.md\\` in your project root.\nUse \\`getAIToolRules({ tool: \"zed\" })\\` to generate this file.\n\n### Step 2: MCP Configuration\n\nZed's MCP support is configured in Zed settings.\nCheck Zed documentation for the latest MCP configuration format.\n`;\n\n default:\n return baseInstructions + `\n## Generic Setup\n\n### Step 1: Create Guidelines File\n\nCreate \\`AI_GUIDELINES.md\\` in your project root.\nUse \\`getAIToolRules({ tool: \"generic\" })\\` to generate this file.\n\n### Step 2: Reference in Prompts\n\nWhen working with AI tools, reference the guidelines file in your prompts\nor include it in your context.\n`;\n }\n}\n\n// ============================================\n// RULES GENERATION (kept from original)\n// ============================================\n\nexport function generateCursorRules(projectName: string, strict: boolean): string {\n const componentList = Object.keys(COMPONENT_TOKENS).join(\", \");\n const categoryList = TOKEN_CATEGORIES.join(\", \");\n\n const strictRules = strict ? `\n## Hard Rules (Strict Mode)\n\n1. **NO arbitrary values** — \\`w-[350px]\\`, \\`bg-[#ff0000]\\` are FORBIDDEN\n2. **NO hardcoded colors** — All colors must use CSS variables or token imports\n3. **NO hardcoded spacing** — Use \\`spacing.*\\` tokens (e.g., \\`@spacing.md\\`, \\`@spacing.lg\\`)\n4. **NO hardcoded typography** — Use \\`typography.fontSize.*\\` and \\`typography.fontWeight.*\\`\n5. **Token vocabulary only** — If a value isn't in the design system, don't use it\n\n### Escape Hatch\n\nIf external constraints require arbitrary values:\n\n\\`\\`\\`tsx\n{/* @design-override: YouTube embed requires 16:9 aspect ratio */}\n<div className=\"aspect-[16/9]\">\n\\`\\`\\`\n\nDocument the reason. The override comment signals intentional deviation.\n` : `\n## Guidelines (Non-Strict Mode)\n\n1. **Prefer tokens** — Use design system tokens when available\n2. **Document overrides** — If using arbitrary values, add a comment explaining why\n3. **Consistency** — Match existing patterns in the codebase\n`;\n\n const tierGuidance = `\n## Token Tier System (Critical)\n\nAtomix tokens are organized in tiers. Understanding this hierarchy is essential:\n\n### Tier 1: Primitives (Read-Only Reference)\n\nRaw foundational values. **DO NOT use these directly in components.**\n\n| Type | Example Path | Example Value | Use For |\n|------|-------------|---------------|---------|\n| Color scales | \\`colors.scales.green.500\\` | \\`#10B981\\` | Reference only |\n| Spacing scale | \\`spacing.md\\` | \\`1rem\\` | Token reference |\n| Font sizes | \\`typography.fontSize.sm\\` | \\`0.875rem\\` | Reference only |\n| Radius scale | \\`radius.lg\\` | \\`12px\\` | Token reference |\n\nThese values are **locked** — AI tools should never suggest modifying them.\n\n### Tier 2: Semantics (Primary API)\n\nPurpose-driven tokens that reference primitives. **USE THESE in components.**\n\n| Type | Example Path | Maps To | Use For |\n|------|-------------|---------|---------|\n| Mode colors | \\`colors.modes.light.bgSurface\\` | \\`neutral[5]\\` | Backgrounds |\n| Semantic radius | \\`radius.semantic.button\\` | \\`scale.md\\` | Component corners |\n| TypeSets | \\`typography.typeSets.title-lg\\` | Composed style | Text styling |\n| Focus rings | \\`shadows.focus.ring\\` | Composed shadow | A11y focus |\n\nThese are **editable via Atomix Designer** and auto-switch for dark mode.\n\n### Tier 3: Component Tokens\n\nComponent-specific token assignments. Managed via Atomix Designer.\n\n- Button variants: primary, secondary, outline, ghost\n- Card variants: default, outlined, elevated\n- Sizes: sm, md, lg\n\n---\n\n### Correct Token Usage\n\n\\`\\`\\`tsx\n// ✅ CORRECT: Use semantic color (Tier 2)\nstyle={{ backgroundColor: \"var(--atomix-bg-surface)\" }}\n\n// ❌ WRONG: Using primitive directly (Tier 1)\nstyle={{ backgroundColor: colors.scales.neutral[5] }}\n\n// ✅ CORRECT: Use typeSet (Tier 2)\nstyle={{ ...typography.typeSets[\"title-lg\"] }}\n\n// ❌ WRONG: Using primitive font size (Tier 1)\nstyle={{ fontSize: typography.fontSize[\"2xl\"] }}\n\\`\\`\\`\n\n### When to Reference Primitives\n\nPrimitives are useful for:\n1. **Validation** — Checking if a hardcoded value matches a token\n2. **Documentation** — Explaining what a semantic token resolves to\n3. **A11y calculations** — Contrast ratio checks need actual hex values\n4. **Debug logging** — Showing resolved values in dev tools\n\nBut **NEVER** use primitive paths directly in component styling code.\n`;\n\n return `# ${projectName} — Atomix Design System Rules\n\nThis project uses the **Atomix Design System**. All UI code must follow these guidelines.\n\n---\n${strictRules}\n---\n${tierGuidance}\n---\n\n## Token Categories\n\nAvailable token categories: ${categoryList}\n\n### Color Tokens\n\nUse CSS variables for all colors:\n\n\\`\\`\\`tsx\n// ✅ Correct\nstyle={{ backgroundColor: \"var(--atomix-bg-surface)\" }}\nstyle={{ color: \"var(--atomix-text-primary)\" }}\n\n// ❌ Wrong\nstyle={{ backgroundColor: \"#ffffff\" }}\nstyle={{ color: \"rgb(0, 0, 0)\" }}\n\\`\\`\\`\n\n**Semantic color aliases:**\n- \\`--atomix-brand\\` — Primary brand color\n- \\`--atomix-bg-page\\` — Page background\n- \\`--atomix-bg-surface\\` — Card/surface background\n- \\`--atomix-bg-muted\\` — Muted/secondary background\n- \\`--atomix-text-primary\\` — Primary text color\n- \\`--atomix-text-secondary\\` — Secondary text color\n- \\`--atomix-text-muted\\` — Muted/placeholder text\n- \\`--atomix-icon-brand\\` — Brand-colored icons\n- \\`--atomix-icon-strong\\` — High contrast icons\n- \\`--atomix-icon-subtle\\` — Medium contrast icons\n- \\`--atomix-icon-disabled\\` — Disabled state icons\n- \\`--atomix-border-primary\\` — Default border color\n\n### Spacing Tokens\n\nUse spacing tokens for all padding, margin, and gap values:\n\n\\`\\`\\`tsx\nimport { spacing } from \"@atomix/tokens/primitives\";\n\n// ✅ Correct\nstyle={{ padding: spacing.inset.md }}\nstyle={{ gap: spacing.gap.sm }}\n\n// ❌ Wrong\nstyle={{ padding: \"16px\" }}\nstyle={{ gap: \"8px\" }}\n\\`\\`\\`\n\n**Spacing scale:** xs, sm, md, lg, xl, 2xl, 3xl\n\n### Typography Tokens\n\nUse typography tokens for font properties:\n\n\\`\\`\\`tsx\nimport { typography } from \"@atomix/tokens/primitives\";\n\n// ✅ Correct\nstyle={{ \n fontSize: typography.fontSize.sm,\n fontWeight: typography.fontWeight.medium,\n lineHeight: typography.lineHeight.normal,\n}}\n\n// ❌ Wrong\nstyle={{ fontSize: \"14px\", fontWeight: 500 }}\n\\`\\`\\`\n\n### Motion Tokens\n\nUse motion tokens for animations:\n\n\\`\\`\\`tsx\nimport { motion } from \"@atomix/tokens/primitives\";\n\n// ✅ Correct\nstyle={{ \n transitionDuration: motion.duration.fast,\n transitionTimingFunction: motion.easing.ease,\n}}\n\n// ❌ Wrong\nstyle={{ transition: \"all 150ms ease\" }}\n\\`\\`\\`\n\n---\n\n## Component Usage\n\nAvailable components: ${componentList}\n\n### Using the MCP Server\n\nThis project has an MCP server for querying design tokens. Use these tools:\n\n- \\`getToken(\"path.to.token\")\\` — Get a specific token value\n- \\`listTokens(\"colors\")\\` — List all tokens in a category\n- \\`getComponentTokens(\"button\")\\` — Get tokens for a component\n- \\`validateUsage(\"value\")\\` — Check if a value follows the design system\n- \\`searchTokens(\"brand\")\\` — Search for tokens by name or value\n\n### Component Patterns\n\nWhen implementing components:\n\n1. Check the component tokens first: \\`getComponentTokens(\"componentName\")\\`\n2. Use the documented variants and sizes\n3. Apply tokens through CSS variables or direct imports\n4. Follow the existing component architecture\n\n---\n\n## Import Patterns\n\n\\`\\`\\`tsx\n// Import primitives for direct use\nimport { colors, spacing, typography, motion } from \"@atomix/tokens/primitives\";\n\n// Or import the combined object\nimport { primitives } from \"@atomix/tokens\";\n\n// Use CSS variables in styles (preferred for colors)\nconst style = {\n backgroundColor: \"var(--atomix-bg-surface)\",\n padding: spacing.inset.md,\n borderRadius: \"var(--atomix-radius-scale-md)\",\n};\n\\`\\`\\`\n\n---\n\n## Dark Mode\n\nColors automatically switch in dark mode when using CSS variables:\n\n\\`\\`\\`tsx\n// This works in both light and dark mode\nstyle={{ \n backgroundColor: \"var(--atomix-bg-surface)\",\n color: \"var(--atomix-text-primary)\",\n}}\n\\`\\`\\`\n\nThe \\`.dark\\` class on the root element toggles all color variables.\n\n---\n\n## When Unsure\n\n1. **Search tokens first:** Use \\`searchTokens(\"query\")\\` to find relevant tokens\n2. **Check component tokens:** Use \\`getComponentTokens(\"component\")\\` for component-specific values\n3. **Use the nearest token:** If exact match unavailable, use the closest semantic token\n4. **Flag for review:** Add \\`{/* TODO: need new token? */}\\` comment if a token seems missing\n\n---\n\n## Reference\n\n- Token package: \\`@atomix/tokens\\`\n- CSS variables: All prefixed with \\`--atomix-\\`\n- MCP server: \\`atomix-mcp\\` (run \\`npm run start\\` in packages/atomix-mcp)\n`;\n}\n\n/**\n * Generate a minimal rules file focusing on essential rules\n */\nexport function generateMinimalRules(): string {\n return `# Atomix Design System\n\nUse design tokens from \\`@atomix/tokens\\`:\n\n## Token Tiers (Important!)\n\n- **Primitives** (Tier 1): Raw values — READ-ONLY reference, don't use directly\n- **Semantics** (Tier 2): Purpose-driven — USE THESE in components\n- **Components** (Tier 3): Component assignments — Managed via Designer\n\n## Colors (Semantic - Tier 2)\n\\`\\`\\`tsx\n// ✅ Use semantic CSS variables\nstyle={{ backgroundColor: \"var(--atomix-bg-surface)\" }}\nstyle={{ color: \"var(--atomix-text-primary)\" }}\nstyle={{ borderColor: \"var(--atomix-border-primary)\" }}\n// Icon colors\nstyle={{ color: \"var(--atomix-icon-brand)\" }} // Brand icons\nstyle={{ color: \"var(--atomix-icon-strong)\" }} // High contrast icons\nstyle={{ color: \"var(--atomix-icon-subtle)\" }} // Medium contrast icons\nstyle={{ color: \"var(--atomix-icon-disabled)\" }} // Disabled icons\n\n// ❌ Don't use primitive scales directly\nstyle={{ backgroundColor: colors.scales.neutral[5] }}\n\\`\\`\\`\n\n## Spacing (Use scale keys)\n\\`\\`\\`tsx\n// In component-defaults.ts, use semantic keys:\npadding: { top: \"sm\", right: \"md\", bottom: \"sm\", left: \"md\" }\n\n// These resolve to CSS variables automatically\n\\`\\`\\`\n\n## Typography (Use TypeSets - Tier 2)\n\\`\\`\\`tsx\nimport { typography } from \"@atomix/tokens/primitives\";\n\n// ✅ Use composed typeSets\nstyle={{ ...typography.typeSets[\"title-lg\"] }}\n\n// ❌ Don't use raw fontSize primitives\nstyle={{ fontSize: typography.fontSize[\"2xl\"] }}\n\\`\\`\\`\n\n## Rules\n- NO hardcoded hex colors\n- NO hardcoded pixel values \n- Use **semantic** tokens (Tier 2), not primitives (Tier 1)\n- Use CSS variables for colors (auto dark mode)\n- Primitives are for reference/validation only\n`;\n}\n\n// ============================================\n// MULTI-TOOL RULES GENERATION\n// ============================================\n\nexport interface GeneratedRulesFile {\n tool: AIToolConfig;\n filename: string;\n path: string;\n content: string;\n}\n\n/**\n * Generate rules for a specific AI tool\n */\nexport function generateRulesForTool(\n toolId: AIToolId,\n projectName: string,\n strict: boolean\n): GeneratedRulesFile {\n const tool = AI_TOOLS[toolId];\n \n if (!tool) {\n throw new Error(`Unknown AI tool: ${toolId}. Available: ${Object.keys(AI_TOOLS).join(\", \")}`);\n }\n \n // Add tool-specific header\n const header = `<!-- Generated for ${tool.name} by Atomix MCP Server -->\n<!-- Tool: ${tool.description} -->\n<!-- Rules file: ${tool.rulesPath} -->\n<!-- Generated: ${new Date().toISOString()} -->\n\n`;\n\n const content = header + generateCursorRules(projectName, strict);\n \n return {\n tool,\n filename: tool.rulesFilename,\n path: tool.rulesPath,\n content,\n };\n}\n\n/**\n * Generate rules for ALL supported AI tools at once\n */\nexport function generateRulesForAllTools(\n projectName: string,\n strict: boolean\n): GeneratedRulesFile[] {\n return Object.keys(AI_TOOLS)\n .filter(id => AI_TOOLS[id as AIToolId].rulesPath !== \"\") // Skip tools without rules files\n .map((toolId) => \n generateRulesForTool(toolId as AIToolId, projectName, strict)\n );\n}\n\n/**\n * Get list of all supported AI tools\n */\nexport function getSupportedAITools(): AIToolConfig[] {\n return Object.values(AI_TOOLS);\n}\n\n/**\n * Generate a summary of which files to create for full AI tool support\n */\nexport function generateToolSetupGuide(projectName: string): string {\n const tools = getSupportedAITools();\n const mcpTools = tools.filter(t => t.supportsMCP);\n const rulesTools = tools.filter(t => t.rulesPath);\n \n return `# AI Tool Setup Guide for ${projectName}\n\nThis project uses the **Atomix Design System** with MCP (Model Context Protocol).\n\n## Quick Start\n\nChoose your AI tool and follow the setup:\n\n| Tool | MCP Support | Rules File | Setup Command |\n|------|-------------|------------|---------------|\n${tools.map(t => `| ${t.name} | ${t.supportsMCP ? \"Yes\" : \"No\"} | ${t.rulesPath || \"N/A\"} | \\`getSetupInstructions(\"${t.id}\")\\` |`).join(\"\\n\")}\n\n## MCP-Enabled Tools (Recommended)\n\nThese tools can query Atomix tokens directly:\n\n${mcpTools.map(t => `- **${t.name}** — ${t.description}`).join(\"\\n\")}\n\n### Generate MCP Config\n\n\\`\\`\\`\nexportMCPConfig({ tool: \"cursor\" }) // For Cursor\nexportMCPConfig({ tool: \"claude-desktop\" }) // For Claude Desktop\nexportMCPConfig({ tool: \"all\" }) // All configs at once\n\\`\\`\\`\n\n## Rules-Based Tools\n\nThese tools use instruction files:\n\n${rulesTools.filter(t => !t.supportsMCP).map(t => `- **${t.name}** — \\`${t.rulesPath}\\``).join(\"\\n\")}\n\n### Generate Rules Files\n\n\\`\\`\\`\ngetAIToolRules({ tool: \"copilot\" }) // For GitHub Copilot\ngetAIToolRules({ tool: \"all\" }) // All rules at once\n\\`\\`\\`\n\n## Available MCP Tools\n\nOnce connected, AI tools can use:\n\n| Tool | Description |\n|------|-------------|\n| \\`getToken\\` | Get a specific token by path |\n| \\`listTokens\\` | List tokens in a category |\n| \\`getComponentTokens\\` | Get tokens for a component |\n| \\`validateUsage\\` | Check if a value follows the design system |\n| \\`searchTokens\\` | Search tokens by name or value |\n| \\`exportMCPConfig\\` | Generate MCP configuration files |\n| \\`getSetupInstructions\\` | Get detailed setup instructions |\n\n## Token Tier System\n\n| Tier | Mutable | Use For |\n|------|---------|---------|\n| Primitive | No | Reference only (validation, a11y) |\n| Semantic | Yes (Designer) | Primary API for styling |\n| Component | Yes (Designer) | Component-specific tokens |\n\n**Rule**: Always use semantic tokens in code. Never use primitive paths directly.\n`;\n}\n\n// Backward compatibility aliases\nexport const generateMinimalCursorRules = generateMinimalRules;\n\n"],"mappings":"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","names":["primitives","primitives"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/tokens.ts","../src/utils.ts","../src/component-tokens.ts","../src/user-tokens.ts","../src/ai-rules-generator.ts"],"sourcesContent":["/**\n * Atomix MCP Server\n * \n * Exposes design tokens to AI tools via the Model Context Protocol.\n * \n * Tools:\n * - getToken: Get a specific token by path\n * - listTokens: List all tokens in a category\n * - getComponentTokens: Get tokens for a specific component\n * - validateUsage: Check if a value follows the design system\n * - generateCursorRules: Generate .cursorrules for a project\n */\n\nimport { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nimport { loadPrimitives } from \"./tokens.js\";\nimport { \n getTokenByPath, \n listTokensInCategory, \n flattenTokens,\n getTokenCategories,\n getCssVariableName,\n getTokenMetadata,\n isSemanticToken,\n type TokenTier,\n} from \"./utils.js\";\nimport { COMPONENT_TOKENS } from \"./component-tokens.js\";\nimport {\n parseCLIArgs,\n isUserDSMode,\n fetchUserDesignSystem,\n transformUserTokens,\n} from \"./user-tokens.js\";\nimport { \n generateCursorRules,\n generateRulesForTool,\n generateRulesForAllTools,\n getSupportedAITools,\n generateToolSetupGuide,\n generateMCPConfig,\n generateAllMCPConfigs,\n getSetupInstructions,\n AI_TOOLS,\n type AIToolId,\n type MCPConfigToolId,\n} from \"./ai-rules-generator.js\";\n\n// ============================================\n// HELPERS\n// ============================================\n\n/**\n * Format a timestamp as a human-readable \"time ago\" string\n */\nfunction formatTimeAgo(timestamp: number): string {\n const now = Date.now();\n const diffMs = now - timestamp;\n const diffSec = Math.floor(diffMs / 1000);\n const diffMin = Math.floor(diffSec / 60);\n const diffHour = Math.floor(diffMin / 60);\n const diffDay = Math.floor(diffHour / 24);\n\n if (diffSec < 60) return \"just now\";\n if (diffMin < 60) return `${diffMin} minute${diffMin > 1 ? \"s\" : \"\"} ago`;\n if (diffHour < 24) return `${diffHour} hour${diffHour > 1 ? \"s\" : \"\"} ago`;\n if (diffDay < 7) return `${diffDay} day${diffDay > 1 ? \"s\" : \"\"} ago`;\n \n // For older dates, show the date\n const date = new Date(timestamp);\n return date.toLocaleDateString(\"en-US\", { \n month: \"short\", \n day: \"numeric\", \n year: date.getFullYear() !== new Date().getFullYear() ? \"numeric\" : undefined \n });\n}\n\n// ============================================\n// SERVER SETUP\n// ============================================\n\nconst server = new Server(\n {\n name: \"atomix-mcp\",\n version: \"0.1.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n },\n }\n);\n\n// ============================================\n// TOOL DEFINITIONS\n// ============================================\n\nserver.setRequestHandler(ListToolsRequestSchema, async () => {\n return {\n tools: [\n {\n name: \"getToken\",\n description: \"Get a specific design token by its path. Returns value, CSS variable, and tier metadata. IMPORTANT: Tokens are tiered - 'primitive' tokens are read-only reference values, 'semantic' tokens are the primary API for styling.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Token path in dot notation. Prefer semantic paths (colors.modes.light.bgPage) over primitive paths (colors.scales.green.500)\",\n },\n tenantId: {\n type: \"string\",\n description: \"Tenant ID for multi-tenant support (optional, defaults to 'default')\",\n },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"listTokens\",\n description: \"List tokens in a category. Use 'tier' filter to get only semantic tokens (recommended) or primitives (reference only). Semantic tokens are the primary API; primitives are read-only reference values.\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n enum: [\"colors\", \"typography\", \"spacing\", \"sizing\", \"shadows\", \"radius\", \"motion\", \"zIndex\", \"borders\"],\n description: \"Token category to list\",\n },\n subcategory: {\n type: \"string\",\n description: \"Optional subcategory, e.g., 'modes.light' for semantic colors, 'scale' for primitive spacing\",\n },\n tier: {\n type: \"string\",\n enum: [\"semantic\", \"primitive\", \"all\"],\n description: \"Filter by token tier. 'semantic' (recommended) returns purpose-driven tokens for styling. 'primitive' returns raw reference values. Default: 'all'\",\n },\n tenantId: {\n type: \"string\",\n description: \"Tenant ID for multi-tenant support (optional, defaults to 'default')\",\n },\n },\n required: [\"category\"],\n },\n },\n {\n name: \"getComponentTokens\",\n description: \"Get all design tokens used by a specific component (Button, Card, Dialog, etc.)\",\n inputSchema: {\n type: \"object\",\n properties: {\n component: {\n type: \"string\",\n enum: [\"button\", \"card\", \"dialog\", \"input\", \"select\", \"heading\", \"checkbox\", \"radio\", \"toggle\", \"selectionControls\"],\n description: \"Component name\",\n },\n variant: {\n type: \"string\",\n description: \"Optional variant name (e.g., 'primary', 'outline', 'ghost')\",\n },\n size: {\n type: \"string\",\n description: \"Optional size name (e.g., 'sm', 'md', 'lg')\",\n },\n tenantId: {\n type: \"string\",\n description: \"Tenant ID for multi-tenant support (optional, defaults to 'default')\",\n },\n },\n required: [\"component\"],\n },\n },\n {\n name: \"validateUsage\",\n description: \"Check if a CSS value follows the Atomix design system. Detects arbitrary values that should use tokens.\",\n inputSchema: {\n type: \"object\",\n properties: {\n value: {\n type: \"string\",\n description: \"CSS value to validate, e.g., '#ff0000', '16px', 'rgb(0,112,97)'\",\n },\n context: {\n type: \"string\",\n enum: [\"color\", \"spacing\", \"radius\", \"shadow\", \"typography\", \"any\"],\n description: \"Context of the value (helps find the right token)\",\n },\n },\n required: [\"value\"],\n },\n },\n {\n name: \"generateCursorRules\",\n description: \"[DEPRECATED] Use 'getAIToolRules' instead. Generate .cursorrules content for a project.\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectName: {\n type: \"string\",\n description: \"Name of the project\",\n },\n strict: {\n type: \"boolean\",\n description: \"Whether to enforce strict token usage (no arbitrary values)\",\n },\n },\n required: [],\n },\n },\n {\n name: \"getAIToolRules\",\n description: \"Generate design system rules for AI coding tools. Supports Cursor, GitHub Copilot, Windsurf, Cline, Continue, Zed, and more.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"generic\", \"all\"],\n description: \"AI tool to generate rules for. Use 'all' to generate for all supported tools.\",\n },\n projectName: {\n type: \"string\",\n description: \"Name of the project (default: 'My Project')\",\n },\n strict: {\n type: \"boolean\",\n description: \"Enforce strict token usage - no arbitrary values allowed (default: true)\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"listAITools\",\n description: \"List all supported AI coding tools and their rules file conventions.\",\n inputSchema: {\n type: \"object\",\n properties: {},\n required: [],\n },\n },\n {\n name: \"getAIToolSetupGuide\",\n description: \"Get a complete setup guide for integrating Atomix with AI coding tools.\",\n inputSchema: {\n type: \"object\",\n properties: {\n projectName: {\n type: \"string\",\n description: \"Name of the project\",\n },\n },\n required: [],\n },\n },\n {\n name: \"exportMCPConfig\",\n description: \"Generate MCP configuration file for AI tools. Creates ready-to-use config for Cursor (.cursor/mcp.json), Claude Desktop, Windsurf, Continue, or VS Code.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"claude-desktop\", \"windsurf\", \"continue\", \"vscode\", \"all\"],\n description: \"AI tool to generate MCP config for. Use 'all' to generate for all supported tools.\",\n },\n tenantId: {\n type: \"string\",\n description: \"Tenant ID for multi-tenant setups (optional, defaults to 'default')\",\n },\n projectName: {\n type: \"string\",\n description: \"Project name for identification (optional)\",\n },\n useNpx: {\n type: \"boolean\",\n description: \"Use npx to run the server (default: true). Set to false for local development.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"getSetupInstructions\",\n description: \"Get detailed step-by-step setup instructions for a specific AI tool. Includes MCP configuration, rules file setup, and verification steps.\",\n inputSchema: {\n type: \"object\",\n properties: {\n tool: {\n type: \"string\",\n enum: [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"claude-desktop\", \"generic\"],\n description: \"AI tool to get setup instructions for.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"searchTokens\",\n description: \"Search for tokens by name or value. Results include tier metadata - prefer using 'semantic' tier tokens in code, use 'primitive' tier only for reference/validation.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (matches token paths or values)\",\n },\n tier: {\n type: \"string\",\n enum: [\"semantic\", \"primitive\", \"all\"],\n description: \"Filter results by tier. 'semantic' recommended for styling. Default: 'all'\",\n },\n },\n required: [\"query\"],\n },\n },\n ],\n };\n});\n\n// ============================================\n// TOOL HANDLERS\n// ============================================\n\nserver.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n switch (name) {\n case \"getToken\": {\n const path = args?.path as string;\n const value = getTokenByPath(primitives, path);\n \n if (value === undefined) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: `Token not found: ${path}`,\n suggestion: `Use listTokens to see available tokens. Available categories: ${getTokenCategories().join(\", \")}`,\n }, null, 2),\n },\n ],\n };\n }\n\n const cssVar = getCssVariableName(path);\n const metadata = getTokenMetadata(path);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n path,\n value,\n cssVariable: cssVar,\n // Token tier classification\n tier: metadata.tier,\n mutable: metadata.mutable,\n editVia: metadata.editVia || null,\n guidance: metadata.guidance,\n // Usage examples\n usage: metadata.tier === \"semantic\" ? {\n css: `var(${cssVar})`,\n tailwind: getTailwindClass(path, value),\n recommendation: \"Use this token in your components.\",\n } : {\n css: `var(${cssVar})`,\n tailwind: getTailwindClass(path, value),\n recommendation: \"This is a primitive (read-only reference). Consider using a semantic token instead.\",\n semanticAlternatives: getSuggestedSemanticTokens(path),\n },\n }, null, 2),\n },\n ],\n };\n }\n\n case \"listTokens\": {\n const category = args?.category as string;\n const subcategory = args?.subcategory as string | undefined;\n const tierFilter = (args?.tier as TokenTier | \"all\") || \"all\";\n \n const rawTokens = listTokensInCategory(primitives, category, subcategory);\n \n // Apply tier filter and add metadata\n const tokensWithMetadata: Record<string, {\n value: unknown;\n tier: TokenTier;\n mutable: boolean;\n guidance: string;\n }> = {};\n \n for (const [tokenPath, value] of Object.entries(rawTokens)) {\n const fullPath = subcategory \n ? `${category}.${subcategory}.${tokenPath}`\n : `${category}.${tokenPath}`;\n const metadata = getTokenMetadata(fullPath);\n \n // Apply tier filter\n if (tierFilter !== \"all\" && metadata.tier !== tierFilter) {\n continue;\n }\n \n tokensWithMetadata[tokenPath] = {\n value,\n tier: metadata.tier,\n mutable: metadata.mutable,\n guidance: metadata.guidance,\n };\n }\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n category,\n subcategory: subcategory || null,\n tierFilter,\n count: Object.keys(tokensWithMetadata).length,\n note: tierFilter === \"all\" \n ? \"Results include both primitive (read-only) and semantic (usable) tokens. Use tier='semantic' for styling recommendations.\"\n : tierFilter === \"semantic\"\n ? \"Showing semantic tokens - these are the recommended tokens for styling.\"\n : \"Showing primitive tokens - use these for reference/validation only, not direct styling.\",\n tokens: tokensWithMetadata,\n }, null, 2),\n },\n ],\n };\n }\n\n case \"getComponentTokens\": {\n const component = args?.component as string;\n const variant = args?.variant as string | undefined;\n const size = args?.size as string | undefined;\n \n const componentKey = component.toLowerCase();\n const componentData = COMPONENT_TOKENS[componentKey];\n \n if (!componentData) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: `Component not found: ${component}`,\n available: Object.keys(COMPONENT_TOKENS),\n }, null, 2),\n },\n ],\n };\n }\n\n let result = { ...componentData };\n \n // Filter by variant if specified\n if (variant && result.variants) {\n result.variants = { [variant]: result.variants[variant] };\n }\n \n // Filter by size if specified\n if (size && result.sizes) {\n result.sizes = { [size]: result.sizes[size] };\n }\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n\n case \"validateUsage\": {\n const value = args?.value as string;\n const context = (args?.context as string) || \"any\";\n \n const validation = validateValue(value, context);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify(validation, null, 2),\n },\n ],\n };\n }\n\n case \"generateCursorRules\": {\n // DEPRECATED: Forward to getAIToolRules\n const projectName = (args?.projectName as string) || \"My Project\";\n const strict = (args?.strict as boolean) ?? true;\n \n const rules = generateCursorRules(projectName, strict);\n \n return {\n content: [\n {\n type: \"text\",\n text: `<!-- DEPRECATED: Use getAIToolRules instead -->\\n${rules}`,\n },\n ],\n };\n }\n\n case \"getAIToolRules\": {\n const tool = args?.tool as string;\n const projectName = (args?.projectName as string) || \"My Project\";\n const strict = (args?.strict as boolean) ?? true;\n \n if (tool === \"all\") {\n // Generate for all tools\n const allRules = generateRulesForAllTools(projectName, strict);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n message: `Generated rules for ${allRules.length} AI tools`,\n tools: allRules.map(r => ({\n tool: r.tool.name,\n filename: r.filename,\n path: r.path,\n description: r.tool.description,\n })),\n files: allRules.map(r => ({\n path: r.path,\n content: r.content,\n })),\n }, null, 2),\n },\n ],\n };\n }\n \n // Generate for specific tool\n try {\n const result = generateRulesForTool(tool as AIToolId, projectName, strict);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n tool: result.tool.name,\n filename: result.filename,\n path: result.path,\n description: result.tool.description,\n content: result.content,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: String(error),\n availableTools: Object.keys(AI_TOOLS),\n }, null, 2),\n },\n ],\n };\n }\n }\n\n case \"listAITools\": {\n const tools = getSupportedAITools();\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n count: tools.length,\n tools: tools.map(t => ({\n id: t.id,\n name: t.name,\n rulesFile: t.rulesPath,\n description: t.description,\n })),\n note: \"Use getAIToolRules({ tool: 'toolId' }) to generate rules for a specific tool.\",\n }, null, 2),\n },\n ],\n };\n }\n\n case \"getAIToolSetupGuide\": {\n const projectName = (args?.projectName as string) || \"My Project\";\n const guide = generateToolSetupGuide(projectName);\n \n return {\n content: [\n {\n type: \"text\",\n text: guide,\n },\n ],\n };\n }\n\n case \"exportMCPConfig\": {\n const tool = args?.tool as string;\n const tenantId = (args?.tenantId as string) || \"default\";\n const projectName = (args?.projectName as string) || \"my-project\";\n const useNpx = (args?.useNpx as boolean) ?? true;\n \n const options = { tenantId, projectName, useNpx };\n \n if (tool === \"all\") {\n // Generate for all tools\n const allConfigs = generateAllMCPConfigs(options);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n message: `Generated MCP configs for ${allConfigs.length} AI tools`,\n configs: allConfigs.map(c => ({\n tool: c.tool,\n path: c.path,\n filename: c.filename,\n })),\n files: allConfigs.map(c => ({\n tool: c.tool,\n path: c.path,\n content: c.content,\n instructions: c.instructions,\n })),\n }, null, 2),\n },\n ],\n };\n }\n \n // Generate for specific tool\n try {\n const config = generateMCPConfig(tool as MCPConfigToolId, options);\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n tool: config.tool,\n path: config.path,\n filename: config.filename,\n content: config.content,\n instructions: config.instructions,\n }, null, 2),\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: String(error),\n availableTools: [\"cursor\", \"claude-desktop\", \"windsurf\", \"continue\", \"vscode\", \"all\"],\n }, null, 2),\n },\n ],\n };\n }\n }\n\n case \"getSetupInstructions\": {\n const toolId = args?.tool as AIToolId;\n \n try {\n const instructions = getSetupInstructions(toolId);\n \n return {\n content: [\n {\n type: \"text\",\n text: instructions,\n },\n ],\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n error: String(error),\n availableTools: Object.keys(AI_TOOLS),\n }, null, 2),\n },\n ],\n };\n }\n }\n\n case \"searchTokens\": {\n const query = (args?.query as string).toLowerCase();\n const tierFilter = (args?.tier as TokenTier | \"all\") || \"all\";\n const allTokens = flattenTokens(primitives);\n \n const matches = Object.entries(allTokens)\n .filter(([path, value]) => {\n const pathLower = path.toLowerCase();\n const valueStr = String(value).toLowerCase();\n const matchesQuery = pathLower.includes(query) || valueStr.includes(query);\n \n if (!matchesQuery) return false;\n \n // Apply tier filter\n if (tierFilter !== \"all\") {\n const metadata = getTokenMetadata(path);\n if (metadata.tier !== tierFilter) return false;\n }\n \n return true;\n })\n .slice(0, 50) // Limit results\n .map(([path, value]) => {\n const metadata = getTokenMetadata(path);\n return {\n path,\n value,\n cssVariable: getCssVariableName(path),\n tier: metadata.tier,\n mutable: metadata.mutable,\n guidance: metadata.guidance,\n };\n });\n \n // Sort semantic tokens first\n matches.sort((a, b) => {\n if (a.tier === \"semantic\" && b.tier !== \"semantic\") return -1;\n if (a.tier !== \"semantic\" && b.tier === \"semantic\") return 1;\n return 0;\n });\n \n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({\n query,\n tierFilter,\n count: matches.length,\n note: \"Semantic tokens are listed first. Use semantic tokens for styling; primitives are for reference only.\",\n matches,\n }, null, 2),\n },\n ],\n };\n }\n\n default:\n return {\n content: [\n {\n type: \"text\",\n text: JSON.stringify({ error: `Unknown tool: ${name}` }),\n },\n ],\n };\n }\n});\n\n// ============================================\n// RESOURCE DEFINITIONS\n// ============================================\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n return {\n resources: [\n {\n uri: \"atomix://tokens/all\",\n name: \"All Atomix Tokens\",\n description: \"Complete design token reference\",\n mimeType: \"application/json\",\n },\n {\n uri: \"atomix://tokens/colors\",\n name: \"Color Tokens\",\n description: \"All color tokens (static, scales, modes)\",\n mimeType: \"application/json\",\n },\n {\n uri: \"atomix://tokens/typography\",\n name: \"Typography Tokens\",\n description: \"Font families, sizes, weights, line heights\",\n mimeType: \"application/json\",\n },\n {\n uri: \"atomix://tokens/spacing\",\n name: \"Spacing Tokens\",\n description: \"Spacing scale, insets, gaps\",\n mimeType: \"application/json\",\n },\n {\n uri: \"atomix://components\",\n name: \"Component Tokens\",\n description: \"Token mappings for all components\",\n mimeType: \"application/json\",\n },\n ],\n };\n});\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const uri = request.params.uri;\n \n switch (uri) {\n case \"atomix://tokens/all\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(primitives, null, 2),\n },\n ],\n };\n \n case \"atomix://tokens/colors\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(primitives.colors, null, 2),\n },\n ],\n };\n \n case \"atomix://tokens/typography\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(primitives.typography, null, 2),\n },\n ],\n };\n \n case \"atomix://tokens/spacing\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(primitives.spacing, null, 2),\n },\n ],\n };\n \n case \"atomix://components\":\n return {\n contents: [\n {\n uri,\n mimeType: \"application/json\",\n text: JSON.stringify(COMPONENT_TOKENS, null, 2),\n },\n ],\n };\n \n default:\n throw new Error(`Unknown resource: ${uri}`);\n }\n});\n\n// ============================================\n// HELPER FUNCTIONS\n// ============================================\n\nfunction getTailwindClass(path: string, value: unknown): string | null {\n // Map common token paths to Tailwind classes\n if (path.startsWith(\"colors.static.brand.primary\")) return \"bg-brand text-brand\";\n // Spacing: flat structure (spacing.xs, spacing.md, etc.)\n if (path.startsWith(\"spacing.\") && !path.includes(\".inset\")) {\n const size = path.split(\".\").pop();\n return `p-${size} m-${size} gap-${size}`;\n }\n // Radius: flat structure (radius.xs, radius.md, etc.)\n if (path.startsWith(\"radius.\")) {\n const size = path.split(\".\").pop();\n return `rounded-${size}`;\n }\n return null;\n}\n\n/**\n * Suggest semantic token alternatives for a primitive token path\n */\nfunction getSuggestedSemanticTokens(primitivePath: string): string[] {\n const suggestions: string[] = [];\n \n // Color scale → Mode colors\n if (primitivePath.startsWith(\"colors.scales.\")) {\n suggestions.push(\n \"colors.modes.light.bgPage (page background)\",\n \"colors.modes.light.bgSurface (card/panel background)\",\n \"colors.modes.light.textPrimary (main text)\",\n \"colors.modes.light.borderPrimary (borders)\",\n \"colors.modes.light.actionPrimary (interactive elements)\"\n );\n }\n \n // Spacing → Use flat spacing tokens (spacing.xs, spacing.md, etc.)\n if (primitivePath.startsWith(\"spacing.\")) {\n suggestions.push(\n \"Use spacing tokens (spacing.xs, spacing.sm, spacing.md, spacing.lg, etc.)\",\n \"These resolve to CSS variables automatically\"\n );\n }\n \n // Typography fontSize → TypeSets\n if (primitivePath.startsWith(\"typography.fontSize.\")) {\n suggestions.push(\n \"typography.typeSets.title-lg (large titles)\",\n \"typography.typeSets.title-md (medium titles)\",\n \"typography.typeSets.text-normal-regular (body text)\",\n \"typography.typeSets.label-md (form labels)\"\n );\n }\n \n // Radius → Use flat radius tokens (radius.sm, radius.md, etc.)\n if (primitivePath.startsWith(\"radius.\")) {\n suggestions.push(\n \"Use radius tokens (radius.sm, radius.md, radius.lg, radius.full, etc.)\",\n \"Describe semantic usage in AI guidance (e.g., 'Buttons use @radius.md')\"\n );\n }\n \n // Shadow elevation → Use elevation keys\n if (primitivePath.startsWith(\"shadows.elevation.\")) {\n suggestions.push(\n \"Use elevation keys (none, sm, md, lg, xl) in component defaults\",\n \"These resolve to CSS variables automatically\"\n );\n }\n \n return suggestions;\n}\n\nfunction validateValue(value: string, context: string): {\n valid: boolean;\n issue?: string;\n suggestion?: string;\n matchingTokens?: Array<{ path: string; value: unknown; cssVariable: string }>;\n} {\n // Check for hex colors\n if (/^#[0-9A-Fa-f]{3,8}$/.test(value)) {\n const allTokens = flattenTokens(primitives);\n const matches = Object.entries(allTokens)\n .filter(([path, v]) => {\n if (typeof v !== \"string\") return false;\n return v.toLowerCase() === value.toLowerCase();\n })\n .map(([path, v]) => ({\n path,\n value: v,\n cssVariable: getCssVariableName(path),\n }));\n \n if (matches.length > 0) {\n return {\n valid: false,\n issue: \"Hardcoded hex color detected\",\n suggestion: `Use token instead: ${matches[0].cssVariable}`,\n matchingTokens: matches,\n };\n }\n \n return {\n valid: false,\n issue: \"Hardcoded hex color with no matching token\",\n suggestion: \"Check colors.static, colors.scales, or colors.modes for appropriate tokens\",\n };\n }\n\n // Check for rgb/rgba/hsl colors\n if (/^(rgb|rgba|hsl|hsla)\\(/.test(value)) {\n return {\n valid: false,\n issue: \"Hardcoded color function detected\",\n suggestion: \"Use CSS variable: var(--atomix-colors-*) or primitives.colors.*\",\n };\n }\n\n // Check for pixel values in spacing context\n if (context === \"spacing\" && /^\\d+px$/.test(value)) {\n return {\n valid: false,\n issue: \"Hardcoded pixel value for spacing\",\n suggestion: \"Use spacing.* tokens (e.g., @spacing.md, @spacing.lg)\",\n };\n }\n\n // Check for pixel values in any context\n if (/^\\d+px$/.test(value)) {\n return {\n valid: false,\n issue: \"Hardcoded pixel value detected\",\n suggestion: \"Consider using design tokens from spacing, sizing, or typography\",\n };\n }\n\n // Check for Tailwind arbitrary values\n if (/\\[.*\\]/.test(value)) {\n return {\n valid: false,\n issue: \"Tailwind arbitrary value detected\",\n suggestion: \"Replace with token-based class or CSS variable\",\n };\n }\n\n return { valid: true };\n}\n\n// ============================================\n// START SERVER\n// ============================================\n\n// Global primitives reference (loaded on startup)\nlet primitives: Record<string, unknown> = {};\n\n// Global governance reference (for user DS mode)\nlet userGovernance: { rules: string[]; categories?: Record<string, string[]> } | undefined;\n\n// Global DS mode flag\nlet isUserMode = false;\nlet userDsId: string | undefined;\n\nasync function main() {\n // Parse CLI arguments\n const cliArgs = parseCLIArgs();\n \n if (isUserDSMode(cliArgs)) {\n // User DS mode: fetch tokens from Atomix API\n console.error(`[atomix-mcp] User DS mode: loading design system ${cliArgs.dsId}`);\n isUserMode = true;\n userDsId = cliArgs.dsId;\n \n const result = await fetchUserDesignSystem({\n dsId: cliArgs.dsId!,\n apiKey: cliArgs.apiKey,\n baseUrl: cliArgs.baseUrl,\n });\n \n if (!result.success || !result.tokens) {\n console.error(`[atomix-mcp] Failed to load user DS: ${result.error}`);\n console.error(\"[atomix-mcp] Falling back to Atomix internal tokens\");\n \n // Fallback to internal tokens\n primitives = await loadPrimitives();\n } else {\n // Transform user tokens to MCP-compatible format\n primitives = transformUserTokens(result.tokens);\n userGovernance = result.governance;\n \n // Display startup summary\n const meta = result.meta;\n const dsName = meta?.name || cliArgs.dsId;\n const tokenCategories = Object.keys(primitives);\n const rulesCount = userGovernance?.rules?.length || 0;\n \n console.error(\"\");\n console.error(`[atomix-mcp] ========================================`);\n console.error(`[atomix-mcp] Design System: ${dsName}`);\n console.error(`[atomix-mcp] ----------------------------------------`);\n \n // Show publish info\n if (meta?.publishedAt) {\n const publishedDate = new Date(meta.publishedAt);\n const timeAgo = formatTimeAgo(meta.publishedAt);\n console.error(`[atomix-mcp] Published: ${timeAgo}`);\n console.error(`[atomix-mcp] (${publishedDate.toLocaleString()})`);\n }\n if (meta?.version) {\n console.error(`[atomix-mcp] Version: ${meta.version}`);\n }\n \n console.error(`[atomix-mcp] ----------------------------------------`);\n console.error(`[atomix-mcp] Tokens: ${tokenCategories.length} categories`);\n console.error(`[atomix-mcp] ${tokenCategories.join(\", \")}`);\n console.error(`[atomix-mcp] Rules: ${rulesCount} governance rules`);\n console.error(`[atomix-mcp] ========================================`);\n console.error(\"\");\n }\n } else {\n // Standard mode: load Atomix internal primitives\n console.error(\"[atomix-mcp] Loading Atomix internal primitives...\");\n primitives = await loadPrimitives();\n console.error(`[atomix-mcp] Loaded ${Object.keys(primitives).length} token categories`);\n }\n \n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n console.error(\"[atomix-mcp] Atomix MCP server started\");\n if (isUserMode) {\n console.error(`[atomix-mcp] Serving design system: ${userDsId}`);\n }\n}\n\nmain().catch((error) => {\n console.error(\"[atomix-mcp] Fatal error:\", error);\n process.exit(1);\n});\n\n// ============================================\n// EXPORTS (for programmatic use)\n// ============================================\n\nexport {\n // AI rules generator functions\n generateCursorRules,\n generateRulesForTool,\n generateRulesForAllTools,\n getSupportedAITools,\n generateToolSetupGuide,\n generateMCPConfig,\n generateAllMCPConfigs,\n getSetupInstructions,\n AI_TOOLS,\n // User tokens functions\n parseCLIArgs,\n isUserDSMode,\n fetchUserDesignSystem,\n transformUserTokens,\n // Types\n type AIToolId,\n type MCPConfigToolId,\n};\n\n","/**\n * Token data for MCP server\n * \n * Loads primitives dynamically from the local @atomix/tokens package.\n * This module provides the single source of truth for all design tokens.\n */\n\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\n\n// Get the directory of this file\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Load primitives from the sibling atomix package\n// Path: packages/atomix-mcp/dist -> packages/atomix/dist\nconst atomixPath = join(__dirname, \"../../atomix/dist/index.mjs\");\n\n// Dynamic import with fallback to inline primitives\nlet loadedPrimitives: Record<string, unknown> | null = null;\n\nasync function loadPrimitives(): Promise<Record<string, unknown>> {\n if (loadedPrimitives) return loadedPrimitives;\n \n try {\n const module = await import(atomixPath);\n loadedPrimitives = module.primitives as Record<string, unknown>;\n return loadedPrimitives;\n } catch (error) {\n console.error(`Failed to load @atomix/tokens from ${atomixPath}:`, error);\n console.error(\"Falling back to inline primitives...\");\n loadedPrimitives = FALLBACK_PRIMITIVES;\n return FALLBACK_PRIMITIVES;\n }\n}\n\n// Export a synchronous reference (populated on first use)\n// For the MCP server, we'll use loadPrimitives() to ensure it's loaded\nexport { loadPrimitives };\n\n// Synchronous export (may be empty until loadPrimitives is called)\nexport let primitives: Record<string, unknown> = {};\n\n// Initialize primitives immediately\nloadPrimitives().then((p) => {\n primitives = p;\n});\n\nexport const TOKEN_CATEGORIES = [\n \"colors\",\n \"typography\", \n \"spacing\",\n \"sizing\",\n \"shadows\",\n \"radius\",\n \"motion\",\n \"zIndex\",\n \"borders\",\n] as const;\n\nexport type TokenCategory = typeof TOKEN_CATEGORIES[number];\n\n// Fallback primitives (minimal set for testing when @atomix/tokens isn't available)\nconst FALLBACK_PRIMITIVES: Record<string, unknown> = {\n colors: {\n static: {\n brand: {\n primary: \"#007061\",\n primaryLight: \"#00A389\",\n primaryDark: \"#005A4D\",\n primaryForeground: \"#FFFFFF\",\n },\n white: \"#FFFFFF\",\n black: \"#000000\",\n },\n modes: {\n light: {\n bgPage: \"#FFFFFF\",\n bgSurface: \"#FFFFFF\",\n bgMuted: \"#F5F5F5\",\n textPrimary: \"#171717\",\n textSecondary: \"#525252\",\n textMuted: \"#A3A3A3\",\n // Icon colors (derived from brand/text)\n iconBrand: \"#007061\", // = brand.primary\n iconStrong: \"#171717\", // = textPrimary\n iconSubtle: \"#525252\", // = textSecondary\n iconDisabled: \"#A3A3A3\", // = textMuted\n borderPrimary: \"#E5E5E5\",\n },\n dark: {\n bgPage: \"#0A0A0A\",\n bgSurface: \"#1A1A1A\",\n bgMuted: \"#262626\",\n textPrimary: \"#FAFAFA\",\n textSecondary: \"#A3A3A3\",\n textMuted: \"#737373\",\n // Icon colors (derived from brand/text)\n iconBrand: \"#007061\", // = brand.primary\n iconStrong: \"#FAFAFA\", // = textPrimary\n iconSubtle: \"#A3A3A3\", // = textSecondary\n iconDisabled: \"#737373\", // = textMuted\n borderPrimary: \"#404040\",\n },\n },\n scales: {\n green: {\n 50: \"#E6F5F2\",\n 500: \"#007061\",\n 900: \"#002E28\",\n },\n },\n },\n typography: {\n fontFamily: {\n sans: \"Inter, system-ui, sans-serif\",\n mono: \"JetBrains Mono, monospace\",\n },\n fontSize: {\n xs: \"0.75rem\",\n sm: \"0.875rem\",\n md: \"1rem\",\n lg: \"1.125rem\",\n xl: \"1.25rem\",\n },\n fontWeight: {\n regular: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n tight: 1.25,\n normal: 1.5,\n relaxed: 1.625,\n },\n },\n spacing: {\n scale: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n },\n inset: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n },\n },\n sizing: {\n button: {\n sm: { height: \"32px\" },\n md: { height: \"40px\" },\n lg: { height: \"48px\" },\n },\n },\n shadows: {\n elevation: {\n none: \"none\",\n sm: \"0 1px 2px rgba(0, 0, 0, 0.05)\",\n md: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n lg: \"0 10px 15px rgba(0, 0, 0, 0.1)\",\n },\n focus: {\n ring: \"0 0 0 2px var(--atomix-brand)\",\n },\n },\n radius: {\n scale: {\n none: \"0\",\n sm: \"0.25rem\",\n md: \"0.5rem\",\n lg: \"0.75rem\",\n xl: \"1rem\",\n full: \"9999px\",\n },\n },\n motion: {\n duration: {\n instant: \"0ms\",\n fast: \"150ms\",\n normal: \"200ms\",\n slow: \"300ms\",\n },\n easing: {\n ease: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n easeIn: \"cubic-bezier(0.4, 0, 1, 1)\",\n easeOut: \"cubic-bezier(0, 0, 0.2, 1)\",\n },\n },\n zIndex: {\n dropdown: 1000,\n modal: 1100,\n tooltip: 1200,\n },\n borders: {\n width: {\n none: \"0\",\n thin: \"1px\",\n medium: \"2px\",\n },\n },\n};\n\n","/**\n * Utility functions for token traversal and manipulation\n */\n\nimport { TOKEN_CATEGORIES, type TokenCategory } from \"./tokens.js\";\n\n/**\n * Get a token value by its dot-notation path\n * @example getTokenByPath(primitives, \"colors.static.brand.primary\")\n */\nexport function getTokenByPath(obj: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = obj;\n \n for (const part of parts) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n \n return current;\n}\n\n/**\n * List all tokens in a category, optionally filtered by subcategory\n */\nexport function listTokensInCategory(\n primitives: Record<string, unknown>,\n category: string,\n subcategory?: string\n): Record<string, unknown> {\n let base = primitives[category];\n \n if (!base) return {};\n \n if (subcategory) {\n const subParts = subcategory.split(\".\");\n for (const part of subParts) {\n if (typeof base !== \"object\" || base === null) return {};\n base = (base as Record<string, unknown>)[part];\n }\n }\n \n if (typeof base !== \"object\" || base === null) {\n return { [subcategory || category]: base };\n }\n \n return flattenTokens(base as Record<string, unknown>);\n}\n\n/**\n * Flatten a nested token object into dot-notation paths\n */\nexport function flattenTokens(\n obj: Record<string, unknown>,\n prefix = \"\"\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n \n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n \n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n Object.assign(result, flattenTokens(value as Record<string, unknown>, path));\n } else {\n result[path] = value;\n }\n }\n \n return result;\n}\n\n/**\n * Get all available token categories\n */\nexport function getTokenCategories(): TokenCategory[] {\n return [...TOKEN_CATEGORIES];\n}\n\n/**\n * Convert a token path to a CSS variable name\n * @example getCssVariableName(\"colors.static.brand.primary\") → \"--atomix-colors-static-brand-primary\"\n */\nexport function getCssVariableName(path: string): string {\n // Convert dot notation to dash notation\n const dashPath = path\n .replace(/\\./g, \"-\")\n .replace(/([a-z])([A-Z])/g, \"$1-$2\") // camelCase to kebab-case\n .toLowerCase();\n \n return `--atomix-${dashPath}`;\n}\n\n/**\n * Parse a CSS variable name back to a token path\n * @example parseVariableName(\"--atomix-colors-static-brand-primary\") → \"colors.static.brand.primary\"\n */\nexport function parseVariableName(varName: string): string | null {\n if (!varName.startsWith(\"--atomix-\")) return null;\n \n return varName\n .replace(\"--atomix-\", \"\")\n .replace(/-/g, \".\");\n}\n\n/**\n * Check if a value looks like a hardcoded token (hex, rgb, px, etc.)\n */\nexport function isHardcodedValue(value: string): {\n isHardcoded: boolean;\n type?: \"color\" | \"spacing\" | \"unknown\";\n details?: string;\n} {\n // Hex colors\n if (/^#[0-9A-Fa-f]{3,8}$/.test(value)) {\n return { isHardcoded: true, type: \"color\", details: \"Hex color\" };\n }\n \n // RGB/RGBA/HSL\n if (/^(rgb|rgba|hsl|hsla)\\(/.test(value)) {\n return { isHardcoded: true, type: \"color\", details: \"Color function\" };\n }\n \n // Pixel values\n if (/^\\d+px$/.test(value)) {\n return { isHardcoded: true, type: \"spacing\", details: \"Pixel value\" };\n }\n \n // Rem values (outside of tokens)\n if (/^\\d+(\\.\\d+)?rem$/.test(value)) {\n return { isHardcoded: true, type: \"spacing\", details: \"Rem value\" };\n }\n \n // Tailwind arbitrary values\n if (/\\[.+\\]/.test(value)) {\n return { isHardcoded: true, type: \"unknown\", details: \"Tailwind arbitrary value\" };\n }\n \n return { isHardcoded: false };\n}\n\n/**\n * Find tokens matching a hex color value\n */\nexport function findTokensByColor(\n primitives: Record<string, unknown>,\n hexColor: string\n): Array<{ path: string; value: string }> {\n const allTokens = flattenTokens(primitives);\n const normalizedHex = hexColor.toLowerCase();\n \n return Object.entries(allTokens)\n .filter(([_, value]) => {\n if (typeof value !== \"string\") return false;\n return value.toLowerCase() === normalizedHex;\n })\n .map(([path, value]) => ({ path, value: value as string }));\n}\n\n/**\n * Get semantic alias for a token path (for shorter CSS variable names)\n */\nexport function getSemanticAlias(path: string): string | null {\n // Common semantic aliases\n const aliases: Record<string, string> = {\n \"colors.static.brand.primary\": \"--atomix-brand\",\n \"colors.modes.light.bgPage\": \"--atomix-bg-page\",\n \"colors.modes.light.bgSurface\": \"--atomix-bg-surface\",\n \"colors.modes.light.textPrimary\": \"--atomix-text-primary\",\n \"colors.modes.light.borderPrimary\": \"--atomix-border-primary\",\n // Icon colors\n \"colors.modes.light.iconBrand\": \"--atomix-icon-brand\",\n \"colors.modes.light.iconStrong\": \"--atomix-icon-strong\",\n \"colors.modes.light.iconSubtle\": \"--atomix-icon-subtle\",\n \"colors.modes.light.iconDisabled\": \"--atomix-icon-disabled\",\n \"typography.fontFamily.sans\": \"--atomix-font-sans\",\n };\n \n return aliases[path] || null;\n}\n\n// ============================================\n// TOKEN TIER CLASSIFICATION\n// ============================================\n\nexport type TokenTier = \"primitive\" | \"semantic\" | \"component\";\n\nexport interface TokenMetadata {\n /** Token tier: primitive (raw values), semantic (purpose-driven), component (usage-specific) */\n tier: TokenTier;\n /** Whether this token can be modified by external tools */\n mutable: boolean;\n /** How to edit this token if mutable */\n editVia?: \"designer\" | \"code\" | \"api\";\n /** Usage guidance for AI tools */\n guidance: string;\n}\n\n/**\n * Determine the tier and metadata for a token path.\n * \n * TIER DEFINITIONS:\n * - Primitive: Raw foundational values (scales, raw colors, px/rem values)\n * → Read-only reference for validation/a11y/docs\n * \n * - Semantic: Purpose-driven mappings that reference primitives\n * → The primary API for styling, editable via Designer\n * \n * - Component: Token assignments for specific components\n * → Editable via Designer, specific to component variants/sizes\n */\nexport function getTokenMetadata(path: string): TokenMetadata {\n // ============================================\n // PRIMITIVE TIER (Read-Only Reference)\n // Raw values that should not be modified by AI\n // ============================================\n \n // Color scales (raw palette)\n if (path.match(/^colors\\.scales\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Raw color palette. Use semantic colors (colors.modes.*) in components instead.\",\n };\n }\n \n // Alpha scales\n if (path.match(/^colors\\.scales\\.(black|white|green)Alpha\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Alpha transparency scale. Reference only for overlays/effects.\",\n };\n }\n \n // Spacing scale\n if (path.match(/^spacing\\.scale\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Spacing scale values. Use semantic spacing keys (xs, sm, md, lg) in components.\",\n };\n }\n \n // Spacing inset/stack/inline (derived from scale)\n if (path.match(/^spacing\\.(inset|stack|inline|gap)\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Spacing presets derived from scale. Reference only.\",\n };\n }\n \n // Typography raw values (fontSize, fontWeight, lineHeight)\n if (path.match(/^typography\\.(fontSize|fontWeight|lineHeight|lineHeightPx|letterSpacing|paragraphSpacing)\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Raw typography values. Use typeSets (title-lg, text-normal-regular) in components.\",\n };\n }\n \n // Radius scale\n if (path.match(/^radius\\.scale\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Border radius scale. Use semantic radius (radius.semantic.*) or scale keys in components.\",\n };\n }\n \n // Border width scale\n if (path.match(/^borders\\.width\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Border width scale. Use semantic border keys in components.\",\n };\n }\n \n // Shadow elevation (raw shadows)\n if (path.match(/^shadows\\.elevation\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Elevation shadow values. Use elevation keys (sm, md, lg) in components.\",\n };\n }\n \n // Motion duration/easing (raw values)\n if (path.match(/^motion\\.(duration|easing)\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Motion primitives. Use semantic motion presets (motion.semantic.*) when available.\",\n };\n }\n \n // Z-index scale\n if (path.match(/^zIndex\\.scale\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Z-index scale. Use semantic z-index (zIndex.semantic.*) in components.\",\n };\n }\n \n // Sizing raw values\n if (path.match(/^sizing\\./)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Component sizing values. Reference only for layout calculations.\",\n };\n }\n \n // ============================================\n // SEMANTIC TIER (Primary API)\n // Purpose-driven tokens, editable via Designer\n // ============================================\n \n // Mode colors (light/dark semantic colors)\n if (path.match(/^colors\\.modes\\.(light|dark)\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic color for theming. Use this in components. Editable via Atomix Designer.\",\n };\n }\n \n // Adaptive colors (feedback colors)\n if (path.match(/^colors\\.adaptive\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Adaptive feedback color (error, warning, success, info). Use for validation states.\",\n };\n }\n \n // Static brand colors\n if (path.match(/^colors\\.static\\.brand/)) {\n return {\n tier: \"semantic\",\n mutable: false, // Brand colors are locked\n guidance: \"Brand identity color. Use for primary brand elements. Protected from modification.\",\n };\n }\n \n // Static utility colors (white, black, transparent)\n if (path.match(/^colors\\.static\\.(white|black|transparent)/)) {\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Static utility color. Use for absolute white/black when needed.\",\n };\n }\n \n // Semantic radius\n if (path.match(/^radius\\.semantic\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic border radius for component types. Use this in component styling.\",\n };\n }\n \n // Semantic borders\n if (path.match(/^borders\\.semantic\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic border width for component types. Use this in component styling.\",\n };\n }\n \n // Semantic motion\n if (path.match(/^motion\\.semantic\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic animation preset. Use for consistent motion patterns.\",\n };\n }\n \n // Semantic z-index\n if (path.match(/^zIndex\\.semantic\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Semantic z-index for UI layers. Use for proper stacking order.\",\n };\n }\n \n // Focus shadows\n if (path.match(/^shadows\\.focus\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Focus ring styles for accessibility. Use for keyboard focus indicators.\",\n };\n }\n \n // Typography typeSets\n if (path.match(/^typography\\.typeSets\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Composed typography style. Use these for consistent text styling.\",\n };\n }\n \n // Typography font families\n if (path.match(/^typography\\.fontFamily\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Font family selection. Use 'sans', 'mono', or 'display' keys.\",\n };\n }\n \n // Typography text styles\n if (path.match(/^typography\\.textStyles\\./)) {\n return {\n tier: \"semantic\",\n mutable: true,\n editVia: \"designer\",\n guidance: \"Complete text style definition. Use for consistent typography.\",\n };\n }\n \n // ============================================\n // DEFAULT: Assume primitive if unknown\n // ============================================\n return {\n tier: \"primitive\",\n mutable: false,\n guidance: \"Token classification unknown. Treat as read-only reference.\",\n };\n}\n\n/**\n * Check if a token path is a semantic token (the primary API for AI tools)\n */\nexport function isSemanticToken(path: string): boolean {\n const metadata = getTokenMetadata(path);\n return metadata.tier === \"semantic\";\n}\n\n/**\n * Check if a token path is a primitive (read-only reference)\n */\nexport function isPrimitiveToken(path: string): boolean {\n const metadata = getTokenMetadata(path);\n return metadata.tier === \"primitive\";\n}\n\n","/**\n * Component Token Mappings\n * \n * AUTO-GENERATED from apps/atomix-lab/src/config/component-defaults.ts\n * DO NOT EDIT MANUALLY - run `npm run sync` to regenerate.\n * \n * Maps each component to its design tokens.\n * This allows AI tools to understand which tokens apply to which components.\n * \n * Last synced: 2026-01-04T21:49:24.444Z\n * Tenant: default\n */\n\nexport interface ComponentTokenConfig {\n description: string;\n variants?: Record<string, VariantTokens>;\n sizes?: Record<string, SizeTokens>;\n shared?: Record<string, string>;\n cssVariables?: string[];\n tailwindClasses?: string[];\n}\n\nexport interface VariantTokens {\n description?: string;\n tokens: Record<string, string>;\n}\n\nexport interface SizeTokens {\n description?: string;\n tokens: Record<string, string>;\n}\n\n// Multi-tenant ready token store\nexport interface MCPTokenStore {\n version: string;\n tenantId: string;\n generatedAt: string;\n components: Record<string, ComponentTokenConfig>;\n}\n\nexport const COMPONENT_TOKENS: Record<string, ComponentTokenConfig> = {\n \"button\": {\n \"description\": \"Interactive button component with multiple variants and sizes\",\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"top\": \"xs\",\n \"right\": \"sm\",\n \"bottom\": \"xs\",\n \"left\": \"sm\",\n \"borderRadius\": \"radius.scale.lg\",\n \"typeSet\": \"typography.typeSets.text-small-bold\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"xs\",\n \"right\": \"sm\",\n \"bottom\": \"xs\",\n \"left\": \"sm\",\n \"borderRadius\": \"radius.scale.lg\",\n \"typeSet\": \"typography.typeSets.text-small-bold\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"top\": \"sm\",\n \"right\": \"lg\",\n \"bottom\": \"sm\",\n \"left\": \"lg\",\n \"borderRadius\": \"radius.scale.4xl\",\n \"typeSet\": \"typography.typeSets.text-normal-bold\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"top\": \"sm\",\n \"right\": \"lg\",\n \"bottom\": \"sm\",\n \"left\": \"lg\",\n \"borderRadius\": \"radius.scale.4xl\",\n \"typeSet\": \"typography.typeSets.text-large-bold\"\n }\n }\n }\n },\n \"card\": {\n \"description\": \"Container component for grouping related content\",\n \"variants\": {\n \"default\": {\n \"description\": \"default variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgSurface\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderWidth\": \"sm\",\n \"borderRadius\": \"xl\",\n \"shadow\": \"none\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"interaction\": \"elevation\",\n \"hoverShadow\": \"elevation-lg\",\n \"hoverTranslateY\": \"-2px\",\n \"hoverBorderColor\": \"colors.modes.{mode}.borderStrong\"\n }\n },\n \"elevated\": {\n \"description\": \"elevated variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgSurface\",\n \"borderColor\": \"colors.modes.{mode}.borderPrimary\",\n \"borderWidth\": \"sm\",\n \"borderRadius\": \"2xl\",\n \"shadow\": \"elevation-md\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"interaction\": \"elevation\",\n \"hoverShadow\": \"elevation-lg\",\n \"hoverTranslateY\": \"-2px\",\n \"hoverBorderColor\": \"transparent\"\n }\n },\n \"outlined\": {\n \"description\": \"outlined variant\",\n \"tokens\": {\n \"background\": \"transparent\",\n \"borderColor\": \"colors.modes.{mode}.borderSecondary\",\n \"borderWidth\": \"lg\",\n \"borderRadius\": \"2xl\",\n \"shadow\": \"none\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"interaction\": \"border\",\n \"hoverShadow\": \"none\",\n \"hoverTranslateY\": \"0\",\n \"hoverBorderColor\": \"colors.modes.{mode}.borderStrong\"\n }\n },\n \"ghost\": {\n \"description\": \"ghost variant\",\n \"tokens\": {\n \"background\": \"transparent\",\n \"borderColor\": \"transparent\",\n \"borderWidth\": \"none\",\n \"borderRadius\": \"xl\",\n \"shadow\": \"none\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textMuted\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"interaction\": \"none\",\n \"hoverShadow\": \"none\",\n \"hoverTranslateY\": \"0\",\n \"hoverBorderColor\": \"transparent\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"top\": \"lg\",\n \"right\": \"xl\",\n \"bottom\": \"lg\",\n \"left\": \"xl\",\n \"headingSize\": \"sm\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"lg\",\n \"right\": \"xl\",\n \"bottom\": \"lg\",\n \"left\": \"xl\",\n \"headingSize\": \"sm\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"top\": \"xl\",\n \"right\": \"2xl\",\n \"bottom\": \"xl\",\n \"left\": \"2xl\",\n \"headingSize\": \"md\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"top\": \"2xl\",\n \"right\": \"3xl\",\n \"bottom\": \"2xl\",\n \"left\": \"3xl\",\n \"headingSize\": \"lg\"\n }\n }\n },\n \"shared\": {\n \"titleFontFamily\": \"typography.fontFamily.sans\",\n \"bodyFontFamily\": \"typography.fontFamily.sans\"\n }\n },\n \"input\": {\n \"description\": \"Text input field component with validation states\",\n \"variants\": {\n \"default\": {\n \"description\": \"default variant\",\n \"tokens\": {\n \"borderWidth\": \"sm\",\n \"borderColor\": \"colors.modes.{mode}.borderPrimary\",\n \"borderColorFocus\": \"colors.modes.{mode}.borderStrong\",\n \"helperTextColor\": \"colors.modes.{mode}.textMuted\"\n }\n },\n \"error\": {\n \"description\": \"error variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.adaptive.error.{mode}.border\",\n \"borderColorFocus\": \"colors.adaptive.error.{mode}.border\",\n \"helperTextColor\": \"colors.adaptive.error.{mode}.text\"\n }\n },\n \"success\": {\n \"description\": \"success variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.ring\",\n \"borderColorFocus\": \"colors.modes.{mode}.ring\",\n \"helperTextColor\": \"colors.adaptive.success.{mode}.text\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"fieldHeight\": \"32px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.lg\",\n \"top\": \"xs\",\n \"right\": \"md\",\n \"bottom\": \"xs\",\n \"left\": \"md\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"xs\",\n \"right\": \"md\",\n \"bottom\": \"xs\",\n \"left\": \"md\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"fieldHeight\": \"40px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.xl\",\n \"top\": \"sm\",\n \"right\": \"md\",\n \"bottom\": \"sm\",\n \"left\": \"md\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"fieldHeight\": \"48px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.2xl\",\n \"top\": \"xl\",\n \"right\": \"lg\",\n \"bottom\": \"xl\",\n \"left\": \"lg\"\n }\n }\n }\n },\n \"select\": {\n \"description\": \"Unified text field component supporting input, select, and textarea\",\n \"variants\": {\n \"default\": {\n \"description\": \"default variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderPrimary\",\n \"borderColorFocus\": \"colors.modes.{mode}.borderSecondary\",\n \"helperTextColor\": \"colors.modes.{mode}.textMuted\"\n }\n },\n \"error\": {\n \"description\": \"error variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.adaptive.error.{mode}.border\",\n \"borderColorFocus\": \"colors.adaptive.error.{mode}.border\",\n \"helperTextColor\": \"colors.adaptive.error.{mode}.text\"\n }\n },\n \"success\": {\n \"description\": \"success variant\",\n \"tokens\": {\n \"borderWidth\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.ring\",\n \"borderColorFocus\": \"colors.modes.{mode}.ring\",\n \"helperTextColor\": \"colors.adaptive.success.{mode}.text\"\n }\n },\n \"disabled\": {\n \"description\": \"disabled variant\",\n \"tokens\": {\n \"borderWidth\": \"sm\",\n \"borderColor\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorFocus\": \"colors.modes.{mode}.borderSecondary\",\n \"helperTextColor\": \"colors.modes.{mode}.textDisabled\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"fieldHeight\": \"32px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.lg\",\n \"top\": \"xs\",\n \"right\": \"md\",\n \"bottom\": \"xs\",\n \"left\": \"md\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"xs\",\n \"right\": \"md\",\n \"bottom\": \"xs\",\n \"left\": \"md\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"fieldHeight\": \"44px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"none\",\n \"top\": \"sm\",\n \"right\": \"md\",\n \"bottom\": \"sm\",\n \"left\": \"md\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"fieldHeight\": \"48px\",\n \"helperTypeSet\": \"helper-text\",\n \"borderRadius\": \"radius.scale.2xl\",\n \"top\": \"xl\",\n \"right\": \"lg\",\n \"bottom\": \"xl\",\n \"left\": \"lg\"\n }\n }\n }\n },\n \"dialog\": {\n \"description\": \"Modal dialog for focused interactions\",\n \"variants\": {\n \"default\": {\n \"description\": \"default variant\",\n \"tokens\": {\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"contentAlign\": \"center\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"buttonAlign\": \"center\"\n }\n },\n \"with-footer\": {\n \"description\": \"with-footer variant\",\n \"tokens\": {\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textSecondary\",\n \"contentAlign\": \"left\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"buttonAlign\": \"space-between\"\n }\n },\n \"minimal\": {\n \"description\": \"minimal variant\",\n \"tokens\": {\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"bodyColor\": \"colors.modes.{mode}.textMuted\",\n \"contentAlign\": \"center\",\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"buttonAlign\": \"center\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"headingSize\": \"sm\",\n \"top\": \"xl\",\n \"right\": \"xl\",\n \"bottom\": \"xl\",\n \"left\": \"xl\",\n \"buttonSize\": \"sm\"\n }\n },\n \"padding\": {\n \"tokens\": {\n \"top\": \"xl\",\n \"right\": \"xl\",\n \"bottom\": \"xl\",\n \"left\": \"xl\",\n \"buttonSize\": \"sm\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"headingSize\": \"md\",\n \"top\": \"xl\",\n \"right\": \"xl\",\n \"bottom\": \"xl\",\n \"left\": \"xl\",\n \"buttonSize\": \"md\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"headingSize\": \"lg\",\n \"top\": \"xl\",\n \"right\": \"xl\",\n \"bottom\": \"xl\",\n \"left\": \"xl\",\n \"buttonSize\": \"lg\"\n }\n }\n },\n \"shared\": {\n \"titleFontFamily\": \"typography.fontFamily.sans\",\n \"bodyFontFamily\": \"typography.fontFamily.sans\"\n }\n },\n \"heading\": {\n \"description\": \"Typography component for titles, descriptions, and eyebrows\",\n \"variants\": {\n \"title-only\": {\n \"description\": \"title-only variant\",\n \"tokens\": {\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"descriptionColor\": \"colors.modes.{mode}.textSecondary\",\n \"textAlign\": \"left\",\n \"eyebrowGap\": \"xs\",\n \"descriptionGap\": \"sm\",\n \"footerGap\": \"sm\"\n }\n },\n \"title-description\": {\n \"description\": \"title-description variant\",\n \"tokens\": {\n \"eyebrowColor\": \"colors.modes.{mode}.textMuted\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"descriptionColor\": \"colors.modes.{mode}.textSecondary\",\n \"textAlign\": \"left\",\n \"eyebrowGap\": \"xs\",\n \"descriptionGap\": \"xs\",\n \"footerGap\": \"sm\"\n }\n },\n \"full\": {\n \"description\": \"full variant\",\n \"tokens\": {\n \"eyebrowColor\": \"colors.modes.{mode}.textSecondary\",\n \"titleColor\": \"colors.modes.{mode}.textPrimary\",\n \"descriptionColor\": \"colors.modes.{mode}.textSecondary\",\n \"textAlign\": \"left\",\n \"eyebrowGap\": \"xs\",\n \"descriptionGap\": \"xs\",\n \"footerGap\": \"sm\"\n }\n }\n },\n \"sizes\": {\n \"sm\": {\n \"tokens\": {\n \"eyebrowTypeSet\": \"typography.typeSets.title-sm\",\n \"titleTypeSet\": \"typography.typeSets.title-md\",\n \"descriptionTypeSet\": \"typography.typeSets.text-normal-regular\"\n }\n },\n \"md\": {\n \"tokens\": {\n \"eyebrowTypeSet\": \"typography.typeSets.title-sm\",\n \"titleTypeSet\": \"typography.typeSets.title-lg\",\n \"descriptionTypeSet\": \"typography.typeSets.text-normal-regular\"\n }\n },\n \"lg\": {\n \"tokens\": {\n \"eyebrowTypeSet\": \"typography.typeSets.title-sm\",\n \"titleTypeSet\": \"typography.typeSets.title-2xl\",\n \"descriptionTypeSet\": \"typography.typeSets.text-normal-regular\"\n }\n }\n },\n \"shared\": {\n \"fontFamily\": \"typography.fontFamily.sans\"\n }\n },\n \"selectionControls\": {\n \"description\": \"Selection control components: checkbox, radio, and toggle switch\",\n \"variants\": {\n \"checkbox\": {\n \"description\": \"checkbox variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"subtle\"\n }\n },\n \"radio\": {\n \"description\": \"radio variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"subtle\"\n }\n },\n \"toggle\": {\n \"description\": \"toggle variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"press\"\n }\n }\n },\n \"sizes\": {\n \"md\": {\n \"tokens\": {\n \"controlSize\": \"20px\",\n \"labelTypeSet\": \"typography.typeSets.text-normal-regular\",\n \"gap\": \"spacing.scale.sm\",\n \"borderRadius\": \"radius.scale.lg\"\n }\n }\n }\n },\n \"checkbox\": {\n \"description\": \"Checkbox selection control\",\n \"variants\": {\n \"default\": {\n \"description\": \"checkbox variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"subtle\"\n }\n }\n },\n \"sizes\": {\n \"md\": {\n \"tokens\": {\n \"controlSize\": \"20px\",\n \"labelTypeSet\": \"typography.typeSets.text-normal-regular\",\n \"gap\": \"spacing.scale.sm\",\n \"borderRadius\": \"radius.scale.lg\"\n }\n }\n },\n \"shared\": {\n \"transitionDuration\": \"motion.duration.fast\",\n \"focusRing\": \"shadows.focus.ring\"\n }\n },\n \"radio\": {\n \"description\": \"Radio selection control\",\n \"variants\": {\n \"default\": {\n \"description\": \"radio variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"subtle\"\n }\n }\n },\n \"sizes\": {\n \"md\": {\n \"tokens\": {\n \"controlSize\": \"20px\",\n \"labelTypeSet\": \"typography.typeSets.text-normal-regular\",\n \"gap\": \"spacing.scale.sm\",\n \"borderRadius\": \"radius.scale.lg\"\n }\n }\n },\n \"shared\": {\n \"transitionDuration\": \"motion.duration.fast\",\n \"focusRing\": \"shadows.focus.ring\"\n }\n },\n \"toggle\": {\n \"description\": \"Toggle selection control\",\n \"variants\": {\n \"default\": {\n \"description\": \"toggle variant\",\n \"tokens\": {\n \"background\": \"colors.modes.{mode}.bgMuted\",\n \"backgroundChecked\": \"colors.modes.{mode}.actionPrimary\",\n \"backgroundDisabled\": \"colors.modes.{mode}.actionSecondary\",\n \"backgroundError\": \"colors.modes.{mode}.bgMuted\",\n \"borderWidth\": \"md\",\n \"borderWidthError\": \"md\",\n \"borderWidthDisabled\": \"md\",\n \"borderColor\": \"colors.modes.{mode}.borderStrong\",\n \"borderColorChecked\": \"transparent\",\n \"borderColorDisabled\": \"colors.modes.{mode}.borderSecondary\",\n \"borderColorError\": \"colors.adaptive.error.{mode}.border\",\n \"indicatorColor\": \"colors.static.white\",\n \"labelColor\": \"colors.modes.{mode}.textPrimary\",\n \"interaction\": \"press\"\n }\n }\n },\n \"sizes\": {\n \"md\": {\n \"tokens\": {\n \"controlSize\": \"20px\",\n \"labelTypeSet\": \"typography.typeSets.text-normal-regular\",\n \"gap\": \"spacing.scale.sm\",\n \"borderRadius\": \"radius.scale.lg\"\n }\n }\n },\n \"shared\": {\n \"transitionDuration\": \"motion.duration.fast\",\n \"focusRing\": \"shadows.focus.ring\"\n }\n }\n};\n\n// Multi-tenant wrapper (backward compatible)\nexport const TOKEN_STORE: MCPTokenStore = {\n version: \"1.0.0\",\n tenantId: \"default\",\n generatedAt: \"2026-01-04T21:49:24.444Z\",\n components: COMPONENT_TOKENS,\n};\n","/**\n * User Tokens Fetcher\n * -------------------\n * Fetches user-specific design system tokens from Atomix API.\n * \n * Used when MCP server is run with --ds-id flag to serve a user's\n * custom design system instead of Atomix's internal tokens.\n */\n\n// ============================================\n// TYPES\n// ============================================\n\nexport interface UserDesignSystem {\n id: string;\n name: string;\n tokens: Record<string, unknown>;\n governance?: {\n rules: string[];\n categories?: Record<string, string[]>;\n };\n}\n\nexport interface FetchUserDSOptions {\n /** User's design system ID */\n dsId: string;\n /** API key for authentication */\n apiKey?: string;\n /** Base URL for the Atomix API (default: https://atomix.design) */\n baseUrl?: string;\n}\n\nexport interface UserDSMeta {\n id: string;\n name: string;\n publishedAt?: number;\n updatedAt?: number;\n version?: number;\n}\n\nexport interface UserDSResponse {\n success: boolean;\n tokens?: Record<string, unknown>;\n governance?: UserDesignSystem['governance'];\n meta?: UserDSMeta;\n error?: string;\n}\n\n// ============================================\n// API ENDPOINTS\n// ============================================\n\nconst DEFAULT_BASE_URL = 'https://atomixstudio.eu';\n\n/**\n * Fetch user's design system tokens from Atomix API\n * \n * @param options - Fetch options including dsId and apiKey\n * @returns User's tokens and governance rules\n * \n * @example\n * ```ts\n * const { tokens, governance } = await fetchUserDesignSystem({\n * dsId: 'abc123',\n * apiKey: 'user-api-key'\n * });\n * ```\n */\nexport async function fetchUserDesignSystem(\n options: FetchUserDSOptions\n): Promise<UserDSResponse> {\n const { dsId, apiKey, baseUrl = DEFAULT_BASE_URL } = options;\n\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n headers['Authorization'] = `Bearer ${apiKey}`;\n }\n\n // Fetch tokens\n const tokensResponse = await fetch(`${baseUrl}/api/ds/${dsId}/tokens`, {\n method: 'GET',\n headers,\n });\n\n if (!tokensResponse.ok) {\n const error = await tokensResponse.text();\n return {\n success: false,\n error: `Failed to fetch tokens: ${tokensResponse.status} ${error}`,\n };\n }\n\n const tokensData = await tokensResponse.json() as { \n tokens?: Record<string, unknown>;\n meta?: UserDSMeta;\n } | Record<string, unknown>;\n\n // Extract metadata\n const meta: UserDSMeta | undefined = 'meta' in tokensData && tokensData.meta\n ? tokensData.meta as UserDSMeta\n : undefined;\n\n // Fetch governance rules\n let governance: UserDesignSystem['governance'] | undefined;\n \n try {\n const rulesResponse = await fetch(`${baseUrl}/api/ds/${dsId}/rules`, {\n method: 'GET',\n headers,\n });\n\n if (rulesResponse.ok) {\n const rulesData = await rulesResponse.json() as UserDesignSystem['governance'];\n governance = rulesData;\n }\n } catch {\n // Governance is optional, continue without it\n console.error('[atomix-mcp] Could not fetch governance rules, continuing without them');\n }\n\n // Extract tokens - handle both { tokens: {...} } and direct {...} formats\n const tokens = 'tokens' in tokensData && tokensData.tokens \n ? tokensData.tokens as Record<string, unknown>\n : tokensData as Record<string, unknown>;\n\n return {\n success: true,\n tokens,\n governance,\n meta,\n };\n } catch (error) {\n return {\n success: false,\n error: `Network error: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Validate API key format\n */\nexport function isValidApiKey(key: unknown): key is string {\n if (typeof key !== 'string') return false;\n // API keys should be at least 20 characters (UUID-ish)\n return key.length >= 20;\n}\n\n/**\n * Validate design system ID format\n */\nexport function isValidDsId(id: unknown): id is string {\n if (typeof id !== 'string') return false;\n // DS IDs should be non-empty strings\n return id.length > 0;\n}\n\n// ============================================\n// CLI ARGUMENT PARSING\n// ============================================\n\nexport interface CLIArgs {\n /** User's design system ID */\n dsId?: string;\n /** API key for authentication */\n apiKey?: string;\n /** Tenant ID (legacy, mapped to dsId) */\n tenant?: string;\n /** Base URL for the Atomix API */\n baseUrl?: string;\n}\n\n/**\n * Parse command line arguments for user DS mode\n * \n * Supported args:\n * - --ds-id <id>: User's design system ID\n * - --api-key <key>: API key for authentication\n * - --tenant <id>: Legacy tenant ID (mapped to dsId)\n * - --base-url <url>: Custom API base URL\n * \n * @param argv - Command line arguments (default: process.argv)\n * @returns Parsed CLI arguments\n */\nexport function parseCLIArgs(argv: string[] = process.argv): CLIArgs {\n const args: CLIArgs = {};\n \n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n const next = argv[i + 1];\n\n switch (arg) {\n case '--ds-id':\n if (next && !next.startsWith('--')) {\n args.dsId = next;\n i++;\n }\n break;\n\n case '--api-key':\n if (next && !next.startsWith('--')) {\n args.apiKey = next;\n i++;\n }\n break;\n\n case '--tenant':\n // Legacy support: map tenant to dsId\n if (next && !next.startsWith('--')) {\n args.tenant = next;\n args.dsId = args.dsId || next;\n i++;\n }\n break;\n\n case '--base-url':\n if (next && !next.startsWith('--')) {\n args.baseUrl = next;\n i++;\n }\n break;\n }\n }\n\n return args;\n}\n\n/**\n * Check if CLI args indicate user DS mode\n */\nexport function isUserDSMode(args: CLIArgs): boolean {\n return Boolean(args.dsId);\n}\n\n// ============================================\n// TOKEN TRANSFORMATION\n// ============================================\n\n/**\n * Transform user DS tokens to match the structure expected by MCP server.\n * \n * User DS tokens come in the StoredDesignSystem format from InstantDB.\n * This transforms them to the flat primitives structure used by MCP tools.\n * \n * @param userTokens - User's tokens from InstantDB\n * @returns Tokens in MCP-compatible format\n */\nexport function transformUserTokens(\n userTokens: Record<string, unknown>\n): Record<string, unknown> {\n // If tokens are already in the right format, return as-is\n if (userTokens.colors && userTokens.typography && userTokens.spacing) {\n return userTokens;\n }\n\n // If tokens have a 'tokens' wrapper, unwrap it\n if (typeof userTokens.tokens === 'object' && userTokens.tokens !== null) {\n return userTokens.tokens as Record<string, unknown>;\n }\n\n // Return as-is and let the MCP tools handle the structure\n return userTokens;\n}\n\n","/**\n * AI Rules Generator\n * \n * Generates project-specific rules and MCP configurations for AI coding tools\n * using the Atomix design system.\n * \n * SUPPORTED MCP CLIENTS (from modelcontextprotocol.io/clients):\n * \n * IDE/Editors:\n * - Cursor (.cursorrules)\n * - VS Code + GitHub Copilot (.github/copilot-instructions.md)\n * - Windsurf (.windsurfrules)\n * - Zed (MCP native)\n * - Continue (.continuerules)\n * - Cline (.clinerules)\n * - CodeGPT (MCP native)\n * - Amazon Q IDE (MCP native)\n * - Augment Code (MCP native)\n * - VT Code (MCP native)\n * \n * Desktop Apps:\n * - Claude Desktop (MCP native)\n * - BoltAI (MCP native)\n * - Chatbox (MCP native)\n * - ChatGPT (MCP native)\n * \n * CLI/Terminal:\n * - Warp (.warp/workflows or MCP)\n * - Amazon Q CLI (MCP native)\n * - goose (MCP native)\n * \n * Frameworks/Libraries:\n * - Genkit (MCP native)\n * - LangChain (MCP native)\n * - fast-agent (MCP native)\n */\n\nimport { TOKEN_CATEGORIES } from \"./tokens.js\";\nimport { COMPONENT_TOKENS } from \"./component-tokens.js\";\n\n// ============================================\n// SUPPORTED AI TOOLS\n// ============================================\n\nexport type AIToolId = \n | \"cursor\" \n | \"copilot\" \n | \"windsurf\" \n | \"cline\" \n | \"continue\"\n | \"zed\"\n | \"claude-desktop\"\n | \"generic\";\n\nexport interface AIToolConfig {\n id: AIToolId;\n name: string;\n rulesFilename: string;\n rulesPath: string; // Relative to project root\n mcpConfigPath?: string; // Where MCP config lives for this tool\n supportsMarkdown: boolean;\n supportsMCP: boolean;\n description: string;\n}\n\n/**\n * Registry of supported AI coding tools and their rules file conventions\n */\nexport const AI_TOOLS: Record<AIToolId, AIToolConfig> = {\n cursor: {\n id: \"cursor\",\n name: \"Cursor\",\n rulesFilename: \".cursorrules\",\n rulesPath: \".cursorrules\",\n mcpConfigPath: \".cursor/mcp.json\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Cursor IDE - AI-first code editor\",\n },\n copilot: {\n id: \"copilot\",\n name: \"GitHub Copilot\",\n rulesFilename: \"copilot-instructions.md\",\n rulesPath: \".github/copilot-instructions.md\",\n supportsMarkdown: true,\n supportsMCP: false, // Uses rules file instead\n description: \"GitHub Copilot in VS Code, JetBrains, etc.\",\n },\n windsurf: {\n id: \"windsurf\",\n name: \"Windsurf\",\n rulesFilename: \".windsurfrules\",\n rulesPath: \".windsurfrules\",\n mcpConfigPath: \".windsurf/mcp.json\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Windsurf Editor by Codeium\",\n },\n cline: {\n id: \"cline\",\n name: \"Cline\",\n rulesFilename: \".clinerules\",\n rulesPath: \".clinerules\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Cline VS Code extension (formerly Claude Dev)\",\n },\n continue: {\n id: \"continue\",\n name: \"Continue\",\n rulesFilename: \".continuerules\",\n rulesPath: \".continuerules\",\n mcpConfigPath: \".continue/config.json\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Continue - open source AI code assistant\",\n },\n zed: {\n id: \"zed\",\n name: \"Zed\",\n rulesFilename: \".zed/assistant/rules.md\",\n rulesPath: \".zed/assistant/rules.md\",\n supportsMarkdown: true,\n supportsMCP: true,\n description: \"Zed Editor with AI assistant\",\n },\n \"claude-desktop\": {\n id: \"claude-desktop\",\n name: \"Claude Desktop\",\n rulesFilename: \"\",\n rulesPath: \"\",\n mcpConfigPath: \"~/Library/Application Support/Claude/claude_desktop_config.json\",\n supportsMarkdown: false,\n supportsMCP: true,\n description: \"Claude Desktop App by Anthropic\",\n },\n generic: {\n id: \"generic\",\n name: \"Generic AI\",\n rulesFilename: \"AI_GUIDELINES.md\",\n rulesPath: \"AI_GUIDELINES.md\",\n supportsMarkdown: true,\n supportsMCP: false,\n description: \"Generic guidelines for any AI tool\",\n },\n};\n\n// ============================================\n// MCP CONFIG GENERATION\n// ============================================\n\nexport type MCPConfigToolId = \"cursor\" | \"claude-desktop\" | \"windsurf\" | \"continue\" | \"vscode\";\n\nexport interface MCPConfigOptions {\n /** Path to the MCP server (default: npx @atomixstudio/mcp) */\n serverPath?: string;\n /** Use npx to run the server */\n useNpx?: boolean;\n /** Design system ID for per-user MCP mode */\n dsId?: string;\n /** API key for authentication (required for per-user mode) */\n apiKey?: string;\n /** @deprecated Use dsId instead. Tenant ID for backwards compatibility */\n tenantId?: string;\n /** Project name for identification */\n projectName?: string;\n}\n\nexport interface MCPConfig {\n tool: MCPConfigToolId;\n filename: string;\n path: string;\n content: string;\n instructions: string;\n}\n\n/**\n * Generate MCP configuration file for a specific AI tool\n */\nexport function generateMCPConfig(\n tool: MCPConfigToolId,\n options: MCPConfigOptions = {}\n): MCPConfig {\n const {\n serverPath,\n useNpx = true,\n dsId,\n apiKey,\n tenantId, // Legacy support\n projectName = \"my-project\",\n } = options;\n\n const npxCommand = useNpx ? \"npx\" : \"node\";\n const npxArgs = useNpx \n ? [\"@atomixstudio/mcp@latest\"]\n : [serverPath || \"./node_modules/@atomixstudio/mcp/dist/index.js\"];\n\n // Use dsId + apiKey (new format) or fall back to tenantId (legacy)\n const effectiveDsId = dsId || tenantId;\n \n if (effectiveDsId && effectiveDsId !== \"default\") {\n npxArgs.push(\"--ds-id\", effectiveDsId);\n \n // Only add API key if provided\n if (apiKey) {\n npxArgs.push(\"--api-key\", apiKey);\n }\n }\n\n switch (tool) {\n case \"cursor\": {\n const config = {\n mcpServers: {\n atomix: {\n command: npxCommand,\n args: npxArgs,\n },\n },\n };\n\n return {\n tool: \"cursor\",\n filename: \"mcp.json\",\n path: \".cursor/mcp.json\",\n content: JSON.stringify(config, null, 2),\n instructions: `\n## Cursor MCP Setup\n\n1. Create the file \\`.cursor/mcp.json\\` in your project root\n2. Paste the configuration below\n3. Restart Cursor IDE\n4. The Atomix MCP server will be available in Cursor's AI features\n\n### Configuration File\n\\`\\`\\`json\n${JSON.stringify(config, null, 2)}\n\\`\\`\\`\n\n### Verify Setup\nAfter restarting Cursor, you can verify the MCP server is working by:\n- Opening the AI chat (Cmd/Ctrl + L)\n- Asking: \"What design tokens are available?\"\n- The AI should query the Atomix MCP server and list token categories\n`.trim(),\n };\n }\n\n case \"claude-desktop\": {\n const config = {\n mcpServers: {\n atomix: {\n command: npxCommand,\n args: npxArgs,\n },\n },\n };\n\n const configPath = process.platform === \"darwin\"\n ? \"~/Library/Application Support/Claude/claude_desktop_config.json\"\n : process.platform === \"win32\"\n ? \"%APPDATA%\\\\Claude\\\\claude_desktop_config.json\"\n : \"~/.config/Claude/claude_desktop_config.json\";\n\n return {\n tool: \"claude-desktop\",\n filename: \"claude_desktop_config.json\",\n path: configPath,\n content: JSON.stringify(config, null, 2),\n instructions: `\n## Claude Desktop MCP Setup\n\n1. Locate your Claude Desktop config file:\n - **macOS**: \\`${configPath}\\`\n - **Windows**: \\`%APPDATA%\\\\Claude\\\\claude_desktop_config.json\\`\n - **Linux**: \\`~/.config/Claude/claude_desktop_config.json\\`\n\n2. Create or edit the file with the configuration below\n\n3. Restart Claude Desktop\n\n4. The Atomix MCP server will be available when chatting with Claude\n\n### Configuration File\n\\`\\`\\`json\n${JSON.stringify(config, null, 2)}\n\\`\\`\\`\n\n### Verify Setup\nAfter restarting Claude Desktop:\n- Start a new conversation\n- Ask: \"Can you check what Atomix design tokens are available?\"\n- Claude should use the MCP server to query tokens\n`.trim(),\n };\n }\n\n case \"windsurf\": {\n const config = {\n mcpServers: {\n atomix: {\n command: npxCommand,\n args: npxArgs,\n },\n },\n };\n\n return {\n tool: \"windsurf\",\n filename: \"mcp.json\",\n path: \".windsurf/mcp.json\",\n content: JSON.stringify(config, null, 2),\n instructions: `\n## Windsurf MCP Setup\n\n1. Create the file \\`.windsurf/mcp.json\\` in your project root\n2. Paste the configuration below\n3. Restart Windsurf Editor\n4. The Atomix MCP server will be available in Cascade\n\n### Configuration File\n\\`\\`\\`json\n${JSON.stringify(config, null, 2)}\n\\`\\`\\`\n`.trim(),\n };\n }\n\n case \"continue\": {\n const config = {\n models: [],\n mcpServers: [\n {\n name: \"atomix\",\n command: npxCommand,\n args: npxArgs,\n },\n ],\n };\n\n return {\n tool: \"continue\",\n filename: \"config.json\",\n path: \".continue/config.json\",\n content: JSON.stringify(config, null, 2),\n instructions: `\n## Continue MCP Setup\n\n1. Create or edit \\`.continue/config.json\\` in your project root\n2. Add the mcpServers section below\n3. Restart VS Code\n4. The Atomix MCP server will be available in Continue\n\n### Configuration File\n\\`\\`\\`json\n${JSON.stringify(config, null, 2)}\n\\`\\`\\`\n\nNote: If you already have a config.json, merge the mcpServers array.\n`.trim(),\n };\n }\n\n case \"vscode\": {\n // VS Code uses settings.json or extension-specific configs\n return {\n tool: \"vscode\",\n filename: \"settings.json\",\n path: \".vscode/settings.json\",\n content: JSON.stringify({\n \"mcp.servers\": {\n atomix: {\n command: npxCommand,\n args: npxArgs,\n },\n },\n }, null, 2),\n instructions: `\n## VS Code MCP Setup\n\nFor VS Code, MCP support depends on your AI extension:\n\n### Option 1: Use GitHub Copilot Instructions\nCreate \\`.github/copilot-instructions.md\\` with Atomix rules (use getAIToolRules)\n\n### Option 2: Use Continue Extension\nSee Continue setup instructions above\n\n### Option 3: Use Cline Extension\n1. Install Cline extension\n2. Cline will auto-detect MCP servers in .cursor/mcp.json or .vscode/settings.json\n\n### Settings.json (for MCP-aware extensions)\n\\`\\`\\`json\n{\n \"mcp.servers\": {\n \"atomix\": {\n \"command\": \"${npxCommand}\",\n \"args\": ${JSON.stringify(npxArgs)}\n }\n }\n}\n\\`\\`\\`\n`.trim(),\n };\n }\n\n default:\n throw new Error(`Unknown MCP config tool: ${tool}`);\n }\n}\n\n/**\n * Generate MCP configs for all supported tools\n */\nexport function generateAllMCPConfigs(options: MCPConfigOptions = {}): MCPConfig[] {\n const tools: MCPConfigToolId[] = [\"cursor\", \"claude-desktop\", \"windsurf\", \"continue\", \"vscode\"];\n return tools.map(tool => generateMCPConfig(tool, options));\n}\n\n// ============================================\n// SETUP INSTRUCTIONS\n// ============================================\n\n/**\n * Get detailed setup instructions for a specific AI tool\n */\nexport function getSetupInstructions(toolId: AIToolId): string {\n const tool = AI_TOOLS[toolId];\n \n if (!tool) {\n throw new Error(`Unknown AI tool: ${toolId}. Available: ${Object.keys(AI_TOOLS).join(\", \")}`);\n }\n\n const baseInstructions = `\n# ${tool.name} Setup for Atomix Design System\n\n${tool.description}\n\n## Overview\n\n${tool.supportsMCP ? `${tool.name} supports MCP (Model Context Protocol), allowing direct integration with the Atomix design token server.` : `${tool.name} uses a rules file to understand the Atomix design system.`}\n\n`;\n\n switch (toolId) {\n case \"cursor\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Add MCP Configuration\n\nCreate \\`.cursor/mcp.json\\` in your project root:\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\"]\n }\n }\n}\n\\`\\`\\`\n\n### Step 2: Add Rules File (Optional but Recommended)\n\nCreate \\`.cursorrules\\` in your project root with Atomix guidelines.\nUse \\`getAIToolRules({ tool: \"cursor\" })\\` to generate this file.\n\n### Step 3: Restart Cursor\n\nAfter adding the MCP config, restart Cursor IDE completely.\n\n## Verification\n\n1. Open AI chat (Cmd/Ctrl + L)\n2. Ask: \"What Atomix design tokens are available?\"\n3. Cursor should query the MCP server and respond with token information\n\n## Available MCP Tools\n\nOnce configured, you can use these in conversations:\n- \\`getToken(\"colors.static.brand.primary\")\\` - Get a specific token\n- \\`listTokens(\"colors\")\\` - List tokens in a category\n- \\`getComponentTokens(\"button\")\\` - Get component tokens\n- \\`validateUsage(\"#ff0000\")\\` - Check if a value is allowed\n- \\`searchTokens(\"brand\")\\` - Search for tokens\n`;\n\n case \"claude-desktop\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Locate Config File\n\n- **macOS**: \\`~/Library/Application Support/Claude/claude_desktop_config.json\\`\n- **Windows**: \\`%APPDATA%\\\\Claude\\\\claude_desktop_config.json\\`\n- **Linux**: \\`~/.config/Claude/claude_desktop_config.json\\`\n\n### Step 2: Add MCP Configuration\n\nCreate or edit the config file:\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\"]\n }\n }\n}\n\\`\\`\\`\n\n### Step 3: Restart Claude Desktop\n\nCompletely quit and reopen Claude Desktop.\n\n## Verification\n\nStart a new conversation and ask:\n\"Can you check what Atomix design tokens are available?\"\n\nClaude should use the MCP server to query and list tokens.\n`;\n\n case \"copilot\":\n return baseInstructions + `\n## Quick Setup\n\nGitHub Copilot doesn't support MCP directly, but uses instruction files.\n\n### Step 1: Create Instructions File\n\nCreate \\`.github/copilot-instructions.md\\` in your project:\n\nUse \\`getAIToolRules({ tool: \"copilot\" })\\` to generate the content.\n\n### Step 2: Enable Custom Instructions\n\nIn VS Code settings, ensure:\n\\`\\`\\`json\n{\n \"github.copilot.chat.codeGeneration.useInstructionFiles\": true\n}\n\\`\\`\\`\n\n## Verification\n\n1. Open Copilot Chat\n2. Ask about design tokens\n3. Copilot should follow the Atomix guidelines from the instructions file\n`;\n\n case \"windsurf\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Add MCP Configuration\n\nCreate \\`.windsurf/mcp.json\\` in your project root:\n\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\"]\n }\n }\n}\n\\`\\`\\`\n\n### Step 2: Add Rules File\n\nCreate \\`.windsurfrules\\` in your project root.\nUse \\`getAIToolRules({ tool: \"windsurf\" })\\` to generate this file.\n\n### Step 3: Restart Windsurf\n\nRestart the editor to load the MCP configuration.\n`;\n\n case \"cline\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Create Rules File\n\nCreate \\`.clinerules\\` in your project root.\nUse \\`getAIToolRules({ tool: \"cline\" })\\` to generate this file.\n\n### Step 2: MCP Auto-Detection\n\nCline can auto-detect MCP servers from:\n- \\`.cursor/mcp.json\\`\n- Project configuration\n\nIf you have Cursor's MCP config, Cline will use it automatically.\n\n### Step 3: Manual MCP Setup (if needed)\n\nIn Cline settings, add MCP server configuration:\n- Command: \\`npx\\`\n- Args: \\`@atomixstudio/mcp@latest\\`\n`;\n\n case \"continue\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Add MCP Configuration\n\nCreate or edit \\`.continue/config.json\\`:\n\n\\`\\`\\`json\n{\n \"mcpServers\": [\n {\n \"name\": \"atomix\",\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\"]\n }\n ]\n}\n\\`\\`\\`\n\n### Step 2: Add Rules File (Optional)\n\nCreate \\`.continuerules\\` in your project root.\nUse \\`getAIToolRules({ tool: \"continue\" })\\` to generate this file.\n\n### Step 3: Restart VS Code\n\nRestart VS Code to load the Continue configuration.\n`;\n\n case \"zed\":\n return baseInstructions + `\n## Quick Setup\n\n### Step 1: Add Rules File\n\nCreate \\`.zed/assistant/rules.md\\` in your project root.\nUse \\`getAIToolRules({ tool: \"zed\" })\\` to generate this file.\n\n### Step 2: MCP Configuration\n\nZed's MCP support is configured in Zed settings.\nCheck Zed documentation for the latest MCP configuration format.\n`;\n\n default:\n return baseInstructions + `\n## Generic Setup\n\n### Step 1: Create Guidelines File\n\nCreate \\`AI_GUIDELINES.md\\` in your project root.\nUse \\`getAIToolRules({ tool: \"generic\" })\\` to generate this file.\n\n### Step 2: Reference in Prompts\n\nWhen working with AI tools, reference the guidelines file in your prompts\nor include it in your context.\n`;\n }\n}\n\n// ============================================\n// RULES GENERATION (kept from original)\n// ============================================\n\nexport function generateCursorRules(projectName: string, strict: boolean): string {\n const componentList = Object.keys(COMPONENT_TOKENS).join(\", \");\n const categoryList = TOKEN_CATEGORIES.join(\", \");\n\n const strictRules = strict ? `\n## Hard Rules (Strict Mode)\n\n1. **NO arbitrary values** — \\`w-[350px]\\`, \\`bg-[#ff0000]\\` are FORBIDDEN\n2. **NO hardcoded colors** — All colors must use CSS variables or token imports\n3. **NO hardcoded spacing** — Use \\`spacing.*\\` tokens (e.g., \\`@spacing.md\\`, \\`@spacing.lg\\`)\n4. **NO hardcoded typography** — Use \\`typography.fontSize.*\\` and \\`typography.fontWeight.*\\`\n5. **Token vocabulary only** — If a value isn't in the design system, don't use it\n\n### Escape Hatch\n\nIf external constraints require arbitrary values:\n\n\\`\\`\\`tsx\n{/* @design-override: YouTube embed requires 16:9 aspect ratio */}\n<div className=\"aspect-[16/9]\">\n\\`\\`\\`\n\nDocument the reason. The override comment signals intentional deviation.\n` : `\n## Guidelines (Non-Strict Mode)\n\n1. **Prefer tokens** — Use design system tokens when available\n2. **Document overrides** — If using arbitrary values, add a comment explaining why\n3. **Consistency** — Match existing patterns in the codebase\n`;\n\n const tierGuidance = `\n## Token Tier System (Critical)\n\nAtomix tokens are organized in tiers. Understanding this hierarchy is essential:\n\n### Tier 1: Primitives (Read-Only Reference)\n\nRaw foundational values. **DO NOT use these directly in components.**\n\n| Type | Example Path | Example Value | Use For |\n|------|-------------|---------------|---------|\n| Color scales | \\`colors.scales.green.500\\` | \\`#10B981\\` | Reference only |\n| Spacing scale | \\`spacing.md\\` | \\`1rem\\` | Token reference |\n| Font sizes | \\`typography.fontSize.sm\\` | \\`0.875rem\\` | Reference only |\n| Radius scale | \\`radius.lg\\` | \\`12px\\` | Token reference |\n\nThese values are **locked** — AI tools should never suggest modifying them.\n\n### Tier 2: Semantics (Primary API)\n\nPurpose-driven tokens that reference primitives. **USE THESE in components.**\n\n| Type | Example Path | Maps To | Use For |\n|------|-------------|---------|---------|\n| Mode colors | \\`colors.modes.light.bgSurface\\` | \\`neutral[5]\\` | Backgrounds |\n| Semantic radius | \\`radius.semantic.button\\` | \\`scale.md\\` | Component corners |\n| TypeSets | \\`typography.typeSets.title-lg\\` | Composed style | Text styling |\n| Focus rings | \\`shadows.focus.ring\\` | Composed shadow | A11y focus |\n\nThese are **editable via Atomix Designer** and auto-switch for dark mode.\n\n### Tier 3: Component Tokens\n\nComponent-specific token assignments. Managed via Atomix Designer.\n\n- Button variants: primary, secondary, outline, ghost\n- Card variants: default, outlined, elevated\n- Sizes: sm, md, lg\n\n---\n\n### Correct Token Usage\n\n\\`\\`\\`tsx\n// ✅ CORRECT: Use semantic color (Tier 2)\nstyle={{ backgroundColor: \"var(--atomix-bg-surface)\" }}\n\n// ❌ WRONG: Using primitive directly (Tier 1)\nstyle={{ backgroundColor: colors.scales.neutral[5] }}\n\n// ✅ CORRECT: Use typeSet (Tier 2)\nstyle={{ ...typography.typeSets[\"title-lg\"] }}\n\n// ❌ WRONG: Using primitive font size (Tier 1)\nstyle={{ fontSize: typography.fontSize[\"2xl\"] }}\n\\`\\`\\`\n\n### When to Reference Primitives\n\nPrimitives are useful for:\n1. **Validation** — Checking if a hardcoded value matches a token\n2. **Documentation** — Explaining what a semantic token resolves to\n3. **A11y calculations** — Contrast ratio checks need actual hex values\n4. **Debug logging** — Showing resolved values in dev tools\n\nBut **NEVER** use primitive paths directly in component styling code.\n`;\n\n return `# ${projectName} — Atomix Design System Rules\n\nThis project uses the **Atomix Design System**. All UI code must follow these guidelines.\n\n---\n${strictRules}\n---\n${tierGuidance}\n---\n\n## Token Categories\n\nAvailable token categories: ${categoryList}\n\n### Color Tokens\n\nUse CSS variables for all colors:\n\n\\`\\`\\`tsx\n// ✅ Correct\nstyle={{ backgroundColor: \"var(--atomix-bg-surface)\" }}\nstyle={{ color: \"var(--atomix-text-primary)\" }}\n\n// ❌ Wrong\nstyle={{ backgroundColor: \"#ffffff\" }}\nstyle={{ color: \"rgb(0, 0, 0)\" }}\n\\`\\`\\`\n\n**Semantic color aliases:**\n- \\`--atomix-brand\\` — Primary brand color\n- \\`--atomix-bg-page\\` — Page background\n- \\`--atomix-bg-surface\\` — Card/surface background\n- \\`--atomix-bg-muted\\` — Muted/secondary background\n- \\`--atomix-text-primary\\` — Primary text color\n- \\`--atomix-text-secondary\\` — Secondary text color\n- \\`--atomix-text-muted\\` — Muted/placeholder text\n- \\`--atomix-icon-brand\\` — Brand-colored icons\n- \\`--atomix-icon-strong\\` — High contrast icons\n- \\`--atomix-icon-subtle\\` — Medium contrast icons\n- \\`--atomix-icon-disabled\\` — Disabled state icons\n- \\`--atomix-border-primary\\` — Default border color\n\n### Spacing Tokens\n\nUse spacing tokens for all padding, margin, and gap values:\n\n\\`\\`\\`tsx\nimport { spacing } from \"@atomix/tokens/primitives\";\n\n// ✅ Correct\nstyle={{ padding: spacing.inset.md }}\nstyle={{ gap: spacing.gap.sm }}\n\n// ❌ Wrong\nstyle={{ padding: \"16px\" }}\nstyle={{ gap: \"8px\" }}\n\\`\\`\\`\n\n**Spacing scale:** xs, sm, md, lg, xl, 2xl, 3xl\n\n### Typography Tokens\n\nUse typography tokens for font properties:\n\n\\`\\`\\`tsx\nimport { typography } from \"@atomix/tokens/primitives\";\n\n// ✅ Correct\nstyle={{ \n fontSize: typography.fontSize.sm,\n fontWeight: typography.fontWeight.medium,\n lineHeight: typography.lineHeight.normal,\n}}\n\n// ❌ Wrong\nstyle={{ fontSize: \"14px\", fontWeight: 500 }}\n\\`\\`\\`\n\n### Motion Tokens\n\nUse motion tokens for animations:\n\n\\`\\`\\`tsx\nimport { motion } from \"@atomix/tokens/primitives\";\n\n// ✅ Correct\nstyle={{ \n transitionDuration: motion.duration.fast,\n transitionTimingFunction: motion.easing.ease,\n}}\n\n// ❌ Wrong\nstyle={{ transition: \"all 150ms ease\" }}\n\\`\\`\\`\n\n---\n\n## Component Usage\n\nAvailable components: ${componentList}\n\n### Using the MCP Server\n\nThis project has an MCP server for querying design tokens. Use these tools:\n\n- \\`getToken(\"path.to.token\")\\` — Get a specific token value\n- \\`listTokens(\"colors\")\\` — List all tokens in a category\n- \\`getComponentTokens(\"button\")\\` — Get tokens for a component\n- \\`validateUsage(\"value\")\\` — Check if a value follows the design system\n- \\`searchTokens(\"brand\")\\` — Search for tokens by name or value\n\n### Component Patterns\n\nWhen implementing components:\n\n1. Check the component tokens first: \\`getComponentTokens(\"componentName\")\\`\n2. Use the documented variants and sizes\n3. Apply tokens through CSS variables or direct imports\n4. Follow the existing component architecture\n\n---\n\n## Import Patterns\n\n\\`\\`\\`tsx\n// Import primitives for direct use\nimport { colors, spacing, typography, motion } from \"@atomix/tokens/primitives\";\n\n// Or import the combined object\nimport { primitives } from \"@atomix/tokens\";\n\n// Use CSS variables in styles (preferred for colors)\nconst style = {\n backgroundColor: \"var(--atomix-bg-surface)\",\n padding: spacing.inset.md,\n borderRadius: \"var(--atomix-radius-scale-md)\",\n};\n\\`\\`\\`\n\n---\n\n## Dark Mode\n\nColors automatically switch in dark mode when using CSS variables:\n\n\\`\\`\\`tsx\n// This works in both light and dark mode\nstyle={{ \n backgroundColor: \"var(--atomix-bg-surface)\",\n color: \"var(--atomix-text-primary)\",\n}}\n\\`\\`\\`\n\nThe \\`.dark\\` class on the root element toggles all color variables.\n\n---\n\n## When Unsure\n\n1. **Search tokens first:** Use \\`searchTokens(\"query\")\\` to find relevant tokens\n2. **Check component tokens:** Use \\`getComponentTokens(\"component\")\\` for component-specific values\n3. **Use the nearest token:** If exact match unavailable, use the closest semantic token\n4. **Flag for review:** Add \\`{/* TODO: need new token? */}\\` comment if a token seems missing\n\n---\n\n## Reference\n\n- Token package: \\`@atomix/tokens\\`\n- CSS variables: All prefixed with \\`--atomix-\\`\n- MCP server: \\`atomix-mcp\\` (run \\`npm run start\\` in packages/atomix-mcp)\n`;\n}\n\n/**\n * Generate a minimal rules file focusing on essential rules\n */\nexport function generateMinimalRules(): string {\n return `# Atomix Design System\n\nUse design tokens from \\`@atomix/tokens\\`:\n\n## Token Tiers (Important!)\n\n- **Primitives** (Tier 1): Raw values — READ-ONLY reference, don't use directly\n- **Semantics** (Tier 2): Purpose-driven — USE THESE in components\n- **Components** (Tier 3): Component assignments — Managed via Designer\n\n## Colors (Semantic - Tier 2)\n\\`\\`\\`tsx\n// ✅ Use semantic CSS variables\nstyle={{ backgroundColor: \"var(--atomix-bg-surface)\" }}\nstyle={{ color: \"var(--atomix-text-primary)\" }}\nstyle={{ borderColor: \"var(--atomix-border-primary)\" }}\n// Icon colors\nstyle={{ color: \"var(--atomix-icon-brand)\" }} // Brand icons\nstyle={{ color: \"var(--atomix-icon-strong)\" }} // High contrast icons\nstyle={{ color: \"var(--atomix-icon-subtle)\" }} // Medium contrast icons\nstyle={{ color: \"var(--atomix-icon-disabled)\" }} // Disabled icons\n\n// ❌ Don't use primitive scales directly\nstyle={{ backgroundColor: colors.scales.neutral[5] }}\n\\`\\`\\`\n\n## Spacing (Use scale keys)\n\\`\\`\\`tsx\n// In component-defaults.ts, use semantic keys:\npadding: { top: \"sm\", right: \"md\", bottom: \"sm\", left: \"md\" }\n\n// These resolve to CSS variables automatically\n\\`\\`\\`\n\n## Typography (Use TypeSets - Tier 2)\n\\`\\`\\`tsx\nimport { typography } from \"@atomix/tokens/primitives\";\n\n// ✅ Use composed typeSets\nstyle={{ ...typography.typeSets[\"title-lg\"] }}\n\n// ❌ Don't use raw fontSize primitives\nstyle={{ fontSize: typography.fontSize[\"2xl\"] }}\n\\`\\`\\`\n\n## Rules\n- NO hardcoded hex colors\n- NO hardcoded pixel values \n- Use **semantic** tokens (Tier 2), not primitives (Tier 1)\n- Use CSS variables for colors (auto dark mode)\n- Primitives are for reference/validation only\n`;\n}\n\n// ============================================\n// MULTI-TOOL RULES GENERATION\n// ============================================\n\nexport interface GeneratedRulesFile {\n tool: AIToolConfig;\n filename: string;\n path: string;\n content: string;\n}\n\n/**\n * Generate rules for a specific AI tool\n */\nexport function generateRulesForTool(\n toolId: AIToolId,\n projectName: string,\n strict: boolean\n): GeneratedRulesFile {\n const tool = AI_TOOLS[toolId];\n \n if (!tool) {\n throw new Error(`Unknown AI tool: ${toolId}. Available: ${Object.keys(AI_TOOLS).join(\", \")}`);\n }\n \n // Add tool-specific header\n const header = `<!-- Generated for ${tool.name} by Atomix MCP Server -->\n<!-- Tool: ${tool.description} -->\n<!-- Rules file: ${tool.rulesPath} -->\n<!-- Generated: ${new Date().toISOString()} -->\n\n`;\n\n const content = header + generateCursorRules(projectName, strict);\n \n return {\n tool,\n filename: tool.rulesFilename,\n path: tool.rulesPath,\n content,\n };\n}\n\n/**\n * Generate rules for ALL supported AI tools at once\n */\nexport function generateRulesForAllTools(\n projectName: string,\n strict: boolean\n): GeneratedRulesFile[] {\n return Object.keys(AI_TOOLS)\n .filter(id => AI_TOOLS[id as AIToolId].rulesPath !== \"\") // Skip tools without rules files\n .map((toolId) => \n generateRulesForTool(toolId as AIToolId, projectName, strict)\n );\n}\n\n/**\n * Get list of all supported AI tools\n */\nexport function getSupportedAITools(): AIToolConfig[] {\n return Object.values(AI_TOOLS);\n}\n\n/**\n * Generate a summary of which files to create for full AI tool support\n */\nexport function generateToolSetupGuide(projectName: string): string {\n const tools = getSupportedAITools();\n const mcpTools = tools.filter(t => t.supportsMCP);\n const rulesTools = tools.filter(t => t.rulesPath);\n \n return `# AI Tool Setup Guide for ${projectName}\n\nThis project uses the **Atomix Design System** with MCP (Model Context Protocol).\n\n## Quick Start\n\nChoose your AI tool and follow the setup:\n\n| Tool | MCP Support | Rules File | Setup Command |\n|------|-------------|------------|---------------|\n${tools.map(t => `| ${t.name} | ${t.supportsMCP ? \"Yes\" : \"No\"} | ${t.rulesPath || \"N/A\"} | \\`getSetupInstructions(\"${t.id}\")\\` |`).join(\"\\n\")}\n\n## MCP-Enabled Tools (Recommended)\n\nThese tools can query Atomix tokens directly:\n\n${mcpTools.map(t => `- **${t.name}** — ${t.description}`).join(\"\\n\")}\n\n### Generate MCP Config\n\n\\`\\`\\`\nexportMCPConfig({ tool: \"cursor\" }) // For Cursor\nexportMCPConfig({ tool: \"claude-desktop\" }) // For Claude Desktop\nexportMCPConfig({ tool: \"all\" }) // All configs at once\n\\`\\`\\`\n\n## Rules-Based Tools\n\nThese tools use instruction files:\n\n${rulesTools.filter(t => !t.supportsMCP).map(t => `- **${t.name}** — \\`${t.rulesPath}\\``).join(\"\\n\")}\n\n### Generate Rules Files\n\n\\`\\`\\`\ngetAIToolRules({ tool: \"copilot\" }) // For GitHub Copilot\ngetAIToolRules({ tool: \"all\" }) // All rules at once\n\\`\\`\\`\n\n## Available MCP Tools\n\nOnce connected, AI tools can use:\n\n| Tool | Description |\n|------|-------------|\n| \\`getToken\\` | Get a specific token by path |\n| \\`listTokens\\` | List tokens in a category |\n| \\`getComponentTokens\\` | Get tokens for a component |\n| \\`validateUsage\\` | Check if a value follows the design system |\n| \\`searchTokens\\` | Search tokens by name or value |\n| \\`exportMCPConfig\\` | Generate MCP configuration files |\n| \\`getSetupInstructions\\` | Get detailed setup instructions |\n\n## Token Tier System\n\n| Tier | Mutable | Use For |\n|------|---------|---------|\n| Primitive | No | Reference only (validation, a11y) |\n| Semantic | Yes (Designer) | Primary API for styling |\n| Component | Yes (Designer) | Component-specific tokens |\n\n**Rule**: Always use semantic tokens in code. Never use primitive paths directly.\n`;\n}\n\n// Backward compatibility aliases\nexport const generateMinimalCursorRules = generateMinimalRules;\n\n"],"mappings":"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","names":["primitives","primitives"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atomixstudio/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "MCP server for Atomix design tokens - enables AI tools to consume design system tokens",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"bin": {
|
|
21
|
-
"
|
|
21
|
+
"atomixstudio-mcp": "dist/index.js"
|
|
22
22
|
},
|
|
23
23
|
"scripts": {
|
|
24
24
|
"sync": "node scripts/sync-component-tokens.cjs",
|
package/src/component-tokens.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* Maps each component to its design tokens.
|
|
8
8
|
* This allows AI tools to understand which tokens apply to which components.
|
|
9
9
|
*
|
|
10
|
-
* Last synced: 2026-01-04T21:
|
|
10
|
+
* Last synced: 2026-01-04T21:49:24.444Z
|
|
11
11
|
* Tenant: default
|
|
12
12
|
*/
|
|
13
13
|
|
|
@@ -697,6 +697,6 @@ export const COMPONENT_TOKENS: Record<string, ComponentTokenConfig> = {
|
|
|
697
697
|
export const TOKEN_STORE: MCPTokenStore = {
|
|
698
698
|
version: "1.0.0",
|
|
699
699
|
tenantId: "default",
|
|
700
|
-
generatedAt: "2026-01-04T21:
|
|
700
|
+
generatedAt: "2026-01-04T21:49:24.444Z",
|
|
701
701
|
components: COMPONENT_TOKENS,
|
|
702
702
|
};
|