@atomixstudio/mcp 1.0.7 → 1.0.8

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"],"sourcesContent":["/**\n * Atomix MCP Server - User Design System Mode\n * \n * A minimal MCP server that serves design tokens from a user's\n * Atomix Design System via the public API.\n * \n * Usage:\n * npx @atomixstudio/mcp --ds-id <id> --api-key <key>\n * \n * Tools:\n * - getToken: Get a specific token by path\n * - listTokens: List tokens in a category\n * - searchTokens: Search for tokens by name or value\n * - validateUsage: Check if a value follows the design system\n * - getAIToolRules: Generate AI coding rules for this design system\n * - exportMCPConfig: Generate MCP configuration files\n * - getSetupInstructions: Get setup guide for AI tools\n * \n * @see https://atomixstudio.eu\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 ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\n// ============================================\n// TYPES\n// ============================================\n\ninterface ExportedTokens {\n tokens: {\n colors: {\n static: { brand: Record<string, string> };\n modes: { light: Record<string, string>; dark: Record<string, string> };\n };\n typography: Record<string, unknown>;\n spacing: { scale: Record<string, string> };\n sizing: { height: Record<string, string>; icon: Record<string, string> };\n shadows: { elevation: Record<string, string> };\n radius: { scale: Record<string, string> };\n borders: { width: Record<string, string> };\n motion: { duration: Record<string, string>; easing: Record<string, string> };\n zIndex: Record<string, number>;\n };\n cssVariables: Record<string, string>;\n governance: {\n rules: string[];\n categories: Record<string, string[]>;\n };\n meta: {\n name: string;\n version: number;\n exportedAt: string;\n };\n}\n\ninterface DesignSystemData {\n tokens: ExportedTokens[\"tokens\"];\n cssVariables: Record<string, string>;\n governance: ExportedTokens[\"governance\"];\n meta: ExportedTokens[\"meta\"];\n}\n\n// ============================================\n// CLI ARGUMENTS\n// ============================================\n\ninterface CLIArgs {\n command: \"server\" | \"sync\" | \"init\" | \"help\";\n dsId: string | null;\n apiKey: string | null;\n apiBase: string | null;\n output: string | null;\n format: OutputFormat | null;\n exclude: string[];\n yes: boolean; // Auto-confirm\n rules: boolean; // Also sync rules files\n rulesDir: string | null; // Directory for rules files (default: project root)\n}\n\nfunction parseArgs(): CLIArgs {\n const args = process.argv.slice(2);\n let command: CLIArgs[\"command\"] = \"server\";\n let dsId: string | null = null;\n let apiKey: string | null = null;\n let apiBase: string | null = null;\n let output: string | null = null;\n let format: CLIArgs[\"format\"] = null;\n let exclude: string[] = [];\n let yes = false;\n let rules: boolean | null = null; // null = use default (true for sync)\n let rulesDir: string | null = null;\n\n // Check for subcommand first\n if (args[0] && !args[0].startsWith(\"-\")) {\n const cmd = args[0].toLowerCase();\n if (cmd === \"sync\") command = \"sync\";\n else if (cmd === \"init\") command = \"init\";\n else if (cmd === \"help\" || cmd === \"--help\" || cmd === \"-h\") command = \"help\";\n }\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--ds-id\" && args[i + 1]) {\n dsId = args[i + 1];\n i++;\n } else if (args[i] === \"--api-key\" && args[i + 1]) {\n apiKey = args[i + 1];\n i++;\n } else if (args[i] === \"--api-base\" && args[i + 1]) {\n apiBase = args[i + 1];\n i++;\n } else if ((args[i] === \"--output\" || args[i] === \"-o\") && args[i + 1]) {\n output = args[i + 1];\n i++;\n } else if (args[i] === \"--format\" && args[i + 1]) {\n const f = args[i + 1].toLowerCase() as OutputFormat;\n const validFormats: OutputFormat[] = [\"css\", \"scss\", \"less\", \"json\", \"ts\", \"js\", \"swift\", \"kotlin\", \"dart\"];\n if (validFormats.includes(f)) format = f;\n i++;\n } else if (args[i] === \"--exclude\" && args[i + 1]) {\n exclude.push(args[i + 1]);\n i++;\n } else if (args[i] === \"-y\" || args[i] === \"--yes\") {\n yes = true;\n } else if (args[i] === \"--rules\" || args[i] === \"-r\") {\n rules = true;\n } else if (args[i] === \"--no-rules\") {\n rules = false;\n } else if (args[i] === \"--rules-dir\" && args[i + 1]) {\n rulesDir = args[i + 1];\n rules = true; // Implies --rules\n i++;\n }\n }\n\n // Default: rules sync is ON for sync command (since guides reference tokens)\n const effectiveRules = rules !== null ? rules : (command === \"sync\");\n\n return { command, dsId, apiKey, apiBase, output, format, exclude, yes, rules: effectiveRules, rulesDir };\n}\n\nconst cliArgs = parseArgs();\nconst { dsId, apiKey } = cliArgs;\n// For MCP server mode, use CLI apiBase or default\nconst apiBase = cliArgs.apiBase || \"https://atomixstudio.eu\";\n\n// ============================================\n// TOKEN FETCHING\n// ============================================\n\nlet cachedData: DesignSystemData | null = null;\n\nasync function fetchDesignSystem(): Promise<DesignSystemData> {\n if (cachedData) return cachedData;\n\n if (!dsId) {\n throw new Error(\"Missing --ds-id argument. Usage: npx @atomixstudio/mcp --ds-id <id> --api-key <key>\");\n }\n\n const url = `${apiBase}/api/ds/${dsId}/tokens?format=export`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n \n if (apiKey) {\n headers[\"x-api-key\"] = apiKey;\n }\n\n const response = await fetch(url, { headers });\n \n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to fetch design system: ${response.status} ${text}`);\n }\n\n const data = await response.json() as DesignSystemData;\n cachedData = data;\n return data;\n}\n\n// ============================================\n// TOKEN UTILITIES\n// ============================================\n\nconst TOKEN_CATEGORIES = [\"colors\", \"typography\", \"spacing\", \"sizing\", \"shadows\", \"radius\", \"borders\", \"motion\", \"zIndex\"] as const;\ntype TokenCategory = typeof TOKEN_CATEGORIES[number];\n\nfunction getTokenByPath(tokens: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = tokens;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\nfunction flattenTokens(obj: unknown, prefix = \"\"): Array<{ path: string; value: unknown }> {\n const results: Array<{ path: string; value: unknown }> = [];\n\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n for (const [key, value] of Object.entries(obj)) {\n const newPath = prefix ? `${prefix}.${key}` : key;\n \n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n results.push(...flattenTokens(value, newPath));\n } else {\n results.push({ path: newPath, value });\n }\n }\n }\n\n return results;\n}\n\nfunction searchTokens(tokens: Record<string, unknown>, query: string): Array<{ path: string; value: unknown }> {\n const flat = flattenTokens(tokens);\n const lowerQuery = query.toLowerCase();\n \n return flat.filter(({ path, value }) => {\n const pathMatch = path.toLowerCase().includes(lowerQuery);\n const valueMatch = String(value).toLowerCase().includes(lowerQuery);\n return pathMatch || valueMatch;\n });\n}\n\n// ============================================\n// TOKEN COUNTING\n// ============================================\n\nfunction countTokens(tokens: Record<string, unknown>, prefix = \"\"): number {\n let count = 0;\n for (const [key, value] of Object.entries(tokens)) {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n count += countTokens(value as Record<string, unknown>, `${prefix}${key}.`);\n } else if (value !== undefined && value !== null) {\n count++;\n }\n }\n return count;\n}\n\nfunction getTokenStats(data: DesignSystemData): {\n total: number;\n byCategory: Record<string, number>;\n cssVariables: number;\n governanceRules: number;\n} {\n const byCategory: Record<string, number> = {};\n let total = 0;\n\n for (const [category, value] of Object.entries(data.tokens)) {\n if (value && typeof value === \"object\") {\n const count = countTokens(value as Record<string, unknown>);\n byCategory[category] = count;\n total += count;\n }\n }\n\n return {\n total,\n byCategory,\n cssVariables: Object.keys(data.cssVariables).length,\n governanceRules: data.governance.rules.length,\n };\n}\n\n// ============================================\n// MCP SERVER SETUP\n// ============================================\n\nconst server = new Server(\n {\n name: \"atomix-mcp-user\",\n version: \"1.0.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\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 the value and CSS variable name.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Token path in dot notation (e.g., 'colors.brand.primary', 'spacing.scale.md')\",\n },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"listTokens\",\n description: \"List all tokens in a category (colors, typography, spacing, sizing, shadows, radius, borders, motion, zIndex).\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n enum: TOKEN_CATEGORIES,\n description: \"Token category to list\",\n },\n subcategory: {\n type: \"string\",\n description: \"Optional subcategory (e.g., 'brand' for colors, 'scale' for spacing)\",\n },\n },\n required: [\"category\"],\n },\n },\n {\n name: \"searchTokens\",\n description: \"Search for tokens by name or value.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (matches token paths or values)\",\n },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"validateUsage\",\n description: \"Check if a CSS value follows the design system. Detects hardcoded 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 to help find the right token\",\n },\n },\n required: [\"value\"],\n },\n },\n {\n name: \"getAIToolRules\",\n description: \"Generate design system rules for AI coding tools (Cursor, Copilot, Windsurf, etc.).\",\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 get rules for all tools.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"exportMCPConfig\",\n description: \"Generate MCP configuration file for AI tools.\",\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.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"getSetupInstructions\",\n description: \"Get detailed setup instructions for a specific AI tool.\",\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: \"syncTokens\",\n description: \"Sync design tokens to a local file. Creates or updates a tokens file with the latest values from your design system. Returns a diff of changes.\",\n inputSchema: {\n type: \"object\",\n properties: {\n output: {\n type: \"string\",\n description: \"Output file path relative to project root (e.g., './src/tokens.css', './DesignTokens.swift')\",\n },\n format: {\n type: \"string\",\n enum: [\"css\", \"scss\", \"less\", \"json\", \"ts\", \"js\", \"swift\", \"kotlin\", \"dart\"],\n description: \"Output format. WEB: css, scss, less, json, ts, js. NATIVE: swift (iOS), kotlin (Android), dart (Flutter). Default: css\",\n },\n },\n required: [\"output\"],\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 try {\n const data = await fetchDesignSystem();\n\n switch (name) {\n case \"getToken\": {\n const path = args?.path as string;\n const value = getTokenByPath(data.tokens, path);\n \n if (value === undefined) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Token not found: ${path}`,\n suggestion: \"Use listTokens or searchTokens to find available tokens.\",\n availableCategories: TOKEN_CATEGORIES,\n }, null, 2),\n }],\n };\n }\n\n // Find CSS variable for this path\n const cssVarKey = `--atmx-${path.replace(/\\./g, \"-\")}`;\n const cssVar = data.cssVariables[cssVarKey];\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n path,\n value,\n cssVariable: cssVar || `var(${cssVarKey})`,\n usage: `style={{ property: \"var(${cssVarKey})\" }}`,\n }, null, 2),\n }],\n };\n }\n\n case \"listTokens\": {\n const category = args?.category as TokenCategory;\n const subcategory = args?.subcategory as string | undefined;\n \n let tokensToList: unknown = data.tokens[category];\n \n if (subcategory && tokensToList && typeof tokensToList === \"object\") {\n tokensToList = getTokenByPath(tokensToList as Record<string, unknown>, subcategory);\n }\n\n if (!tokensToList) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Category not found: ${category}${subcategory ? `.${subcategory}` : \"\"}`,\n availableCategories: TOKEN_CATEGORIES,\n }, null, 2),\n }],\n };\n }\n\n const flat = flattenTokens(tokensToList);\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n category,\n subcategory,\n count: flat.length,\n tokens: flat.slice(0, 50), // Limit to 50 for readability\n truncated: flat.length > 50,\n }, null, 2),\n }],\n };\n }\n\n case \"searchTokens\": {\n const query = args?.query as string;\n const results = searchTokens(data.tokens, query);\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n query,\n count: results.length,\n results: results.slice(0, 30),\n truncated: results.length > 30,\n }, null, 2),\n }],\n };\n }\n\n case \"validateUsage\": {\n const value = args?.value as string;\n const context = (args?.context as string) || \"any\";\n \n // Check if value is a hardcoded color\n const isHexColor = /^#[0-9A-Fa-f]{3,8}$/.test(value);\n const isRgbColor = /^rgb\\(|^rgba\\(|^hsl\\(/.test(value);\n const isPixelValue = /^\\d+px$/.test(value);\n \n if (!isHexColor && !isRgbColor && !isPixelValue) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: true,\n message: \"Value appears to be using tokens or is not a design token value.\",\n }, null, 2),\n }],\n };\n }\n\n // Search for matching tokens\n const matches = searchTokens(data.tokens, value);\n \n if (matches.length > 0) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: false,\n message: \"Hardcoded value detected. Use a token instead.\",\n matchingTokens: matches.slice(0, 5),\n suggestion: `Use var(--atmx-${matches[0].path.replace(/\\./g, \"-\")}) instead of ${value}`,\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: false,\n message: \"Hardcoded value detected. No exact token match found.\",\n suggestion: `Consider adding this value to the design system or use the closest token.`,\n context,\n }, null, 2),\n }],\n };\n }\n\n case \"getAIToolRules\": {\n const tool = args?.tool as string;\n \n // Fetch rules from the API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool === \"all\" ? \"all\" : tool}`;\n console.error(`[getAIToolRules] Fetching: ${rulesUrl}`);\n \n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n \n try {\n const response = await fetch(rulesUrl, { headers });\n console.error(`[getAIToolRules] Response status: ${response.status}`);\n \n if (!response.ok) {\n const errorText = await response.text();\n console.error(`[getAIToolRules] Error response: ${errorText}`);\n throw new Error(`Failed to fetch rules: ${response.status} - ${errorText}`);\n }\n\n const rules = await response.json() as { rules?: string[]; categories?: Record<string, string[]> };\n console.error(`[getAIToolRules] Got ${rules.rules?.length || 0} rules`);\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(rules, null, 2),\n }],\n };\n } catch (fetchError) {\n console.error(`[getAIToolRules] Fetch error:`, fetchError);\n throw fetchError;\n }\n }\n\n case \"exportMCPConfig\": {\n const tool = args?.tool as string;\n \n // Generate MCP config locally\n const serverName = data.meta.name.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n const npxArgs = [\"@atomixstudio/mcp@latest\"];\n if (dsId) npxArgs.push(\"--ds-id\", dsId);\n if (apiKey) npxArgs.push(\"--api-key\", apiKey);\n\n const config = {\n mcpServers: {\n [serverName]: {\n command: \"npx\",\n args: npxArgs,\n },\n },\n };\n\n const configs: Record<string, { path: string; content: string }> = {\n cursor: { path: \".cursor/mcp.json\", content: JSON.stringify(config, null, 2) },\n \"claude-desktop\": { path: \"claude_desktop_config.json\", content: JSON.stringify(config, null, 2) },\n windsurf: { path: \".windsurf/mcp.json\", content: JSON.stringify(config, null, 2) },\n continue: { path: \".continue/config.json\", content: JSON.stringify({ models: [], mcpServers: [{ name: serverName, command: \"npx\", args: npxArgs }] }, null, 2) },\n vscode: { path: \".vscode/settings.json\", content: JSON.stringify({ \"mcp.servers\": config.mcpServers }, null, 2) },\n };\n\n if (tool === \"all\") {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n message: \"MCP configurations for all tools\",\n configs: Object.entries(configs).map(([t, c]) => ({\n tool: t,\n path: c.path,\n content: JSON.parse(c.content),\n })),\n }, null, 2),\n }],\n };\n }\n\n const selectedConfig = configs[tool as keyof typeof configs];\n if (!selectedConfig) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${tool}`,\n availableTools: Object.keys(configs),\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n tool,\n path: selectedConfig.path,\n content: JSON.parse(selectedConfig.content),\n instructions: `Create the file at ${selectedConfig.path} with the content above, then restart your IDE.`,\n }, null, 2),\n }],\n };\n }\n\n case \"getSetupInstructions\": {\n const tool = args?.tool as string;\n \n const instructions: Record<string, string> = {\n cursor: `# Cursor MCP Setup\n\n1. Create \\`.cursor/mcp.json\\` in your project root\n2. Add the MCP configuration (use exportMCPConfig to get it)\n3. Restart Cursor IDE\n4. Verify by asking: \"What design tokens are available?\"`,\n\n copilot: `# GitHub Copilot Setup\n\n1. Create \\`.github/copilot-instructions.md\\` in your project\n2. Use getAIToolRules({ tool: \"copilot\" }) to get the content\n3. Enable custom instructions in VS Code settings:\n \"github.copilot.chat.codeGeneration.useInstructionFiles\": true`,\n\n windsurf: `# Windsurf Setup\n\n1. Create \\`.windsurf/mcp.json\\` in your project root\n2. Create \\`.windsurfrules\\` with rules from getAIToolRules\n3. Restart Windsurf Editor`,\n\n cline: `# Cline Setup\n\n1. Create \\`.clinerules\\` in your project root\n2. Cline auto-detects MCP from .cursor/mcp.json`,\n\n continue: `# Continue Setup\n\n1. Create/edit \\`.continue/config.json\\`\n2. Add mcpServers configuration\n3. Restart VS Code`,\n\n zed: `# Zed Setup\n\n1. Create \\`.zed/assistant/rules.md\\` in your project\n2. Use getAIToolRules({ tool: \"zed\" }) for content`,\n\n \"claude-desktop\": `# Claude Desktop Setup\n\n1. Find your Claude config:\n - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json\n - Windows: %APPDATA%\\\\Claude\\\\claude_desktop_config.json\n2. Add MCP server configuration\n3. Restart Claude Desktop`,\n\n generic: `# Generic AI Tool Setup\n\n1. Create AI_GUIDELINES.md in your project root\n2. Use getAIToolRules({ tool: \"generic\" }) for content\n3. Reference in your prompts or context`,\n };\n\n const instruction = instructions[tool];\n if (!instruction) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${tool}`,\n availableTools: Object.keys(instructions),\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: instruction,\n }],\n };\n }\n\n case \"syncTokens\": {\n const output = args?.output as string;\n const format = (args?.format as OutputFormat) || \"css\";\n \n if (!output) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ error: \"Missing required parameter: output\" }, null, 2),\n }],\n };\n }\n\n // Generate content based on format\n // Get dark mode colors for CSS output\n const darkModeColors = (data.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n \n let newContent: string;\n switch (format) {\n case \"css\":\n newContent = generateCSSOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"scss\":\n newContent = generateSCSSOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"less\":\n newContent = generateLessOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"json\":\n newContent = generateJSONOutput(data.tokens);\n break;\n case \"js\":\n newContent = generateJSOutput(data.tokens);\n break;\n case \"ts\":\n newContent = generateTSOutput(data.tokens);\n break;\n case \"swift\":\n newContent = generateSwiftOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"kotlin\":\n newContent = generateKotlinOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"dart\":\n newContent = generateDartOutput(data.cssVariables, darkModeColors?.dark);\n break;\n default:\n newContent = generateCSSOutput(data.cssVariables, darkModeColors?.dark);\n }\n\n // Check if file exists and diff\n const outputPath = path.resolve(process.cwd(), output);\n const fileExists = fs.existsSync(outputPath);\n const tokenCount = Object.keys(data.cssVariables).length;\n\n let diffSummary = \"\";\n let changes: Array<{ key: string; old: string; new: string }> = [];\n\n if (fileExists && [\"css\", \"scss\", \"less\"].includes(format)) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n const diff = diffTokens(oldContent, data.cssVariables, format as OutputFormat, darkModeColors?.dark);\n \n // Count light mode changes\n const lightChanges = diff.added.length + diff.modified.length + diff.removed.length;\n // Count dark mode changes\n const darkChanges = diff.addedDark.length + diff.modifiedDark.length + diff.removedDark.length;\n const totalChanges = lightChanges + darkChanges;\n \n if (totalChanges === 0) {\n return {\n content: [{\n type: \"text\",\n text: `✓ Already up to date!\\n\\nFile: ${output}\\nTokens: ${tokenCount}\\nVersion: ${data.meta.version}`,\n }],\n };\n }\n\n changes = [...diff.modified, ...diff.modifiedDark];\n \n // Build summary\n const lightSummary = lightChanges > 0 ? `Light: ${diff.modified.length} modified, ${diff.added.length} added, ${diff.removed.length} removed` : \"\";\n const darkSummary = darkChanges > 0 ? `Dark: ${diff.modifiedDark.length} modified, ${diff.addedDark.length} added, ${diff.removedDark.length} removed` : \"\";\n diffSummary = [lightSummary, darkSummary].filter(Boolean).join(\" | \");\n }\n\n // Write the file\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n fs.writeFileSync(outputPath, newContent);\n\n // Build response\n let response = `✓ Synced ${tokenCount} tokens to ${output}\\n`;\n response += `Format: ${format}\\n`;\n response += `Design System: ${data.meta.name} (v${data.meta.version})\\n`;\n \n if (diffSummary) {\n response += `\\n${diffSummary}\\n`;\n if (changes.length > 0 && changes.length <= 10) {\n response += \"\\nModified tokens:\\n\";\n for (const { key, old: oldVal, new: newVal } of changes) {\n response += ` ${key}: ${oldVal} → ${newVal}\\n`;\n }\n }\n } else if (!fileExists) {\n response += \"\\n(New file created)\";\n }\n\n return {\n content: [{\n type: \"text\",\n text: response,\n }],\n };\n }\n\n default:\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${name}`,\n availableTools: [\"getToken\", \"listTokens\", \"searchTokens\", \"validateUsage\", \"getAIToolRules\", \"exportMCPConfig\", \"getSetupInstructions\", \"syncTokens\"],\n }, null, 2),\n }],\n };\n }\n } catch (error) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: error instanceof Error ? error.message : \"Unknown error\",\n suggestion: \"Make sure --ds-id and --api-key are correct.\",\n }, null, 2),\n }],\n isError: true,\n };\n }\n});\n\n// ============================================\n// RESOURCE HANDLERS\n// ============================================\n\nconst AI_TOOLS = [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"generic\"] as const;\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n const data = await fetchDesignSystem();\n const stats = getTokenStats(data);\n \n const resources = [\n {\n uri: \"atomix://welcome\",\n name: `Welcome to ${data.meta.name}`,\n description: `Design system overview with ${stats.total} tokens and ${stats.governanceRules} governance rules`,\n mimeType: \"text/markdown\",\n },\n ...AI_TOOLS.map(tool => ({\n uri: `atomix://rules/${tool}`,\n name: `${tool.charAt(0).toUpperCase() + tool.slice(1)} Rules`,\n description: `Design system rules file for ${tool}`,\n mimeType: \"text/markdown\",\n })),\n ];\n\n return { resources };\n});\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n const data = await fetchDesignSystem();\n const stats = getTokenStats(data);\n\n // Welcome resource\n if (uri === \"atomix://welcome\") {\n const welcome = generateWelcomeMessage(data, stats);\n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: welcome,\n }],\n };\n }\n\n // Rules resources\n const rulesMatch = uri.match(/^atomix:\\/\\/rules\\/(.+)$/);\n if (rulesMatch) {\n const tool = rulesMatch[1];\n if (!AI_TOOLS.includes(tool as typeof AI_TOOLS[number])) {\n throw new Error(`Unknown tool: ${tool}. Available: ${AI_TOOLS.join(\", \")}`);\n }\n\n // Fetch rules from API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n\n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n throw new Error(`Failed to fetch rules: ${response.status}`);\n }\n\n const rulesData = await response.json() as { content?: string; tool?: string };\n \n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: rulesData.content || JSON.stringify(rulesData, null, 2),\n }],\n };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n});\n\n// ============================================\n// PROMPTS - Auto-suggest welcome on connection\n// ============================================\n\nserver.setRequestHandler(ListPromptsRequestSchema, async () => {\n return {\n prompts: [\n {\n name: \"welcome\",\n description: \"Get started with this design system - shows overview, available tokens, and tools. Run this first!\",\n },\n {\n name: \"design-system-rules\",\n description: \"Get the design system governance rules for your AI coding tool\",\n arguments: [\n {\n name: \"tool\",\n description: \"AI tool to generate rules for (cursor, copilot, windsurf, cline, continue, zed, generic)\",\n required: false,\n },\n ],\n },\n ],\n };\n});\n\nserver.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const data = await fetchDesignSystem();\n const stats = getTokenStats(data);\n\n switch (name) {\n case \"welcome\": {\n const welcome = generateWelcomeMessage(data, stats);\n return {\n description: `Welcome to ${data.meta.name} Design System`,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: \"Show me the design system overview and available tools.\",\n },\n },\n {\n role: \"assistant\" as const,\n content: {\n type: \"text\" as const,\n text: welcome,\n },\n },\n ],\n };\n }\n\n case \"design-system-rules\": {\n const tool = (args?.tool as string) || \"cursor\";\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n\n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n throw new Error(`Failed to fetch rules: ${response.status}`);\n }\n\n const rulesData = await response.json() as { content?: string };\n \n return {\n description: `Design system rules for ${tool}`,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Show me the design system rules for ${tool}.`,\n },\n },\n {\n role: \"assistant\" as const,\n content: {\n type: \"text\" as const,\n text: rulesData.content || JSON.stringify(rulesData, null, 2),\n },\n },\n ],\n };\n }\n\n default:\n throw new Error(`Unknown prompt: ${name}`);\n }\n});\n\nfunction generateWelcomeMessage(data: DesignSystemData, stats: ReturnType<typeof getTokenStats>): string {\n const toolsList = [\n \"getToken - Get a specific token by path\",\n \"listTokens - List all tokens in a category\",\n \"searchTokens - Search tokens by name or value\",\n \"validateUsage - Check if a CSS value follows the design system\",\n \"getAIToolRules - Generate AI coding rules for any tool\",\n \"exportMCPConfig - Generate MCP config for AI tools\",\n \"getSetupInstructions - Get setup guide for specific tools\",\n \"syncTokens - Sync tokens to a local file (css, scss, swift, kotlin, dart, etc.)\",\n ];\n\n const categoryBreakdown = Object.entries(stats.byCategory)\n .map(([cat, count]) => ` - ${cat}: ${count} tokens`)\n .join(\"\\n\");\n\n const asciiArt = `\n\\`\\`\\`\n ↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘ \n\\`\\`\\`\n`;\n\n return `${asciiArt}\n# Welcome to ${data.meta.name}\n\nYour design system is connected and ready to use.\n\n## Design System Overview\n\n| Metric | Value |\n|--------|-------|\n| Name | ${data.meta.name} |\n| DS ID | ${dsId} |\n| Total Tokens | ${stats.total} |\n| CSS Variables | ${stats.cssVariables} |\n| Governance Rules | ${stats.governanceRules} |\n| Version | ${data.meta.version || 1} |\n\n### Token Breakdown\n\n${categoryBreakdown}\n\n## Available Tools\n\n${toolsList.map((t, i) => `${i + 1}. **${t.split(\" - \")[0]}** - ${t.split(\" - \")[1]}`).join(\"\\n\")}\n\n## Quick Start\n\n### Get a Token\n\\`\\`\\`\nUse getToken with path \"colors.static.brand.primary\"\n\\`\\`\\`\n\n### List All Spacing Tokens\n\\`\\`\\`\nUse listTokens with category \"spacing\"\n\\`\\`\\`\n\n### Validate a Hardcoded Value\n\\`\\`\\`\nUse validateUsage with value \"#ff0000\" and context \"color\"\n\\`\\`\\`\n\n## Resources Available\n\nThis MCP server exposes rules files as resources that your AI tool can read:\n\n| Resource | Description |\n|----------|-------------|\n| \\`atomix://welcome\\` | This welcome message |\n| \\`atomix://rules/cursor\\` | .cursorrules file content |\n| \\`atomix://rules/copilot\\` | GitHub Copilot instructions |\n| \\`atomix://rules/windsurf\\` | .windsurfrules file content |\n| \\`atomix://rules/cline\\` | .clinerules file content |\n| \\`atomix://rules/continue\\` | Continue rules |\n| \\`atomix://rules/zed\\` | Zed assistant rules |\n| \\`atomix://rules/generic\\` | Generic AI guidelines |\n\n## Checking for Updates\n\nYour design system may be updated over time. To ensure you have the latest tokens:\n\n1. **Check version**: The current version is ${data.meta.version || 1}\n2. **Refresh tokens**: Restart the MCP server to fetch latest tokens\n3. **View changes**: Visit https://atomixstudio.eu/ds/${dsId} to see recent changes\n\n---\n\n*Powered by Atomix Studio - https://atomixstudio.eu*\n`;\n}\n\n// ============================================\n// SYNC COMMAND\n// ============================================\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as readline from \"readline\";\n\ntype OutputFormat = \n | \"css\" | \"scss\" | \"less\" // Web CSS-based\n | \"json\" | \"ts\" | \"js\" // Web JS-based\n | \"swift\" | \"kotlin\" | \"dart\"; // Native mobile\n\ninterface AtomixConfig {\n dsId: string;\n apiKey?: string;\n apiBase?: string;\n output: string;\n format: OutputFormat;\n // For future codebase scanning\n include?: string[]; // Glob patterns to include\n exclude?: string[]; // Glob patterns to exclude\n}\n\n// Default file patterns for codebase scanning\nconst DEFAULT_INCLUDE = [\n \"**/*.tsx\", // React TypeScript components\n \"**/*.jsx\", // React JavaScript components\n \"**/*.ts\", // TypeScript files\n \"**/*.js\", // JavaScript files\n \"**/*.css\", // CSS stylesheets\n \"**/*.scss\", // SASS files\n \"**/*.less\", // Less files\n \"**/*.vue\", // Vue components\n \"**/*.svelte\", // Svelte components\n \"**/*.astro\", // Astro components\n];\n\nconst DEFAULT_EXCLUDE = [\n \"node_modules/**\",\n \"dist/**\",\n \"build/**\",\n \".next/**\",\n \".nuxt/**\",\n \".git/**\",\n \"coverage/**\",\n \"**/*.min.js\",\n \"**/*.min.css\",\n \"**/*.d.ts\", // Type definitions\n \"**/*.test.*\", // Test files\n \"**/*.spec.*\", // Spec files\n];\n\nfunction findConfig(): AtomixConfig | null {\n const configNames = [\".atomixrc\", \".atomixrc.json\", \"atomix.config.json\"];\n const cwd = process.cwd();\n \n for (const name of configNames) {\n const configPath = path.join(cwd, name);\n if (fs.existsSync(configPath)) {\n try {\n const content = fs.readFileSync(configPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n console.error(`Error parsing ${name}`);\n }\n }\n }\n return null;\n}\n\nfunction generateCSSOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>\n): string {\n const lines = [\n \"/* Atomix Design System Tokens\",\n \" * Auto-generated - do not edit manually\",\n ` * Synced: ${new Date().toISOString()}`,\n \" */\",\n \"\",\n \"/* Light mode (default) */\",\n \":root {\"\n ];\n \n for (const [key, value] of Object.entries(cssVariables)) {\n lines.push(` ${key}: ${value};`);\n }\n \n lines.push(\"}\");\n \n // Add dark mode overrides if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"/* Dark mode */\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n // Detect prefix from cssVariables keys\n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n // Dark mode colors are stored with keys like \"bg-page\", \"text-primary\"\n // Convert to CSS variable names: --atmx-color-bg-page\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n\nfunction generateJSONOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return JSON.stringify(tokens, null, 2);\n}\n\nfunction generateTSOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return `// Atomix Design System Tokens\n// Auto-generated - do not edit manually\n// Synced: ${new Date().toISOString()}\n\nexport const tokens = ${JSON.stringify(tokens, null, 2)} as const;\n\nexport type Tokens = typeof tokens;\n`;\n}\n\nfunction generateJSOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return `// Atomix Design System Tokens\n// Auto-generated - do not edit manually\n// Synced: ${new Date().toISOString()}\n\nexport const tokens = ${JSON.stringify(tokens, null, 2)};\n`;\n}\n\nfunction generateSCSSOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"// CSS Custom Properties (for use in CSS/HTML)\",\n \"// Light mode (default)\",\n \":root {\"\n ];\n \n for (const [key, value] of Object.entries(cssVariables)) {\n lines.push(` ${key}: ${value};`);\n }\n \n lines.push(\"}\");\n \n // Add dark mode CSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Dark mode\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n lines.push(\"// SCSS Variables (light mode values)\");\n \n for (const [key, value] of Object.entries(cssVariables)) {\n const scssVar = \"$\" + key.replace(/^--/, \"\");\n lines.push(`${scssVar}: ${value};`);\n }\n \n // Add dark mode SCSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// SCSS Variables (dark mode values)\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^--([a-z]+)-/);\n const prefix = prefixMatch ? prefixMatch[1] : \"atmx\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const scssVar = `$${prefix}-color-${key}-dark`;\n lines.push(`${scssVar}: ${value};`);\n }\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n\nfunction generateLessOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"// CSS Custom Properties (for use in CSS/HTML)\",\n \"// Light mode (default)\",\n \":root {\"\n ];\n \n for (const [key, value] of Object.entries(cssVariables)) {\n lines.push(` ${key}: ${value};`);\n }\n \n lines.push(\"}\");\n \n // Add dark mode CSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Dark mode\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n lines.push(\"// Less Variables (light mode values)\");\n \n for (const [key, value] of Object.entries(cssVariables)) {\n const lessVar = \"@\" + key.replace(/^--/, \"\");\n lines.push(`${lessVar}: ${value};`);\n }\n \n // Add dark mode Less variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Less Variables (dark mode values)\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^--([a-z]+)-/);\n const prefix = prefixMatch ? prefixMatch[1] : \"atmx\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const lessVar = `@${prefix}-color-${key}-dark`;\n lines.push(`${lessVar}: ${value};`);\n }\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n\n// ============================================\n// NATIVE MOBILE OUTPUT GENERATORS\n// ============================================\n\nfunction toSwiftName(cssVar: string): string {\n // --atmx-color-brand-primary → colorBrandPrimary\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toKotlinName(cssVar: string): string {\n // --atmx-color-brand-primary → ColorBrandPrimary\n const camel = toSwiftName(cssVar);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n}\n\nfunction toDartName(cssVar: string): string {\n // --atmx-color-brand-primary → colorBrandPrimary (same as Swift)\n return toSwiftName(cssVar);\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToSwiftColor(hex: string): string {\n // #RRGGBB or #RRGGBBAA\n const clean = hex.replace(\"#\", \"\");\n if (clean.length === 3) {\n // #RGB -> #RRGGBB\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(hex: 0x${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(hex: 0x${clean})`;\n }\n if (clean.length === 8) {\n // #RRGGBBAA\n const rgb = clean.substring(0, 6);\n const alpha = parseInt(clean.substring(6, 8), 16) / 255;\n return `Color(hex: 0x${rgb}).opacity(${alpha.toFixed(2)})`;\n }\n return `Color.clear // Could not parse: ${hex}`;\n}\n\nfunction hexToKotlinColor(hex: string): string {\n const clean = hex.replace(\"#\", \"\").toUpperCase();\n if (clean.length === 3) {\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(0xFF${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(0xFF${clean})`;\n }\n if (clean.length === 8) {\n // RRGGBBAA -> AARRGGBB for Android\n const rgb = clean.substring(0, 6);\n const alpha = clean.substring(6, 8);\n return `Color(0x${alpha}${rgb})`;\n }\n return `Color.Transparent // Could not parse: ${hex}`;\n}\n\nfunction hexToDartColor(hex: string): string {\n const clean = hex.replace(\"#\", \"\").toUpperCase();\n if (clean.length === 3) {\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(0xFF${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(0xFF${clean})`;\n }\n if (clean.length === 8) {\n const rgb = clean.substring(0, 6);\n const alpha = clean.substring(6, 8);\n return `Color(0x${alpha}${rgb})`;\n }\n return `Colors.transparent // Could not parse: ${hex}`;\n}\n\nfunction generateSwiftOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"import SwiftUI\",\n \"\",\n \"// MARK: - Color Extension for Hex\",\n \"extension Color {\",\n \" init(hex: UInt, alpha: Double = 1.0) {\",\n \" self.init(\",\n \" .sRGB,\",\n \" red: Double((hex >> 16) & 0xFF) / 255.0,\",\n \" green: Double((hex >> 8) & 0xFF) / 255.0,\",\n \" blue: Double(hex & 0xFF) / 255.0,\",\n \" opacity: alpha\",\n \" )\",\n \" }\",\n \"}\",\n \"\",\n \"// MARK: - Design Tokens\",\n \"enum DesignTokens {\",\n \"\",\n \" // MARK: Colors (Light Mode)\",\n \" enum Colors {\"\n ];\n\n // Group by category\n const colors: Array<[string, string]> = [];\n const spacing: Array<[string, string]> = [];\n const typography: Array<[string, string]> = [];\n const other: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(cssVariables)) {\n if (key.includes(\"-color-\")) colors.push([key, value]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value]);\n else other.push([key, value]);\n }\n\n for (const [key, value] of colors) {\n const name = toSwiftName(key);\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n }\n }\n\n lines.push(\" }\");\n \n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // MARK: Colors (Dark Mode)\");\n lines.push(\" enum ColorsDark {\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n }\n }\n \n lines.push(\" }\");\n }\n \n lines.push(\"\");\n lines.push(\" // MARK: Spacing\");\n lines.push(\" enum Spacing {\");\n\n for (const [key, value] of spacing) {\n const name = toSwiftName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" // MARK: Typography\");\n lines.push(\" enum Typography {\");\n\n for (const [key, value] of typography) {\n const name = toSwiftName(key);\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n }\n } else if (key.includes(\"weight\")) {\n lines.push(` static let ${name} = \"${value}\"`);\n } else if (key.includes(\"family\")) {\n lines.push(` static let ${name} = \"${value}\"`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" // MARK: Other\");\n lines.push(\" enum Other {\");\n\n for (const [key, value] of other) {\n const name = toSwiftName(key);\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n } else {\n lines.push(` static let ${name} = \"${value}\"`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction generateKotlinOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"package com.atomix.design\",\n \"\",\n \"import androidx.compose.ui.graphics.Color\",\n \"import androidx.compose.ui.unit.dp\",\n \"import androidx.compose.ui.unit.sp\",\n \"\",\n \"object DesignTokens {\",\n \"\",\n \" // Light mode colors\",\n \" object Colors {\"\n ];\n\n const colors: Array<[string, string]> = [];\n const spacing: Array<[string, string]> = [];\n const typography: Array<[string, string]> = [];\n const other: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(cssVariables)) {\n if (key.includes(\"-color-\")) colors.push([key, value]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value]);\n else other.push([key, value]);\n }\n\n for (const [key, value] of colors) {\n const name = toKotlinName(key);\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n }\n }\n\n lines.push(\" }\");\n \n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // Dark mode colors\");\n lines.push(\" object ColorsDark {\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `Color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n }\n }\n \n lines.push(\" }\");\n }\n \n lines.push(\"\");\n lines.push(\" object Spacing {\");\n\n for (const [key, value] of spacing) {\n const name = toKotlinName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.dp`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" object Typography {\");\n\n for (const [key, value] of typography) {\n const name = toKotlinName(key);\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.sp`);\n }\n } else {\n lines.push(` const val ${name} = \"${value}\"`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" object Other {\");\n\n for (const [key, value] of other) {\n const name = toKotlinName(key);\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.dp`);\n } else {\n lines.push(` const val ${name} = \"${value}\"`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction generateDartOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"import 'package:flutter/material.dart';\",\n \"\",\n \"class DesignTokens {\",\n \" DesignTokens._();\",\n \"\",\n \" // Colors (Light Mode)\"\n ];\n\n const colors: Array<[string, string]> = [];\n const spacing: Array<[string, string]> = [];\n const typography: Array<[string, string]> = [];\n const other: Array<[string, string]> = [];\n\n for (const [key, value] of Object.entries(cssVariables)) {\n if (key.includes(\"-color-\")) colors.push([key, value]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value]);\n else other.push([key, value]);\n }\n\n for (const [key, value] of colors) {\n const name = toDartName(key);\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n }\n }\n\n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // Colors (Dark Mode)\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}Dark`;\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Spacing\");\n\n for (const [key, value] of spacing) {\n const name = toDartName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Typography\");\n\n for (const [key, value] of typography) {\n const name = toDartName(key);\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n }\n } else {\n lines.push(` static const String ${name} = '${value}';`);\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Other\");\n\n for (const [key, value] of other) {\n const name = toDartName(key);\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n } else {\n lines.push(` static const String ${name} = '${value}';`);\n }\n }\n }\n\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\nfunction diffTokens(\n oldContent: string,\n newCssVars: Record<string, string>,\n format: OutputFormat,\n newDarkVars?: Record<string, string>\n): { \n added: string[]; \n modified: Array<{ key: string; old: string; new: string }>; \n removed: string[];\n addedDark: string[];\n modifiedDark: Array<{ key: string; old: string; new: string }>;\n removedDark: string[];\n} {\n const added: string[] = [];\n const modified: Array<{ key: string; old: string; new: string }> = [];\n const removed: string[] = [];\n const addedDark: string[] = [];\n const modifiedDark: Array<{ key: string; old: string; new: string }> = [];\n const removedDark: string[] = [];\n\n // CSS-based formats (css, scss, less) all use CSS variables\n if (format === \"css\" || format === \"scss\" || format === \"less\") {\n // Split old content into light mode (:root) and dark mode (.dark) sections\n // Find the :root section\n const rootMatch = oldContent.match(/:root\\s*\\{([^}]*)\\}/);\n const darkMatch = oldContent.match(/\\.dark[^{]*\\{([^}]*)\\}/);\n \n // Parse light mode variables from :root\n const oldLightVars: Record<string, string> = {};\n if (rootMatch) {\n const rootContent = rootMatch[1];\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(rootContent)) !== null) {\n oldLightVars[match[1]] = match[2].trim();\n }\n } else {\n // Fallback: parse everything (old behavior for files without sections)\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(oldContent)) !== null) {\n // Only take the first occurrence to get light mode values\n if (!(match[1] in oldLightVars)) {\n oldLightVars[match[1]] = match[2].trim();\n }\n }\n }\n\n // Parse dark mode variables from .dark\n const oldDarkVars: Record<string, string> = {};\n if (darkMatch) {\n const darkContent = darkMatch[1];\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(darkContent)) !== null) {\n oldDarkVars[match[1]] = match[2].trim();\n }\n }\n\n // Compare light mode\n for (const [key, value] of Object.entries(newCssVars)) {\n if (!(key in oldLightVars)) {\n added.push(key);\n } else if (oldLightVars[key] !== value) {\n modified.push({ key, old: oldLightVars[key], new: value });\n }\n }\n\n for (const key of Object.keys(oldLightVars)) {\n if (!(key in newCssVars)) {\n removed.push(key);\n }\n }\n\n // Compare dark mode if new dark vars provided\n if (newDarkVars && Object.keys(newDarkVars).length > 0) {\n // Generate the expected CSS variable names for dark mode\n // newDarkVars keys are like \"bg-page\", need to match \"--atmx-color-bg-page\"\n const firstKey = Object.keys(newCssVars)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n\n for (const [key, value] of Object.entries(newDarkVars)) {\n const cssVarName = `${prefix}color-${key}`;\n if (!(cssVarName in oldDarkVars)) {\n addedDark.push(cssVarName);\n } else if (oldDarkVars[cssVarName] !== value) {\n modifiedDark.push({ key: cssVarName, old: oldDarkVars[cssVarName], new: value });\n }\n }\n\n for (const key of Object.keys(oldDarkVars)) {\n // Extract the short key from --atmx-color-bg-page -> bg-page\n const shortKey = key.replace(new RegExp(`^${prefix}color-`), \"\");\n if (!(shortKey in newDarkVars)) {\n removedDark.push(key);\n }\n }\n }\n }\n\n return { added, modified, removed, addedDark, modifiedDark, removedDark };\n}\n\nasync function promptConfirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} [Y/n] `, (answer) => {\n rl.close();\n const normalized = answer.toLowerCase().trim();\n resolve(normalized === \"\" || normalized === \"y\" || normalized === \"yes\");\n });\n });\n}\n\nasync function runSync() {\n console.log(\"\");\n console.log(\" ↘↘↘ Atomix Token Sync\");\n console.log(\"\");\n\n // Load config\n const config = findConfig();\n const effectiveDsId = cliArgs.dsId || config?.dsId;\n const effectiveApiKey = cliArgs.apiKey || config?.apiKey;\n const effectiveApiBase = cliArgs.apiBase || config?.apiBase || \"https://atomixstudio.eu\";\n const effectiveOutput = cliArgs.output || config?.output || \"./tokens.css\";\n const effectiveFormat = cliArgs.format || config?.format || \"css\";\n\n if (!effectiveDsId) {\n console.error(\" Error: Missing design system ID\");\n console.error(\"\");\n console.error(\" Either:\");\n console.error(\" 1. Run: npx atomix sync --ds-id <your-ds-id>\");\n console.error(\" 2. Create .atomixrc with { \\\"dsId\\\": \\\"<your-ds-id>\\\" }\");\n console.error(\" 3. Run: npx atomix init\");\n console.error(\"\");\n process.exit(1);\n }\n\n console.log(` Fetching tokens from ${effectiveApiBase}...`);\n\n // Fetch latest tokens\n const url = `${effectiveApiBase}/api/ds/${effectiveDsId}/tokens?format=export`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (effectiveApiKey) headers[\"x-api-key\"] = effectiveApiKey;\n\n let data: ExportedTokens;\n try {\n const response = await fetch(url, { headers });\n if (!response.ok) {\n const errorText = await response.text();\n console.error(` Error: Failed to fetch tokens (${response.status})`);\n console.error(` ${errorText}`);\n process.exit(1);\n }\n data = await response.json() as ExportedTokens;\n } catch (error) {\n console.error(` Error: Could not connect to ${effectiveApiBase}`);\n console.error(` ${error instanceof Error ? error.message : String(error)}`);\n process.exit(1);\n }\n\n console.log(` Design System: ${data.meta.name} (v${data.meta.version})`);\n console.log(\"\");\n\n // Generate new content based on format\n // Get dark mode colors for CSS output\n const darkModeColors = (data.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n \n let newContent: string;\n switch (effectiveFormat) {\n case \"css\":\n newContent = generateCSSOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"scss\":\n newContent = generateSCSSOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"less\":\n newContent = generateLessOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"json\":\n newContent = generateJSONOutput(data.tokens);\n break;\n case \"js\":\n newContent = generateJSOutput(data.tokens);\n break;\n case \"ts\":\n newContent = generateTSOutput(data.tokens);\n break;\n case \"swift\":\n newContent = generateSwiftOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"kotlin\":\n newContent = generateKotlinOutput(data.cssVariables, darkModeColors?.dark);\n break;\n case \"dart\":\n newContent = generateDartOutput(data.cssVariables, darkModeColors?.dark);\n break;\n default:\n newContent = generateCSSOutput(data.cssVariables, darkModeColors?.dark);\n break;\n }\n\n // Check if file exists and diff\n const outputPath = path.resolve(process.cwd(), effectiveOutput);\n const fileExists = fs.existsSync(outputPath);\n\n // CSS-based formats support diffing\n const supportsDiff = [\"css\", \"scss\", \"less\"].includes(effectiveFormat);\n if (fileExists && supportsDiff) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n const diff = diffTokens(oldContent, data.cssVariables, effectiveFormat, darkModeColors?.dark);\n\n // Count light mode changes\n const lightChanges = diff.added.length + diff.modified.length + diff.removed.length;\n // Count dark mode changes\n const darkChanges = diff.addedDark.length + diff.modifiedDark.length + diff.removedDark.length;\n const totalChanges = lightChanges + darkChanges;\n\n if (totalChanges === 0) {\n console.log(\" ✓ Already up to date!\");\n console.log(\"\");\n process.exit(0);\n }\n\n console.log(` Changes detected in ${path.basename(effectiveOutput)}:`);\n console.log(\"\");\n\n // Show light mode changes\n if (lightChanges > 0) {\n console.log(\" Light Mode:\");\n if (diff.modified.length > 0) {\n for (const { key, old: oldVal, new: newVal } of diff.modified) {\n console.log(` ${key}`);\n console.log(` - ${oldVal}`);\n console.log(` + ${newVal}`);\n }\n }\n if (diff.added.length > 0) {\n console.log(` + ${diff.added.length} new token(s)`);\n }\n if (diff.removed.length > 0) {\n console.log(` - ${diff.removed.length} removed token(s)`);\n }\n console.log(\"\");\n }\n\n // Show dark mode changes\n if (darkChanges > 0) {\n console.log(\" Dark Mode:\");\n if (diff.modifiedDark.length > 0) {\n for (const { key, old: oldVal, new: newVal } of diff.modifiedDark) {\n console.log(` ${key}`);\n console.log(` - ${oldVal}`);\n console.log(` + ${newVal}`);\n }\n }\n if (diff.addedDark.length > 0) {\n console.log(` + ${diff.addedDark.length} new token(s)`);\n }\n if (diff.removedDark.length > 0) {\n console.log(` - ${diff.removedDark.length} removed token(s)`);\n }\n console.log(\"\");\n }\n\n console.log(` Total: ${totalChanges} change(s) (Light: ${lightChanges}, Dark: ${darkChanges})`);\n console.log(\"\");\n\n // Confirm\n if (!cliArgs.yes) {\n const confirmed = await promptConfirm(\" Apply changes?\");\n if (!confirmed) {\n console.log(\" Cancelled.\");\n process.exit(0);\n }\n }\n } else if (!fileExists) {\n console.log(` Creating ${effectiveOutput}...`);\n console.log(` ${Object.keys(data.cssVariables).length} tokens`);\n console.log(\"\");\n\n if (!cliArgs.yes) {\n const confirmed = await promptConfirm(\" Create file?\");\n if (!confirmed) {\n console.log(\" Cancelled.\");\n process.exit(0);\n }\n }\n }\n\n // Write file\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n fs.writeFileSync(outputPath, newContent);\n\n console.log(\"\");\n console.log(` ✓ Tokens synced → ${effectiveOutput}`);\n\n // Sync rules files (ON by default since guides reference tokens)\n if (cliArgs.rules) {\n console.log(\"\");\n console.log(\" Syncing AI guidance rules...\");\n \n const rulesDir = cliArgs.rulesDir || process.cwd();\n const rulesDirResolved = path.resolve(process.cwd(), rulesDir);\n \n // Detect which AI tools are likely in use based on existing files\n const toolsToSync: Array<{ tool: string; filename: string; dir?: string }> = [\n { tool: \"cursor\", filename: \".cursorrules\" },\n { tool: \"windsurf\", filename: \".windsurfrules\" },\n { tool: \"cline\", filename: \".clinerules\" },\n { tool: \"continue\", filename: \".continuerules\" },\n { tool: \"copilot\", filename: \"copilot-instructions.md\", dir: \".github\" },\n { tool: \"generic\", filename: \"AI_GUIDELINES.md\" },\n ];\n \n // Check which tools have existing files or should be created\n const existingTools = toolsToSync.filter(t => {\n const filePath = t.dir \n ? path.join(rulesDirResolved, t.dir, t.filename)\n : path.join(rulesDirResolved, t.filename);\n return fs.existsSync(filePath);\n });\n \n // If no existing rules files, create .cursorrules by default\n const toolsToWrite = existingTools.length > 0 \n ? existingTools \n : [{ tool: \"cursor\", filename: \".cursorrules\" }];\n \n for (const { tool, filename, dir } of toolsToWrite) {\n try {\n // Fetch rules from API\n const rulesUrl = `${effectiveApiBase}/api/ds/${effectiveDsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (effectiveApiKey) headers[\"x-api-key\"] = effectiveApiKey;\n \n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n console.error(` ✗ Failed to fetch ${tool} rules: ${response.status}`);\n continue;\n }\n \n const rulesData = await response.json() as { content?: string };\n if (!rulesData.content) {\n console.error(` ✗ No content for ${tool} rules`);\n continue;\n }\n \n // Write the file\n const targetDir = dir ? path.join(rulesDirResolved, dir) : rulesDirResolved;\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n \n const filePath = path.join(targetDir, filename);\n fs.writeFileSync(filePath, rulesData.content);\n \n const relativePath = dir ? `${dir}/${filename}` : filename;\n console.log(` ✓ ${relativePath}`);\n } catch (error) {\n console.error(` ✗ Error syncing ${tool} rules:`, error instanceof Error ? error.message : String(error));\n }\n }\n }\n\n console.log(\"\");\n}\n\nasync function runInit() {\n console.log(\"\");\n console.log(\" ↘↘↘ Atomix Config Setup\");\n console.log(\"\");\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n const question = (prompt: string): Promise<string> =>\n new Promise((resolve) => rl.question(prompt, resolve));\n\n const dsId = cliArgs.dsId || await question(\" Design System ID: \");\n const output = await question(\" Output file [./tokens.css]: \") || \"./tokens.css\";\n const format = await question(\" Format (css/json/ts) [css]: \") || \"css\";\n\n rl.close();\n\n const config: AtomixConfig = {\n dsId,\n output,\n format: format as \"css\" | \"json\" | \"ts\",\n };\n\n const configPath = path.join(process.cwd(), \".atomixrc\");\n fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + \"\\n\");\n\n console.log(\"\");\n console.log(` ✓ Created .atomixrc`);\n console.log(\"\");\n console.log(\" Now run: npx atomix sync\");\n console.log(\"\");\n}\n\nfunction showHelp() {\n console.log(`\n ↘↘↘ Atomix CLI\n\n COMMANDS\n sync Sync design tokens to your project\n init Create .atomixrc config file\n help Show this help message\n (none) Start MCP server for AI tools\n\n SYNC OPTIONS\n --ds-id Design system ID (or set in .atomixrc)\n --api-key API key for private design systems\n --output, -o Output file path [./tokens.css]\n --format Output format [css]\n WEB:\n css - CSS custom properties (:root { --var: value })\n scss - CSS vars + SCSS variables ($var: value)\n less - CSS vars + Less variables (@var: value)\n json - Raw token JSON\n ts - TypeScript with types\n js - JavaScript ES module\n NATIVE:\n swift - SwiftUI (iOS/macOS)\n kotlin - Jetpack Compose (Android)\n dart - Flutter\n --no-rules Skip syncing AI rules files (tokens + rules sync by default)\n --rules-dir Directory for rules files [project root]\n --exclude Glob pattern to exclude (can use multiple times)\n -y, --yes Auto-confirm changes\n\n MCP SERVER OPTIONS\n --ds-id Design system ID (required)\n --api-key API key for private design systems\n --api-base API base URL [https://atomixstudio.eu]\n\n EXAMPLES\n npx heyatomix sync # Sync tokens + AI rules (default)\n npx heyatomix sync --no-rules # Sync tokens only\n npx heyatomix sync -o ./src/tokens.css\n npx heyatomix sync --format scss -o ./src/styles/_tokens.scss\n npx heyatomix sync --format swift -o ./Sources/DesignTokens.swift\n npx heyatomix init\n npx heyatomix --ds-id abc123 # Start MCP server\n\n CONFIG FILE (.atomixrc)\n {\n \"dsId\": \"your-design-system-id\",\n \"output\": \"./src/styles/tokens.css\",\n \"format\": \"css\",\n \"exclude\": [\"legacy/**\", \"vendor/**\"]\n }\n\n DEFAULT SCANNED FILES\n *.tsx, *.jsx, *.ts, *.js, *.css, *.scss, *.less, *.vue, *.svelte\n\n DEFAULT EXCLUDED\n node_modules/**, dist/**, build/**, .next/**, *.min.*, *.d.ts\n`);\n}\n\n// ============================================\n// START SERVER\n// ============================================\n\nasync function startServer() {\n if (!dsId) {\n console.error(\"Error: Missing --ds-id argument\");\n console.error(\"Usage: npx atomix --ds-id <id> --api-key <key>\");\n console.error(\"\");\n console.error(\"For sync command: npx atomix sync --help\");\n console.error(\"Get your DS ID from https://atomixstudio.eu/ds/[your-ds-id]\");\n process.exit(1);\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log to stderr so it doesn't interfere with MCP protocol on stdout\n console.error(`Atomix MCP Server started for design system: ${dsId}`);\n}\n\nasync function main() {\n switch (cliArgs.command) {\n case \"sync\":\n await runSync();\n break;\n case \"init\":\n await runInit();\n break;\n case \"help\":\n showHelp();\n break;\n case \"server\":\n default:\n await startServer();\n break;\n }\n}\n\nmain().catch((error) => {\n console.error(\"Failed:\", error);\n process.exit(1);\n});\n\n"],"mappings":"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","names":["dsId","apiKey","apiBase","path","resolve","headers","dsId"]}
1
+ {"version":3,"sources":["../src/index.ts","../../atomix-sync-core/src/fetch.ts","../../atomix-sync-core/src/diff.ts","../../atomix-sync-core/src/rules.ts","../../atomix-sync-core/src/formats/css.ts","../../atomix-sync-core/src/formats/scss.ts","../../atomix-sync-core/src/formats/less.ts","../../atomix-sync-core/src/formats/json.ts","../../atomix-sync-core/src/formats/ts.ts","../../atomix-sync-core/src/formats/js.ts","../../atomix-sync-core/src/formats/swift.ts","../../atomix-sync-core/src/formats/kotlin.ts","../../atomix-sync-core/src/formats/dart.ts","../../atomix-sync-core/src/response.ts","../../atomix-sync-core/src/tokens.ts"],"sourcesContent":["/**\n * Atomix MCP Server - User Design System Mode\n * \n * A minimal MCP server that serves design tokens from a user's\n * Atomix Design System via the public API.\n * \n * Usage:\n * npx @atomixstudio/mcp --ds-id <id> [--api-key <key>]\n * \n * Tools:\n * - getToken: Get a specific token by path\n * - listTokens: List tokens in a category\n * - searchTokens: Search for tokens by name or value\n * - validateUsage: Check if a value follows the design system\n * - getAIToolRules: Generate AI coding rules for this design system\n * - exportMCPConfig: Generate MCP configuration files\n * - getSetupInstructions: Get setup guide for AI tools\n * - syncTokens: Sync tokens to a local file\n * \n * @see https://atomixstudio.eu\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 ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\n// Import from core library\nimport {\n fetchDesignSystem,\n getTokenByPath,\n flattenTokens,\n searchTokens,\n getTokenStats,\n syncTokens as coreSyncTokens,\n compareDesignSystems,\n generateCSSOutput,\n generateSCSSOutput,\n generateLessOutput,\n generateJSONOutput,\n generateTSOutput,\n generateJSOutput,\n generateSwiftOutput,\n generateKotlinOutput,\n generateDartOutput,\n diffTokens,\n formatSyncResponse,\n detectGovernanceChangesByFoundation,\n syncRulesFiles,\n type DesignSystemData,\n type OutputFormat,\n type RulesFileResult,\n type DiffResult,\n} from \"@atomixstudio/sync-core\";\nimport * as path from \"path\";\nimport * as fs from \"fs\";\n\n// ============================================\n// CLI ARGUMENTS (for MCP server configuration)\n// ============================================\n\nfunction parseArgs(): { dsId: string | null; apiKey: string | null; apiBase: string | null } {\n const args = process.argv.slice(2);\n let dsId: string | null = null;\n let apiKey: string | null = null;\n let apiBase: string | null = null;\n\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--ds-id\" && args[i + 1]) {\n dsId = args[i + 1];\n i++;\n } else if (args[i] === \"--api-key\" && args[i + 1]) {\n apiKey = args[i + 1];\n i++;\n } else if (args[i] === \"--api-base\" && args[i + 1]) {\n apiBase = args[i + 1];\n i++;\n }\n }\n\n return { dsId, apiKey, apiBase };\n}\n\nconst cliArgs = parseArgs();\nconst { dsId, apiKey } = cliArgs;\nconst apiBase = cliArgs.apiBase || \"https://atomixstudio.eu\";\n\n// ============================================\n// CACHED DATA (for MCP server)\n// ============================================\n\nlet cachedData: DesignSystemData | null = null;\nlet cachedETag: string | null = null;\nlet lastChangeSummary: string | null = null;\n\n// Store affected tokens from last sync for /refactor command\ninterface LastSyncAffectedTokens {\n modified: Array<{ token: string; oldValue: string; newValue: string }>;\n removed: Array<{ token: string; lastValue: string }>;\n added: string[];\n format: string; // \"css\" | \"scss\" | \"swift\" | \"kotlin\" | \"dart\" etc.\n timestamp: string;\n}\nlet lastSyncAffectedTokens: LastSyncAffectedTokens | null = null;\n\n/**\n * Fetch design system for MCP: uses cache (etag) unless forceRefresh.\n * Updates cachedData/cachedETag and returns DesignSystemData.\n */\nasync function fetchDesignSystemForMCP(forceRefresh = false): Promise<DesignSystemData> {\n if (!dsId) {\n throw new Error(\"Missing --ds-id argument. Usage: npx @atomixstudio/mcp --ds-id <id> [--api-key <key>]\");\n }\n const result = await fetchDesignSystem({\n dsId,\n apiKey: apiKey ?? undefined,\n apiBase,\n etag: forceRefresh ? undefined : cachedETag ?? undefined,\n forceRefresh,\n });\n if (result.status === 304 && cachedData) {\n return cachedData;\n }\n if (!result.data) {\n throw new Error(\"Failed to fetch design system: no data returned\");\n }\n cachedData = result.data;\n cachedETag = result.etag;\n return result.data;\n}\n\n// Helper to get last change summary (MCP-specific, tracks changes for prompts)\nfunction getLastChangeSummary(): string | null {\n return lastChangeSummary;\n}\n\n// Update change summary when fetching (for MCP prompts)\nasync function updateChangeSummary(freshData: DesignSystemData) {\n if (cachedData) {\n const changes = compareDesignSystems(cachedData, freshData);\n lastChangeSummary = changes.summary;\n if (changes.hasChanges) {\n console.error(`[mcp-user] Design system changes detected:\\n${changes.summary}`);\n }\n }\n}\n\n// ============================================\n// TOKEN UTILITIES\n// ============================================\n\nconst TOKEN_CATEGORIES = [\"colors\", \"typography\", \"spacing\", \"sizing\", \"shadows\", \"radius\", \"borders\", \"motion\", \"zIndex\"] as const;\ntype TokenCategory = typeof TOKEN_CATEGORIES[number];\n\n// Token utilities are imported from core library - no local implementations needed\n\n// ============================================\n// MCP SERVER SETUP\n// ============================================\n\nconst server = new Server(\n {\n name: \"atomix-mcp-user\",\n version: \"1.0.0\",\n },\n {\n capabilities: {\n tools: {},\n resources: {},\n prompts: {},\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 the value and CSS variable name.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"Token path in dot notation (e.g., 'colors.brand.primary', 'spacing.scale.md')\",\n },\n },\n required: [\"path\"],\n },\n },\n {\n name: \"listTokens\",\n description: \"List all tokens in a category (colors, typography, spacing, sizing, shadows, radius, borders, motion, zIndex).\",\n inputSchema: {\n type: \"object\",\n properties: {\n category: {\n type: \"string\",\n enum: TOKEN_CATEGORIES,\n description: \"Token category to list\",\n },\n subcategory: {\n type: \"string\",\n description: \"Optional subcategory (e.g., 'brand' for colors, 'scale' for spacing)\",\n },\n },\n required: [\"category\"],\n },\n },\n {\n name: \"searchTokens\",\n description: \"Search for tokens by name or value.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: {\n type: \"string\",\n description: \"Search query (matches token paths or values)\",\n },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"validateUsage\",\n description: \"Check if a CSS value follows the design system. Detects hardcoded 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 to help find the right token\",\n },\n },\n required: [\"value\"],\n },\n },\n {\n name: \"getAIToolRules\",\n description: \"Generate design system rules for AI coding tools (Cursor, Copilot, Windsurf, etc.).\",\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 get rules for all tools.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"exportMCPConfig\",\n description: \"Generate MCP configuration file for AI tools.\",\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.\",\n },\n },\n required: [\"tool\"],\n },\n },\n {\n name: \"getSetupInstructions\",\n description: \"Get detailed setup instructions for a specific AI tool.\",\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: \"syncTokens\",\n description: \"Sync design tokens to a local file. Safe, never breaks UI - adds new tokens, updates existing values, marks deprecated tokens. Use /refactor to migrate deprecated tokens. WARNING: The output file is completely rewritten - only CSS custom properties (variables) are preserved. Custom CSS rules will be lost. Keep custom CSS in a separate file.\",\n inputSchema: {\n type: \"object\",\n properties: {\n output: {\n type: \"string\",\n description: \"Output file path relative to project root (e.g., './src/tokens.css', './DesignTokens.swift')\",\n },\n format: {\n type: \"string\",\n enum: [\"css\", \"scss\", \"less\", \"json\", \"ts\", \"js\", \"swift\", \"kotlin\", \"dart\"],\n description: \"Output format. WEB: css, scss, less, json, ts, js. NATIVE: swift (iOS), kotlin (Android), dart (Flutter). Default: css\",\n },\n },\n required: [\"output\"],\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 try {\n // Force refresh for syncTokens to ensure we get the latest data\n const shouldForceRefresh = name === \"syncTokens\";\n const data = await fetchDesignSystemForMCP(shouldForceRefresh);\n\n switch (name) {\n case \"getToken\": {\n const path = args?.path as string;\n const value = getTokenByPath(data.tokens, path);\n \n if (value === undefined) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Token not found: ${path}`,\n suggestion: \"Use listTokens or searchTokens to find available tokens.\",\n availableCategories: TOKEN_CATEGORIES,\n }, null, 2),\n }],\n };\n }\n\n // Find CSS variable for this path\n const cssVarKey = `--atmx-${path.replace(/\\./g, \"-\")}`;\n const cssVar = data.cssVariables[cssVarKey];\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n path,\n value,\n cssVariable: cssVar || `var(${cssVarKey})`,\n usage: `style={{ property: \"var(${cssVarKey})\" }}`,\n }, null, 2),\n }],\n };\n }\n\n case \"listTokens\": {\n const category = args?.category as TokenCategory;\n const subcategory = args?.subcategory as string | undefined;\n \n let tokensToList: unknown = data.tokens[category];\n \n if (subcategory && tokensToList && typeof tokensToList === \"object\") {\n tokensToList = getTokenByPath(tokensToList as Record<string, unknown>, subcategory);\n }\n\n if (!tokensToList) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Category not found: ${category}${subcategory ? `.${subcategory}` : \"\"}`,\n availableCategories: TOKEN_CATEGORIES,\n }, null, 2),\n }],\n };\n }\n\n const flat = flattenTokens(tokensToList);\n \n // Enhance tokens with CSS variable names\n const tokensWithCssVars = flat.map(({ path, value }: { path: string; value: unknown }) => {\n // Construct the full path for CSS variable lookup\n const fullPath = subcategory \n ? `${category}.${subcategory}.${path}` \n : `${category}.${path}`;\n \n // Find CSS variable in cssVariables\n let cssVar: string | undefined;\n \n if (category === \"colors\" && subcategory === \"static.brand\") {\n // Brand colors use pattern: --atmx-color-brand-{key}\n // Path is already just the key (e.g., \"testis\", \"primary\")\n cssVar = data.cssVariables[`--atmx-color-brand-${path}`];\n } else if (category === \"colors\" && subcategory?.startsWith(\"modes.\")) {\n // Mode colors use pattern: --atmx-color-{key}\n // Path is already the semantic key (e.g., \"bg-page\", \"text-primary\")\n cssVar = data.cssVariables[`--atmx-color-${path}`];\n } else {\n // For other tokens, try the standard pattern\n const cssVarKey = `--atmx-${fullPath.replace(/\\./g, \"-\")}`;\n cssVar = data.cssVariables[cssVarKey];\n }\n \n return {\n path: fullPath,\n value,\n cssVariable: cssVar || undefined,\n };\n });\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n category,\n subcategory,\n count: tokensWithCssVars.length,\n tokens: tokensWithCssVars.slice(0, 50), // Limit to 50 for readability\n truncated: tokensWithCssVars.length > 50,\n }, null, 2),\n }],\n };\n }\n\n case \"searchTokens\": {\n const query = args?.query as string;\n const results = searchTokens(data.tokens, query);\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n query,\n count: results.length,\n results: results.slice(0, 30),\n truncated: results.length > 30,\n }, null, 2),\n }],\n };\n }\n\n case \"validateUsage\": {\n const value = args?.value as string;\n const context = (args?.context as string) || \"any\";\n \n // Check if value is a hardcoded color\n const isHexColor = /^#[0-9A-Fa-f]{3,8}$/.test(value);\n const isRgbColor = /^rgb\\(|^rgba\\(|^hsl\\(/.test(value);\n const isPixelValue = /^\\d+px$/.test(value);\n \n if (!isHexColor && !isRgbColor && !isPixelValue) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: true,\n message: \"Value appears to be using tokens or is not a design token value.\",\n }, null, 2),\n }],\n };\n }\n\n // Search for matching tokens\n const matches = searchTokens(data.tokens, value);\n \n if (matches.length > 0) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: false,\n message: \"Hardcoded value detected. Use a token instead.\",\n matchingTokens: matches.slice(0, 5),\n suggestion: `Use var(--atmx-${matches[0].path.replace(/\\./g, \"-\")}) instead of ${value}`,\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n value,\n valid: false,\n message: \"Hardcoded value detected. No exact token match found.\",\n suggestion: `Consider adding this value to the design system or use the closest token.`,\n context,\n }, null, 2),\n }],\n };\n }\n\n case \"getAIToolRules\": {\n const tool = args?.tool as string;\n \n // Fetch rules from the API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool === \"all\" ? \"all\" : tool}`;\n console.error(`[getAIToolRules] Fetching: ${rulesUrl}`);\n \n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n \n try {\n const response = await fetch(rulesUrl, { headers });\n console.error(`[getAIToolRules] Response status: ${response.status}`);\n \n if (!response.ok) {\n const errorText = await response.text();\n console.error(`[getAIToolRules] Error response: ${errorText}`);\n throw new Error(`Failed to fetch rules: ${response.status} - ${errorText}`);\n }\n\n const rules = await response.json() as { rules?: string[]; categories?: Record<string, string[]> };\n console.error(`[getAIToolRules] Got ${rules.rules?.length || 0} rules`);\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify(rules, null, 2),\n }],\n };\n } catch (fetchError) {\n console.error(`[getAIToolRules] Fetch error:`, fetchError);\n throw fetchError;\n }\n }\n\n case \"exportMCPConfig\": {\n const tool = args?.tool as string;\n \n // Generate MCP config locally\n const serverName = data.meta.name.toLowerCase().replace(/[^a-z0-9]/g, \"-\");\n const npxArgs = [\"@atomixstudio/mcp@latest\"];\n if (dsId) npxArgs.push(\"--ds-id\", dsId);\n if (apiKey) npxArgs.push(\"--api-key\", apiKey);\n\n const config = {\n mcpServers: {\n [serverName]: {\n command: \"npx\",\n args: npxArgs,\n },\n },\n };\n\n const configs: Record<string, { path: string; content: string }> = {\n cursor: { path: \".cursor/mcp.json\", content: JSON.stringify(config, null, 2) },\n \"claude-desktop\": { path: \"claude_desktop_config.json\", content: JSON.stringify(config, null, 2) },\n windsurf: { path: \".windsurf/mcp.json\", content: JSON.stringify(config, null, 2) },\n continue: { path: \".continue/config.json\", content: JSON.stringify({ models: [], mcpServers: [{ name: serverName, command: \"npx\", args: npxArgs }] }, null, 2) },\n vscode: { path: \".vscode/settings.json\", content: JSON.stringify({ \"mcp.servers\": config.mcpServers }, null, 2) },\n };\n\n if (tool === \"all\") {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n message: \"MCP configurations for all tools\",\n configs: Object.entries(configs).map(([t, c]) => ({\n tool: t,\n path: c.path,\n content: JSON.parse(c.content),\n })),\n }, null, 2),\n }],\n };\n }\n\n const selectedConfig = configs[tool as keyof typeof configs];\n if (!selectedConfig) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${tool}`,\n availableTools: Object.keys(configs),\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n tool,\n path: selectedConfig.path,\n content: JSON.parse(selectedConfig.content),\n instructions: `Create the file at ${selectedConfig.path} with the content above, then restart your IDE.`,\n }, null, 2),\n }],\n };\n }\n\n case \"getSetupInstructions\": {\n const tool = args?.tool as string;\n \n const instructions: Record<string, string> = {\n cursor: `# Cursor MCP Setup\n\n1. Create \\`.cursor/mcp.json\\` in your project root\n2. Add the MCP configuration (use exportMCPConfig to get it)\n3. Restart Cursor IDE\n4. Verify by asking: \"What design tokens are available?\"\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n copilot: `# GitHub Copilot Setup\n\n1. Create \\`.github/copilot-instructions.md\\` in your project\n2. Use getAIToolRules({ tool: \"copilot\" }) to get the content\n3. Enable custom instructions in VS Code settings:\n \"github.copilot.chat.codeGeneration.useInstructionFiles\": true\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n windsurf: `# Windsurf Setup\n\n1. Create \\`.windsurf/mcp.json\\` in your project root\n2. Create \\`.windsurfrules\\` with rules from getAIToolRules\n3. Restart Windsurf Editor\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n cline: `# Cline Setup\n\n1. Create \\`.clinerules\\` in your project root\n2. Cline auto-detects MCP from .cursor/mcp.json\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n continue: `# Continue Setup\n\n1. Create/edit \\`.continue/config.json\\`\n2. Add mcpServers configuration\n3. Restart VS Code\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n zed: `# Zed Setup\n\n1. Create \\`.zed/assistant/rules.md\\` in your project\n2. Use getAIToolRules({ tool: \"zed\" }) for content\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n \"claude-desktop\": `# Claude Desktop Setup\n\n1. Find your Claude config:\n - macOS: ~/Library/Application Support/Claude/claude_desktop_config.json\n - Windows: %APPDATA%\\\\Claude\\\\claude_desktop_config.json\n2. Add MCP server configuration\n3. Restart Claude Desktop\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n\n generic: `# Generic AI Tool Setup\n\n1. Create AI_GUIDELINES.md in your project root\n2. Use getAIToolRules({ tool: \"generic\" }) for content\n3. Reference in your prompts or context\n\n## File Structure\n\n⚠️ **IMPORTANT**: The \\`tokens.css\\` file (or your specified output file) is **completely rewritten** on each sync.\n\n- ✅ **Preserved**: CSS custom properties (variables) - both design system tokens and custom variables\n- ❌ **Lost**: Regular CSS rules (selectors, classes, media queries, etc.)\n\n**Best Practice**: Keep \\`tokens.css\\` separate from your custom CSS. Use a separate file (e.g., \\`custom.css\\`) for custom styles.`,\n };\n\n const instruction = instructions[tool];\n if (!instruction) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${tool}`,\n availableTools: Object.keys(instructions),\n }, null, 2),\n }],\n };\n }\n\n return {\n content: [{\n type: \"text\",\n text: instruction,\n }],\n };\n }\n\n case \"syncTokens\": {\n const output = args?.output as string;\n const format = (args?.format as OutputFormat) || \"css\";\n \n if (!output) {\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({ error: \"Missing required parameter: output\" }, null, 2),\n }],\n };\n }\n\n // Check if file exists first to detect deprecated tokens\n const outputPath = path.resolve(process.cwd(), output);\n const fileExists = fs.existsSync(outputPath);\n \n // Read old file if it exists\n const deprecatedTokens: Map<string, string> = new Map();\n const existingTokens: Map<string, string> = new Map();\n \n if (fileExists && [\"css\", \"scss\", \"less\"].includes(format)) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n \n // Extract CSS variables with their values from old file\n // Pattern: --var-name: value; (handles both with and without comments)\n // Improved regex: handles comments before variables, supports uppercase/numbers in prefix\n const oldVarPattern = /(?:^|\\n)\\s*(?:\\/\\*[^*]*\\*+(?:[^/*][^*]*\\*+)*\\/\\s*)?(--[a-zA-Z0-9-]+):\\s*([^;]+);/gm;\n let match;\n while ((match = oldVarPattern.exec(oldContent)) !== null) {\n const varName = match[1];\n const varValue = match[2].trim();\n \n existingTokens.set(varName, varValue);\n \n // Mark as deprecated if NOT in design system (kept for backward compatibility)\n if (!(varName in data.cssVariables)) {\n deprecatedTokens.set(varName, varValue);\n }\n }\n }\n \n // Always merge: DS tokens + existing custom tokens (deprecated get comment but stay in file)\n const mergedCssVariables = { ...data.cssVariables };\n // Note: deprecated tokens are passed separately to get /* DEPRECATED */ comment\n // but custom tokens not in DS are preserved in the output\n\n // Generate content based on format\n // Get dark mode colors for CSS output\n const darkModeColors = (data.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n \n // Use mergedCssVariables for CSS-based formats (supports merge mode)\n // Use data.cssVariables for native formats (merge mode not supported)\n let newContent: string;\n switch (format) {\n case \"css\":\n newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"scss\":\n newContent = generateSCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"less\":\n newContent = generateLessOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"json\":\n newContent = generateJSONOutput(data.tokens);\n break;\n case \"js\":\n newContent = generateJSOutput(data.tokens);\n break;\n case \"ts\":\n newContent = generateTSOutput(data.tokens);\n break;\n case \"swift\":\n newContent = generateSwiftOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"kotlin\":\n newContent = generateKotlinOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n case \"dart\":\n newContent = generateDartOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n break;\n default:\n newContent = generateCSSOutput(mergedCssVariables, darkModeColors?.dark, deprecatedTokens);\n }\n\n // Count tokens\n const tokenCount = Object.keys(mergedCssVariables).length;\n const dsTokenCount = Object.keys(data.cssVariables).length;\n const deprecatedCount = deprecatedTokens.size;\n\n let diffSummary = \"\";\n let changes: Array<{ key: string; old: string; new: string }> = [];\n let diff: DiffResult | undefined;\n\n if (fileExists && [\"css\", \"scss\", \"less\"].includes(format)) {\n const oldContent = fs.readFileSync(outputPath, \"utf-8\");\n diff = diffTokens(oldContent, mergedCssVariables, format as OutputFormat, darkModeColors?.dark);\n \n // Count changes (removed tokens are kept as deprecated, not actually removed)\n const lightChanges = diff.added.length + diff.modified.length;\n const darkChanges = diff.addedDark.length + diff.modifiedDark.length;\n const totalChanges = lightChanges + darkChanges + deprecatedCount;\n \n if (totalChanges === 0) {\n const lastUpdated = data.meta.exportedAt \n ? new Date(data.meta.exportedAt).toLocaleString()\n : \"N/A\";\n return {\n content: [{\n type: \"text\",\n text: `✓ Already up to date!\\n\\nFile: ${output}\\nTokens: ${tokenCount}\\nVersion: ${data.meta.version}\\nLast updated: ${lastUpdated}`,\n }],\n };\n }\n\n changes = [...diff.modified, ...diff.modifiedDark];\n \n // Build summary (deprecated tokens are kept, marked for /refactor)\n const lightSummary = lightChanges > 0 ? `Light: ${diff.modified.length} modified, ${diff.added.length} added` : \"\";\n const darkSummary = darkChanges > 0 ? `Dark: ${diff.modifiedDark.length} modified, ${diff.addedDark.length} added` : \"\";\n const deprecatedSummary = deprecatedCount > 0 ? `${deprecatedCount} deprecated (use /refactor)` : \"\";\n diffSummary = [lightSummary, darkSummary, deprecatedSummary].filter(Boolean).join(\" | \");\n \n // Store affected tokens for /refactor command\n const removedTokensWithValues: Array<{ token: string; lastValue: string }> = [];\n for (const [token, value] of deprecatedTokens.entries()) {\n removedTokensWithValues.push({ token, lastValue: value });\n }\n \n lastSyncAffectedTokens = {\n modified: [...diff.modified, ...diff.modifiedDark].map(m => ({\n token: m.key,\n oldValue: m.old,\n newValue: m.new,\n })),\n removed: removedTokensWithValues,\n added: [...diff.added, ...diff.addedDark],\n format,\n timestamp: new Date().toISOString(),\n };\n }\n\n // Write the file\n const outputDir = path.dirname(outputPath);\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n fs.writeFileSync(outputPath, newContent);\n\n // Sync rules files (default: true, same as core syncTokens)\n // IMPORTANT: Keep rules syncing logic here - don't duplicate in formatter\n // The formatter only formats the response, it doesn't perform operations\n let rulesResults: RulesFileResult[] = [];\n try {\n rulesResults = await syncRulesFiles({\n dsId: dsId!,\n apiKey: apiKey ?? undefined,\n apiBase,\n rulesDir: process.cwd(),\n });\n } catch (error) {\n // Rules sync is optional, don't fail the whole operation\n console.error(`[syncTokens] Failed to sync rules: ${error}`);\n }\n\n // Detect which foundations have governance changes\n // IMPORTANT: Use the shared helper from core - don't duplicate logic\n const governanceChanges = cachedData \n ? detectGovernanceChangesByFoundation(cachedData, data)\n : [];\n\n // IMPORTANT: Use the shared formatter from core package\n // This ensures MCP and CLI have identical output format\n // All response formatting logic is centralized in formatSyncResponse()\n // Do NOT build custom response text here - use the formatter instead\n const response = formatSyncResponse({\n data,\n output,\n format,\n dsTokenCount,\n deprecatedCount,\n deprecatedTokens,\n diff,\n changes,\n fileExists,\n rulesResults,\n governanceChanges,\n changeSummary: getLastChangeSummary(),\n hasRefactorRecommendation: !!lastSyncAffectedTokens?.removed.length,\n deprecatedTokenCount: lastSyncAffectedTokens?.removed.length || 0,\n });\n\n\n return {\n content: [{\n type: \"text\",\n text: response,\n }],\n };\n }\n\n default:\n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: `Unknown tool: ${name}`,\n availableTools: [\"getToken\", \"listTokens\", \"searchTokens\", \"validateUsage\", \"getAIToolRules\", \"exportMCPConfig\", \"getSetupInstructions\", \"syncTokens\"],\n }, null, 2),\n }],\n };\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n let suggestion = \"Check your MCP server configuration.\";\n \n if (errorMessage.includes(\"Missing --ds-id\")) {\n suggestion = \"Add --ds-id <your-design-system-id> to your MCP server configuration.\";\n } else if (errorMessage.includes(\"Failed to fetch\")) {\n const statusMatch = errorMessage.match(/Failed to fetch design system: (\\d+)/);\n if (statusMatch) {\n const status = statusMatch[1];\n if (status === \"404\") {\n suggestion = `Design system ID \"${dsId}\" not found. Verify the ID is correct or the design system has been published.`;\n } else if (status === \"401\" || status === \"403\") {\n suggestion = \"Design system is private. Add --api-key <your-key> to your MCP server configuration.\";\n } else {\n suggestion = `API request failed (${status}). Check your network connection and API base URL (${apiBase}).`;\n }\n } else {\n suggestion = `Failed to connect to API at ${apiBase}. Check your network connection.`;\n }\n }\n \n return {\n content: [{\n type: \"text\",\n text: JSON.stringify({\n error: errorMessage,\n suggestion,\n configured: {\n dsId: dsId || \"not set\",\n apiBase: apiBase || \"not set\",\n hasApiKey: !!apiKey,\n },\n }, null, 2),\n }],\n isError: true,\n };\n }\n});\n\n// ============================================\n// RESOURCE HANDLERS\n// ============================================\n\nconst AI_TOOLS = [\"cursor\", \"copilot\", \"windsurf\", \"cline\", \"continue\", \"zed\", \"generic\"] as const;\n\nserver.setRequestHandler(ListResourcesRequestSchema, async () => {\n try {\n const data = await fetchDesignSystemForMCP();\n const stats = getTokenStats(data);\n\n const resources = [\n {\n uri: \"atomix://welcome\",\n name: `Welcome to ${data.meta.name}`,\n description: `Design system overview with ${stats.total} tokens and ${stats.governanceRules} governance rules`,\n mimeType: \"text/markdown\",\n },\n ...AI_TOOLS.map(tool => ({\n uri: `atomix://rules/${tool}`,\n name: `${tool.charAt(0).toUpperCase() + tool.slice(1)} Rules`,\n description: `Design system rules file for ${tool}`,\n mimeType: \"text/markdown\",\n })),\n ];\n\n return { resources };\n } catch {\n // ds-id missing or fetch failed: return minimal list so Cursor still shows Resources\n return {\n resources: [\n {\n uri: \"atomix://setup\",\n name: \"Configure MCP\",\n description: \"Add --ds-id to your MCP config to load design system resources\",\n mimeType: \"text/markdown\",\n },\n ],\n };\n }\n});\n\nserver.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n // Placeholder when ds-id missing or fetch failed\n if (uri === \"atomix://setup\") {\n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: `# Configure Atomix MCP\n\nAdd \\`--ds-id <your-design-system-id>\\` to your MCP server config.\n\nExample (\\`.cursor/mcp.json\\`):\n\\`\\`\\`json\n{\n \"mcpServers\": {\n \"atomix\": {\n \"command\": \"npx\",\n \"args\": [\"@atomixstudio/mcp@latest\", \"--ds-id\", \"<your-ds-id>\"]\n }\n }\n}\n\\`\\`\\`\n\nGet your DS ID from: https://atomixstudio.eu/ds/[your-ds-id]`,\n }],\n };\n }\n\n const data = await fetchDesignSystemForMCP();\n const stats = getTokenStats(data);\n\n // Welcome resource\n if (uri === \"atomix://welcome\") {\n const welcome = generateWelcomeMessage(data, stats);\n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: welcome,\n }],\n };\n }\n\n // Rules resources\n const rulesMatch = uri.match(/^atomix:\\/\\/rules\\/(.+)$/);\n if (rulesMatch) {\n const tool = rulesMatch[1];\n if (!AI_TOOLS.includes(tool as typeof AI_TOOLS[number])) {\n throw new Error(`Unknown tool: ${tool}. Available: ${AI_TOOLS.join(\", \")}`);\n }\n\n // Fetch rules from API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n\n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n throw new Error(`Failed to fetch rules: ${response.status}`);\n }\n\n const rulesData = await response.json() as { content?: string; tool?: string };\n \n return {\n contents: [{\n uri,\n mimeType: \"text/markdown\",\n text: rulesData.content || JSON.stringify(rulesData, null, 2),\n }],\n };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n});\n\n// ============================================\n// PROMPTS - Auto-suggest welcome on connection\n// ============================================\n\nserver.setRequestHandler(ListPromptsRequestSchema, async () => {\n const prompts = [\n {\n name: \"welcome\",\n description: \"Get started with this design system - shows overview, available tokens, and tools. Run this first!\",\n },\n {\n name: \"design-system-rules\",\n description: \"Get the design system governance rules for your AI coding tool\",\n arguments: [\n {\n name: \"tool\",\n description: \"AI tool to generate rules for (cursor, copilot, windsurf, cline, continue, zed, generic)\",\n required: false,\n },\n ],\n },\n {\n name: \"spacing\",\n description: \"List all spacing tokens with their values in a table format\",\n },\n {\n name: \"radius\",\n description: \"List all border radius tokens with their values in a table format\",\n },\n {\n name: \"color\",\n description: \"List all color tokens with light/dark mode values in a table format\",\n },\n {\n name: \"typography\",\n description: \"List all typography tokens with their values in a table format\",\n },\n {\n name: \"shadow\",\n description: \"List all shadow/elevation tokens with their values in a table format\",\n },\n {\n name: \"border\",\n description: \"List all border width tokens with their values in a table format\",\n },\n {\n name: \"sizing\",\n description: \"List all sizing tokens (height, icon) with their values in a table format\",\n },\n {\n name: \"motion\",\n description: \"List all motion tokens (duration, easing) with their values in a table format\",\n },\n {\n name: \"sync\",\n description: \"Sync design tokens (./tokens.css). Safe: Adds new tokens, updates existing values, marks deprecated tokens. Supports formats: css, scss, less, json, ts, js, swift, kotlin, dart. Use /refactor to migrate deprecated tokens.\",\n },\n {\n name: \"refactor\",\n description: \"Migrate deprecated tokens in codebase. Scans for deprecated tokens marked by /sync and suggests replacements. Run after /sync to update code.\",\n },\n ];\n\n return { prompts };\n});\n\nserver.setRequestHandler(GetPromptRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n // Try to fetch design system, but handle gracefully if not configured\n // Force refresh for sync prompt to ensure we get latest data\n const shouldForceRefresh = name === \"sync\";\n let data: DesignSystemData | null = null;\n let stats: ReturnType<typeof getTokenStats> | null = null;\n \n try {\n data = await fetchDesignSystemForMCP(shouldForceRefresh);\n stats = getTokenStats(data);\n } catch (error) {\n // If design system fetch fails, return helpful error message\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\n \n if (errorMessage.includes(\"Missing --ds-id\")) {\n // Missing ds-id configuration\n return {\n description: \"MCP Server Configuration Required\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `The MCP server isn't configured. To use design system prompts, you need to configure the server with:\n- \\`--ds-id\\`: Your design system ID (required - get it from https://atomixstudio.eu/ds/[your-ds-id])\n- \\`--api-key\\`: Your API key (optional - only needed for private design systems)\n\n**Note:** Most design systems are public and don't require an API key. Only add \\`--api-key\\` if your design system is private.\n\nConfigure the MCP server in your Cursor settings, then restart Cursor.`,\n },\n },\n ],\n };\n } else if (errorMessage.includes(\"Failed to fetch\")) {\n // API fetch failed - show actual error details\n const statusMatch = errorMessage.match(/Failed to fetch design system: (\\d+) (.+)/);\n const status = statusMatch ? statusMatch[1] : \"unknown\";\n const details = statusMatch ? statusMatch[2] : errorMessage;\n \n let helpText = `**Error:** Failed to fetch design system from ${apiBase}/api/ds/${dsId}/tokens\\n\\n`;\n helpText += `**Status:** ${status}\\n`;\n helpText += `**Details:** ${details}\\n\\n`;\n \n if (status === \"404\") {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Design system ID \"${dsId}\" doesn't exist\\n`;\n helpText += `- API base URL \"${apiBase}\" is incorrect\\n`;\n helpText += `- Design system hasn't been published yet\\n\\n`;\n helpText += `**Solution:** Verify the design system ID and API base URL in your MCP server configuration.`;\n } else if (status === \"401\" || status === \"403\") {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Design system is private and requires an API key\\n`;\n helpText += `- API key is invalid or expired\\n\\n`;\n helpText += `**Solution:** Add \\`--api-key <your-key>\\` to your MCP server configuration.`;\n } else {\n helpText += `**Possible causes:**\\n`;\n helpText += `- Network connection issue\\n`;\n helpText += `- API server is down\\n`;\n helpText += `- CORS or firewall blocking the request\\n\\n`;\n helpText += `**Solution:** Check your network connection and verify the API base URL is accessible.`;\n }\n \n return {\n description: \"Design System Fetch Failed\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: helpText,\n },\n },\n ],\n };\n }\n // Re-throw other errors\n throw error;\n }\n\n // Helper to build category prompt with metadata and AI rules\n const buildCategoryPrompt = (category: string, instructions: string): string => {\n const lines: string[] = [];\n \n // Header with DS info\n lines.push(`## Design System Information`);\n lines.push(`- **Name**: ${data!.meta.name}`);\n lines.push(`- **Version**: ${data!.meta.version || \"1.0.0\"}`);\n lines.push(`- **Last Published**: ${data!.meta.exportedAt ? new Date(data!.meta.exportedAt).toLocaleDateString() : \"N/A\"}`);\n lines.push(``);\n \n // AI Rules for this category\n const categoryRules = data!.governance.categories?.[category];\n if (categoryRules && categoryRules.length > 0) {\n lines.push(`## AI Rules for ${category.charAt(0).toUpperCase() + category.slice(1)}`);\n categoryRules.forEach((rule: string, index: number) => {\n lines.push(`${index + 1}. ${rule}`);\n });\n lines.push(``);\n }\n \n // Instructions\n lines.push(`## Instructions`);\n lines.push(instructions);\n \n return lines.join(\"\\n\");\n };\n\n switch (name) {\n case \"welcome\": {\n const welcome = generateWelcomeMessage(data, stats);\n return {\n description: `Welcome to ${data.meta.name} Design System`,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: \"Show me the design system overview and available tools.\",\n },\n },\n {\n role: \"assistant\" as const,\n content: {\n type: \"text\" as const,\n text: welcome,\n },\n },\n ],\n };\n }\n\n case \"design-system-rules\": {\n const tool = (args?.tool as string) || \"cursor\";\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n\n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n throw new Error(`Failed to fetch rules: ${response.status}`);\n }\n\n const rulesData = await response.json() as { content?: string };\n \n return {\n description: `Design system rules for ${tool}`,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Show me the design system rules for ${tool}.`,\n },\n },\n {\n role: \"assistant\" as const,\n content: {\n type: \"text\" as const,\n text: rulesData.content || JSON.stringify(rulesData, null, 2),\n },\n },\n ],\n };\n }\n\n case \"spacing\": {\n const instructions = `List all spacing tokens in a table format. Use the listTokens tool with category \"spacing\" and subcategory \"scale\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"spacing.xs\" instead of \"spacing.scale.xs\").`;\n const response = {\n description: \"List all spacing tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"spacing\", instructions),\n },\n },\n ],\n };\n\n return response;\n }\n\n case \"radius\": {\n const instructions = `List all border radius tokens in a table format. Use the listTokens tool with category \"radius\" and subcategory \"scale\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"radius.sm\" instead of \"radius.scale.sm\").`;\n return {\n description: \"List all border radius tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"radius\", instructions),\n },\n },\n ],\n };\n }\n\n case \"color\": {\n const instructions = `List all color tokens in a table format showing both light and dark mode values. \n\nFirst, call listTokens with category \"colors\" and subcategory \"modes.light\" to get light mode colors.\nThen, call listTokens with category \"colors\" and subcategory \"modes.dark\" to get dark mode colors.\nAlso call listTokens with category \"colors\" and subcategory \"static.brand\" to get brand colors.\n\nFormat the response as a markdown table with columns: Token Name | Light Mode Value | Dark Mode Value | CSS Variable.\n\nFor brand colors (from static.brand), show the same value in both Light and Dark columns since brand colors don't change with mode.\nFor semantic colors (from modes.light/modes.dark), match tokens by name and show their respective values.\n\nThe Token Name should be in short format:\n- Brand colors: \"colors.brand.primary\" (not \"colors.static.brand.primary\")\n- Semantic colors: \"colors.bgSurface\" (not \"colors.modes.light.bgSurface\")`;\n return {\n description: \"List all color tokens with light/dark mode\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"colors\", instructions),\n },\n },\n ],\n };\n }\n\n case \"typography\": {\n const instructions = `List all typography tokens in a table format. Use the listTokens tool with category \"typography\" (no subcategory needed). Format the response as a markdown table with columns: Token Name | Value | CSS Variable. Group tokens by type (fontSize, fontWeight, lineHeight, etc.) with section headers.`;\n return {\n description: \"List all typography tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"typography\", instructions),\n },\n },\n ],\n };\n }\n\n case \"shadow\": {\n const instructions = `List all shadow/elevation tokens in a table format. Use the listTokens tool with category \"shadows\" and subcategory \"elevation\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"shadows.elevation.md\" is fine as-is).`;\n return {\n description: \"List all shadow/elevation tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"shadows\", instructions),\n },\n },\n ],\n };\n }\n\n case \"border\": {\n const instructions = `List all border width tokens in a table format. Use the listTokens tool with category \"borders\" and subcategory \"width\". Format the response as a markdown table with columns: Token Name | Value | CSS Variable. The Token Name should be in short format (e.g., \"borders.width.sm\" is fine as-is).`;\n return {\n description: \"List all border width tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"borders\", instructions),\n },\n },\n ],\n };\n }\n\n case \"sizing\": {\n const instructions = `List all sizing tokens in a table format. Call listTokens twice:\n1. category \"sizing\" and subcategory \"height\" for component heights\n2. category \"sizing\" and subcategory \"icon\" for icon sizes\n\nFormat the response as a markdown table with columns: Token Name | Value | CSS Variable. Group by type (height vs icon) with section headers.`;\n return {\n description: \"List all sizing tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"sizing\", instructions),\n },\n },\n ],\n };\n }\n\n case \"motion\": {\n const instructions = `List all motion tokens in a table format. Call listTokens twice:\n1. category \"motion\" and subcategory \"duration\" for duration tokens\n2. category \"motion\" and subcategory \"easing\" for easing tokens\n\nFormat the response as a markdown table with columns: Token Name | Value | CSS Variable. Group by type (duration vs easing) with section headers.`;\n return {\n description: \"List all motion tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildCategoryPrompt(\"motion\", instructions),\n },\n },\n ],\n };\n }\n\n case \"sync\": {\n // Use defaults - no arguments needed\n const output = (args?.output as string) || \"./tokens.css\";\n const format = (args?.format as string) || \"css\";\n \n \n // MCP prompts return messages that the AI interprets\n // Use a very direct, imperative instruction to call the tool\n const response = {\n description: `Sync design tokens to ${output}`,\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `Call the syncTokens tool now. Use output=\"${output}\" and format=\"${format}\". Execute immediately - do not search or ask questions.`,\n },\n },\n ],\n };\n \n \n return response;\n }\n\n case \"refactor\": {\n // Check if we have affected tokens from last sync\n if (!lastSyncAffectedTokens) {\n return {\n description: \"Refactor codebase for deprecated tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `No recent sync data available. Please run \\`/sync\\` first to update your token file, then run \\`/refactor\\` to scan your codebase for deprecated token usage.`,\n },\n },\n ],\n };\n }\n\n // Check if there are any deprecated tokens to refactor\n if (lastSyncAffectedTokens.removed.length === 0) {\n return {\n description: \"Refactor codebase for deprecated tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `✓ No deprecated tokens found in last sync.\\n\\nYour codebase is up to date! The last sync on ${new Date(lastSyncAffectedTokens.timestamp).toLocaleString()} did not remove any tokens.`,\n },\n },\n ],\n };\n }\n\n // Build the refactor instructions\n const format = lastSyncAffectedTokens.format;\n const isNativeFormat = [\"swift\", \"kotlin\", \"dart\"].includes(format);\n \n // Build search patterns based on format\n let searchPatterns = \"\";\n let fileExtensions = \"\";\n \n if (isNativeFormat) {\n // Native format patterns\n const nativeTokens = lastSyncAffectedTokens.removed.map(r => {\n // Convert CSS var name to native format\n // --atmx-color-brand-primary → colorBrandPrimary (Swift/Dart) or ColorBrandPrimary (Kotlin)\n const withoutPrefix = r.token.replace(/^--atmx-/, \"\");\n const camelCase = withoutPrefix.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n const pascalCase = camelCase.charAt(0).toUpperCase() + camelCase.slice(1);\n return { css: r.token, camel: camelCase, pascal: pascalCase, lastValue: r.lastValue };\n });\n \n if (format === \"swift\") {\n fileExtensions = \".swift files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.*.${t.camel}\\` (was: ${t.lastValue})`).join(\"\\n\");\n } else if (format === \"kotlin\") {\n fileExtensions = \".kt files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.*.${t.pascal}\\` (was: ${t.lastValue})`).join(\"\\n\");\n } else {\n fileExtensions = \".dart files\";\n searchPatterns = nativeTokens.map(t => ` • \\`DesignTokens.${t.camel}\\` (was: ${t.lastValue})`).join(\"\\n\");\n }\n } else {\n // Web format patterns (CSS, SCSS, Less, etc.)\n fileExtensions = \".tsx, .ts, .jsx, .js, .css, .scss, .less, .vue, .svelte files\";\n searchPatterns = lastSyncAffectedTokens.removed.map(r => \n ` • \\`var(${r.token})\\` or \\`\"${r.token}\"\\` (was: ${r.lastValue})`\n ).join(\"\\n\");\n }\n\n const instructions = `Scan the codebase for deprecated design tokens and help update them.\n\n## Deprecated Tokens (${lastSyncAffectedTokens.removed.length})\n\nThe following tokens have been removed from the design system:\n\n${searchPatterns}\n\n## Instructions\n\n1. **Search** for these patterns in ${fileExtensions}:\n - Skip node_modules, dist, build, .next, .git directories\n - Look for both \\`var(--token)\\` and direct string references\n\n2. **Report findings** in this format:\n \\`\\`\\`\n 📄 path/to/file.tsx\n Line 42: background: var(--atmx-color-deprecated);\n Line 78: const color = \"--atmx-color-deprecated\";\n \\`\\`\\`\n\n3. **After listing all findings**, ask:\n > \"Found X instances of deprecated tokens in Y files. Would you like me to update them?\"\n > \n > For each deprecated token, I'll suggest the closest equivalent from the current design system.\n\n4. **If user confirms**:\n - Show the proposed replacement for each instance\n - Apply changes only after user approves\n - For tokens with no clear replacement, ask user which token to use\n\n## Important\n\n- Do NOT make any changes without explicit user confirmation\n- Show before → after for each change\n- If you can't find a suitable replacement token, ask the user\n\n## Available Token Categories\n\nUse \\`/color\\`, \\`/spacing\\`, \\`/radius\\`, \\`/typography\\`, \\`/shadow\\`, \\`/border\\`, \\`/sizing\\`, \\`/motion\\` to see current tokens if you need to find replacements.`;\n\n return {\n description: \"Refactor codebase for deprecated tokens\",\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: instructions,\n },\n },\n ],\n };\n }\n\n default:\n throw new Error(`Unknown prompt: ${name}`);\n }\n});\n\nfunction generateWelcomeMessage(data: DesignSystemData, stats: ReturnType<typeof getTokenStats>): string {\n const toolsList = [\n \"getToken - Get a specific token by path\",\n \"listTokens - List all tokens in a category\",\n \"searchTokens - Search tokens by name or value\",\n \"validateUsage - Check if a CSS value follows the design system\",\n \"getAIToolRules - Generate AI coding rules for any tool\",\n \"exportMCPConfig - Generate MCP config for AI tools\",\n \"getSetupInstructions - Get setup guide for specific tools\",\n \"syncTokens - Sync tokens to a local file (css, scss, swift, kotlin, dart, etc.)\",\n ];\n\n const categoryBreakdown = Object.entries(stats.byCategory)\n .map(([cat, count]) => ` - ${cat}: ${count} tokens`)\n .join(\"\\n\");\n\n const asciiArt = `\n\\`\\`\\`\n ↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘↘ \n ↘↘↘↘↘↘↘↘↘↘↘ \n\\`\\`\\`\n`;\n\n return `${asciiArt}\n# Welcome to ${data.meta.name}\n\nYour design system is connected and ready to use.\n\n## Design System Overview\n\n| Metric | Value |\n|--------|-------|\n| Name | ${data.meta.name} |\n| DS ID | ${dsId} |\n| Total Tokens | ${stats.total} |\n| CSS Variables | ${stats.cssVariables} |\n| Governance Rules | ${stats.governanceRules} |\n| Version | ${data.meta.version || 1} |\n\n### Token Breakdown\n\n${categoryBreakdown}\n\n## Available Tools\n\n${toolsList.map((t, i) => `${i + 1}. **${t.split(\" - \")[0]}** - ${t.split(\" - \")[1]}`).join(\"\\n\")}\n\n## Quick Start\n\n### Get a Token\n\\`\\`\\`\nUse getToken with path \"colors.static.brand.primary\"\n\\`\\`\\`\n\n### List All Spacing Tokens\n\\`\\`\\`\nUse listTokens with category \"spacing\"\n\\`\\`\\`\n\n### Validate a Hardcoded Value\n\\`\\`\\`\nUse validateUsage with value \"#ff0000\" and context \"color\"\n\\`\\`\\`\n\n## Resources Available\n\nThis MCP server exposes rules files as resources that your AI tool can read:\n\n| Resource | Description |\n|----------|-------------|\n| \\`atomix://welcome\\` | This welcome message |\n| \\`atomix://rules/cursor\\` | .cursorrules file content |\n| \\`atomix://rules/copilot\\` | GitHub Copilot instructions |\n| \\`atomix://rules/windsurf\\` | .windsurfrules file content |\n| \\`atomix://rules/cline\\` | .clinerules file content |\n| \\`atomix://rules/continue\\` | Continue rules |\n| \\`atomix://rules/zed\\` | Zed assistant rules |\n| \\`atomix://rules/generic\\` | Generic AI guidelines |\n\n## Checking for Updates\n\nYour design system may be updated over time. To ensure you have the latest tokens:\n\n1. **Check version**: The current version is ${data.meta.version || 1}\n2. **Refresh tokens**: Restart the MCP server to fetch latest tokens\n3. **View changes**: Visit https://atomixstudio.eu/ds/${dsId} to see recent changes\n\n---\n\n*Powered by Atomix Studio - https://atomixstudio.eu*\n`;\n}\n\n// ============================================\n// START SERVER\n// ============================================\n\nasync function startServer() {\n if (!dsId) {\n console.error(\"Error: Missing --ds-id argument\");\n console.error(\"Usage: npx atomix --ds-id <id> [--api-key <key>]\");\n console.error(\"Note: --api-key is optional (only needed for private design systems)\");\n console.error(\"\");\n console.error(\"For sync command: npx atomix sync --help\");\n console.error(\"Get your DS ID from https://atomixstudio.eu/ds/[your-ds-id]\");\n process.exit(1);\n }\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log to stderr so it doesn't interfere with MCP protocol on stdout\n console.error(`Atomix MCP Server started for design system: ${dsId}`);\n}\n\n// Start MCP server (no CLI commands - this is MCP-only)\nasync function main() {\n await startServer();\n}\n\nmain().catch((error) => {\n console.error(\"Failed:\", error);\n process.exit(1);\n});\n\n","/**\n * Fetch Design System Data\n * \n * Handles fetching design system tokens from API with ETag support.\n */\n\nimport type { DesignSystemData, ExportedTokens, FetchOptions, FetchResult, ChangeSummary } from './types.js';\n\n/**\n * Generate ETag from design system metadata\n */\nexport function generateETag(meta: { version: number; updatedAt?: string; exportedAt?: string }): string {\n const ts = meta.updatedAt ?? meta.exportedAt ?? \"\";\n const hash = `${meta.version}-${ts}`;\n return `\"v${hash}\"`; // ETag format: \"v1.0-2024-01-01T00:00:00Z\"\n}\n\n/**\n * Compare two design systems and return change summary\n */\nexport function compareDesignSystems(\n cached: DesignSystemData,\n fresh: DesignSystemData\n): ChangeSummary {\n const changes: ChangeSummary = {\n hasChanges: false,\n versionChanged: false,\n timestampChanged: false,\n addedTokens: [],\n removedTokens: [],\n modifiedTokens: [],\n governanceChanged: false,\n summary: \"\",\n };\n\n // Compare metadata\n if (cached.meta.version !== fresh.meta.version) {\n changes.versionChanged = true;\n changes.hasChanges = true;\n }\n\n if (cached.meta.exportedAt !== fresh.meta.exportedAt) {\n changes.timestampChanged = true;\n changes.hasChanges = true;\n }\n\n // Compare CSS variables (includes all tokens: spacing, typography, colors, etc.)\n const cachedVars = Object.keys(cached.cssVariables);\n const freshVars = Object.keys(fresh.cssVariables);\n\n // Find added tokens (all categories)\n for (const varName of freshVars) {\n if (!(varName in cached.cssVariables)) {\n changes.addedTokens.push(varName);\n changes.hasChanges = true;\n }\n }\n\n // Find removed tokens (all categories)\n for (const varName of cachedVars) {\n if (!(varName in fresh.cssVariables)) {\n changes.removedTokens.push(varName);\n changes.hasChanges = true;\n }\n }\n\n // Find modified tokens (all categories)\n for (const varName of cachedVars) {\n if (varName in fresh.cssVariables) {\n const oldValue = cached.cssVariables[varName];\n const newValue = fresh.cssVariables[varName];\n if (oldValue !== newValue) {\n changes.modifiedTokens.push({\n token: varName,\n oldValue,\n newValue,\n });\n changes.hasChanges = true;\n }\n }\n }\n\n // Compare dark mode colors (stored separately in tokens.colors.modes.dark)\n // These are NOT in cssVariables, so we need to compare them separately\n const cachedDark = (cached.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n const freshDark = (fresh.tokens?.colors as Record<string, unknown>)?.modes as { dark?: Record<string, string> } | undefined;\n \n const cachedDarkColors = cachedDark?.dark || {};\n const freshDarkColors = freshDark?.dark || {};\n \n const cachedDarkKeys = Object.keys(cachedDarkColors);\n const freshDarkKeys = Object.keys(freshDarkColors);\n\n // Detect CSS variable prefix from existing cssVariables (fallback to --atmx-color-)\n const firstColorVar = cachedVars.find(v => v.includes(\"-color-\")) || freshVars.find(v => v.includes(\"-color-\"));\n const prefixMatch = firstColorVar?.match(/^(--[a-z]+-color-)/);\n const colorPrefix = prefixMatch ? prefixMatch[1] : \"--atmx-color-\";\n\n // Find added dark mode colors\n for (const key of freshDarkKeys) {\n if (!(key in cachedDarkColors)) {\n const cssVarName = `${colorPrefix}${key}`;\n // Only add if not already in the list (avoid duplicates)\n if (!changes.addedTokens.includes(cssVarName)) {\n changes.addedTokens.push(cssVarName);\n changes.hasChanges = true;\n }\n }\n }\n\n // Find removed dark mode colors\n for (const key of cachedDarkKeys) {\n if (!(key in freshDarkColors)) {\n const cssVarName = `${colorPrefix}${key}`;\n if (!changes.removedTokens.includes(cssVarName)) {\n changes.removedTokens.push(cssVarName);\n changes.hasChanges = true;\n }\n }\n }\n\n // Find modified dark mode colors\n for (const key of cachedDarkKeys) {\n if (key in freshDarkColors) {\n const oldValue = cachedDarkColors[key];\n const newValue = freshDarkColors[key];\n if (oldValue !== newValue) {\n const cssVarName = `${colorPrefix}${key}`;\n // Check if we already have this token in modified list (might be a light mode change too)\n const existingIndex = changes.modifiedTokens.findIndex(m => m.token === cssVarName);\n if (existingIndex >= 0) {\n // Update existing entry to show both light and dark changes\n changes.modifiedTokens[existingIndex].oldValue += ` | dark: ${oldValue}`;\n changes.modifiedTokens[existingIndex].newValue += ` | dark: ${newValue}`;\n } else {\n // Add new dark mode-only change\n changes.modifiedTokens.push({\n token: `${cssVarName} (dark mode)`,\n oldValue,\n newValue,\n });\n changes.hasChanges = true;\n }\n }\n }\n }\n\n // Compare governance rules (AI guide changes)\n // Compare both the rules array and categories object\n const cachedGovernance = cached.governance || { rules: [], categories: {} };\n const freshGovernance = fresh.governance || { rules: [], categories: {} };\n \n const cachedRules = cachedGovernance.rules || [];\n const freshRules = freshGovernance.rules || [];\n const cachedCategories = cachedGovernance.categories || {};\n const freshCategories = freshGovernance.categories || {};\n \n // Compare rules array (deep comparison)\n const cachedRulesStr = JSON.stringify(cachedRules.sort());\n const freshRulesStr = JSON.stringify(freshRules.sort());\n \n // Compare categories object (deep comparison)\n const cachedCategoriesStr = JSON.stringify(cachedCategories, Object.keys(cachedCategories).sort());\n const freshCategoriesStr = JSON.stringify(freshCategories, Object.keys(freshCategories).sort());\n \n if (cachedRulesStr !== freshRulesStr || cachedCategoriesStr !== freshCategoriesStr) {\n changes.governanceChanged = true;\n changes.hasChanges = true;\n }\n\n // Build summary text\n const summaryLines: string[] = [];\n \n if (!changes.hasChanges) {\n summaryLines.push(\"✓ No changes detected - design system is up to date\");\n } else {\n summaryLines.push(\"📦 Design System Changes Detected:\");\n summaryLines.push(\"\");\n\n if (changes.versionChanged) {\n summaryLines.push(` Version: ${cached.meta.version} → ${fresh.meta.version}`);\n }\n\n if (changes.timestampChanged) {\n const cachedDate = new Date(cached.meta.exportedAt).toLocaleString();\n const freshDate = new Date(fresh.meta.exportedAt).toLocaleString();\n summaryLines.push(` Published: ${cachedDate} → ${freshDate}`);\n }\n\n if (changes.addedTokens.length > 0) {\n summaryLines.push(` ➕ Added: ${changes.addedTokens.length} token(s)`);\n if (changes.addedTokens.length <= 10) {\n changes.addedTokens.forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n } else {\n changes.addedTokens.slice(0, 10).forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n summaryLines.push(` ... and ${changes.addedTokens.length - 10} more`);\n }\n }\n\n if (changes.removedTokens.length > 0) {\n summaryLines.push(` ➖ Removed: ${changes.removedTokens.length} token(s)`);\n if (changes.removedTokens.length <= 10) {\n changes.removedTokens.forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n } else {\n changes.removedTokens.slice(0, 10).forEach(token => {\n summaryLines.push(` - ${token}`);\n });\n summaryLines.push(` ... and ${changes.removedTokens.length - 10} more`);\n }\n }\n\n if (changes.modifiedTokens.length > 0) {\n summaryLines.push(` 🔄 Modified: ${changes.modifiedTokens.length} token(s)`);\n if (changes.modifiedTokens.length <= 10) {\n changes.modifiedTokens.forEach(({ token, oldValue, newValue }) => {\n summaryLines.push(` ${token}:`);\n summaryLines.push(` - ${oldValue}`);\n summaryLines.push(` + ${newValue}`);\n });\n } else {\n changes.modifiedTokens.slice(0, 5).forEach(({ token, oldValue, newValue }) => {\n summaryLines.push(` ${token}:`);\n summaryLines.push(` - ${oldValue}`);\n summaryLines.push(` + ${newValue}`);\n });\n summaryLines.push(` ... and ${changes.modifiedTokens.length - 5} more`);\n }\n }\n\n if (changes.governanceChanged) {\n summaryLines.push(` 📝 AI guide updated`);\n }\n }\n\n changes.summary = summaryLines.join(\"\\n\");\n return changes;\n}\n\n/**\n * Detect which foundations have governance changes\n * \n * Compares cached vs fresh governance data and returns an array of foundation names\n * that have changed (e.g., [\"general\", \"colors\", \"typography\"]).\n * \n * @param cached - Previously cached design system data\n * @param fresh - Freshly fetched design system data\n * @returns Array of foundation names that have governance changes\n */\nexport function detectGovernanceChangesByFoundation(\n cached: DesignSystemData,\n fresh: DesignSystemData\n): string[] {\n const changes: string[] = [];\n \n const cachedGov = cached.governance || { rules: [], categories: {} };\n const freshGov = fresh.governance || { rules: [], categories: {} };\n \n // Check general rules (rules array)\n const cachedRulesStr = JSON.stringify((cachedGov.rules || []).sort());\n const freshRulesStr = JSON.stringify((freshGov.rules || []).sort());\n if (cachedRulesStr !== freshRulesStr) {\n changes.push(\"general\");\n }\n \n // Check foundation-specific rules (categories object)\n const cachedCategories = cachedGov.categories || {};\n const freshCategories = freshGov.categories || {};\n \n const allFoundationKeys = new Set([\n ...Object.keys(cachedCategories),\n ...Object.keys(freshCategories),\n ]);\n \n for (const foundation of allFoundationKeys) {\n const cachedRules = cachedCategories[foundation] || [];\n const freshRules = freshCategories[foundation] || [];\n const cachedRulesStr = JSON.stringify(cachedRules.sort());\n const freshRulesStr = JSON.stringify(freshRules.sort());\n \n if (cachedRulesStr !== freshRulesStr) {\n changes.push(foundation);\n }\n }\n \n return changes;\n}\n\n/**\n * Fetch design system from API with ETag support\n */\nexport async function fetchDesignSystem(options: FetchOptions): Promise<FetchResult> {\n const { dsId, apiKey, apiBase = \"https://atomixstudio.eu\", etag, forceRefresh = false } = options;\n\n if (!dsId) {\n throw new Error(\"Missing dsId. Usage: fetchDesignSystem({ dsId: '...' })\");\n }\n\n const url = `${apiBase}/api/ds/${dsId}/tokens?format=export`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n \n if (apiKey) {\n headers[\"x-api-key\"] = apiKey;\n }\n \n // Send If-None-Match if we have cached ETag\n if (etag) {\n headers[\"if-none-match\"] = etag;\n }\n\n const response = await fetch(url, { headers });\n \n if (response.status === 304) {\n // Not Modified - return null data, same ETag\n return {\n data: null,\n etag: etag!,\n status: 304,\n };\n }\n \n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to fetch design system: ${response.status} ${text}`);\n }\n\n const data = await response.json() as ExportedTokens;\n \n // Extract ETag from response header or generate from meta\n const responseETag = response.headers.get('etag');\n const finalETag = responseETag || generateETag(data.meta);\n \n // Transform to DesignSystemData format\n const designSystemData: DesignSystemData = {\n tokens: data.tokens,\n cssVariables: data.cssVariables,\n governance: data.governance,\n meta: data.meta,\n };\n \n return {\n data: designSystemData,\n etag: finalETag,\n status: 200,\n };\n}\n","/**\n * Diff Logic\n * \n * Functions for comparing token files and detecting changes.\n */\n\nimport type { OutputFormat, DiffResult } from './types.js';\n\nexport function diffTokens(\n oldContent: string,\n newCssVars: Record<string, string>,\n format: OutputFormat,\n newDarkVars?: Record<string, string>\n): DiffResult {\n const added: string[] = [];\n const modified: Array<{ key: string; old: string; new: string }> = [];\n const removed: string[] = [];\n const addedDark: string[] = [];\n const modifiedDark: Array<{ key: string; old: string; new: string }> = [];\n const removedDark: string[] = [];\n\n // CSS-based formats (css, scss, less) all use CSS variables\n if (format === \"css\" || format === \"scss\" || format === \"less\") {\n // Split old content into light mode (:root) and dark mode (.dark) sections\n // Find the :root section\n const rootMatch = oldContent.match(/:root\\s*\\{([^}]*)\\}/);\n const darkMatch = oldContent.match(/\\.dark[^{]*\\{([^}]*)\\}/);\n \n // Parse light mode variables from :root\n const oldLightVars: Record<string, string> = {};\n if (rootMatch) {\n const rootContent = rootMatch[1];\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(rootContent)) !== null) {\n oldLightVars[match[1]] = match[2].trim();\n }\n } else {\n // Fallback: parse everything (old behavior for files without sections)\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(oldContent)) !== null) {\n // Only take the first occurrence to get light mode values\n if (!(match[1] in oldLightVars)) {\n oldLightVars[match[1]] = match[2].trim();\n }\n }\n }\n\n // Parse dark mode variables from .dark\n const oldDarkVars: Record<string, string> = {};\n if (darkMatch) {\n const darkContent = darkMatch[1];\n const varRegex = /(--[\\w-]+):\\s*([^;]+);/g;\n let match;\n while ((match = varRegex.exec(darkContent)) !== null) {\n oldDarkVars[match[1]] = match[2].trim();\n }\n }\n\n // Compare light mode\n for (const [key, value] of Object.entries(newCssVars)) {\n if (!(key in oldLightVars)) {\n added.push(key);\n } else if (oldLightVars[key] !== value) {\n modified.push({ key, old: oldLightVars[key], new: value });\n }\n }\n\n for (const key of Object.keys(oldLightVars)) {\n if (!(key in newCssVars)) {\n removed.push(key);\n }\n }\n\n // Compare dark mode if new dark vars provided\n if (newDarkVars && Object.keys(newDarkVars).length > 0) {\n // Generate the expected CSS variable names for dark mode\n // newDarkVars keys are like \"bg-page\", need to match \"--atmx-color-bg-page\"\n const firstKey = Object.keys(newCssVars)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n\n for (const [key, value] of Object.entries(newDarkVars)) {\n const cssVarName = `${prefix}color-${key}`;\n if (!(cssVarName in oldDarkVars)) {\n addedDark.push(cssVarName);\n } else if (oldDarkVars[cssVarName] !== value) {\n modifiedDark.push({ key: cssVarName, old: oldDarkVars[cssVarName], new: value });\n }\n }\n\n for (const key of Object.keys(oldDarkVars)) {\n // Extract the short key from --atmx-color-bg-page -> bg-page\n const shortKey = key.replace(new RegExp(`^${prefix}color-`), \"\");\n if (!(shortKey in newDarkVars)) {\n removedDark.push(key);\n }\n }\n }\n }\n\n return { added, modified, removed, addedDark, modifiedDark, removedDark };\n}\n","/**\n * Rules File Syncing\n * \n * Functions for syncing AI tool rules files.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nexport interface SyncRulesOptions {\n dsId: string;\n apiKey?: string;\n apiBase?: string;\n rulesDir?: string;\n}\n\nexport interface RulesFileResult {\n tool: string;\n filename: string;\n path: string;\n success: boolean;\n error?: string;\n}\n\nexport async function syncRulesFiles(options: SyncRulesOptions): Promise<RulesFileResult[]> {\n const { dsId, apiKey, apiBase = \"https://atomixstudio.eu\", rulesDir = process.cwd() } = options;\n \n const rulesDirResolved = path.resolve(process.cwd(), rulesDir);\n \n // Detect which AI tools are likely in use based on existing files\n const toolsToSync: Array<{ tool: string; filename: string; dir?: string }> = [\n { tool: \"cursor\", filename: \".cursorrules\" },\n { tool: \"windsurf\", filename: \".windsurfrules\" },\n { tool: \"cline\", filename: \".clinerules\" },\n { tool: \"continue\", filename: \".continuerules\" },\n { tool: \"copilot\", filename: \"copilot-instructions.md\", dir: \".github\" },\n { tool: \"generic\", filename: \"AI_GUIDELINES.md\" },\n ];\n \n // Check which tools have existing files or should be created\n const existingTools = toolsToSync.filter(t => {\n const filePath = t.dir \n ? path.join(rulesDirResolved, t.dir, t.filename)\n : path.join(rulesDirResolved, t.filename);\n return fs.existsSync(filePath);\n });\n \n // If no existing rules files, create .cursorrules by default\n const toolsToWrite = existingTools.length > 0 \n ? existingTools \n : [{ tool: \"cursor\", filename: \".cursorrules\" }];\n \n const results: RulesFileResult[] = [];\n \n for (const { tool, filename, dir } of toolsToWrite) {\n try {\n // Fetch rules from API\n const rulesUrl = `${apiBase}/api/ds/${dsId}/rules?format=${tool}`;\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (apiKey) headers[\"x-api-key\"] = apiKey;\n \n const response = await fetch(rulesUrl, { headers });\n if (!response.ok) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: `Failed to fetch ${tool} rules: ${response.status}`,\n });\n continue;\n }\n \n const rulesData = await response.json() as { content?: string };\n if (!rulesData.content) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: `No content for ${tool} rules`,\n });\n continue;\n }\n \n // Write the file\n const targetDir = dir ? path.join(rulesDirResolved, dir) : rulesDirResolved;\n if (!fs.existsSync(targetDir)) {\n fs.mkdirSync(targetDir, { recursive: true });\n }\n \n const filePath = path.join(targetDir, filename);\n fs.writeFileSync(filePath, rulesData.content);\n \n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: true,\n });\n } catch (error) {\n results.push({\n tool,\n filename,\n path: dir ? `${dir}/${filename}` : filename,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n \n return results;\n}\n","/**\n * CSS Format Generator\n * \n * Generates CSS output with CSS custom properties and dark mode support.\n */\n\nexport function generateCSSOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"/* Atomix Design System Tokens\",\n \" * Auto-generated - do not edit manually\",\n ` * Synced: ${new Date().toISOString()}`,\n \" *\",\n \" * WARNING: This file is completely rewritten on each sync.\",\n \" * Only CSS custom properties (variables) are preserved.\",\n \" * Custom CSS rules (selectors, classes, etc.) will be lost.\",\n \" * Keep custom CSS in a separate file.\",\n \" */\",\n \"\",\n \"/* Light mode (default) */\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` /* DEPRECATED */ ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode overrides if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"/* Dark mode */\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n // Detect prefix from cssVariables keys\n const firstKey = sortedKeys[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n // Sort dark mode keys for consistent output\n const sortedDarkKeys = Object.keys(darkModeColors).sort();\n for (const key of sortedDarkKeys) {\n // Dark mode colors are stored with keys like \"bg-page\", \"text-primary\"\n // Convert to CSS variable names: --atmx-color-bg-page\n lines.push(` ${prefix}color-${key}: ${darkModeColors[key]};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * SCSS Format Generator\n * \n * Generates SCSS output with CSS variables and SCSS variables.\n */\n\nexport function generateSCSSOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"// CSS Custom Properties (for use in CSS/HTML)\",\n \"// Light mode (default)\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` // DEPRECATED ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode CSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Dark mode\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n const firstKey = sortedKeys[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n lines.push(\"// SCSS Variables (light mode values)\");\n \n // Include deprecated tokens in SCSS variables too\n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n const scssVar = \"$\" + key.replace(/^--/, \"\");\n if (deprecated) {\n lines.push(`// DEPRECATED ${scssVar}: ${value};`);\n } else {\n lines.push(`${scssVar}: ${value};`);\n }\n }\n \n // Add dark mode SCSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// SCSS Variables (dark mode values)\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^--([a-z]+)-/);\n const prefix = prefixMatch ? prefixMatch[1] : \"atmx\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const scssVar = `$${prefix}-color-${key}-dark`;\n lines.push(`${scssVar}: ${value};`);\n }\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * Less Format Generator\n * \n * Generates Less output with CSS variables and Less variables.\n */\n\nexport function generateLessOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"// CSS Custom Properties (for use in CSS/HTML)\",\n \"// Light mode (default)\",\n \":root {\"\n ];\n \n // Merge current and deprecated tokens, then sort\n const allVars = new Map<string, { value: string; deprecated: boolean }>();\n \n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n allVars.set(key, { value, deprecated: false });\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n allVars.set(key, { value, deprecated: true });\n }\n \n // Sort all variables by name\n const sortedKeys = Array.from(allVars.keys()).sort();\n \n for (const key of sortedKeys) {\n const { value, deprecated } = allVars.get(key)!;\n if (deprecated) {\n lines.push(` // DEPRECATED ${key}: ${value};`);\n } else {\n lines.push(` ${key}: ${value};`);\n }\n }\n \n lines.push(\"}\");\n \n // Add dark mode CSS variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Dark mode\");\n lines.push(\".dark,\");\n lines.push(\"[data-theme=\\\"dark\\\"] {\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^(--[a-z]+-)/);\n const prefix = prefixMatch ? prefixMatch[1] : \"--atmx-\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n lines.push(` ${prefix}color-${key}: ${value};`);\n }\n \n lines.push(\"}\");\n }\n \n lines.push(\"\");\n lines.push(\"// Less Variables (light mode values)\");\n \n for (const [key, value] of Object.entries(cssVariables)) {\n const lessVar = \"@\" + key.replace(/^--/, \"\");\n lines.push(`${lessVar}: ${value};`);\n }\n \n // Add dark mode Less variables\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\"// Less Variables (dark mode values)\");\n \n const firstKey = Object.keys(cssVariables)[0] || \"--atmx-\";\n const prefixMatch = firstKey.match(/^--([a-z]+)-/);\n const prefix = prefixMatch ? prefixMatch[1] : \"atmx\";\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const lessVar = `@${prefix}-color-${key}-dark`;\n lines.push(`${lessVar}: ${value};`);\n }\n }\n \n lines.push(\"\");\n \n return lines.join(\"\\n\");\n}\n","/**\n * JSON Format Generator\n * \n * Generates JSON output with raw token structure.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateJSONOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return JSON.stringify(tokens, null, 2);\n}\n","/**\n * TypeScript Format Generator\n * \n * Generates TypeScript output with types.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateTSOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return `// Atomix Design System Tokens\n// Auto-generated - do not edit manually\n// Synced: ${new Date().toISOString()}\n\nexport const tokens = ${JSON.stringify(tokens, null, 2)} as const;\n\nexport type Tokens = typeof tokens;\n`;\n}\n","/**\n * JavaScript Format Generator\n * \n * Generates JavaScript ES module output.\n */\n\nimport type { ExportedTokens } from '../types.js';\n\nexport function generateJSOutput(tokens: ExportedTokens[\"tokens\"]): string {\n return `// Atomix Design System Tokens\n// Auto-generated - do not edit manually\n// Synced: ${new Date().toISOString()}\n\nexport const tokens = ${JSON.stringify(tokens, null, 2)};\n`;\n}\n","/**\n * Swift Format Generator\n * \n * Generates Swift/SwiftUI output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n // --atmx-color-brand-primary → colorBrandPrimary\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToSwiftColor(hex: string): string {\n // #RRGGBB or #RRGGBBAA\n const clean = hex.replace(\"#\", \"\");\n if (clean.length === 3) {\n // #RGB -> #RRGGBB\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(hex: 0x${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(hex: 0x${clean})`;\n }\n if (clean.length === 8) {\n // #RRGGBBAA\n const rgb = clean.substring(0, 6);\n const alpha = parseInt(clean.substring(6, 8), 16) / 255;\n return `Color(hex: 0x${rgb}).opacity(${alpha.toFixed(2)})`;\n }\n return `Color.clear // Could not parse: ${hex}`;\n}\n\nexport function generateSwiftOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"import SwiftUI\",\n \"\",\n \"// MARK: - Color Extension for Hex\",\n \"extension Color {\",\n \" init(hex: UInt, alpha: Double = 1.0) {\",\n \" self.init(\",\n \" .sRGB,\",\n \" red: Double((hex >> 16) & 0xFF) / 255.0,\",\n \" green: Double((hex >> 8) & 0xFF) / 255.0,\",\n \" blue: Double(hex & 0xFF) / 255.0,\",\n \" opacity: alpha\",\n \" )\",\n \" }\",\n \"}\",\n \"\",\n \"// MARK: - Design Tokens\",\n \"enum DesignTokens {\",\n \"\",\n \" // MARK: Colors (Light Mode)\",\n \" enum Colors {\"\n ];\n\n // Group by category, including deprecated tokens\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toSwiftName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n } else {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n }\n }\n }\n\n lines.push(\" }\");\n \n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // MARK: Colors (Dark Mode)\");\n lines.push(\" enum ColorsDark {\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n }\n }\n \n lines.push(\" }\");\n }\n \n lines.push(\"\");\n lines.push(\" // MARK: Spacing\");\n lines.push(\" enum Spacing {\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toSwiftName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n } else {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" // MARK: Typography\");\n lines.push(\" enum Typography {\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toSwiftName(key);\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n }\n } else if (key.includes(\"weight\")) {\n lines.push(` static let ${name} = \"${value}\"`);\n } else if (key.includes(\"family\")) {\n lines.push(` static let ${name} = \"${value}\"`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" // MARK: Other\");\n lines.push(\" enum Other {\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toSwiftName(key);\n if (isDeprecated) {\n lines.push(` @available(*, deprecated, message: \"This token has been removed from the design system\")`);\n }\n if (isColorValue(value)) {\n lines.push(` static let ${name} = ${hexToSwiftColor(value)}`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static let ${name}: CGFloat = ${numValue}`);\n } else {\n lines.push(` static let ${name} = \"${value}\"`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Kotlin Format Generator\n * \n * Generates Kotlin/Jetpack Compose output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toKotlinName(cssVar: string): string {\n // --atmx-color-brand-primary → ColorBrandPrimary\n const camel = toSwiftName(cssVar);\n return camel.charAt(0).toUpperCase() + camel.slice(1);\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToKotlinColor(hex: string): string {\n const clean = hex.replace(\"#\", \"\").toUpperCase();\n if (clean.length === 3) {\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(0xFF${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(0xFF${clean})`;\n }\n if (clean.length === 8) {\n // RRGGBBAA -> AARRGGBB for Android\n const rgb = clean.substring(0, 6);\n const alpha = clean.substring(6, 8);\n return `Color(0x${alpha}${rgb})`;\n }\n return `Color.Transparent // Could not parse: ${hex}`;\n}\n\nexport function generateKotlinOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"package com.atomix.design\",\n \"\",\n \"import androidx.compose.ui.graphics.Color\",\n \"import androidx.compose.ui.unit.dp\",\n \"import androidx.compose.ui.unit.sp\",\n \"\",\n \"object DesignTokens {\",\n \"\",\n \" // Light mode colors\",\n \" object Colors {\"\n ];\n\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toKotlinName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n } else {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n }\n }\n }\n\n lines.push(\" }\");\n \n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // Dark mode colors\");\n lines.push(\" object ColorsDark {\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `Color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}`;\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n }\n }\n \n lines.push(\" }\");\n }\n \n lines.push(\"\");\n lines.push(\" object Spacing {\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toKotlinName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n lines.push(` val ${name} = ${numValue}.dp`);\n } else {\n lines.push(` val ${name} = ${numValue}.dp`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" object Typography {\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toKotlinName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.sp`);\n }\n } else {\n lines.push(` const val ${name} = \"${value}\"`);\n }\n }\n\n lines.push(\" }\");\n lines.push(\"\");\n lines.push(\" object Other {\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toKotlinName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated(\"This token has been removed from the design system\")`);\n }\n if (isColorValue(value)) {\n lines.push(` val ${name} = ${hexToKotlinColor(value)}`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` val ${name} = ${numValue}.dp`);\n } else {\n lines.push(` const val ${name} = \"${value}\"`);\n }\n }\n }\n\n lines.push(\" }\");\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Dart Format Generator\n * \n * Generates Dart/Flutter output with dark mode support.\n */\n\n// Helper functions\nfunction toSwiftName(cssVar: string): string {\n return cssVar\n .replace(/^--atmx-/, \"\")\n .replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\nfunction toDartName(cssVar: string): string {\n // --atmx-color-brand-primary → colorBrandPrimary (same as Swift)\n return toSwiftName(cssVar);\n}\n\nfunction isColorValue(value: string): boolean {\n return /^#[0-9A-Fa-f]{3,8}$/.test(value) || \n /^rgb/.test(value) || \n /^hsl/.test(value);\n}\n\nfunction hexToDartColor(hex: string): string {\n const clean = hex.replace(\"#\", \"\").toUpperCase();\n if (clean.length === 3) {\n const r = clean[0], g = clean[1], b = clean[2];\n return `Color(0xFF${r}${r}${g}${g}${b}${b})`;\n }\n if (clean.length === 6) {\n return `Color(0xFF${clean})`;\n }\n if (clean.length === 8) {\n const rgb = clean.substring(0, 6);\n const alpha = clean.substring(6, 8);\n return `Color(0x${alpha}${rgb})`;\n }\n return `Colors.transparent // Could not parse: ${hex}`;\n}\n\nexport function generateDartOutput(\n cssVariables: Record<string, string>,\n darkModeColors?: Record<string, string>,\n deprecatedTokens: Map<string, string> = new Map()\n): string {\n const lines = [\n \"// Atomix Design System Tokens\",\n \"// Auto-generated - do not edit manually\",\n `// Synced: ${new Date().toISOString()}`,\n \"\",\n \"import 'package:flutter/material.dart';\",\n \"\",\n \"class DesignTokens {\",\n \" DesignTokens._();\",\n \"\",\n \" // Colors (Light Mode)\"\n ];\n\n const colors: Array<[string, string, boolean]> = [];\n const spacing: Array<[string, string, boolean]> = [];\n const typography: Array<[string, string, boolean]> = [];\n const other: Array<[string, string, boolean]> = [];\n\n // Add current tokens\n for (const [key, value] of Object.entries(cssVariables)) {\n const isDeprecated = false;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n \n // Add deprecated tokens\n for (const [key, value] of deprecatedTokens.entries()) {\n const isDeprecated = true;\n if (key.includes(\"-color-\")) colors.push([key, value, isDeprecated]);\n else if (key.includes(\"-spacing-\")) spacing.push([key, value, isDeprecated]);\n else if (key.includes(\"-typography-\") || key.includes(\"-font-\")) typography.push([key, value, isDeprecated]);\n else other.push([key, value, isDeprecated]);\n }\n\n // Sort by key name\n colors.sort((a, b) => a[0].localeCompare(b[0]));\n spacing.sort((a, b) => a[0].localeCompare(b[0]));\n typography.sort((a, b) => a[0].localeCompare(b[0]));\n other.sort((a, b) => a[0].localeCompare(b[0]));\n\n for (const [key, value, isDeprecated] of colors) {\n const name = toDartName(key);\n if (isColorValue(value)) {\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n } else {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n }\n }\n }\n\n // Add dark mode colors if provided\n if (darkModeColors && Object.keys(darkModeColors).length > 0) {\n lines.push(\"\");\n lines.push(\" // Colors (Dark Mode)\");\n \n for (const [key, value] of Object.entries(darkModeColors)) {\n const name = `color${key.split(\"-\").map(s => s.charAt(0).toUpperCase() + s.slice(1)).join(\"\")}Dark`;\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Spacing\");\n\n for (const [key, value, isDeprecated] of spacing) {\n const name = toDartName(key);\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n lines.push(` static const double ${name} = ${numValue};`);\n } else {\n lines.push(` static const double ${name} = ${numValue};`);\n }\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Typography\");\n\n for (const [key, value, isDeprecated] of typography) {\n const name = toDartName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n }\n if (key.includes(\"size\")) {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n }\n } else {\n lines.push(` static const String ${name} = '${value}';`);\n }\n }\n\n lines.push(\"\");\n lines.push(\" // Other\");\n\n for (const [key, value, isDeprecated] of other) {\n const name = toDartName(key);\n if (isDeprecated) {\n lines.push(` @Deprecated('This token has been removed from the design system')`);\n }\n if (isColorValue(value)) {\n lines.push(` static const ${name} = ${hexToDartColor(value)};`);\n } else {\n const numValue = parseFloat(value);\n if (!isNaN(numValue)) {\n lines.push(` static const double ${name} = ${numValue};`);\n } else {\n lines.push(` static const String ${name} = '${value}';`);\n }\n }\n }\n\n lines.push(\"}\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n","/**\n * Format sync response for CLI and MCP\n * \n * Single source of truth for sync output formatting.\n * This ensures MCP and CLI have identical response formats.\n */\n\nimport * as path from \"path\";\nimport type { DesignSystemData, DiffResult } from './types.js';\nimport type { RulesFileResult } from './rules.js';\n\nexport interface FormatSyncResponseOptions {\n // Core data\n data: DesignSystemData;\n output: string;\n format: string;\n \n // Token counts\n dsTokenCount: number;\n deprecatedCount: number;\n deprecatedTokens: Map<string, string>;\n \n // Changes\n diff?: DiffResult;\n changes?: Array<{ key: string; old: string; new: string }>;\n fileExists: boolean;\n \n // Rules\n rulesResults?: RulesFileResult[];\n \n // Governance changes\n governanceChanges?: string[];\n changeSummary?: string | null;\n \n // Refactor info\n hasRefactorRecommendation?: boolean;\n deprecatedTokenCount?: number;\n}\n\n/**\n * Format enhanced sync response text\n * \n * Generates a comprehensive response with explicit lists of:\n * - Deprecated tokens (with values)\n * - New tokens\n * - Modified files (output + rules files)\n * - AI rules changes by foundation\n * - Detailed changes summary\n * - Refactor recommendations\n */\nexport function formatSyncResponse(options: FormatSyncResponseOptions): string {\n const {\n data,\n output,\n format,\n dsTokenCount,\n deprecatedCount,\n deprecatedTokens,\n diff,\n changes = [],\n fileExists,\n rulesResults = [],\n governanceChanges = [],\n changeSummary,\n hasRefactorRecommendation = false,\n deprecatedTokenCount = 0,\n } = options;\n\n const lastUpdated = data.meta.exportedAt \n ? new Date(data.meta.exportedAt).toLocaleString()\n : \"N/A\";\n\n let response = `✓ Synced ${dsTokenCount} tokens to ${output}\\n`;\n response += `Format: ${format}\\n`;\n response += `Design System: ${data.meta.name} (v${data.meta.version})\\n`;\n if (deprecatedCount > 0) {\n response += `Tokens: ${dsTokenCount} active, ${deprecatedCount} deprecated (run /refactor to migrate)\\n`;\n } else {\n response += `Tokens: ${dsTokenCount}\\n`;\n }\n response += `Version: ${data.meta.version}\\n`;\n response += `Last updated: ${lastUpdated}\\n`;\n\n // ============================================\n // SECTION 1: DEPRECATED TOKENS (Explicit List)\n // ============================================\n if (deprecatedCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📋 DEPRECATED TOKENS (${deprecatedCount})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `These tokens are no longer in the design system but are preserved in your file for backward compatibility.\\n`;\n response += `Run \\`/refactor\\` to find and migrate usage in your codebase.\\n\\n`;\n \n const deprecatedTokenList = Array.from(deprecatedTokens.keys()).sort();\n deprecatedTokenList.forEach((token, index) => {\n const value = deprecatedTokens.get(token);\n response += ` ${index + 1}. ${token}`;\n if (value) {\n response += ` = ${value}`;\n }\n response += `\\n`;\n });\n }\n\n // ============================================\n // SECTION 2: NEW TOKENS (Explicit List)\n // ============================================\n const newTokenList: string[] = [];\n if (diff) {\n newTokenList.push(...diff.added, ...diff.addedDark);\n }\n\n // Also include tokens from change summary if available\n if (changeSummary && changeSummary.includes(\"➕ Added:\")) {\n const addedSection = changeSummary.match(/➕ Added: \\d+ token\\(s\\)([\\s\\S]*?)(?=➖|🔄|📝|$)/);\n if (addedSection) {\n const addedLines = addedSection[0].match(/ - (--[^\\n]+)/g) || [];\n addedLines.forEach(line => {\n const token = line.replace(/ - /, \"\").trim();\n if (token && !newTokenList.includes(token)) {\n newTokenList.push(token);\n }\n });\n }\n }\n\n if (newTokenList.length > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `✨ NEW TOKENS (${newTokenList.length})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n newTokenList.sort().forEach((token, index) => {\n response += ` ${index + 1}. ${token}\\n`;\n });\n }\n\n // ============================================\n // SECTION 3: MODIFIED FILES (Explicit List)\n // ============================================\n const modifiedFiles: string[] = [output];\n\n // Add rules files that were synced\n rulesResults.forEach(result => {\n if (result.success) {\n const fullPath = path.resolve(process.cwd(), result.path);\n if (!modifiedFiles.includes(fullPath)) {\n modifiedFiles.push(fullPath);\n }\n }\n });\n\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📁 MODIFIED FILES (${modifiedFiles.length})\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n modifiedFiles.forEach((file, index) => {\n const relativePath = path.relative(process.cwd(), file);\n response += ` ${index + 1}. ${relativePath}\\n`;\n });\n\n // ============================================\n // SECTION 4: AI RULES CHANGES (By Foundation)\n // ============================================\n if (governanceChanges.length > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📝 AI RULES CHANGES\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `The following AI guidance sections have been updated:\\n\\n`;\n \n // Capitalize foundation names\n const capitalize = (str: string) => str.charAt(0).toUpperCase() + str.slice(1);\n \n governanceChanges.forEach((foundation, index) => {\n const displayName = foundation === \"general\" \n ? \"General Rules\" \n : capitalize(foundation);\n response += ` ${index + 1}. ${displayName}\\n`;\n });\n \n response += `\\nThese changes are reflected in your AI tool rules files (e.g., .cursorrules).\\n`;\n response += `Review the updated rules files to see the new guidance.\\n`;\n }\n\n // ============================================\n // SECTION 5: DETAILED CHANGES (Keep existing)\n // ============================================\n if (diff) {\n const lightChanges = diff.added.length + diff.modified.length;\n const darkChanges = diff.addedDark.length + diff.modifiedDark.length;\n \n if (lightChanges > 0 || darkChanges > 0 || deprecatedCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `📊 DETAILED CHANGES\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n \n const lightSummary = lightChanges > 0 ? `Light: ${diff.modified.length} modified, ${diff.added.length} added` : \"\";\n const darkSummary = darkChanges > 0 ? `Dark: ${diff.modifiedDark.length} modified, ${diff.addedDark.length} added` : \"\";\n const deprecatedSummary = deprecatedCount > 0 ? `${deprecatedCount} deprecated (use /refactor)` : \"\";\n const diffSummary = [lightSummary, darkSummary, deprecatedSummary].filter(Boolean).join(\" | \");\n response += `${diffSummary}\\n`;\n \n if (changes.length > 0 && changes.length <= 10) {\n response += \"\\nModified tokens:\\n\";\n for (const { key, old: oldVal, new: newVal } of changes) {\n response += ` ${key}: ${oldVal} → ${newVal}\\n`;\n }\n }\n }\n } else if (!fileExists) {\n response += `\\n(New file created)\\n`;\n }\n\n // ============================================\n // SECTION 6: REFACTOR RECOMMENDATION\n // ============================================\n if (hasRefactorRecommendation && deprecatedTokenCount > 0) {\n response += `\\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n`;\n response += `💡 NEXT STEP\\n`;\n response += `━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\\n\\n`;\n response += `${deprecatedTokenCount} token(s) have been deprecated.\\n`;\n response += `Your codebase may still reference these deprecated tokens.\\n\\n`;\n response += `Run \\`/refactor\\` to:\\n`;\n response += ` • Scan your codebase for deprecated token usage\\n`;\n response += ` • See which files need updates\\n`;\n response += ` • Review and apply changes with your confirmation\\n`;\n }\n\n return response;\n}\n","/**\n * Token Utilities\n * \n * Functions for working with design tokens.\n */\n\nimport type { DesignSystemData } from './types.js';\n\nexport function getTokenByPath(tokens: Record<string, unknown>, path: string): unknown {\n const parts = path.split(\".\");\n let current: unknown = tokens;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in current) {\n current = (current as Record<string, unknown>)[part];\n } else {\n return undefined;\n }\n }\n\n return current;\n}\n\nexport function flattenTokens(obj: unknown, prefix = \"\"): Array<{ path: string; value: unknown }> {\n const results: Array<{ path: string; value: unknown }> = [];\n\n if (obj && typeof obj === \"object\" && !Array.isArray(obj)) {\n for (const [key, value] of Object.entries(obj)) {\n const newPath = prefix ? `${prefix}.${key}` : key;\n \n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n results.push(...flattenTokens(value, newPath));\n } else {\n results.push({ path: newPath, value });\n }\n }\n }\n\n return results;\n}\n\nexport function searchTokens(tokens: Record<string, unknown>, query: string): Array<{ path: string; value: unknown }> {\n const flat = flattenTokens(tokens);\n const lowerQuery = query.toLowerCase();\n \n return flat.filter(({ path, value }) => {\n const pathMatch = path.toLowerCase().includes(lowerQuery);\n const valueMatch = String(value).toLowerCase().includes(lowerQuery);\n return pathMatch || valueMatch;\n });\n}\n\nexport function countTokens(tokens: Record<string, unknown>, prefix = \"\"): number {\n let count = 0;\n for (const [key, value] of Object.entries(tokens)) {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n count += countTokens(value as Record<string, unknown>, `${prefix}${key}.`);\n } else if (value !== undefined && value !== null) {\n count++;\n }\n }\n return count;\n}\n\nexport function getTokenStats(data: DesignSystemData): {\n total: number;\n byCategory: Record<string, number>;\n cssVariables: number;\n governanceRules: number;\n} {\n const byCategory: Record<string, number> = {};\n let total = 0;\n\n for (const [category, value] of Object.entries(data.tokens)) {\n if (value && typeof value === \"object\") {\n const count = countTokens(value as Record<string, unknown>);\n byCategory[category] = count;\n total += count;\n }\n }\n\n return {\n total,\n byCategory,\n cssVariables: Object.keys(data.cssVariables).length,\n governanceRules: data.governance.rules.length,\n };\n}\n"],"mappings":"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","names":["cachedRulesStr","freshRulesStr","dsId","apiKey","apiBase","dsId","apiKey","apiBase","toSwiftName","isColorValue","toSwiftName","isColorValue","path","path","path","fs","dsId","apiKey","apiBase","path"]}