@fragments-sdk/cli 0.15.8 → 0.15.10
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/README.md +6 -6
- package/dist/bin.js +1 -1
- package/dist/{create-FKRHEMPZ.js → create-EXURTBKK.js} +2 -2
- package/dist/create-EXURTBKK.js.map +1 -0
- package/dist/mcp-bin.js +779 -132
- package/dist/mcp-bin.js.map +1 -1
- package/package.json +2 -2
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/label.contract.json +1 -1
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/primitive.contract.json +1 -1
- package/src/commands/create.ts +1 -1
- package/src/mcp/__tests__/server.integration.test.ts +342 -0
- package/src/mcp/server.ts +924 -138
- package/src/mcp/version.ts +17 -0
- package/dist/create-FKRHEMPZ.js.map +0 -1
package/dist/mcp-bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/mcp/server.ts","../src/mcp-bin.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Tool,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n BRAND,\n DEFAULTS,\n generateContext,\n type CompiledFragmentsFile,\n type VerifyResult,\n type Theme,\n} from '../core/index.js';\nimport { buildMcpTools, buildToolNames, CLI_TOOL_EXTENSIONS } from '@fragments-sdk/context/mcp-tools';\n// ../service is lazy-imported to avoid requiring playwright at startup.\n// Visual tools (render, fix) load it on first use.\ntype ServiceModule = typeof import('../service/index.js');\nlet _service: ServiceModule | null = null;\nasync function getService(): Promise<ServiceModule> {\n if (!_service) {\n try {\n _service = await import('../service/index.js');\n } catch {\n throw new Error(\n 'Visual tools require playwright. Install it with: npm install playwright'\n );\n }\n }\n return _service;\n}\nimport { readFile } from 'node:fs/promises';\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { createRequire } from 'node:module';\nimport { projectFields } from './utils.js';\n\n/**\n * MCP Tool names & definitions (from shared source of truth)\n */\nconst TOOL_NAMES = buildToolNames(BRAND.nameLower) as Record<string, string> & {\n discover: string;\n inspect: string;\n blocks: string;\n tokens: string;\n implement: string;\n render: string;\n fix: string;\n};\n\n/**\n * Placeholder patterns to filter out from usage text.\n * These are auto-generated and provide no value to AI agents.\n */\nconst PLACEHOLDER_PATTERNS = [\n /^\\w+ component is needed$/i,\n /^Alternative component is more appropriate$/i,\n /^Use \\w+ when you need/i,\n];\n\n/**\n * Filter out placeholder text from usage arrays\n */\nfunction filterPlaceholders(items: string[] | undefined): string[] {\n if (!items) return [];\n return items.filter(item =>\n !PLACEHOLDER_PATTERNS.some(pattern => pattern.test(item.trim()))\n );\n}\n\n/**\n * Resolve workspace directory globs (e.g. \"apps/*\") into actual paths.\n */\nfunction resolveWorkspaceGlob(baseDir: string, pattern: string): string[] {\n const parts = pattern.split('/');\n let dirs = [baseDir];\n\n for (const part of parts) {\n if (part === '**') continue; // Skip double-star recursion\n const next: string[] = [];\n for (const d of dirs) {\n if (part === '*') {\n try {\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {\n next.push(join(d, entry.name));\n }\n }\n } catch { /* unreadable dir */ }\n } else {\n const candidate = join(d, part);\n if (existsSync(candidate)) next.push(candidate);\n }\n }\n dirs = next;\n }\n\n return dirs;\n}\n\n/**\n * Detect workspace directories from package.json \"workspaces\" or pnpm-workspace.yaml.\n */\nfunction getWorkspaceDirs(rootDir: string): string[] {\n const dirs: string[] = [];\n\n // npm/yarn: package.json \"workspaces\" field\n const rootPkgPath = join(rootDir, 'package.json');\n if (existsSync(rootPkgPath)) {\n try {\n const rootPkg = JSON.parse(readFileSync(rootPkgPath, 'utf-8'));\n const workspaces = Array.isArray(rootPkg.workspaces)\n ? rootPkg.workspaces\n : rootPkg.workspaces?.packages;\n if (Array.isArray(workspaces)) {\n for (const pattern of workspaces) {\n dirs.push(...resolveWorkspaceGlob(rootDir, pattern));\n }\n return dirs;\n }\n } catch { /* unreadable */ }\n }\n\n // pnpm: pnpm-workspace.yaml\n const pnpmWsPath = join(rootDir, 'pnpm-workspace.yaml');\n if (existsSync(pnpmWsPath)) {\n try {\n const content = readFileSync(pnpmWsPath, 'utf-8');\n const lines = content.split('\\n');\n let inPackages = false;\n for (const line of lines) {\n if (/^packages\\s*:/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = line.match(/^\\s+-\\s+['\"]?([^'\"#\\n]+)['\"]?/);\n if (match) {\n dirs.push(...resolveWorkspaceGlob(rootDir, match[1].trim()));\n } else if (/^\\S/.test(line) && line.trim()) {\n break; // New top-level key, stop\n }\n }\n }\n } catch { /* unreadable */ }\n }\n\n return dirs;\n}\n\n/**\n * Scan a directory's package.json deps for packages with a \"fragments\" field.\n * Uses Node.js module resolution (createRequire) to handle all package managers.\n */\n/**\n * Resolve a dependency's package.json path. Tries the standard subpath first,\n * then falls back to resolving the package's main entry and walking up to\n * find package.json — necessary when the package's `exports` map doesn't\n * expose `./package.json`.\n */\nfunction resolveDepPackageJson(\n localRequire: NodeRequire,\n depName: string\n): string | null {\n // Fast path: package exposes ./package.json in exports\n try {\n return localRequire.resolve(`${depName}/package.json`);\n } catch {\n // Blocked by exports map\n }\n\n // Fallback: resolve the package's main entry and walk up to package.json\n try {\n const mainPath = localRequire.resolve(depName);\n let dir = dirname(mainPath);\n while (true) {\n const candidate = join(dir, 'package.json');\n if (existsSync(candidate)) {\n const pkg = JSON.parse(readFileSync(candidate, 'utf-8'));\n if (pkg.name === depName) return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n // Package not resolvable at all\n }\n\n return null;\n}\n\nfunction findFragmentsInDeps(dir: string, found: string[]): void {\n const pkgJsonPath = join(dir, 'package.json');\n if (!existsSync(pkgJsonPath)) return;\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n };\n const localRequire = createRequire(join(dir, 'noop.js'));\n for (const depName of Object.keys(allDeps)) {\n try {\n const depPkgPath = resolveDepPackageJson(localRequire, depName);\n if (!depPkgPath) continue;\n const depPkg = JSON.parse(readFileSync(depPkgPath, 'utf-8'));\n if (depPkg.fragments) {\n const fragmentsPath = join(dirname(depPkgPath), depPkg.fragments);\n if (existsSync(fragmentsPath) && !found.includes(fragmentsPath)) {\n found.push(fragmentsPath);\n }\n }\n } catch {\n // Package not resolvable or unreadable, skip\n }\n }\n } catch {\n // No package.json or unreadable\n }\n}\n\n/**\n * Find fragments.json files:\n * 1. Walk up from startDir (for library authors with a local build)\n * 2. Read package.json deps and resolve packages with a \"fragments\" field\n * 3. Check workspace packages' deps (monorepo support)\n *\n * Uses Node.js module resolution (createRequire) to handle all package\n * managers: pnpm symlinks, yarn PnP, monorepo hoisting, etc.\n */\nexport function findFragmentsJson(startDir: string): string[] {\n const found: string[] = [];\n const resolvedStart = resolve(startDir);\n\n // 1. Walk upward from startDir (library author flow)\n let dir = resolvedStart;\n while (true) {\n const candidate = join(dir, BRAND.outFile);\n if (existsSync(candidate)) {\n found.push(candidate);\n break;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n // 2. Check root package.json deps\n findFragmentsInDeps(resolvedStart, found);\n\n // 3. Check workspace packages' deps (monorepo support)\n if (found.length === 0 || existsSync(join(resolvedStart, 'pnpm-workspace.yaml'))) {\n const workspaceDirs = getWorkspaceDirs(resolvedStart);\n for (const wsDir of workspaceDirs) {\n findFragmentsInDeps(wsDir, found);\n }\n }\n\n return found;\n}\n\n/**\n * MCP Server configuration\n */\nexport interface McpServerConfig {\n /** Project root directory */\n projectRoot: string;\n\n /** Viewer base URL */\n viewerUrl?: string;\n\n /** Default theme for verification */\n theme?: Theme;\n\n /** Diff threshold percentage */\n threshold?: number;\n}\n\nconst TOOLS = buildMcpTools(BRAND.nameLower, CLI_TOOL_EXTENSIONS) as Tool[];\n\n/**\n * Create and configure the MCP server\n */\nexport function createMcpServer(config: McpServerConfig): Server {\n const server = new Server(\n {\n name: `${BRAND.nameLower}-mcp`,\n version: '0.0.1',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Lazy-loaded resources\n let fragmentsData: CompiledFragmentsFile | null = null;\n // Per-fragment package name map (fragment name → package name from its source fragments.json)\n const fragmentPackageMap = new Map<string, string>();\n let defaultPackageName: string | null = null;\n\n let browserPool: any = null;\n let storageManager: any = null;\n let diffEngine: any = null;\n let isPoolWarming = false;\n\n async function loadFragments(): Promise<CompiledFragmentsFile> {\n if (fragmentsData) {\n return fragmentsData;\n }\n\n const paths = findFragmentsJson(config.projectRoot);\n\n if (paths.length === 0) {\n throw new Error(\n `No ${BRAND.outFile} found. Searched ${config.projectRoot} and package.json dependencies. ` +\n `Either run \\`${BRAND.cliCommand} build\\` or install a package with a \"fragments\" field in its package.json.`\n );\n }\n\n // Load and merge all found fragments files\n const content = await readFile(paths[0], 'utf-8');\n fragmentsData = JSON.parse(content) as CompiledFragmentsFile;\n\n // Normalize legacy \"recipes\" key to \"blocks\"\n if (!fragmentsData.blocks && fragmentsData.recipes) {\n fragmentsData.blocks = fragmentsData.recipes;\n }\n\n // Track per-fragment package names from each source file\n if (fragmentsData.packageName) {\n for (const name of Object.keys(fragmentsData.fragments)) {\n fragmentPackageMap.set(name, fragmentsData.packageName);\n }\n }\n\n for (let i = 1; i < paths.length; i++) {\n const extra = JSON.parse(await readFile(paths[i], 'utf-8')) as CompiledFragmentsFile;\n // Track package name for each fragment from this file\n if (extra.packageName) {\n for (const name of Object.keys(extra.fragments)) {\n fragmentPackageMap.set(name, extra.packageName);\n }\n }\n Object.assign(fragmentsData.fragments, extra.fragments);\n // Support both \"blocks\" (new) and \"recipes\" (legacy) keys\n const extraBlocks = extra.blocks ?? extra.recipes;\n if (extraBlocks) {\n fragmentsData.blocks = { ...fragmentsData.blocks, ...extraBlocks };\n }\n }\n\n return fragmentsData;\n }\n\n /**\n * Get the package name for import statements for a specific component.\n * Uses per-fragment tracking when multiple fragments.json files are merged,\n * falls back to the first fragments.json packageName, then project package.json.\n */\n async function getPackageName(fragmentName?: string): Promise<string> {\n // Ensure fragments are loaded (populates fragmentPackageMap)\n await loadFragments();\n\n // Check per-fragment map first (handles multi-library merges correctly)\n if (fragmentName) {\n const segPkg = fragmentPackageMap.get(fragmentName);\n if (segPkg) return segPkg;\n }\n\n if (defaultPackageName) {\n return defaultPackageName;\n }\n\n // Prefer packageName from first fragments.json\n if (fragmentsData?.packageName) {\n defaultPackageName = fragmentsData.packageName;\n return defaultPackageName;\n }\n\n // Fallback to project package.json\n const packageJsonPath = join(config.projectRoot, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = await readFile(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(content) as { name?: string };\n if (pkg.name) {\n defaultPackageName = pkg.name;\n return defaultPackageName;\n }\n } catch {\n // Fall through to default\n }\n }\n\n // Default fallback\n defaultPackageName = 'your-component-library';\n return defaultPackageName;\n }\n\n /**\n * Get or create browser pool with extended idle timeout for MCP\n */\n async function getBrowserPool() {\n if (!browserPool) {\n const { BrowserPool } = await getService();\n browserPool = new BrowserPool({\n viewport: DEFAULTS.viewport,\n // 30 minute idle timeout for MCP - server runs continuously\n idleTimeoutMs: 30 * 60 * 1000,\n poolSize: 2, // Keep 2 contexts warm for faster captures\n });\n }\n return browserPool;\n }\n\n /**\n * Pre-warm browser pool in background (non-blocking)\n */\n function warmBrowserPool(): void {\n if (isPoolWarming || browserPool?.isReady) {\n return;\n }\n isPoolWarming = true;\n\n // Warm in background - don't await\n getBrowserPool().then((pool) => {\n pool.warmup().then(() => {\n isPoolWarming = false;\n }).catch(() => {\n isPoolWarming = false;\n });\n }).catch(() => {\n isPoolWarming = false;\n });\n }\n\n /**\n * Get or create storage manager\n */\n async function getStorageManager() {\n if (!storageManager) {\n const { StorageManager } = await getService();\n storageManager = new StorageManager({\n projectRoot: config.projectRoot,\n });\n await storageManager.initialize();\n }\n return storageManager;\n }\n\n /**\n * Get or create diff engine\n */\n async function getDiffEngine() {\n if (!diffEngine) {\n const { DiffEngine } = await getService();\n diffEngine = new DiffEngine(config.threshold ?? DEFAULTS.diffThreshold);\n }\n return diffEngine;\n }\n\n // Register tool listing\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return { tools: TOOLS };\n });\n\n // Register tool execution\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n // ================================================================\n // DISCOVER — list, suggest, context, alternatives\n // ================================================================\n case TOOL_NAMES.discover: {\n const data = await loadFragments();\n const useCase = (args?.useCase as string) ?? undefined;\n const componentForAlts = (args?.component as string) ?? undefined;\n const category = (args?.category as string) ?? undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n const status = (args?.status as string) ?? undefined;\n const format = (args?.format as 'markdown' | 'json') ?? 'markdown';\n const compact = (args?.compact as boolean) ?? false;\n const includeCode = (args?.includeCode as boolean) ?? false;\n const includeRelations = (args?.includeRelations as boolean) ?? false;\n\n // --- Context mode: compact or format specified with no specific query ---\n if (compact || (args?.format && !useCase && !componentForAlts && !category && !search && !status)) {\n const fragments = Object.values(data.fragments);\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n\n const { content: ctxContent, tokenEstimate } = generateContext(fragments, {\n format,\n compact,\n include: {\n code: includeCode,\n relations: includeRelations,\n },\n }, allBlocks);\n\n return {\n content: [{\n type: 'text' as const,\n text: ctxContent,\n }],\n _meta: { tokenEstimate },\n };\n }\n\n // --- Suggest mode: useCase provided ---\n if (useCase) {\n const useCaseLower = useCase.toLowerCase();\n const context = ((args as Record<string, unknown>)?.context as string)?.toLowerCase() ?? '';\n const searchTerms = `${useCaseLower} ${context}`.split(/\\s+/).filter(Boolean);\n\n const synonymMap: Record<string, string[]> = {\n 'form': ['input', 'field', 'submit', 'validation'],\n 'input': ['form', 'field', 'text', 'entry'],\n 'button': ['action', 'click', 'submit', 'trigger'],\n 'action': ['button', 'click', 'trigger'],\n 'alert': ['notification', 'message', 'warning', 'error', 'feedback'],\n 'notification': ['alert', 'message', 'toast'],\n 'card': ['container', 'panel', 'box', 'content'],\n 'toggle': ['switch', 'checkbox', 'boolean', 'on/off'],\n 'switch': ['toggle', 'checkbox', 'boolean'],\n 'badge': ['tag', 'label', 'status', 'indicator'],\n 'status': ['badge', 'indicator', 'state'],\n 'login': ['auth', 'signin', 'authentication', 'form'],\n 'auth': ['login', 'signin', 'authentication'],\n };\n\n const expandedTerms = new Set(searchTerms);\n searchTerms.forEach(term => {\n const synonyms = synonymMap[term];\n if (synonyms) {\n synonyms.forEach(syn => expandedTerms.add(syn));\n }\n });\n\n const scored = Object.values(data.fragments).map((s) => {\n let score = 0;\n const reasons: string[] = [];\n\n const nameLower = s.meta.name.toLowerCase();\n if (searchTerms.some((term) => nameLower.includes(term))) {\n score += 15;\n reasons.push(`Name matches search`);\n } else if (Array.from(expandedTerms).some((term) => nameLower.includes(term))) {\n score += 8;\n reasons.push(`Name matches related term`);\n }\n\n const desc = s.meta.description?.toLowerCase() ?? '';\n const descMatches = searchTerms.filter((term) => desc.includes(term));\n if (descMatches.length > 0) {\n score += descMatches.length * 6;\n reasons.push(`Description matches: ${descMatches.join(', ')}`);\n }\n\n const tags = s.meta.tags?.map((t) => t.toLowerCase()) ?? [];\n const tagMatches = searchTerms.filter((term) =>\n tags.some((tag) => tag.includes(term))\n );\n if (tagMatches.length > 0) {\n score += tagMatches.length * 4;\n reasons.push(`Tags match: ${tagMatches.join(', ')}`);\n }\n\n const whenUsed = s.usage?.when?.join(' ').toLowerCase() ?? '';\n const whenMatches = searchTerms.filter((term) => whenUsed.includes(term));\n if (whenMatches.length > 0) {\n score += whenMatches.length * 10;\n reasons.push(`Use cases match: \"${whenMatches.join(', ')}\"`);\n }\n\n const expandedWhenMatches = Array.from(expandedTerms).filter(\n (term) => !searchTerms.includes(term) && whenUsed.includes(term)\n );\n if (expandedWhenMatches.length > 0) {\n score += expandedWhenMatches.length * 5;\n reasons.push(`Related use cases: \"${expandedWhenMatches.join(', ')}\"`);\n }\n\n const cat = s.meta.category?.toLowerCase() ?? '';\n if (searchTerms.some((term) => cat.includes(term))) {\n score += 8;\n reasons.push(`Category: ${s.meta.category}`);\n }\n\n const variantText = s.variants\n .map(v => `${v.name} ${v.description || ''}`.toLowerCase())\n .join(' ');\n const variantMatches = searchTerms.filter(term => variantText.includes(term));\n if (variantMatches.length > 0) {\n score += variantMatches.length * 3;\n reasons.push(`Variants match: ${variantMatches.join(', ')}`);\n }\n\n if (s.meta.status === 'stable') {\n score += 5;\n reasons.push('Stable component');\n } else if (s.meta.status === 'beta') {\n score += 2;\n }\n\n if (s.meta.status === 'deprecated') {\n score -= 25;\n reasons.push('Deprecated - consider alternatives');\n }\n\n const filteredWhen = filterPlaceholders(s.usage?.when).slice(0, 3);\n const filteredWhenNot = filterPlaceholders(s.usage?.whenNot).slice(0, 2);\n\n let confidence: 'high' | 'medium' | 'low';\n if (score >= 25) confidence = 'high';\n else if (score >= 15) confidence = 'medium';\n else confidence = 'low';\n\n return {\n component: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n score,\n confidence,\n reasons,\n usage: { when: filteredWhen, whenNot: filteredWhenNot },\n variantCount: s.variants.length,\n status: s.meta.status,\n };\n });\n\n const MIN_SCORE = 8;\n const filtered = scored\n .filter((s) => s.score >= MIN_SCORE)\n .sort((a, b) => b.score - a.score);\n\n const suggestions: typeof filtered = [];\n const categoryCount: Record<string, number> = {};\n for (const item of filtered) {\n const cat = item.category || 'uncategorized';\n const count = categoryCount[cat] || 0;\n if (count < 2 || suggestions.length < 3) {\n suggestions.push(item);\n categoryCount[cat] = count + 1;\n if (suggestions.length >= 5) break;\n }\n }\n\n const compositionHint = suggestions.length >= 2\n ? `These components work well together. For example, ${suggestions[0].component} can be combined with ${suggestions.slice(1, 3).map(s => s.component).join(' and ')}.`\n : undefined;\n\n // Detect if query is about styling/tokens rather than components\n const STYLE_KEYWORDS = ['color', 'spacing', 'padding', 'margin', 'font', 'border', 'radius', 'shadow', 'variable', 'token', 'css', 'theme', 'dark mode', 'background', 'hover'];\n const isStyleQuery = STYLE_KEYWORDS.some((kw) => useCaseLower.includes(kw));\n\n // Determine no-match quality\n const noMatch = suggestions.length === 0;\n const weakMatch = !noMatch && suggestions.every((s) => s.confidence === 'low');\n\n let recommendation: string;\n let nextStep: string | undefined;\n if (noMatch) {\n recommendation = isStyleQuery\n ? `No matching components found. Your query seems styling-related — try ${TOOL_NAMES.tokens} to find CSS custom properties.`\n : 'No matching components found. Try different keywords or browse all components with fragments_discover.';\n nextStep = isStyleQuery\n ? `Use ${TOOL_NAMES.tokens}(search: \"${searchTerms[0]}\") to find design tokens.`\n : undefined;\n } else if (weakMatch) {\n recommendation = `Weak matches only — ${suggestions[0].component} might work but confidence is low.${isStyleQuery ? ` If you need a CSS variable, try ${TOOL_NAMES.tokens}.` : ''}`;\n nextStep = `Use ${TOOL_NAMES.inspect}(\"${suggestions[0].component}\") to check if it fits, or try broader search terms.`;\n } else {\n recommendation = `Best match: ${suggestions[0].component} (${suggestions[0].confidence} confidence) - ${suggestions[0].description}`;\n nextStep = `Use ${TOOL_NAMES.inspect}(\"${suggestions[0].component}\") for full details.`;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n context: context || undefined,\n suggestions: suggestions.map(({ score, ...rest }) => rest),\n noMatch,\n weakMatch,\n recommendation,\n compositionHint,\n nextStep,\n }, null, 2),\n }],\n };\n }\n\n // --- Alternatives mode: component provided (no useCase) ---\n if (componentForAlts) {\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentForAlts.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentForAlts}\" not found. Use fragments_discover to see available components.`);\n }\n\n const relations = fragment.relations ?? [];\n\n const referencedBy = Object.values(data.fragments)\n .filter((s) =>\n s.relations?.some((r) => r.component.toLowerCase() === componentForAlts.toLowerCase())\n )\n .map((s) => ({\n component: s.meta.name,\n relationship: s.relations?.find(\n (r) => r.component.toLowerCase() === componentForAlts.toLowerCase()\n )?.relationship,\n note: s.relations?.find(\n (r) => r.component.toLowerCase() === componentForAlts.toLowerCase()\n )?.note,\n }));\n\n const sameCategory = Object.values(data.fragments)\n .filter(\n (s) =>\n s.meta.category === fragment.meta.category &&\n s.meta.name.toLowerCase() !== componentForAlts.toLowerCase()\n )\n .map((s) => ({\n component: s.meta.name,\n description: s.meta.description,\n }));\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: fragment.meta.name,\n category: fragment.meta.category,\n directRelations: relations,\n referencedBy,\n sameCategory,\n suggestion: relations.find((r) => r.relationship === 'alternative')\n ? `Consider ${relations.find((r) => r.relationship === 'alternative')?.component}: ${relations.find((r) => r.relationship === 'alternative')?.note}`\n : undefined,\n }, null, 2),\n }],\n };\n }\n\n // --- Default: list mode ---\n const fragments = Object.values(data.fragments)\n .filter((s) => {\n if (category && s.meta.category !== category) return false;\n if (status && (s.meta.status ?? 'stable') !== status) return false;\n if (search) {\n const nameMatch = s.meta.name.toLowerCase().includes(search);\n const descMatch = s.meta.description?.toLowerCase().includes(search);\n const tagMatch = s.meta.tags?.some((t) => t.toLowerCase().includes(search));\n if (!nameMatch && !descMatch && !tagMatch) return false;\n }\n return true;\n })\n .map((s) => ({\n name: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n status: s.meta.status ?? 'stable',\n variantCount: s.variants.length,\n tags: s.meta.tags ?? [],\n }));\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: fragments.length,\n fragments,\n categories: [...new Set(fragments.map((s) => s.category))],\n hint: fragments.length === 0\n ? 'No components found. Try broader search terms or check available categories.'\n : fragments.length > 5\n ? 'Use fragments_discover with useCase for recommendations, or fragments_inspect for details on a specific component.'\n : undefined,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // INSPECT — get + guidelines + example in one call\n // ================================================================\n case TOOL_NAMES.inspect: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const fields = args?.fields as string[] | undefined;\n const variantName = (args?.variant as string) ?? undefined;\n const maxExamples = args?.maxExamples as number | undefined;\n const maxLines = args?.maxLines as number | undefined;\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use fragments_discover to see available components.`);\n }\n\n // Build the full inspect result combining get + guidelines + example\n const pkgName = await getPackageName(fragment.meta.name);\n\n // Filter variants for examples — fuzzy match: exact → prefix → contains\n let variants = fragment.variants;\n if (variantName) {\n const query = variantName.toLowerCase();\n // 1. Exact match\n let filtered = variants.filter(\n (v) => v.name.toLowerCase() === query\n );\n // 2. Prefix match (e.g. \"Dots\" matches \"Dots (Default)\")\n if (filtered.length === 0) {\n filtered = variants.filter(\n (v) => v.name.toLowerCase().startsWith(query)\n );\n }\n // 3. Contains match (e.g. \"elapsed\" matches \"With Elapsed Time\")\n if (filtered.length === 0) {\n filtered = variants.filter(\n (v) => v.name.toLowerCase().includes(query)\n );\n }\n if (filtered.length > 0) {\n variants = filtered;\n } else {\n throw new Error(\n `Variant \"${variantName}\" not found for ${componentName}. ` +\n `Available: ${fragment.variants.map((v) => v.name).join(', ')}`\n );\n }\n }\n if (maxExamples && maxExamples > 0) {\n variants = variants.slice(0, maxExamples);\n }\n\n const truncateCode = (code: string): string => {\n if (!maxLines || maxLines <= 0) return code;\n const lines = code.split('\\n');\n if (lines.length <= maxLines) return code;\n return lines.slice(0, maxLines).join('\\n') + '\\n// ... truncated';\n };\n\n const examples = variants.map((variant) => {\n if (variant.code) {\n return {\n variant: variant.name,\n description: variant.description,\n code: truncateCode(variant.code),\n };\n }\n return {\n variant: variant.name,\n description: variant.description,\n code: `<${fragment.meta.name} />`,\n note: 'No code example provided in fragment. Refer to props for customization.',\n };\n });\n\n const propsReference = Object.entries(fragment.props ?? {}).map(([propName, prop]) => ({\n name: propName,\n type: prop.type,\n required: prop.required,\n default: prop.default,\n description: prop.description,\n }));\n\n const propConstraints = Object.entries(fragment.props ?? {})\n .filter(([, prop]) => prop.constraints && prop.constraints.length > 0)\n .map(([pName, prop]) => ({\n prop: pName,\n constraints: prop.constraints,\n }));\n\n const fullResult = {\n // Component data (from old \"get\")\n meta: fragment.meta,\n props: fragment.props,\n variants: fragment.variants,\n relations: fragment.relations,\n contract: fragment.contract,\n generated: fragment._generated,\n // Guidelines (from old \"guidelines\")\n guidelines: {\n when: filterPlaceholders(fragment.usage?.when),\n whenNot: filterPlaceholders(fragment.usage?.whenNot),\n guidelines: fragment.usage?.guidelines ?? [],\n accessibility: fragment.usage?.accessibility ?? [],\n propConstraints,\n alternatives: fragment.relations\n ?.filter((r) => r.relationship === 'alternative')\n .map((r) => ({\n component: r.component,\n note: r.note,\n })) ?? [],\n },\n // Examples (from old \"example\")\n examples: {\n import: `import { ${fragment.meta.name} } from '${pkgName}';`,\n code: examples,\n propsReference,\n },\n };\n\n // Apply field projection if specified\n const result = fields && fields.length > 0\n ? projectFields(fullResult as unknown as Record<string, unknown>, fields)\n : fullResult;\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n }],\n };\n }\n\n // ================================================================\n // BLOCKS — composition patterns\n // ================================================================\n case TOOL_NAMES.blocks: {\n const data = await loadFragments();\n const blockName = args?.name as string | undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n const component = (args?.component as string)?.toLowerCase() ?? undefined;\n const category = (args?.category as string)?.toLowerCase() ?? undefined;\n\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n\n if (allBlocks.length === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n blocks: [],\n hint: `No blocks found. Run \\`${BRAND.cliCommand} build\\` after adding .block.ts files.`,\n }, null, 2),\n }],\n };\n }\n\n let filtered = allBlocks;\n\n if (blockName) {\n filtered = filtered.filter(\n b => b.name.toLowerCase() === blockName.toLowerCase()\n );\n }\n\n if (search) {\n filtered = filtered.filter(b => {\n const haystack = [\n b.name,\n b.description,\n ...(b.tags ?? []),\n ...b.components,\n b.category,\n ].join(' ').toLowerCase();\n return haystack.includes(search);\n });\n }\n\n if (component) {\n filtered = filtered.filter(b =>\n b.components.some(c => c.toLowerCase() === component)\n );\n }\n\n if (category) {\n filtered = filtered.filter(b =>\n b.category.toLowerCase() === category\n );\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: filtered.length,\n blocks: filtered,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // TOKENS — list CSS custom properties by category\n // ================================================================\n case TOOL_NAMES.tokens: {\n const data = await loadFragments();\n const category = (args?.category as string)?.toLowerCase() ?? undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n\n const tokenData = data.tokens;\n\n if (!tokenData || tokenData.total === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n categories: {},\n hint: `No design tokens found. Add a tokens.include pattern to your ${BRAND.configFile} and run \\`${BRAND.cliCommand} build\\`.`,\n }, null, 2),\n }],\n };\n }\n\n // Filter by category and/or search\n const filteredCategories: Record<string, Array<{ name: string; description?: string }>> = {};\n let filteredTotal = 0;\n\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n // Filter by category\n if (category && cat !== category) continue;\n\n // Filter by search term within this category\n let filtered = tokens;\n if (search) {\n filtered = tokens.filter(\n (t) => t.name.toLowerCase().includes(search) ||\n (t.description && t.description.toLowerCase().includes(search))\n );\n }\n\n if (filtered.length > 0) {\n filteredCategories[cat] = filtered;\n filteredTotal += filtered.length;\n }\n }\n\n // Build usage hint based on context\n let hint: string | undefined;\n if (filteredTotal === 0) {\n const availableCategories = Object.keys(tokenData.categories);\n hint = search\n ? `No tokens matching \"${search}\". Try: ${availableCategories.join(', ')}`\n : category\n ? `Category \"${category}\" not found. Available: ${availableCategories.join(', ')}`\n : undefined;\n } else if (!category && !search) {\n hint = `Use var(--token-name) in your CSS/styles. Filter by category or search to narrow results.`;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n prefix: tokenData.prefix,\n total: filteredTotal,\n totalAvailable: tokenData.total,\n categories: filteredCategories,\n ...(hint && { hint }),\n ...((!category && !search) && {\n availableCategories: Object.entries(tokenData.categories).map(\n ([cat, tokens]) => ({ category: cat, count: tokens.length })\n ),\n }),\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // IMPLEMENT — one-shot discover + inspect + blocks + tokens\n // ================================================================\n case TOOL_NAMES.implement: {\n const data = await loadFragments();\n const useCase = args?.useCase as string;\n if (!useCase) {\n throw new Error('useCase is required');\n }\n\n const useCaseLower = useCase.toLowerCase();\n const searchTerms = useCaseLower.split(/\\s+/).filter(Boolean);\n\n // 1. Score all fragments (same logic as discover suggest)\n const synonymMap: Record<string, string[]> = {\n 'form': ['input', 'field', 'submit', 'validation'],\n 'input': ['form', 'field', 'text', 'entry'],\n 'button': ['action', 'click', 'submit', 'trigger'],\n 'alert': ['notification', 'message', 'warning', 'error', 'feedback'],\n 'notification': ['alert', 'message', 'toast'],\n 'card': ['container', 'panel', 'box', 'content'],\n 'toggle': ['switch', 'checkbox', 'boolean'],\n 'badge': ['tag', 'label', 'status', 'indicator'],\n 'login': ['auth', 'signin', 'authentication', 'form'],\n 'chat': ['message', 'conversation', 'ai'],\n 'table': ['data', 'grid', 'list', 'rows'],\n };\n\n const expandedTerms = new Set(searchTerms);\n searchTerms.forEach((term) => {\n const synonyms = synonymMap[term];\n if (synonyms) synonyms.forEach((syn) => expandedTerms.add(syn));\n });\n\n const scored = Object.values(data.fragments).map((s) => {\n let score = 0;\n const nameLower = s.meta.name.toLowerCase();\n if (searchTerms.some((t) => nameLower.includes(t))) score += 15;\n else if (Array.from(expandedTerms).some((t) => nameLower.includes(t))) score += 8;\n const desc = s.meta.description?.toLowerCase() ?? '';\n score += searchTerms.filter((t) => desc.includes(t)).length * 6;\n const tags = s.meta.tags?.map((t) => t.toLowerCase()) ?? [];\n score += searchTerms.filter((t) => tags.some((tag) => tag.includes(t))).length * 4;\n const whenUsed = s.usage?.when?.join(' ').toLowerCase() ?? '';\n score += searchTerms.filter((t) => whenUsed.includes(t)).length * 10;\n score += Array.from(expandedTerms).filter((t) => !searchTerms.includes(t) && whenUsed.includes(t)).length * 5;\n if (s.meta.category && searchTerms.some((t) => s.meta.category!.toLowerCase().includes(t))) score += 8;\n if (s.meta.status === 'stable') score += 5;\n if (s.meta.status === 'deprecated') score -= 25;\n return { fragment: s, score };\n });\n\n const topMatches = scored\n .filter((s) => s.score >= 8)\n .sort((a, b) => b.score - a.score)\n .slice(0, 3);\n\n // 2. Build component details for top matches\n const components = await Promise.all(\n topMatches.map(async ({ fragment: s, score }) => {\n const pkgName = await getPackageName(s.meta.name);\n const examples = s.variants.slice(0, 2).map((v) => ({\n variant: v.name,\n code: v.code ?? `<${s.meta.name} />`,\n }));\n const propsSummary = Object.entries(s.props ?? {}).slice(0, 10).map(\n ([name, p]) => `${name}${p.required ? ' (required)' : ''}: ${p.type}${p.values ? ` = ${p.values.join('|')}` : ''}`\n );\n return {\n name: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n confidence: score >= 25 ? 'high' : score >= 15 ? 'medium' : 'low',\n import: `import { ${s.meta.name} } from '${pkgName}';`,\n props: propsSummary,\n examples,\n guidelines: filterPlaceholders(s.usage?.when).slice(0, 3),\n accessibility: s.usage?.accessibility?.slice(0, 2) ?? [],\n };\n })\n );\n\n // 3. Find relevant blocks\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n const matchingBlocks = allBlocks\n .filter((b) => {\n const haystack = [b.name, b.description, ...(b.tags ?? []), ...b.components, b.category].join(' ').toLowerCase();\n return searchTerms.some((t) => haystack.includes(t)) ||\n topMatches.some(({ fragment }) => b.components.some((c) => c.toLowerCase() === fragment.meta.name.toLowerCase()));\n })\n .slice(0, 2)\n .map((b) => ({ name: b.name, description: b.description, components: b.components, code: b.code }));\n\n // 4. Find relevant tokens\n const tokenData = data.tokens;\n let relevantTokens: Record<string, string[]> | undefined;\n if (tokenData) {\n const STYLE_KEYWORDS = ['color', 'spacing', 'padding', 'margin', 'font', 'border', 'radius', 'shadow', 'background', 'hover', 'theme'];\n const styleTerms = searchTerms.filter((t) => STYLE_KEYWORDS.includes(t));\n if (styleTerms.length > 0) {\n relevantTokens = {};\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n const matching = tokens.filter((t) => styleTerms.some((st) => t.name.includes(st) || cat.includes(st)));\n if (matching.length > 0) {\n relevantTokens[cat] = matching.map((t) => t.name);\n }\n }\n if (Object.keys(relevantTokens).length === 0) relevantTokens = undefined;\n }\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n components,\n blocks: matchingBlocks.length > 0 ? matchingBlocks : undefined,\n tokens: relevantTokens,\n noMatch: components.length === 0,\n summary: components.length > 0\n ? `Found ${components.length} component(s) for \"${useCase}\". ${matchingBlocks.length > 0 ? `Plus ${matchingBlocks.length} ready-to-use block(s).` : ''}`\n : `No components match \"${useCase}\". Try ${TOOL_NAMES.discover} with different terms${tokenData ? ` or ${TOOL_NAMES.tokens} for CSS variables` : ''}.`,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // RENDER — render + verify + compare\n // ================================================================\n case TOOL_NAMES.render: {\n const componentName = args?.component as string;\n const variantName = args?.variant as string | undefined;\n const props = (args?.props as Record<string, unknown>) ?? {};\n const viewport = args?.viewport as { width?: number; height?: number } | undefined;\n const useBaseline = (args?.baseline as boolean) ?? false;\n const figmaUrl = args?.figmaUrl as string | undefined;\n const theme = (args?.theme as Theme) ?? config.theme ?? DEFAULTS.theme;\n const threshold = (args?.threshold as number) ?? (figmaUrl ? 1.0 : config.threshold ?? DEFAULTS.diffThreshold);\n\n if (!componentName) {\n return {\n content: [{\n type: 'text' as const,\n text: 'Error: component name is required',\n }],\n isError: true,\n };\n }\n\n // --- Baseline verify mode ---\n if (useBaseline) {\n if (!variantName) {\n throw new Error('variant is required when baseline is true');\n }\n\n const { Timer, CaptureEngine: CE, bufferToBase64Url: toBase64 } = await getService();\n const timer = new Timer();\n\n const storage = await getStorageManager();\n const pool = await getBrowserPool();\n const diff = await getDiffEngine();\n\n const baseline = await storage.loadBaseline(componentName, variantName, theme);\n\n if (!baseline) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n verdict: 'error',\n matches: false,\n diffPercentage: 0,\n screenshot: '',\n baseline: '',\n notes: [],\n error: `No baseline found for ${componentName}/${variantName}. Run \\`${BRAND.cliCommand} screenshot\\` first.`,\n timing: { renderMs: 0, captureMs: 0, diffMs: 0, totalMs: timer.elapsed() },\n } satisfies VerifyResult, null, 2),\n }],\n };\n }\n\n const viewerUrl = config.viewerUrl ?? `http://localhost:${DEFAULTS.port}`;\n const captureEngine = new CE(pool, viewerUrl);\n\n const current = await captureEngine.captureVariant(componentName, variantName, {\n theme,\n delay: DEFAULTS.captureDelayMs,\n });\n\n let diffResult;\n let matches = false;\n\n if (diff.areIdentical(current, baseline)) {\n matches = true;\n diffResult = {\n matches: true,\n diffPercentage: 0,\n diffPixelCount: 0,\n totalPixels: current.viewport.width * current.viewport.height,\n changedRegions: [],\n diffTimeMs: 0,\n };\n } else {\n diffResult = diff.compare(current, baseline, { threshold });\n matches = diffResult.matches;\n }\n\n const result: VerifyResult = {\n verdict: matches ? 'pass' : 'fail',\n matches,\n diffPercentage: diffResult.diffPercentage,\n screenshot: toBase64(current.data),\n baseline: toBase64(baseline.data),\n diffImage: diffResult.diffImage\n ? toBase64(diffResult.diffImage)\n : undefined,\n notes: matches\n ? ['Screenshot matches baseline within threshold']\n : [\n `Diff percentage (${diffResult.diffPercentage}%) exceeds threshold (${threshold}%)`,\n `${diffResult.changedRegions.length} changed region(s) detected`,\n ],\n timing: {\n renderMs: current.metadata.renderTimeMs,\n captureMs: current.metadata.captureTimeMs,\n diffMs: diffResult.diffTimeMs,\n totalMs: timer.elapsed(),\n },\n };\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n }],\n };\n }\n\n // --- Figma compare mode ---\n if (figmaUrl) {\n const baseUrl = config.viewerUrl ?? 'http://localhost:6006';\n const compareUrl = `${baseUrl}/fragments/compare`;\n\n try {\n const response = await fetch(compareUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: componentName,\n variant: variantName,\n props,\n figmaUrl,\n threshold,\n }),\n });\n\n interface CompareResult {\n match?: boolean;\n diffPercentage?: number;\n threshold?: number;\n rendered?: string;\n figma?: string;\n diff?: string;\n figmaUrl?: string;\n changedRegions?: Array<{ x: number; y: number; width: number; height: number }>;\n error?: string;\n suggestion?: string;\n }\n\n const result = await response.json() as CompareResult;\n\n if (!response.ok || result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Compare error: ${result.error ?? 'Unknown error'}${result.suggestion ? `\\nSuggestion: ${result.suggestion}` : ''}`,\n }],\n isError: true,\n };\n }\n\n const content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> = [];\n\n const summaryText = result.match\n ? `MATCH: ${componentName} matches Figma design (${result.diffPercentage}% diff, threshold: ${result.threshold}%)`\n : `MISMATCH: ${componentName} differs from Figma design by ${result.diffPercentage}% (threshold: ${result.threshold}%)`;\n\n content.push({ type: 'text' as const, text: summaryText });\n\n if (result.diff && !result.match) {\n content.push({\n type: 'image' as const,\n data: result.diff.replace('data:image/png;base64,', ''),\n mimeType: 'image/png',\n });\n content.push({\n type: 'text' as const,\n text: `Diff image above shows visual differences (red highlights). Changed regions: ${result.changedRegions?.length ?? 0}`,\n });\n }\n\n content.push({\n type: 'text' as const,\n text: JSON.stringify({\n match: result.match,\n diffPercentage: result.diffPercentage,\n threshold: result.threshold,\n figmaUrl: result.figmaUrl,\n changedRegions: result.changedRegions,\n }, null, 2),\n });\n\n return { content };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to compare component: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running and FIGMA_ACCESS_TOKEN is set.`,\n }],\n isError: true,\n };\n }\n }\n\n // --- Default: pure render mode ---\n const baseUrl = config.viewerUrl ?? 'http://localhost:6006';\n const renderUrl = `${baseUrl}/fragments/render`;\n\n try {\n const response = await fetch(renderUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: componentName,\n props,\n viewport: viewport ?? { width: 800, height: 600 },\n }),\n });\n\n const result = await response.json() as { screenshot?: string; error?: string };\n\n if (!response.ok || result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Render error: ${result.error ?? 'Unknown error'}`,\n }],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'image' as const,\n data: result.screenshot!.replace('data:image/png;base64,', ''),\n mimeType: 'image/png',\n },\n {\n type: 'text' as const,\n text: `Successfully rendered ${componentName} with props: ${JSON.stringify(props)}`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to render component: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // FIX — unchanged\n // ================================================================\n case TOOL_NAMES.fix: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const variantName = (args?.variant as string) ?? undefined;\n const fixType = (args?.fixType as 'token' | 'all') ?? 'all';\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use fragments_discover to see available components.`);\n }\n\n const baseUrl = config.viewerUrl ?? 'http://localhost:6006';\n const fixUrl = `${baseUrl}/fragments/fix`;\n\n try {\n const response = await fetch(fixUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: componentName,\n variant: variantName,\n fixType,\n }),\n });\n\n interface FixResult {\n patches: Array<{ file: string; diff: string }>;\n summary: string;\n error?: string;\n }\n\n const result = await response.json() as FixResult;\n\n if (!response.ok || result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Fix generation error: ${result.error ?? 'Unknown error'}`,\n }],\n isError: true,\n };\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: componentName,\n variant: variantName ?? 'all',\n fixType,\n patches: result.patches,\n summary: result.summary,\n patchCount: result.patches.length,\n nextStep: result.patches.length > 0\n ? 'Apply patches using your editor or `patch` command, then run fragments_render with baseline:true to confirm fixes.'\n : undefined,\n }, null, 2),\n }],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to generate fixes: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // PERF — query performance data\n // ================================================================\n case TOOL_NAMES.perf: {\n const data = await loadFragments();\n const componentName = (args?.component as string) ?? undefined;\n const sort = (args?.sort as string) ?? 'size';\n const filter = (args?.filter as string) ?? undefined;\n\n // Collect components with performance data\n let entries = Object.entries(data.fragments)\n .filter(([, f]) => f.performance)\n .map(([name, f]) => ({\n name,\n ...f.performance!,\n }));\n\n if (entries.length === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n components: [],\n hint: `No performance data found. Run \\`${BRAND.cliCommand} perf\\` first to measure bundle sizes.`,\n }, null, 2),\n }],\n };\n }\n\n // Filter by specific component\n if (componentName) {\n entries = entries.filter(\n (e) => e.name.toLowerCase() === componentName.toLowerCase()\n );\n if (entries.length === 0) {\n throw new Error(\n `No performance data for \"${componentName}\". Run \\`${BRAND.cliCommand} perf --component ${componentName}\\` first.`\n );\n }\n }\n\n // Filter by tier or over-budget\n if (filter) {\n if (filter === 'over-budget') {\n entries = entries.filter((e) => e.overBudget);\n } else {\n entries = entries.filter((e) => e.complexity === filter);\n }\n }\n\n // Sort\n switch (sort) {\n case 'name':\n entries.sort((a, b) => a.name.localeCompare(b.name));\n break;\n case 'budget':\n entries.sort((a, b) => b.budgetPercent - a.budgetPercent);\n break;\n case 'size':\n default:\n entries.sort((a, b) => b.bundleSize - a.bundleSize);\n break;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: entries.length,\n summary: data.performanceSummary ?? undefined,\n components: entries,\n }, null, 2),\n }],\n };\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n },\n ],\n isError: true,\n };\n }\n });\n\n // Cleanup on close\n server.onclose = async () => {\n if (browserPool) {\n await browserPool.shutdown();\n }\n };\n\n return server;\n}\n\n/**\n * Start the MCP server with stdio transport\n */\nexport async function startMcpServer(config: McpServerConfig): Promise<void> {\n const server = createMcpServer(config);\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n}\n","#!/usr/bin/env node\nimport { startMcpServer } from './mcp/server.js';\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\nlet projectRoot = process.cwd();\nlet viewerUrl: string | undefined;\n\nfor (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--project-root' || arg === '-p') {\n projectRoot = args[++i] ?? projectRoot;\n } else if (arg === '--viewer-url' || arg === '-u') {\n viewerUrl = args[++i];\n } else if (arg === '--help' || arg === '-h') {\n console.log(`\nUsage: fragments-mcp [options]\n\nOptions:\n -p, --project-root <path> Project root directory (default: cwd)\n -u, --viewer-url <url> Viewer URL (default: http://localhost:6006)\n -h, --help Show this help message\n`);\n process.exit(0);\n }\n}\n\n// Start server\nstartMcpServer({\n projectRoot,\n viewerUrl,\n}).catch((error) => {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n});\n"],"mappings":"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","names":["args","fragments","name","viewerUrl","baseUrl"]}
|
|
1
|
+
{"version":3,"sources":["../src/mcp/server.ts","../src/mcp/version.ts","../src/mcp-bin.ts"],"sourcesContent":["import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n type Tool,\n} from '@modelcontextprotocol/sdk/types.js';\nimport {\n BRAND,\n DEFAULTS,\n generateContext,\n type CompiledFragmentsFile,\n type VerifyResult,\n type Theme,\n} from '../core/index.js';\nimport { buildMcpTools, buildToolNames, CLI_TOOL_EXTENSIONS } from '@fragments-sdk/context/mcp-tools';\nimport type { CompiledBlock, CompiledTokenData } from '@fragments-sdk/context/types';\nimport { ComponentGraphEngine, deserializeGraph } from '@fragments-sdk/context/graph';\nimport type { GraphEdgeType } from '@fragments-sdk/context/graph';\nimport type { EngineOptions as GovernEngineOptions, McpGovernInput } from '@fragments-sdk/govern';\n// ../service is lazy-imported to avoid requiring playwright at startup.\n// Visual tools (render, fix) load it on first use.\ntype ServiceModule = typeof import('../service/index.js');\nlet _service: ServiceModule | null = null;\nasync function getService(): Promise<ServiceModule> {\n if (!_service) {\n try {\n _service = await import('../service/index.js');\n } catch {\n throw new Error(\n 'Visual tools require playwright. Install it with: npm install playwright'\n );\n }\n }\n return _service;\n}\nimport { readFile } from 'node:fs/promises';\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { createRequire } from 'node:module';\nimport { projectFields } from './utils.js';\nimport { MCP_SERVER_VERSION } from './version.js';\n\n/**\n * MCP Tool names & definitions (from shared source of truth)\n */\nconst TOOL_NAMES = buildToolNames() as Record<string, string> & {\n discover: string;\n inspect: string;\n blocks: string;\n tokens: string;\n implement: string;\n render: string;\n fix: string;\n graph: string;\n a11y: string;\n perf: string;\n generate_ui: string;\n govern: string;\n};\n\nconst TOOLS = buildMcpTools(undefined, CLI_TOOL_EXTENSIONS) as Tool[];\n\ntype McpVerbosity = 'compact' | 'standard' | 'full';\ntype TokenCategorySummary = { category: string; count: number };\n\nconst DISCOVER_SYNONYM_MAP: Record<string, string[]> = {\n form: ['input', 'field', 'submit', 'validation'],\n input: ['form', 'field', 'text', 'entry'],\n button: ['action', 'click', 'submit', 'trigger'],\n action: ['button', 'click', 'trigger'],\n submit: ['button', 'form', 'action', 'send'],\n alert: ['notification', 'message', 'warning', 'error', 'feedback'],\n notification: ['alert', 'message', 'toast'],\n feedback: ['form', 'comment', 'review', 'rating'],\n card: ['container', 'panel', 'box', 'content'],\n toggle: ['switch', 'checkbox', 'boolean', 'on/off'],\n switch: ['toggle', 'checkbox', 'boolean'],\n badge: ['tag', 'label', 'status', 'indicator'],\n status: ['badge', 'indicator', 'state'],\n login: ['auth', 'signin', 'authentication', 'form'],\n auth: ['login', 'signin', 'authentication'],\n chat: ['message', 'conversation', 'ai'],\n table: ['data', 'grid', 'list', 'rows'],\n layout: ['stack', 'grid', 'box', 'container', 'page'],\n landing: ['page', 'hero', 'marketing', 'section', 'layout'],\n hero: ['landing', 'marketing', 'banner', 'headline', 'section'],\n marketing: ['landing', 'hero', 'pricing', 'testimonial', 'cta'],\n};\n\nconst TOKEN_CATEGORY_ALIASES: Record<string, string[]> = {\n colors: ['color', 'colors', 'accent', 'background', 'foreground', 'semantic', 'theme'],\n spacing: ['spacing', 'space', 'spaces', 'padding', 'margin', 'gap', 'inset'],\n typography: ['typography', 'type', 'font', 'fonts', 'letter', 'line-height'],\n surfaces: ['surface', 'surfaces', 'canvas', 'backgrounds'],\n shadows: ['shadow', 'shadows', 'elevation'],\n radius: ['radius', 'radii', 'corner', 'corners', 'round', 'rounded', 'rounding'],\n borders: ['border', 'borders', 'stroke', 'outline'],\n text: ['text', 'copy', 'content'],\n focus: ['focus', 'ring', 'focus-ring'],\n layout: ['layout', 'container', 'grid', 'breakpoint'],\n code: ['code'],\n 'component-sizing': ['component-sizing', 'sizing', 'size', 'sizes'],\n};\n\nconst FRIENDLY_TOKEN_CATEGORY_ORDER = [\n 'colors',\n 'spacing',\n 'typography',\n 'surfaces',\n 'shadows',\n 'radius',\n 'borders',\n 'text',\n 'focus',\n 'layout',\n 'code',\n 'component-sizing',\n] as const;\n\nconst STYLE_QUERY_TERMS = new Set([\n 'color',\n 'colors',\n 'spacing',\n 'padding',\n 'margin',\n 'font',\n 'border',\n 'radius',\n 'shadow',\n 'variable',\n 'token',\n 'css',\n 'theme',\n 'background',\n 'hover',\n 'surface',\n 'focus',\n]);\n\n/**\n * Placeholder patterns to filter out from usage text.\n * These are auto-generated and provide no value to AI agents.\n */\nconst PLACEHOLDER_PATTERNS = [\n /^\\w+ component is needed$/i,\n /^Alternative component is more appropriate$/i,\n /^Use \\w+ when you need/i,\n];\n\n/**\n * Filter out placeholder text from usage arrays\n */\nfunction filterPlaceholders(items: string[] | undefined): string[] {\n if (!items) return [];\n return items.filter(item =>\n !PLACEHOLDER_PATTERNS.some(pattern => pattern.test(item.trim()))\n );\n}\n\nfunction parsePositiveLimit(\n value: unknown,\n defaultValue: number | undefined,\n max: number\n): number | undefined {\n if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {\n return defaultValue;\n }\n\n return Math.min(Math.max(Math.floor(value), 1), max);\n}\n\nfunction resolveVerbosity(value: unknown, compactAlias = false): McpVerbosity {\n if (value === 'compact' || value === 'standard' || value === 'full') {\n return value;\n }\n\n return compactAlias ? 'compact' : 'standard';\n}\n\nfunction normalizeSearchText(value: string | undefined): string {\n return (value ?? '').toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();\n}\n\nfunction splitSearchTerms(value: string | undefined): string[] {\n return Array.from(new Set(normalizeSearchText(value).split(/\\s+/).filter(Boolean)));\n}\n\nfunction expandSearchTerms(terms: string[]): string[] {\n const expanded = new Set(terms);\n\n for (const term of terms) {\n for (const synonym of DISCOVER_SYNONYM_MAP[term] ?? []) {\n expanded.add(synonym);\n }\n }\n\n return Array.from(expanded);\n}\n\nfunction countTermMatches(haystack: string, terms: string[]): number {\n return terms.reduce((count, term) => count + (haystack.includes(term) ? 1 : 0), 0);\n}\n\nfunction truncateCodePreview(code: string, previewLines = 20, threshold = 30): string {\n const lines = code.split('\\n');\n if (lines.length <= threshold) {\n return code;\n }\n\n return `${lines.slice(0, previewLines).join('\\n')}\\n// ... truncated (${lines.length} lines total)`;\n}\n\nfunction assignConfidence(score: number): 'high' | 'medium' | 'low' {\n if (score >= 25) return 'high';\n if (score >= 15) return 'medium';\n return 'low';\n}\n\nfunction canonicalizeTokenCategory(categoryKey: string): string | undefined {\n const normalized = normalizeSearchText(categoryKey);\n for (const canonical of FRIENDLY_TOKEN_CATEGORY_ORDER) {\n if (normalized === canonical) {\n return canonical;\n }\n\n const aliases = TOKEN_CATEGORY_ALIASES[canonical] ?? [];\n if (normalized.includes(canonical) || aliases.some((alias) => normalized.includes(alias))) {\n return canonical;\n }\n }\n\n return undefined;\n}\n\nfunction resolveTokenCategoryKeys(\n tokenData: CompiledTokenData,\n requestedCategory: string | undefined\n): { keys: string[]; canonical?: string } {\n if (!requestedCategory) {\n return { keys: Object.keys(tokenData.categories) };\n }\n\n const normalized = normalizeSearchText(requestedCategory);\n if (!normalized) {\n return { keys: Object.keys(tokenData.categories) };\n }\n\n const keys = Object.keys(tokenData.categories);\n const exactRawMatches = keys.filter((key) => normalizeSearchText(key) === normalized);\n if (exactRawMatches.length > 0) {\n return { keys: exactRawMatches, canonical: canonicalizeTokenCategory(exactRawMatches[0]) };\n }\n\n const canonical = FRIENDLY_TOKEN_CATEGORY_ORDER.find((candidate) => {\n if (candidate === normalized) return true;\n return (TOKEN_CATEGORY_ALIASES[candidate] ?? []).includes(normalized);\n });\n\n if (canonical) {\n const aliases = [canonical, ...(TOKEN_CATEGORY_ALIASES[canonical] ?? [])];\n const aliasMatches = keys.filter((key) => {\n const normalizedKey = normalizeSearchText(key);\n return aliases.some((alias) => normalizedKey.includes(alias));\n });\n\n if (aliasMatches.length > 0) {\n return { keys: aliasMatches, canonical };\n }\n }\n\n const partialMatches = keys.filter((key) => normalizeSearchText(key).includes(normalized));\n return { keys: partialMatches, canonical };\n}\n\nfunction summarizeFriendlyTokenCategories(tokenData: CompiledTokenData): TokenCategorySummary[] {\n const counts = new Map<string, number>();\n\n for (const [rawCategory, tokens] of Object.entries(tokenData.categories)) {\n const canonical = canonicalizeTokenCategory(rawCategory) ?? rawCategory;\n counts.set(canonical, (counts.get(canonical) ?? 0) + tokens.length);\n }\n\n const ordered: TokenCategorySummary[] = [];\n for (const category of FRIENDLY_TOKEN_CATEGORY_ORDER) {\n const count = counts.get(category);\n if (count) {\n ordered.push({ category, count });\n counts.delete(category);\n }\n }\n\n for (const [category, count] of counts) {\n ordered.push({ category, count });\n }\n\n return ordered;\n}\n\nfunction limitTokensPerCategory<T>(\n categories: Record<string, T[]>,\n limit: number | undefined\n): { categories: Record<string, T[]>; total: number } {\n if (limit === undefined) {\n return {\n categories,\n total: Object.values(categories).reduce((sum, entries) => sum + entries.length, 0),\n };\n }\n\n const limited: Record<string, T[]> = {};\n let total = 0;\n\n for (const [category, entries] of Object.entries(categories)) {\n const sliced = entries.slice(0, limit);\n if (sliced.length === 0) continue;\n limited[category] = sliced;\n total += sliced.length;\n }\n\n return { categories: limited, total };\n}\n\nfunction scoreBlockMatch(\n block: CompiledBlock,\n query: string,\n preferredComponents: string[] = []\n): number {\n const normalizedQuery = normalizeSearchText(query);\n if (!normalizedQuery) {\n return 0;\n }\n\n const terms = splitSearchTerms(query);\n const expandedTerms = expandSearchTerms(terms);\n const synonymOnlyTerms = expandedTerms.filter((term) => !terms.includes(term));\n\n const nameText = normalizeSearchText(block.name);\n const descriptionText = normalizeSearchText(block.description);\n const tagsText = normalizeSearchText((block.tags ?? []).join(' '));\n const componentsText = normalizeSearchText(block.components.join(' '));\n const categoryText = normalizeSearchText(block.category);\n\n let score = 0;\n\n if (nameText === normalizedQuery) score += 120;\n else if (nameText.includes(normalizedQuery)) score += 90;\n\n if (tagsText.includes(normalizedQuery)) score += 70;\n if (descriptionText.includes(normalizedQuery)) score += 55;\n if (categoryText.includes(normalizedQuery)) score += 40;\n if (componentsText.includes(normalizedQuery)) score += 25;\n\n score += countTermMatches(nameText, terms) * 30;\n score += countTermMatches(tagsText, terms) * 22;\n score += countTermMatches(descriptionText, terms) * 16;\n score += countTermMatches(categoryText, terms) * 14;\n score += countTermMatches(componentsText, terms) * 10;\n\n score += countTermMatches(nameText, synonymOnlyTerms) * 12;\n score += countTermMatches(tagsText, synonymOnlyTerms) * 10;\n score += countTermMatches(descriptionText, synonymOnlyTerms) * 6;\n\n const preferredMatches = block.components.filter((component) =>\n preferredComponents.some((preferred) => preferred.toLowerCase() === component.toLowerCase())\n );\n score += preferredMatches.length * 18;\n\n return score;\n}\n\nfunction rankBlocks(\n blocks: CompiledBlock[],\n query: string,\n preferredComponents: string[] = []\n): Array<{ block: CompiledBlock; score: number }> {\n return blocks\n .map((block) => ({\n block,\n score: scoreBlockMatch(block, query, preferredComponents),\n }))\n .filter((entry) => entry.score > 0)\n .sort((a, b) => b.score - a.score || a.block.name.localeCompare(b.block.name));\n}\n\n/**\n * Resolve workspace directory globs (e.g. \"apps/*\") into actual paths.\n */\nfunction resolveWorkspaceGlob(baseDir: string, pattern: string): string[] {\n const parts = pattern.split('/');\n let dirs = [baseDir];\n\n for (const part of parts) {\n if (part === '**') continue; // Skip double-star recursion\n const next: string[] = [];\n for (const d of dirs) {\n if (part === '*') {\n try {\n for (const entry of readdirSync(d, { withFileTypes: true })) {\n if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {\n next.push(join(d, entry.name));\n }\n }\n } catch { /* unreadable dir */ }\n } else {\n const candidate = join(d, part);\n if (existsSync(candidate)) next.push(candidate);\n }\n }\n dirs = next;\n }\n\n return dirs;\n}\n\n/**\n * Detect workspace directories from package.json \"workspaces\" or pnpm-workspace.yaml.\n */\nfunction getWorkspaceDirs(rootDir: string): string[] {\n const dirs: string[] = [];\n\n // npm/yarn: package.json \"workspaces\" field\n const rootPkgPath = join(rootDir, 'package.json');\n if (existsSync(rootPkgPath)) {\n try {\n const rootPkg = JSON.parse(readFileSync(rootPkgPath, 'utf-8'));\n const workspaces = Array.isArray(rootPkg.workspaces)\n ? rootPkg.workspaces\n : rootPkg.workspaces?.packages;\n if (Array.isArray(workspaces)) {\n for (const pattern of workspaces) {\n dirs.push(...resolveWorkspaceGlob(rootDir, pattern));\n }\n return dirs;\n }\n } catch { /* unreadable */ }\n }\n\n // pnpm: pnpm-workspace.yaml\n const pnpmWsPath = join(rootDir, 'pnpm-workspace.yaml');\n if (existsSync(pnpmWsPath)) {\n try {\n const content = readFileSync(pnpmWsPath, 'utf-8');\n const lines = content.split('\\n');\n let inPackages = false;\n for (const line of lines) {\n if (/^packages\\s*:/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n const match = line.match(/^\\s+-\\s+['\"]?([^'\"#\\n]+)['\"]?/);\n if (match) {\n dirs.push(...resolveWorkspaceGlob(rootDir, match[1].trim()));\n } else if (/^\\S/.test(line) && line.trim()) {\n break; // New top-level key, stop\n }\n }\n }\n } catch { /* unreadable */ }\n }\n\n return dirs;\n}\n\n/**\n * Scan a directory's package.json deps for packages with a \"fragments\" field.\n * Uses Node.js module resolution (createRequire) to handle all package managers.\n */\n/**\n * Resolve a dependency's package.json path. Tries the standard subpath first,\n * then falls back to resolving the package's main entry and walking up to\n * find package.json — necessary when the package's `exports` map doesn't\n * expose `./package.json`.\n */\nfunction resolveDepPackageJson(\n localRequire: NodeRequire,\n depName: string\n): string | null {\n // Fast path: package exposes ./package.json in exports\n try {\n return localRequire.resolve(`${depName}/package.json`);\n } catch {\n // Blocked by exports map\n }\n\n // Fallback: resolve the package's main entry and walk up to package.json\n try {\n const mainPath = localRequire.resolve(depName);\n let dir = dirname(mainPath);\n while (true) {\n const candidate = join(dir, 'package.json');\n if (existsSync(candidate)) {\n const pkg = JSON.parse(readFileSync(candidate, 'utf-8'));\n if (pkg.name === depName) return candidate;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n } catch {\n // Package not resolvable at all\n }\n\n return null;\n}\n\nfunction findFragmentsInDeps(dir: string, found: string[]): void {\n const pkgJsonPath = join(dir, 'package.json');\n if (!existsSync(pkgJsonPath)) return;\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n };\n const localRequire = createRequire(join(dir, 'noop.js'));\n for (const depName of Object.keys(allDeps)) {\n try {\n const depPkgPath = resolveDepPackageJson(localRequire, depName);\n if (!depPkgPath) continue;\n const depPkg = JSON.parse(readFileSync(depPkgPath, 'utf-8'));\n if (depPkg.fragments) {\n const fragmentsPath = join(dirname(depPkgPath), depPkg.fragments);\n if (existsSync(fragmentsPath) && !found.includes(fragmentsPath)) {\n found.push(fragmentsPath);\n }\n }\n } catch {\n // Package not resolvable or unreadable, skip\n }\n }\n } catch {\n // No package.json or unreadable\n }\n}\n\n/**\n * Find fragments.json files:\n * 1. Walk up from startDir (for library authors with a local build)\n * 2. Read package.json deps and resolve packages with a \"fragments\" field\n * 3. Check workspace packages' deps (monorepo support)\n *\n * Uses Node.js module resolution (createRequire) to handle all package\n * managers: pnpm symlinks, yarn PnP, monorepo hoisting, etc.\n */\nexport function findFragmentsJson(startDir: string): string[] {\n const found: string[] = [];\n const resolvedStart = resolve(startDir);\n\n // 1. Walk upward from startDir (library author flow)\n let dir = resolvedStart;\n while (true) {\n const candidate = join(dir, BRAND.outFile);\n if (existsSync(candidate)) {\n found.push(candidate);\n break;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n // 2. Check root package.json deps\n findFragmentsInDeps(resolvedStart, found);\n\n // 3. Check workspace packages' deps (monorepo support)\n if (found.length === 0 || existsSync(join(resolvedStart, 'pnpm-workspace.yaml'))) {\n const workspaceDirs = getWorkspaceDirs(resolvedStart);\n for (const wsDir of workspaceDirs) {\n findFragmentsInDeps(wsDir, found);\n }\n }\n\n return found;\n}\n\n/**\n * MCP Server configuration\n */\nexport interface McpServerConfig {\n /** Project root directory */\n projectRoot: string;\n\n /** Viewer base URL */\n viewerUrl?: string;\n\n /** Default theme for verification */\n theme?: Theme;\n\n /** Diff threshold percentage */\n threshold?: number;\n}\n/**\n * Create and configure the MCP server\n */\nexport function createMcpServer(config: McpServerConfig): Server {\n const server = new Server(\n {\n name: `${BRAND.nameLower}-mcp`,\n version: MCP_SERVER_VERSION,\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Lazy-loaded resources\n let fragmentsData: CompiledFragmentsFile | null = null;\n // Per-fragment package name map (fragment name → package name from its source fragments.json)\n const fragmentPackageMap = new Map<string, string>();\n let defaultPackageName: string | null = null;\n\n let browserPool: any = null;\n let storageManager: any = null;\n let diffEngine: any = null;\n let isPoolWarming = false;\n\n async function loadFragments(): Promise<CompiledFragmentsFile> {\n if (fragmentsData) {\n return fragmentsData;\n }\n\n const paths = findFragmentsJson(config.projectRoot);\n\n if (paths.length === 0) {\n throw new Error(\n `No ${BRAND.outFile} found. Searched ${config.projectRoot} and package.json dependencies. ` +\n `Either run \\`${BRAND.cliCommand} build\\` or install a package with a \"fragments\" field in its package.json.`\n );\n }\n\n // Load and merge all found fragments files\n const content = await readFile(paths[0], 'utf-8');\n fragmentsData = JSON.parse(content) as CompiledFragmentsFile;\n\n // Normalize legacy \"recipes\" key to \"blocks\"\n if (!fragmentsData.blocks && fragmentsData.recipes) {\n fragmentsData.blocks = fragmentsData.recipes;\n }\n\n // Track per-fragment package names from each source file\n if (fragmentsData.packageName) {\n for (const name of Object.keys(fragmentsData.fragments)) {\n fragmentPackageMap.set(name, fragmentsData.packageName);\n }\n }\n\n for (let i = 1; i < paths.length; i++) {\n const extra = JSON.parse(await readFile(paths[i], 'utf-8')) as CompiledFragmentsFile;\n // Track package name for each fragment from this file\n if (extra.packageName) {\n for (const name of Object.keys(extra.fragments)) {\n fragmentPackageMap.set(name, extra.packageName);\n }\n }\n Object.assign(fragmentsData.fragments, extra.fragments);\n // Support both \"blocks\" (new) and \"recipes\" (legacy) keys\n const extraBlocks = extra.blocks ?? extra.recipes;\n if (extraBlocks) {\n fragmentsData.blocks = { ...fragmentsData.blocks, ...extraBlocks };\n }\n }\n\n return fragmentsData;\n }\n\n /**\n * Get the package name for import statements for a specific component.\n * Uses per-fragment tracking when multiple fragments.json files are merged,\n * falls back to the first fragments.json packageName, then project package.json.\n */\n async function getPackageName(fragmentName?: string): Promise<string> {\n // Ensure fragments are loaded (populates fragmentPackageMap)\n await loadFragments();\n\n // Check per-fragment map first (handles multi-library merges correctly)\n if (fragmentName) {\n const segPkg = fragmentPackageMap.get(fragmentName);\n if (segPkg) return segPkg;\n }\n\n if (defaultPackageName) {\n return defaultPackageName;\n }\n\n // Prefer packageName from first fragments.json\n if (fragmentsData?.packageName) {\n defaultPackageName = fragmentsData.packageName;\n return defaultPackageName;\n }\n\n // Fallback to project package.json\n const packageJsonPath = join(config.projectRoot, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = await readFile(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(content) as { name?: string };\n if (pkg.name) {\n defaultPackageName = pkg.name;\n return defaultPackageName;\n }\n } catch {\n // Fall through to default\n }\n }\n\n // Default fallback\n defaultPackageName = 'your-component-library';\n return defaultPackageName;\n }\n\n /**\n * Get or create browser pool with extended idle timeout for MCP\n */\n async function getBrowserPool() {\n if (!browserPool) {\n const { BrowserPool } = await getService();\n browserPool = new BrowserPool({\n viewport: DEFAULTS.viewport,\n // 30 minute idle timeout for MCP - server runs continuously\n idleTimeoutMs: 30 * 60 * 1000,\n poolSize: 2, // Keep 2 contexts warm for faster captures\n });\n }\n return browserPool;\n }\n\n /**\n * Pre-warm browser pool in background (non-blocking)\n */\n function warmBrowserPool(): void {\n if (isPoolWarming || browserPool?.isReady) {\n return;\n }\n isPoolWarming = true;\n\n // Warm in background - don't await\n getBrowserPool().then((pool) => {\n pool.warmup().then(() => {\n isPoolWarming = false;\n }).catch(() => {\n isPoolWarming = false;\n });\n }).catch(() => {\n isPoolWarming = false;\n });\n }\n\n /**\n * Get or create storage manager\n */\n async function getStorageManager() {\n if (!storageManager) {\n const { StorageManager } = await getService();\n storageManager = new StorageManager({\n projectRoot: config.projectRoot,\n });\n await storageManager.initialize();\n }\n return storageManager;\n }\n\n /**\n * Get or create diff engine\n */\n async function getDiffEngine() {\n if (!diffEngine) {\n const { DiffEngine } = await getService();\n diffEngine = new DiffEngine(config.threshold ?? DEFAULTS.diffThreshold);\n }\n return diffEngine;\n }\n\n // Register tool listing\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return { tools: TOOLS };\n });\n\n // Register tool execution\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n // ================================================================\n // DISCOVER — list, suggest, context, alternatives\n // ================================================================\n case TOOL_NAMES.discover: {\n const data = await loadFragments();\n const useCase = (args?.useCase as string) ?? undefined;\n const componentForAlts = (args?.component as string) ?? undefined;\n const category = normalizeSearchText(args?.category as string | undefined) || undefined;\n const search = normalizeSearchText(args?.search as string | undefined) || undefined;\n const status = (args?.status as string) ?? undefined;\n const format = (args?.format as 'markdown' | 'json') ?? 'markdown';\n const compact = (args?.compact as boolean) ?? false;\n const includeCode = (args?.includeCode as boolean) ?? false;\n const includeRelations = (args?.includeRelations as boolean) ?? false;\n const verbosity = resolveVerbosity(args?.verbosity, compact);\n const listLimit = parsePositiveLimit(args?.limit, undefined, 50);\n const suggestLimit = parsePositiveLimit(args?.limit, 10, 25) ?? 10;\n\n // --- Context mode: explicit format request with no specific query ---\n if (args?.format && !useCase && !componentForAlts && !category && !search && !status) {\n const fragments = Object.values(data.fragments);\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n\n const { content: ctxContent, tokenEstimate } = generateContext(fragments, {\n format,\n compact: verbosity === 'compact',\n include: {\n code: includeCode || verbosity === 'full',\n relations: includeRelations,\n },\n }, allBlocks);\n\n return {\n content: [{\n type: 'text' as const,\n text: ctxContent,\n }],\n _meta: { tokenEstimate },\n };\n }\n\n // --- Suggest mode: useCase provided ---\n if (useCase) {\n const useCaseLower = useCase.toLowerCase();\n const context = ((args as Record<string, unknown>)?.context as string)?.toLowerCase() ?? '';\n const searchTerms = splitSearchTerms(`${useCaseLower} ${context}`);\n const expandedTerms = expandSearchTerms(searchTerms);\n const synonymOnlyTerms = expandedTerms.filter((term) => !searchTerms.includes(term));\n\n const scored = Object.values(data.fragments).map((s) => {\n let score = 0;\n const reasons: string[] = [];\n\n const nameLower = s.meta.name.toLowerCase();\n if (searchTerms.some((term) => nameLower.includes(term))) {\n score += 15;\n reasons.push(`Name matches search`);\n } else if (expandedTerms.some((term) => nameLower.includes(term))) {\n score += 8;\n reasons.push(`Name matches related term`);\n }\n\n const desc = s.meta.description?.toLowerCase() ?? '';\n const descMatches = searchTerms.filter((term) => desc.includes(term));\n if (descMatches.length > 0) {\n score += descMatches.length * 6;\n reasons.push(`Description matches: ${descMatches.join(', ')}`);\n }\n\n const tags = s.meta.tags?.map((t) => t.toLowerCase()) ?? [];\n const tagMatches = searchTerms.filter((term) =>\n tags.some((tag) => tag.includes(term))\n );\n if (tagMatches.length > 0) {\n score += tagMatches.length * 4;\n reasons.push(`Tags match: ${tagMatches.join(', ')}`);\n }\n\n const whenUsed = s.usage?.when?.join(' ').toLowerCase() ?? '';\n const whenMatches = searchTerms.filter((term) => whenUsed.includes(term));\n if (whenMatches.length > 0) {\n score += whenMatches.length * 10;\n reasons.push(`Use cases match: \"${whenMatches.join(', ')}\"`);\n }\n\n const expandedWhenMatches = synonymOnlyTerms.filter((term) => whenUsed.includes(term));\n if (expandedWhenMatches.length > 0) {\n score += expandedWhenMatches.length * 5;\n reasons.push(`Related use cases: \"${expandedWhenMatches.join(', ')}\"`);\n }\n\n const cat = s.meta.category?.toLowerCase() ?? '';\n if (searchTerms.some((term) => cat.includes(term))) {\n score += 8;\n reasons.push(`Category: ${s.meta.category}`);\n }\n\n const variantText = s.variants\n .map(v => `${v.name} ${v.description || ''}`.toLowerCase())\n .join(' ');\n const variantMatches = searchTerms.filter(term => variantText.includes(term));\n if (variantMatches.length > 0) {\n score += variantMatches.length * 3;\n reasons.push(`Variants match: ${variantMatches.join(', ')}`);\n }\n\n if (s.meta.status === 'stable') {\n score += 5;\n reasons.push('Stable component');\n } else if (s.meta.status === 'beta') {\n score += 2;\n }\n\n if (s.meta.status === 'deprecated') {\n score -= 25;\n reasons.push('Deprecated - consider alternatives');\n }\n\n const filteredWhen = filterPlaceholders(s.usage?.when).slice(0, 3);\n const filteredWhenNot = filterPlaceholders(s.usage?.whenNot).slice(0, 2);\n\n let confidence: 'high' | 'medium' | 'low';\n if (score >= 25) confidence = 'high';\n else if (score >= 15) confidence = 'medium';\n else confidence = 'low';\n\n return {\n component: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n score,\n confidence,\n reasons,\n usage: { when: filteredWhen, whenNot: filteredWhenNot },\n variantCount: s.variants.length,\n status: s.meta.status,\n };\n });\n\n const MIN_SCORE = 8;\n const filtered = scored\n .filter((s) => s.score >= MIN_SCORE)\n .sort((a, b) => b.score - a.score);\n\n const suggestions: typeof filtered = [];\n const categoryCount: Record<string, number> = {};\n for (const item of filtered) {\n const cat = item.category || 'uncategorized';\n const count = categoryCount[cat] || 0;\n if (count < 2 || suggestions.length < 3) {\n suggestions.push(item);\n categoryCount[cat] = count + 1;\n if (suggestions.length >= suggestLimit) break;\n }\n }\n\n const compositionHint = suggestions.length >= 2\n ? `These components work well together. For example, ${suggestions[0].component} can be combined with ${suggestions.slice(1, 3).map(s => s.component).join(' and ')}.`\n : undefined;\n\n // Detect if query is about styling/tokens rather than components\n const isStyleQuery = splitSearchTerms(useCaseLower).some((term) => STYLE_QUERY_TERMS.has(term));\n\n // Determine no-match quality\n const noMatch = suggestions.length === 0;\n const weakMatch = !noMatch && suggestions.every((s) => s.confidence === 'low');\n\n let recommendation: string;\n let nextStep: string | undefined;\n if (noMatch) {\n recommendation = isStyleQuery\n ? `No matching components found. Your query seems styling-related — try ${TOOL_NAMES.tokens} to find CSS custom properties.`\n : `No matching components found. Try different keywords or browse all components with ${TOOL_NAMES.discover}.`;\n nextStep = isStyleQuery\n ? `Use ${TOOL_NAMES.tokens}(search: \"${searchTerms[0]}\") to find design tokens.`\n : undefined;\n } else if (weakMatch) {\n recommendation = `Weak matches only — ${suggestions[0].component} might work but confidence is low.${isStyleQuery ? ` If you need a CSS variable, try ${TOOL_NAMES.tokens}.` : ''}`;\n nextStep = `Use ${TOOL_NAMES.inspect}(\"${suggestions[0].component}\") to check if it fits, or try broader search terms.`;\n } else {\n recommendation = `Best match: ${suggestions[0].component} (${suggestions[0].confidence} confidence) - ${suggestions[0].description}`;\n nextStep = `Use ${TOOL_NAMES.inspect}(\"${suggestions[0].component}\") for full details.`;\n }\n\n const suggestionResults = suggestions.map(({ score, ...rest }) =>\n verbosity === 'full' ? { ...rest, score } : rest\n );\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n context: context || undefined,\n suggestions: verbosity === 'compact'\n ? suggestionResults.map((suggestion) => ({\n component: suggestion.component,\n description: suggestion.description,\n confidence: suggestion.confidence,\n }))\n : suggestionResults,\n noMatch,\n weakMatch,\n recommendation,\n compositionHint,\n nextStep,\n }, null, 2),\n }],\n };\n }\n\n // --- Alternatives mode: component provided (no useCase) ---\n if (componentForAlts) {\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentForAlts.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentForAlts}\" not found. Use ${TOOL_NAMES.discover} to see available components.`);\n }\n\n const relations = fragment.relations ?? [];\n\n const referencedBy = Object.values(data.fragments)\n .filter((s) =>\n s.relations?.some((r) => r.component.toLowerCase() === componentForAlts.toLowerCase())\n )\n .map((s) => ({\n component: s.meta.name,\n relationship: s.relations?.find(\n (r) => r.component.toLowerCase() === componentForAlts.toLowerCase()\n )?.relationship,\n note: s.relations?.find(\n (r) => r.component.toLowerCase() === componentForAlts.toLowerCase()\n )?.note,\n }));\n\n const sameCategory = Object.values(data.fragments)\n .filter(\n (s) =>\n s.meta.category === fragment.meta.category &&\n s.meta.name.toLowerCase() !== componentForAlts.toLowerCase()\n )\n .map((s) => ({\n component: s.meta.name,\n description: s.meta.description,\n }));\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: fragment.meta.name,\n category: fragment.meta.category,\n directRelations: relations,\n referencedBy,\n sameCategory,\n suggestion: relations.find((r) => r.relationship === 'alternative')\n ? `Consider ${relations.find((r) => r.relationship === 'alternative')?.component}: ${relations.find((r) => r.relationship === 'alternative')?.note}`\n : undefined,\n }, null, 2),\n }],\n };\n }\n\n // --- Default: list mode ---\n const fragments = Object.values(data.fragments)\n .filter((s) => {\n if (category && normalizeSearchText(s.meta.category) !== category) return false;\n if (status && (s.meta.status ?? 'stable') !== status) return false;\n if (search) {\n const nameMatch = s.meta.name.toLowerCase().includes(search);\n const descMatch = s.meta.description?.toLowerCase().includes(search);\n const tagMatch = s.meta.tags?.some((t) => t.toLowerCase().includes(search));\n if (!nameMatch && !descMatch && !tagMatch) return false;\n }\n return true;\n });\n\n const total = fragments.length;\n const limitedFragments = listLimit === undefined ? fragments : fragments.slice(0, listLimit);\n const formattedFragments = limitedFragments.map((s) => {\n const base = {\n name: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n status: s.meta.status ?? 'stable',\n variantCount: s.variants.length,\n };\n\n if (verbosity === 'compact') {\n return base;\n }\n\n if (verbosity === 'full') {\n return {\n ...base,\n tags: s.meta.tags ?? [],\n usage: {\n when: filterPlaceholders(s.usage?.when).slice(0, 3),\n whenNot: filterPlaceholders(s.usage?.whenNot).slice(0, 2),\n },\n relations: s.relations ?? [],\n codeExample: s.variants[0]?.code,\n };\n }\n\n return {\n ...base,\n tags: s.meta.tags ?? [],\n };\n });\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total,\n returned: formattedFragments.length,\n fragments: formattedFragments,\n categories: [...new Set(fragments.map((s) => s.meta.category))],\n hint: total === 0\n ? 'No components found. Try broader search terms or check available categories.'\n : total > 5\n ? `Use ${TOOL_NAMES.discover} with useCase for recommendations, or ${TOOL_NAMES.inspect} for details on a specific component.`\n : undefined,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // INSPECT — get + guidelines + example in one call\n // ================================================================\n case TOOL_NAMES.inspect: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const fields = args?.fields as string[] | undefined;\n const variantName = (args?.variant as string) ?? undefined;\n const maxExamples = args?.maxExamples as number | undefined;\n const maxLines = args?.maxLines as number | undefined;\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use ${TOOL_NAMES.discover} to see available components.`);\n }\n\n // Build the full inspect result combining get + guidelines + example\n const pkgName = await getPackageName(fragment.meta.name);\n\n // Filter variants for examples — fuzzy match: exact → prefix → contains\n let variants = fragment.variants;\n if (variantName) {\n const query = variantName.toLowerCase();\n // 1. Exact match\n let filtered = variants.filter(\n (v) => v.name.toLowerCase() === query\n );\n // 2. Prefix match (e.g. \"Dots\" matches \"Dots (Default)\")\n if (filtered.length === 0) {\n filtered = variants.filter(\n (v) => v.name.toLowerCase().startsWith(query)\n );\n }\n // 3. Contains match (e.g. \"elapsed\" matches \"With Elapsed Time\")\n if (filtered.length === 0) {\n filtered = variants.filter(\n (v) => v.name.toLowerCase().includes(query)\n );\n }\n if (filtered.length > 0) {\n variants = filtered;\n } else {\n throw new Error(\n `Variant \"${variantName}\" not found for ${componentName}. ` +\n `Available: ${fragment.variants.map((v) => v.name).join(', ')}`\n );\n }\n }\n if (maxExamples && maxExamples > 0) {\n variants = variants.slice(0, maxExamples);\n }\n\n const truncateCode = (code: string): string => {\n if (!maxLines || maxLines <= 0) return code;\n const lines = code.split('\\n');\n if (lines.length <= maxLines) return code;\n return lines.slice(0, maxLines).join('\\n') + '\\n// ... truncated';\n };\n\n const examples = variants.map((variant) => {\n if (variant.code) {\n return {\n variant: variant.name,\n description: variant.description,\n code: truncateCode(variant.code),\n };\n }\n return {\n variant: variant.name,\n description: variant.description,\n code: `<${fragment.meta.name} />`,\n note: 'No code example provided in fragment. Refer to props for customization.',\n };\n });\n\n const propsReference = Object.entries(fragment.props ?? {}).map(([propName, prop]) => ({\n name: propName,\n type: prop.type,\n required: prop.required,\n default: prop.default,\n description: prop.description,\n }));\n\n const propConstraints = Object.entries(fragment.props ?? {})\n .filter(([, prop]) => prop.constraints && prop.constraints.length > 0)\n .map(([pName, prop]) => ({\n prop: pName,\n constraints: prop.constraints,\n }));\n\n const fullResult = {\n // Component data (from old \"get\")\n meta: fragment.meta,\n props: fragment.props,\n variants: fragment.variants,\n relations: fragment.relations,\n contract: fragment.contract,\n generated: fragment._generated,\n // Guidelines (from old \"guidelines\")\n guidelines: {\n when: filterPlaceholders(fragment.usage?.when),\n whenNot: filterPlaceholders(fragment.usage?.whenNot),\n guidelines: fragment.usage?.guidelines ?? [],\n accessibility: fragment.usage?.accessibility ?? [],\n propConstraints,\n alternatives: fragment.relations\n ?.filter((r) => r.relationship === 'alternative')\n .map((r) => ({\n component: r.component,\n note: r.note,\n })) ?? [],\n },\n // Examples (from old \"example\")\n examples: {\n import: `import { ${fragment.meta.name} } from '${pkgName}';`,\n code: examples,\n propsReference,\n },\n };\n\n // Apply field projection if specified\n const result = fields && fields.length > 0\n ? projectFields(fullResult as unknown as Record<string, unknown>, fields)\n : fullResult;\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n }],\n };\n }\n\n // ================================================================\n // BLOCKS — composition patterns\n // ================================================================\n case TOOL_NAMES.blocks: {\n const data = await loadFragments();\n const blockName = args?.name as string | undefined;\n const search = (args?.search as string) ?? undefined;\n const component = (args?.component as string)?.toLowerCase() ?? undefined;\n const category = normalizeSearchText(args?.category as string | undefined) || undefined;\n const blocksLimit = parsePositiveLimit(args?.limit, undefined, 50);\n const verbosity = resolveVerbosity(args?.verbosity);\n\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n\n if (allBlocks.length === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n blocks: [],\n hint: `No blocks found. Run \\`${BRAND.cliCommand} build\\` after adding .block.ts files.`,\n }, null, 2),\n }],\n };\n }\n\n let filtered = allBlocks;\n\n if (blockName) {\n filtered = filtered.filter((b) => b.name.toLowerCase() === blockName.toLowerCase());\n }\n\n if (search) {\n filtered = rankBlocks(filtered, search).map(({ block }) => block);\n }\n\n if (component) {\n filtered = filtered.filter(b =>\n b.components.some(c => c.toLowerCase() === component)\n );\n }\n\n if (category) {\n filtered = filtered.filter(b =>\n normalizeSearchText(b.category) === category\n );\n }\n\n if (!search) {\n filtered = [...filtered].sort((a, b) => a.name.localeCompare(b.name));\n }\n\n const total = filtered.length;\n if (blocksLimit !== undefined) {\n filtered = filtered.slice(0, blocksLimit);\n }\n\n const blocks = filtered.map((block) => {\n const base = {\n name: block.name,\n description: block.description,\n category: block.category,\n components: block.components,\n tags: block.tags,\n };\n\n if (verbosity === 'compact') {\n return base;\n }\n\n return {\n ...base,\n code: verbosity === 'full' ? block.code : truncateCodePreview(block.code),\n };\n });\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total,\n returned: blocks.length,\n blocks,\n ...(total === 0 && {\n hint: 'No blocks matching your query. Try broader search terms.',\n }),\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // TOKENS — list CSS custom properties by category\n // ================================================================\n case TOOL_NAMES.tokens: {\n const data = await loadFragments();\n const category = (args?.category as string) ?? undefined;\n const search = normalizeSearchText(args?.search as string | undefined) || undefined;\n const tokensLimit = parsePositiveLimit(args?.limit, search ? 25 : undefined, 100);\n\n const tokenData = data.tokens;\n\n if (!tokenData || tokenData.total === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n categories: {},\n hint: `No design tokens found. Add a tokens.include pattern to your ${BRAND.configFile} and run \\`${BRAND.cliCommand} build\\`.`,\n }, null, 2),\n }],\n };\n }\n\n // Filter by category and/or search\n const filteredCategories: Record<string, Array<{ name: string; description?: string }>> = {};\n const resolvedCategory = resolveTokenCategoryKeys(tokenData, category);\n const searchCategoryKeys = search ? resolveTokenCategoryKeys(tokenData, search).keys : [];\n\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n if (category && !resolvedCategory.keys.includes(cat)) continue;\n\n let filtered = tokens;\n if (search) {\n const normalizedCategory = normalizeSearchText(cat);\n const searchMatchesCategory = searchCategoryKeys.includes(cat);\n if (!searchMatchesCategory) {\n filtered = tokens.filter(\n (token) =>\n token.name.toLowerCase().includes(search) ||\n (token.description && token.description.toLowerCase().includes(search)) ||\n normalizedCategory.includes(search)\n );\n }\n }\n\n if (filtered.length > 0) {\n filteredCategories[cat] = filtered;\n }\n }\n\n const limited = limitTokensPerCategory(filteredCategories, tokensLimit);\n const filteredTotal = limited.total;\n const friendlyCategories = summarizeFriendlyTokenCategories(tokenData);\n const availableCategoryNames = friendlyCategories.map((entry) => entry.category);\n\n // Build usage hint based on context\n let hint: string | undefined;\n if (filteredTotal === 0) {\n hint = search\n ? `No tokens matching \"${search}\". Try categories like: ${availableCategoryNames.join(', ')}`\n : category\n ? `Category \"${category}\" not found. Try categories like: ${availableCategoryNames.join(', ')}`\n : undefined;\n } else if (!category && !search) {\n hint = `Use var(--token-name) in your CSS/styles. Filter by category or search to narrow results.`;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n prefix: tokenData.prefix,\n total: filteredTotal,\n totalAvailable: tokenData.total,\n categories: limited.categories,\n ...(hint && { hint }),\n ...((!category && !search) && {\n availableCategories: friendlyCategories,\n }),\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // IMPLEMENT — one-shot discover + inspect + blocks + tokens\n // ================================================================\n case TOOL_NAMES.implement: {\n const data = await loadFragments();\n const useCase = args?.useCase as string;\n if (!useCase) {\n throw new Error('useCase is required');\n }\n\n const useCaseLower = useCase.toLowerCase();\n const searchTerms = splitSearchTerms(useCaseLower);\n const expandedTerms = expandSearchTerms(searchTerms);\n const synonymOnlyTerms = expandedTerms.filter((term) => !searchTerms.includes(term));\n const verbosity = resolveVerbosity(args?.verbosity);\n const componentLimit = parsePositiveLimit(args?.limit, 5, 15) ?? 5;\n\n const scored = Object.values(data.fragments).map((s) => {\n let score = 0;\n const nameLower = s.meta.name.toLowerCase();\n if (searchTerms.some((t) => nameLower.includes(t))) score += 15;\n else if (expandedTerms.some((t) => nameLower.includes(t))) score += 8;\n const desc = s.meta.description?.toLowerCase() ?? '';\n score += searchTerms.filter((t) => desc.includes(t)).length * 6;\n const tags = s.meta.tags?.map((t) => t.toLowerCase()) ?? [];\n score += searchTerms.filter((t) => tags.some((tag) => tag.includes(t))).length * 4;\n const whenUsed = s.usage?.when?.join(' ').toLowerCase() ?? '';\n score += searchTerms.filter((t) => whenUsed.includes(t)).length * 10;\n score += synonymOnlyTerms.filter((t) => whenUsed.includes(t)).length * 5;\n if (s.meta.category && searchTerms.some((t) => s.meta.category!.toLowerCase().includes(t))) score += 8;\n if (s.meta.status === 'stable') score += 5;\n if (s.meta.status === 'deprecated') score -= 25;\n return { fragment: s, score };\n });\n\n const topMatches = scored\n .filter((s) => s.score >= 8)\n .sort((a, b) => b.score - a.score)\n .slice(0, componentLimit);\n\n // 2. Build component details for top matches\n const components = await Promise.all(\n topMatches.map(async ({ fragment: s, score }) => {\n const pkgName = await getPackageName(s.meta.name);\n const confidence = assignConfidence(score);\n\n if (verbosity === 'compact') {\n return {\n name: s.meta.name,\n description: s.meta.description,\n confidence,\n import: `import { ${s.meta.name} } from '${pkgName}';`,\n };\n }\n\n const exampleLimit = verbosity === 'full' ? s.variants.length : 2;\n const propsLimit = verbosity === 'full' ? Object.keys(s.props ?? {}).length : 5;\n const examples = s.variants.slice(0, exampleLimit).map((v) => ({\n variant: v.name,\n code: v.code ?? `<${s.meta.name} />`,\n }));\n const propsSummary = Object.entries(s.props ?? {}).slice(0, propsLimit).map(\n ([name, p]) => `${name}${p.required ? ' (required)' : ''}: ${p.type}${p.values ? ` = ${p.values.join('|')}` : ''}`\n );\n\n return {\n name: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n confidence,\n import: `import { ${s.meta.name} } from '${pkgName}';`,\n props: propsSummary,\n examples,\n guidelines: filterPlaceholders(s.usage?.when).slice(0, 3),\n accessibility: s.usage?.accessibility?.slice(0, 2) ?? [],\n };\n })\n );\n\n // 3. Find relevant blocks\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n const preferredComponents = topMatches.map(({ fragment }) => fragment.meta.name);\n const matchingBlocks = rankBlocks(allBlocks, useCase, preferredComponents)\n .slice(0, 2)\n .map(({ block }) => {\n const base = {\n name: block.name,\n description: block.description,\n components: block.components,\n };\n\n if (verbosity === 'compact') {\n return base;\n }\n\n return {\n ...base,\n code: verbosity === 'full' ? block.code : truncateCodePreview(block.code),\n };\n });\n\n // 4. Find relevant tokens\n const tokenData = data.tokens;\n let relevantTokens: Record<string, string[]> | undefined;\n if (tokenData) {\n const styleCategories = Array.from(new Set(searchTerms.flatMap((term) => {\n return FRIENDLY_TOKEN_CATEGORY_ORDER.filter((categoryName) => {\n if (categoryName === term) return true;\n return (TOKEN_CATEGORY_ALIASES[categoryName] ?? []).includes(term);\n });\n })));\n\n if (styleCategories.length > 0) {\n relevantTokens = {};\n for (const categoryName of styleCategories) {\n const matchingCategoryKeys = resolveTokenCategoryKeys(tokenData, categoryName).keys;\n for (const key of matchingCategoryKeys) {\n const tokens = tokenData.categories[key];\n if (tokens && tokens.length > 0) {\n relevantTokens[key] = tokens.slice(0, 5).map((token) => token.name);\n }\n }\n }\n if (Object.keys(relevantTokens).length === 0) relevantTokens = undefined;\n }\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n components,\n blocks: matchingBlocks.length > 0 ? matchingBlocks : undefined,\n tokens: verbosity === 'compact' ? undefined : relevantTokens,\n noMatch: components.length === 0,\n summary: components.length > 0\n ? `Found ${components.length} component(s) for \"${useCase}\". ${matchingBlocks.length > 0 ? `Plus ${matchingBlocks.length} ready-to-use block(s).` : ''}`\n : `No components match \"${useCase}\". Try ${TOOL_NAMES.discover} with different terms${tokenData ? ` or ${TOOL_NAMES.tokens} for CSS variables` : ''}.`,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // RENDER — render + verify + compare\n // ================================================================\n case TOOL_NAMES.render: {\n const componentName = args?.component as string;\n const variantName = args?.variant as string | undefined;\n const props = (args?.props as Record<string, unknown>) ?? {};\n const viewport = args?.viewport as { width?: number; height?: number } | undefined;\n const useBaseline = (args?.baseline as boolean) ?? false;\n const figmaUrl = args?.figmaUrl as string | undefined;\n const theme = (args?.theme as Theme) ?? config.theme ?? DEFAULTS.theme;\n const threshold = (args?.threshold as number) ?? (figmaUrl ? 1.0 : config.threshold ?? DEFAULTS.diffThreshold);\n\n if (!componentName) {\n return {\n content: [{\n type: 'text' as const,\n text: 'Error: component name is required',\n }],\n isError: true,\n };\n }\n\n // --- Baseline verify mode ---\n if (useBaseline) {\n if (!variantName) {\n throw new Error('variant is required when baseline is true');\n }\n\n const { Timer, CaptureEngine: CE, bufferToBase64Url: toBase64 } = await getService();\n const timer = new Timer();\n\n const storage = await getStorageManager();\n const pool = await getBrowserPool();\n const diff = await getDiffEngine();\n\n const baseline = await storage.loadBaseline(componentName, variantName, theme);\n\n if (!baseline) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n verdict: 'error',\n matches: false,\n diffPercentage: 0,\n screenshot: '',\n baseline: '',\n notes: [],\n error: `No baseline found for ${componentName}/${variantName}. Run \\`${BRAND.cliCommand} screenshot\\` first.`,\n timing: { renderMs: 0, captureMs: 0, diffMs: 0, totalMs: timer.elapsed() },\n } satisfies VerifyResult, null, 2),\n }],\n };\n }\n\n const viewerUrl = config.viewerUrl ?? `http://localhost:${DEFAULTS.port}`;\n const captureEngine = new CE(pool, viewerUrl);\n\n const current = await captureEngine.captureVariant(componentName, variantName, {\n theme,\n delay: DEFAULTS.captureDelayMs,\n });\n\n let diffResult;\n let matches = false;\n\n if (diff.areIdentical(current, baseline)) {\n matches = true;\n diffResult = {\n matches: true,\n diffPercentage: 0,\n diffPixelCount: 0,\n totalPixels: current.viewport.width * current.viewport.height,\n changedRegions: [],\n diffTimeMs: 0,\n };\n } else {\n diffResult = diff.compare(current, baseline, { threshold });\n matches = diffResult.matches;\n }\n\n const result: VerifyResult = {\n verdict: matches ? 'pass' : 'fail',\n matches,\n diffPercentage: diffResult.diffPercentage,\n screenshot: toBase64(current.data),\n baseline: toBase64(baseline.data),\n diffImage: diffResult.diffImage\n ? toBase64(diffResult.diffImage)\n : undefined,\n notes: matches\n ? ['Screenshot matches baseline within threshold']\n : [\n `Diff percentage (${diffResult.diffPercentage}%) exceeds threshold (${threshold}%)`,\n `${diffResult.changedRegions.length} changed region(s) detected`,\n ],\n timing: {\n renderMs: current.metadata.renderTimeMs,\n captureMs: current.metadata.captureTimeMs,\n diffMs: diffResult.diffTimeMs,\n totalMs: timer.elapsed(),\n },\n };\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify(result, null, 2),\n }],\n };\n }\n\n // --- Figma compare mode ---\n if (figmaUrl) {\n const baseUrl = config.viewerUrl ?? 'http://localhost:6006';\n const compareUrl = `${baseUrl}/fragments/compare`;\n\n try {\n const response = await fetch(compareUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: componentName,\n variant: variantName,\n props,\n figmaUrl,\n threshold,\n }),\n });\n\n interface CompareResult {\n match?: boolean;\n diffPercentage?: number;\n threshold?: number;\n rendered?: string;\n figma?: string;\n diff?: string;\n figmaUrl?: string;\n changedRegions?: Array<{ x: number; y: number; width: number; height: number }>;\n error?: string;\n suggestion?: string;\n }\n\n const result = await response.json() as CompareResult;\n\n if (!response.ok || result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Compare error: ${result.error ?? 'Unknown error'}${result.suggestion ? `\\nSuggestion: ${result.suggestion}` : ''}`,\n }],\n isError: true,\n };\n }\n\n const content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> = [];\n\n const summaryText = result.match\n ? `MATCH: ${componentName} matches Figma design (${result.diffPercentage}% diff, threshold: ${result.threshold}%)`\n : `MISMATCH: ${componentName} differs from Figma design by ${result.diffPercentage}% (threshold: ${result.threshold}%)`;\n\n content.push({ type: 'text' as const, text: summaryText });\n\n if (result.diff && !result.match) {\n content.push({\n type: 'image' as const,\n data: result.diff.replace('data:image/png;base64,', ''),\n mimeType: 'image/png',\n });\n content.push({\n type: 'text' as const,\n text: `Diff image above shows visual differences (red highlights). Changed regions: ${result.changedRegions?.length ?? 0}`,\n });\n }\n\n content.push({\n type: 'text' as const,\n text: JSON.stringify({\n match: result.match,\n diffPercentage: result.diffPercentage,\n threshold: result.threshold,\n figmaUrl: result.figmaUrl,\n changedRegions: result.changedRegions,\n }, null, 2),\n });\n\n return { content };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to compare component: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running and FIGMA_ACCESS_TOKEN is set.`,\n }],\n isError: true,\n };\n }\n }\n\n // --- Default: pure render mode ---\n const baseUrl = config.viewerUrl ?? 'http://localhost:6006';\n const renderUrl = `${baseUrl}/fragments/render`;\n\n try {\n const response = await fetch(renderUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: componentName,\n props,\n viewport: viewport ?? { width: 800, height: 600 },\n }),\n });\n\n const result = await response.json() as { screenshot?: string; error?: string };\n\n if (!response.ok || result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Render error: ${result.error ?? 'Unknown error'}`,\n }],\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: 'image' as const,\n data: result.screenshot!.replace('data:image/png;base64,', ''),\n mimeType: 'image/png',\n },\n {\n type: 'text' as const,\n text: `Successfully rendered ${componentName} with props: ${JSON.stringify(props)}`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to render component: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // FIX — unchanged\n // ================================================================\n case TOOL_NAMES.fix: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const variantName = (args?.variant as string) ?? undefined;\n const fixType = (args?.fixType as 'token' | 'all') ?? 'all';\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use ${TOOL_NAMES.discover} to see available components.`);\n }\n\n const baseUrl = config.viewerUrl ?? 'http://localhost:6006';\n const fixUrl = `${baseUrl}/fragments/fix`;\n\n try {\n const response = await fetch(fixUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: componentName,\n variant: variantName,\n fixType,\n }),\n });\n\n interface FixResult {\n patches: Array<{ file: string; diff: string }>;\n summary: string;\n error?: string;\n }\n\n const result = await response.json() as FixResult;\n\n if (!response.ok || result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Fix generation error: ${result.error ?? 'Unknown error'}`,\n }],\n isError: true,\n };\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: componentName,\n variant: variantName ?? 'all',\n fixType,\n patches: result.patches,\n summary: result.summary,\n patchCount: result.patches.length,\n nextStep: result.patches.length > 0\n ? `Apply patches using your editor or \\`patch\\` command, then run ${TOOL_NAMES.render} with baseline:true to confirm fixes.`\n : undefined,\n }, null, 2),\n }],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to generate fixes: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // GRAPH — query component relationship graph\n // ================================================================\n case TOOL_NAMES.graph: {\n const data = await loadFragments();\n const mode = (args?.mode as string) ?? 'health';\n const componentName = args?.component as string | undefined;\n const target = args?.target as string | undefined;\n const edgeTypes = args?.edgeTypes as GraphEdgeType[] | undefined;\n const maxDepth = (args?.maxDepth as number | undefined) ?? 3;\n\n if (!data.graph) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: 'No graph data available. Run `fragments build` to generate the component graph.',\n hint: 'The graph is built automatically during `fragments build` and embedded in fragments.json.',\n }),\n }],\n isError: true,\n };\n }\n\n const graph = deserializeGraph(data.graph);\n const blocks = data.blocks\n ? Object.fromEntries(\n Object.entries(data.blocks).map(([key, value]) => [key, { components: value.components }])\n )\n : undefined;\n const engine = new ComponentGraphEngine(graph, blocks);\n\n const requireComponent = (modeName: string): string | undefined => {\n if (!componentName) {\n return `component is required for ${modeName} mode`;\n }\n if (!engine.hasNode(componentName)) {\n return `Component \"${componentName}\" not found in graph.`;\n }\n return undefined;\n };\n\n switch (mode) {\n case 'health': {\n const health = engine.getHealth();\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n mode,\n ...health,\n summary: `${health.nodeCount} components, ${health.edgeCount} edges, ${health.connectedComponents.length} island(s), ${health.orphans.length} orphan(s), ${health.compositionCoverage}% in blocks`,\n }, null, 2),\n }],\n };\n }\n\n case 'dependencies': {\n const error = requireComponent(mode);\n if (error) throw new Error(error);\n const dependencies = engine.dependencies(componentName!, edgeTypes);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n mode,\n component: componentName,\n count: dependencies.length,\n dependencies: dependencies.map((edge) => ({\n component: edge.target,\n type: edge.type,\n weight: edge.weight,\n note: edge.note,\n provenance: edge.provenance,\n })),\n }, null, 2),\n }],\n };\n }\n\n case 'dependents': {\n const error = requireComponent(mode);\n if (error) throw new Error(error);\n const dependents = engine.dependents(componentName!, edgeTypes);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n mode,\n component: componentName,\n count: dependents.length,\n dependents: dependents.map((edge) => ({\n component: edge.source,\n type: edge.type,\n weight: edge.weight,\n note: edge.note,\n provenance: edge.provenance,\n })),\n }, null, 2),\n }],\n };\n }\n\n case 'impact': {\n const error = requireComponent(mode);\n if (error) throw new Error(error);\n const impact = engine.impact(componentName!, maxDepth);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n mode,\n ...impact,\n summary: `Changing ${componentName} affects ${impact.totalAffected} component(s) and ${impact.affectedBlocks.length} block(s)`,\n }, null, 2),\n }],\n };\n }\n\n case 'path': {\n if (!componentName || !target) {\n throw new Error('component and target are required for path mode');\n }\n const path = engine.path(componentName, target);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n mode,\n from: componentName,\n to: target,\n ...path,\n edges: path.edges.map((edge) => ({\n source: edge.source,\n target: edge.target,\n type: edge.type,\n })),\n }, null, 2),\n }],\n };\n }\n\n case 'composition': {\n const error = requireComponent(mode);\n if (error) throw new Error(error);\n const composition = engine.composition(componentName!);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n mode,\n ...composition,\n }, null, 2),\n }],\n };\n }\n\n case 'alternatives': {\n const error = requireComponent(mode);\n if (error) throw new Error(error);\n const alternatives = engine.alternatives(componentName!);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n mode,\n component: componentName,\n count: alternatives.length,\n alternatives,\n }, null, 2),\n }],\n };\n }\n\n case 'islands': {\n const islands = engine.islands();\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n mode,\n count: islands.length,\n islands: islands.map((island, index) => ({\n id: index + 1,\n size: island.length,\n components: island,\n })),\n }, null, 2),\n }],\n };\n }\n\n default:\n throw new Error(`Unknown mode: \"${mode}\". Valid modes: dependencies, dependents, impact, path, composition, alternatives, islands, health`);\n }\n }\n\n // ================================================================\n // A11Y — run accessibility audit against viewer endpoint\n // ================================================================\n case TOOL_NAMES.a11y: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const variantName = (args?.variant as string) ?? undefined;\n const standard = (args?.standard as 'AA' | 'AAA') ?? 'AA';\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (entry) => entry.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use ${TOOL_NAMES.discover} to see available components.`);\n }\n\n const baseUrl = config.viewerUrl ?? 'http://localhost:6006';\n const auditUrl = `${baseUrl}/fragments/a11y`;\n\n try {\n const response = await fetch(auditUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: componentName,\n variant: variantName,\n standard,\n }),\n });\n\n const result = await response.json() as {\n results?: Array<{\n variant: string;\n violations: number;\n passes: number;\n incomplete: number;\n summary: {\n total: number;\n critical: number;\n serious: number;\n moderate: number;\n minor: number;\n };\n violationDetails?: Array<{\n id: string;\n impact?: string;\n description: string;\n helpUrl: string;\n nodes: number;\n }>;\n }>;\n error?: string;\n };\n\n if (!response.ok || result.error) {\n throw new Error(result.error ?? 'A11y audit failed');\n }\n\n const variants = result.results ?? [];\n const summary = variants.reduce(\n (acc, variant) => {\n acc.totalViolations += variant.violations;\n acc.totalPasses += variant.passes;\n acc.totalIncomplete += variant.incomplete;\n acc.critical += variant.summary.critical;\n acc.serious += variant.summary.serious;\n acc.moderate += variant.summary.moderate;\n acc.minor += variant.summary.minor;\n return acc;\n },\n {\n totalViolations: 0,\n totalPasses: 0,\n totalIncomplete: 0,\n critical: 0,\n serious: 0,\n moderate: 0,\n minor: 0,\n }\n );\n\n const totalChecks = summary.totalPasses + summary.totalViolations + summary.totalIncomplete;\n const wcagScore = totalChecks > 0\n ? Math.round((summary.totalPasses / totalChecks) * 100)\n : 100;\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: componentName,\n standard,\n wcagScore,\n passed: summary.critical === 0 && summary.serious === 0,\n summary,\n variants,\n }, null, 2),\n }],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to run accessibility audit: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // GENERATE_UI — delegate to playground generation endpoint\n // ================================================================\n case TOOL_NAMES.generate_ui: {\n const prompt = args?.prompt as string;\n if (!prompt) {\n throw new Error('prompt is required');\n }\n\n const currentTree = args?.currentTree as Record<string, unknown> | undefined;\n const playgroundUrl = 'https://usefragments.com';\n const response = await fetch(`${playgroundUrl}/api/playground/generate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n prompt,\n ...(currentTree && { currentSpec: currentTree }),\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Playground API error (${response.status}): ${await response.text()}`);\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: await response.text(),\n }],\n };\n }\n\n // ================================================================\n // GOVERN — validate generated UI specs against governance policies\n // ================================================================\n case TOOL_NAMES.govern: {\n const data = await loadFragments();\n const spec = args?.spec;\n if (!spec || typeof spec !== 'object') {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: 'spec is required and must be an object with { nodes: [{ id, type, props, children }] }',\n }),\n }],\n isError: true,\n };\n }\n\n const {\n handleGovernTool,\n formatVerdict,\n universal,\n fragments: fragmentsPreset,\n } = await import('@fragments-sdk/govern');\n\n const policyOverrides = args?.policy as Record<string, unknown> | undefined;\n const format = (args?.format as 'json' | 'summary') ?? 'json';\n const tokenPrefix = data.tokens?.prefix;\n const basePolicy =\n tokenPrefix && tokenPrefix.includes('fui')\n ? { rules: fragmentsPreset().rules }\n : { rules: universal().rules };\n const engineOptions: GovernEngineOptions | undefined = data.tokens\n ? { tokenData: data.tokens }\n : undefined;\n\n const input: McpGovernInput = {\n spec,\n policy: policyOverrides as McpGovernInput['policy'],\n format,\n };\n\n try {\n const verdict = await handleGovernTool(input, basePolicy, engineOptions);\n return {\n content: [{\n type: 'text' as const,\n text: format === 'summary'\n ? formatVerdict(verdict, 'summary')\n : JSON.stringify(verdict),\n }],\n _meta: {\n score: verdict.score,\n passed: verdict.passed,\n violationCount: verdict.results.reduce((sum, result) => sum + result.violations.length, 0),\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: message,\n }),\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // PERF — query performance data\n // ================================================================\n case TOOL_NAMES.perf: {\n const data = await loadFragments();\n const componentName = (args?.component as string) ?? undefined;\n const sort = (args?.sort as string) ?? 'size';\n const filter = (args?.filter as string) ?? undefined;\n\n // Collect components with performance data\n let entries = Object.entries(data.fragments)\n .filter(([, f]) => f.performance)\n .map(([name, f]) => ({\n name,\n ...f.performance!,\n }));\n\n if (entries.length === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n components: [],\n hint: `No performance data found. Run \\`${BRAND.cliCommand} perf\\` first to measure bundle sizes.`,\n }, null, 2),\n }],\n };\n }\n\n // Filter by specific component\n if (componentName) {\n entries = entries.filter(\n (e) => e.name.toLowerCase() === componentName.toLowerCase()\n );\n if (entries.length === 0) {\n throw new Error(\n `No performance data for \"${componentName}\". Run \\`${BRAND.cliCommand} perf --component ${componentName}\\` first.`\n );\n }\n }\n\n // Filter by tier or over-budget\n if (filter) {\n if (filter === 'over-budget') {\n entries = entries.filter((e) => e.overBudget);\n } else {\n entries = entries.filter((e) => e.complexity === filter);\n }\n }\n\n // Sort\n switch (sort) {\n case 'name':\n entries.sort((a, b) => a.name.localeCompare(b.name));\n break;\n case 'budget':\n entries.sort((a, b) => b.budgetPercent - a.budgetPercent);\n break;\n case 'size':\n default:\n entries.sort((a, b) => b.bundleSize - a.bundleSize);\n break;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: entries.length,\n summary: data.performanceSummary ?? undefined,\n components: entries,\n }, null, 2),\n }],\n };\n }\n\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n },\n ],\n isError: true,\n };\n }\n });\n\n // Cleanup on close\n server.onclose = async () => {\n if (browserPool) {\n await browserPool.shutdown();\n }\n };\n\n return server;\n}\n\n/**\n * Start the MCP server with stdio transport\n */\nexport async function startMcpServer(config: McpServerConfig): Promise<void> {\n const server = createMcpServer(config);\n const transport = new StdioServerTransport();\n\n await server.connect(transport);\n}\n","import { readFileSync } from \"node:fs\";\n\ninterface PackageJson {\n version?: string;\n}\n\nfunction readPackageVersion(): string {\n try {\n const raw = readFileSync(new URL(\"../../package.json\", import.meta.url), \"utf-8\");\n const pkg = JSON.parse(raw) as PackageJson;\n return pkg.version ?? \"0.0.0\";\n } catch {\n return \"0.0.0\";\n }\n}\n\nexport const MCP_SERVER_VERSION = readPackageVersion();\n","#!/usr/bin/env node\nimport { startMcpServer } from './mcp/server.js';\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\nlet projectRoot = process.cwd();\nlet viewerUrl: string | undefined;\n\nfor (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--project-root' || arg === '-p') {\n projectRoot = args[++i] ?? projectRoot;\n } else if (arg === '--viewer-url' || arg === '-u') {\n viewerUrl = args[++i];\n } else if (arg === '--help' || arg === '-h') {\n console.log(`\nUsage: fragments-mcp [options]\n\nOptions:\n -p, --project-root <path> Project root directory (default: cwd)\n -u, --viewer-url <url> Viewer URL (default: http://localhost:6006)\n -h, --help Show this help message\n`);\n process.exit(0);\n }\n}\n\n// Start server\nstartMcpServer({\n projectRoot,\n viewerUrl,\n}).catch((error) => {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n});\n"],"mappings":"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","names":["readFileSync","readFileSync","args","fragments","name","viewerUrl","baseUrl"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fragments-sdk/cli",
|
|
3
|
-
"version": "0.15.
|
|
3
|
+
"version": "0.15.10",
|
|
4
4
|
"license": "FSL-1.1-MIT",
|
|
5
5
|
"description": "CLI, MCP server, and dev tools for Fragments design system",
|
|
6
6
|
"author": "Conan McNicholl",
|
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
"@fragments-sdk/context": "0.6.0",
|
|
87
87
|
"@fragments-sdk/core": "2.0.0",
|
|
88
88
|
"@fragments-sdk/govern": "^0.3.1",
|
|
89
|
-
"@fragments-sdk/viewer": "0.2.
|
|
89
|
+
"@fragments-sdk/viewer": "0.2.9",
|
|
90
90
|
"@fragments-sdk/webmcp": "3.0.0"
|
|
91
91
|
},
|
|
92
92
|
"devDependencies": {
|