@fragments-sdk/mcp 0.7.0 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts","../src/config.ts","../src/orama-index.ts","../src/version.ts","../src/search.ts","../src/scoring.ts","../src/server-helpers.ts","../src/tools/discover.ts","../src/tools/inspect.ts","../src/utils.ts","../src/tools/blocks.ts","../src/tools/tokens.ts","../src/tools/implement.ts","../src/service.ts","../src/tools/render.ts","../src/tools/fix.ts","../src/tools/a11y.ts","../src/graph-handler.ts","../src/tools/graph.ts","../src/tools/perf.ts","../src/tools/govern.ts","../src/tools/generate-ui.ts","../src/tools/index.ts","../src/registry.ts","../src/middleware.ts","../src/source-selection.ts","../src/adapters/fragments-json.ts","../src/discovery.ts","../src/adapters/snapshot-converters.ts","../src/adapters/auto-extract.ts","../src/adapters/discover-components.ts","../src/adapters/scan-tokens.ts","../src/adapters/cloud-catalog.ts","../src/adapters/bundle.ts"],"sourcesContent":["/**\n * Standalone MCP server for Fragments design system.\n *\n * This is a lightweight extraction of the MCP server from @fragments-sdk/cli\n * that can run independently without Playwright or build tools. It provides:\n * - MCP tools for design system discovery, governance, performance, and viewer flows\n * - Hybrid search: Convex-backed vector search + local keyword scoring + RRF\n * - HTTP-only render/fix/a11y (requires a running dev server)\n */\n\nimport { 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 { existsSync } from 'node:fs';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { BRAND } from './constants.js';\nimport { loadConfigFile } from './config.js';\nimport { buildMcpTools, buildToolNames, MCP_TOOL_DEFINITIONS } from '@fragments-sdk/context/mcp-tools';\nimport { buildComponentIndex, buildBlockIndex, buildTokenIndex } from './orama-index.js';\nimport type { ComponentIndex, BlockIndex, TokenIndex } from './orama-index.js';\nimport { MCP_SERVER_VERSION } from './version.js';\nimport type { McpServerConfig, ToolContext } from './types.js';\nimport { CORE_TOOLS, VIEWER_TOOLS, INFRA_TOOLS, TOOL_CAPABILITIES } from './tools/index.js';\nimport { ToolRegistry } from './registry.js';\nimport { executeWithMiddleware } from './middleware.js';\nimport { resolveDataAdapter, resolveSearchApiKey } from './source-selection.js';\n\nexport type { McpServerConfig } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Tool names & definitions (from shared source of truth)\n// ---------------------------------------------------------------------------\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 govern: string;\n render: string;\n fix: string;\n graph: string;\n perf: string;\n a11y: string;\n generate_ui: string;\n};\n\nconst TOOLS = buildMcpTools() as Tool[];\n\n// ---------------------------------------------------------------------------\n// Server implementation\n// ---------------------------------------------------------------------------\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: { listChanged: true },\n },\n }\n );\n\n // Create tool registry\n const registry = new ToolRegistry('', {\n onChanged: () => {\n server.notification({ method: 'notifications/tools/list_changed', params: {} });\n },\n });\n\n // Register built-in tools\n registry.registerBuiltins(\n { core: CORE_TOOLS, viewer: VIEWER_TOOLS, infra: INFRA_TOOLS },\n MCP_TOOL_DEFINITIONS,\n TOOL_CAPABILITIES,\n );\n\n // Load file config (user can pre-provide via config.fileConfig, or we auto-load)\n const fileConfig = config.fileConfig ?? loadConfigFile(config.projectRoot) ?? undefined;\n const mergedConfig: McpServerConfig = {\n ...(fileConfig ? { ...config, fileConfig } : config),\n searchApiKey: resolveSearchApiKey(config, fileConfig),\n };\n const adapter = config.adapter ?? resolveDataAdapter(mergedConfig, fileConfig).adapter;\n\n // Let consumers register custom tools\n config.onRegistry?.(registry);\n\n // Apply tool exclusions from config file\n if (fileConfig?.tools?.exclude) {\n for (const key of fileConfig.tools.exclude) {\n registry.unregister(key);\n }\n }\n\n // Lazy-loaded resources\n let cachedData: import('./types.js').DesignSystemData | null = null;\n let resolvedRoot: string | null = null;\n\n // Orama BM25 indexes — built once after loadFragments(), reused across searches\n let componentIndex: ComponentIndex | null = null;\n let blockIndex: BlockIndex | null = null;\n let tokenIndex: TokenIndex | null = null;\n\n /**\n * Resolve the project root directory.\n *\n * Layer 1: Try MCP roots/list (VS Code, Claude Code, and any client\n * that implements the MCP roots capability).\n * Layer 2: Fall back to the configured projectRoot (defaults to cwd).\n */\n async function resolveProjectRoot(): Promise<string> {\n if (resolvedRoot) return resolvedRoot;\n\n // Layer 1: Try MCP roots/list\n try {\n const result = await server.listRoots();\n if (result.roots?.length > 0) {\n const rootUri = result.roots[0].uri;\n // Convert file:///path/to/workspace -> /path/to/workspace\n resolvedRoot = fileURLToPath(rootUri);\n return resolvedRoot;\n }\n } catch {\n // Client doesn't support roots/list (e.g. Cursor) — fall through\n }\n\n // Layer 2: Fall back to configured projectRoot (cwd)\n resolvedRoot = config.projectRoot;\n return resolvedRoot;\n }\n\n async function loadData(): Promise<import('./types.js').DesignSystemData> {\n if (cachedData) return cachedData;\n const projectRoot = await resolveProjectRoot();\n cachedData = await adapter.load(projectRoot);\n\n // Build Orama BM25 indexes\n const allFragments = Object.values(cachedData.components);\n const allBlocks = Object.values(cachedData.blocks ?? {});\n componentIndex = buildComponentIndex(allFragments);\n if (allBlocks.length > 0) {\n blockIndex = buildBlockIndex(allBlocks);\n }\n if (cachedData.tokens && cachedData.tokens.total > 0) {\n tokenIndex = buildTokenIndex(cachedData.tokens);\n }\n\n return cachedData;\n }\n\n // Register tool listing — omit viewer-dependent tools when no viewer URL is configured\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n const data = await loadData();\n return {\n tools: registry.listTools(\n {\n hasViewer: !!config.viewerUrl,\n hasPlayground: !!(config.playgroundUrl ?? fileConfig?.playgroundUrl),\n capabilities: data.capabilities,\n },\n TOOLS,\n ),\n };\n });\n\n // Register tool execution\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n const data = await loadData();\n const toolContext: ToolContext = {\n data,\n config: mergedConfig,\n indexes: { componentIndex, blockIndex, tokenIndex },\n resolvePackageName: (name?: string) => {\n if (name) {\n const pkg = data.packageMap[name];\n if (pkg) return pkg;\n }\n if (data.defaultPackageName) return data.defaultPackageName;\n const root = resolvedRoot ?? config.projectRoot;\n const packageJsonPath = join(root, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(content) as { name?: string };\n if (pkg.name) {\n return pkg.name;\n }\n } catch { /* Fall through */ }\n }\n return 'your-component-library';\n },\n toolNames: TOOL_NAMES as Record<string, string>,\n };\n\n try {\n const toolKey = registry.resolveKey(name);\n const mCtx = {\n toolName: name,\n toolKey,\n args: args ?? {},\n ctx: toolContext,\n };\n\n return await executeWithMiddleware(\n config.middleware ?? [],\n mCtx,\n () => registry.execute(name, args ?? {}, toolContext),\n );\n } catch (error) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ error: error instanceof Error ? error.message : String(error) }) }],\n isError: true,\n };\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 await server.connect(transport);\n}\n\n/**\n * Smithery sandbox server for capability scanning.\n * Returns a server instance with default config so Smithery can enumerate tools.\n */\nexport function createSandboxServer() {\n return createMcpServer({ projectRoot: process.cwd() });\n}\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SearchConfig } from './search-config.js';\nimport type { ServiceEndpoints } from './service.js';\nimport type { Brand } from './constants.js';\n\nexport interface DsMcpConfigFile {\n /** Override source selection (defaults to auto-detect) */\n source?: 'auto' | 'fragments-json' | 'cloud' | 'bundle' | 'extract';\n /** Override branding (name, prefix, etc.) */\n brand?: Partial<Brand>;\n /** Search configuration overrides */\n search?: SearchConfig;\n /** Service endpoint path overrides */\n endpoints?: Partial<ServiceEndpoints>;\n /** Tool configuration */\n tools?: {\n /** Tool keys to exclude from registration */\n exclude?: string[];\n };\n /** Vector search configuration */\n vectorSearch?: {\n url?: string;\n apiKey?: string;\n };\n /** Fragments Cloud catalog configuration */\n cloud?: {\n /** Override Cloud catalog API URL */\n url?: string;\n /** Override Cloud API key (defaults to FRAGMENTS_API_KEY env var) */\n apiKey?: string;\n };\n /** Playground URL for generate_ui */\n playgroundUrl?: string;\n /**\n * @deprecated The MCP v2 Cloud path uses `/api/catalog` and ignores this\n * configuration. It is retained only for backward compatibility with older\n * local enrichment workflows and should not be used for new setups.\n */\n enrichment?: {\n /** Override enrichment API URL (defaults to Fragments Cloud) */\n url?: string;\n /** Override Cloud API key (defaults to FRAGMENTS_API_KEY env var) */\n apiKey?: string;\n /** Disable enrichment fetching */\n disabled?: boolean;\n /** Cache TTL in ms (default: 600000 = 10 minutes) */\n ttlMs?: number;\n };\n}\n\n/**\n * Load config from ds-mcp.config.json or package.json \"dsMcp\" field.\n * Returns null if no config file is found (pure defaults).\n */\nexport function loadConfigFile(projectRoot: string): DsMcpConfigFile | null {\n // 1. Check for ds-mcp.config.json\n const configPath = join(projectRoot, 'ds-mcp.config.json');\n if (existsSync(configPath)) {\n try {\n const content = readFileSync(configPath, 'utf-8');\n return JSON.parse(content) as DsMcpConfigFile;\n } catch (e) {\n throw new Error(`Failed to parse ${configPath}: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n // 2. Check package.json \"dsMcp\" field\n const pkgPath = join(projectRoot, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const content = readFileSync(pkgPath, 'utf-8');\n const pkg = JSON.parse(content) as { dsMcp?: DsMcpConfigFile };\n if (pkg.dsMcp) return pkg.dsMcp;\n } catch {\n // Ignore parse errors in package.json\n }\n }\n\n return null;\n}\n","/**\n * Orama-powered BM25 search indexes for components, blocks, and tokens.\n *\n * Replaces the bag-of-words keyword scorer with Orama's built-in BM25 engine,\n * which provides IDF weighting (automatically downweights common terms like\n * \"page\", \"section\", \"content\"), stemming, and field-level boosting.\n */\n\nimport { create, insertMultiple, search } from '@orama/orama';\nimport type { AnyOrama } from '@orama/orama';\nimport type { McpBlock, McpComponent, McpTokenData } from '@fragments-sdk/core';\nimport type {\n CompiledBlock,\n CompiledFragment,\n CompiledTokenData,\n} from '@fragments-sdk/context/types';\nimport type { ScoredResult, EntryKind } from './search.js';\n\n// ---------------------------------------------------------------------------\n// Synonym map (shared with search.ts — imported via re-export)\n// ---------------------------------------------------------------------------\n\nexport const 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 'textarea': ['text', 'input', 'multiline', 'area', 'comment'],\n 'area': ['textarea', 'multiline', 'text'],\n 'landing': ['page', 'hero', 'marketing', 'section', 'layout'],\n 'hero': ['landing', 'marketing', 'banner', 'headline', 'section'],\n 'marketing': ['landing', 'hero', 'pricing', 'testimonial', 'cta'],\n 'cta': ['marketing', 'banner', 'action', 'button'],\n 'testimonial': ['marketing', 'review', 'quote', 'feedback'],\n 'layout': ['stack', 'grid', 'box', 'container', 'page'],\n 'page': ['layout', 'landing', 'section', 'container'],\n 'section': ['hero', 'feature', 'testimonial', 'cta', 'faq'],\n 'pricing': ['card', 'plan', 'tier', 'marketing'],\n 'plan': ['pricing', 'card', 'tier', 'subscription'],\n 'dashboard': ['metrics', 'stats', 'chart', 'card', 'grid'],\n 'metrics': ['dashboard', 'stats', 'progress', 'number'],\n 'stats': ['metrics', 'dashboard', 'progress', 'badge'],\n 'chart': ['dashboard', 'metrics', 'data', 'graph'],\n};\n\n// ---------------------------------------------------------------------------\n// Query expansion via synonyms\n// ---------------------------------------------------------------------------\n\n/**\n * Expand a query string with synonym terms.\n * Returns the expanded query as a single string suitable for Orama `term`.\n */\nexport function expandQuery(query: string): string {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const expanded = new Set(terms);\n for (const term of terms) {\n const synonyms = SYNONYM_MAP[term];\n if (synonyms) {\n for (const syn of synonyms) expanded.add(syn);\n }\n }\n return Array.from(expanded).join(' ');\n}\n\n// ---------------------------------------------------------------------------\n// Shared two-pass search pattern\n// ---------------------------------------------------------------------------\n\ninterface TwoPassConfig {\n index: AnyOrama;\n query: string;\n properties: string[];\n boost: Record<string, number>;\n limit: number;\n kind: EntryKind;\n}\n\n/**\n * Two-pass BM25 search: original terms weighted 2x, synonym-expanded terms 1x.\n * Prevents synonym noise from outranking truly relevant results.\n */\nexport function twoPassSearch(config: TwoPassConfig): ScoredResult[] {\n const { index, query, properties, boost, limit, kind } = config;\n\n const baseConfig = {\n mode: 'fulltext' as const,\n properties,\n boost,\n limit,\n };\n\n const originalTermsQuery = query.toLowerCase().split(/\\s+/).filter(Boolean).join(' ');\n const expandedQuery = expandQuery(query);\n\n // First pass: original terms only (moderate threshold to filter weak matches)\n const originalResults = search(index, { term: originalTermsQuery, ...baseConfig, threshold: 0.8 });\n // Second pass: synonym-expanded (permissive — scoring handles relevance via 1x weight)\n const expandedResults = search(index, { term: expandedQuery, ...baseConfig, threshold: 1 });\n\n type Hit = { score: number; document: { name: string } };\n const origHits = (originalResults as unknown as { hits: Hit[] }).hits;\n const expHits = (expandedResults as unknown as { hits: Hit[] }).hits;\n\n // Combine scores: original terms get 2x weight\n const scoreMap = new Map<string, number>();\n for (const hit of origHits) {\n scoreMap.set(hit.document.name, (hit.score || 0) * 2);\n }\n for (const hit of expHits) {\n const name = hit.document.name;\n const existing = scoreMap.get(name) ?? 0;\n scoreMap.set(name, existing + (hit.score || 0));\n }\n\n const scored: ScoredResult[] = [];\n for (const [name, score] of scoreMap) {\n if (score > 0) {\n scored.push({ name, kind, rank: scored.length, score });\n }\n }\n\n scored.sort((a, b) => b.score - a.score);\n scored.forEach((s, i) => { s.rank = i; });\n\n return scored;\n}\n\n// ---------------------------------------------------------------------------\n// Component index\n// ---------------------------------------------------------------------------\n\nconst componentSchema = {\n name: 'string' as const,\n description: 'string' as const,\n category: 'string' as const,\n tags: 'string' as const,\n whenUsed: 'string' as const,\n patterns: 'string' as const,\n variants: 'string' as const,\n status: 'string' as const,\n};\n\nexport type ComponentIndex = AnyOrama;\n\nfunction isCompiledFragment(\n value: McpComponent | CompiledFragment,\n): value is CompiledFragment {\n return 'meta' in value;\n}\n\nfunction normalizeComponent(\n value: McpComponent | CompiledFragment,\n): McpComponent {\n if (!isCompiledFragment(value)) return value;\n return {\n id: value.filePath ?? value.meta.name,\n name: value.meta.name,\n description: value.meta.description ?? '',\n category: value.meta.category ?? 'uncategorized',\n status: value.meta.status ?? 'stable',\n tags: value.meta.tags ?? [],\n props: {},\n propsSummary:\n value.propsSummary ??\n value.contract?.propsSummary ??\n Object.entries(value.props ?? {}).map(\n ([propName, prop]) =>\n `${propName}${prop.required ? ' (required)' : ''}: ${prop.type}`,\n ),\n examples: (value.variants ?? []).map((variant) => ({\n name: variant.name,\n description: variant.description,\n code: variant.code,\n })),\n relations: (value.relations ?? []).map((relation) => ({\n componentName: relation.component,\n relationship: relation.relationship,\n note: relation.note,\n })),\n compoundChildren: [],\n guidance: {\n when: value.usage?.when ?? [],\n whenNot: value.usage?.whenNot ?? [],\n guidelines: value.usage?.guidelines ?? [],\n accessibility: value.usage?.accessibility ?? [],\n dos: value.usage?.when ?? [],\n donts: value.usage?.whenNot ?? [],\n patterns: [],\n },\n sourceType: 'fragments-json',\n sourcePath: value.sourcePath ?? value.filePath,\n metadata: {\n a11yRules: value.contract?.a11yRules ?? [],\n scenarioTags: value.contract?.scenarioTags ?? [],\n },\n };\n}\n\nexport function buildComponentIndex(\n fragments: Array<McpComponent | CompiledFragment>,\n): ComponentIndex {\n const db = create({ schema: componentSchema, language: 'english' });\n const normalized = fragments.map(normalizeComponent);\n\n const docs = normalized.map((f) => ({\n name: f.name,\n description: f.description ?? '',\n category: f.category ?? '',\n tags: (f.tags ?? []).join(' '),\n whenUsed: (f.guidance.when ?? []).join(' '),\n patterns: (f.guidance.patterns ?? [])\n .map(\n (pattern: McpComponent['guidance']['patterns'][number]) =>\n `${pattern.name} ${pattern.description || ''}`,\n )\n .join(' '),\n variants: f.examples\n .map(\n (example: McpComponent['examples'][number]) =>\n `${example.name} ${example.description || ''}`,\n )\n .join(' '),\n status: f.status ?? 'stable',\n }));\n\n insertMultiple(db, docs);\n return db;\n}\n\nexport function searchComponents(\n query: string,\n index: ComponentIndex,\n fragments: Array<McpComponent | CompiledFragment>,\n limit = 50,\n): ScoredResult[] {\n const normalized = fragments.map(normalizeComponent);\n const boostConfig = {\n mode: 'fulltext' as const,\n properties: ['name', 'whenUsed', 'description', 'patterns', 'category', 'tags', 'variants'],\n boost: {\n name: 3,\n whenUsed: 2.5,\n description: 2,\n patterns: 1.5,\n category: 1.5,\n tags: 1.5,\n variants: 1,\n },\n limit,\n };\n\n // Two-pass search: original terms weighted 2x, synonym terms 1x\n // This prevents synonym noise (\"box\", \"container\") from outranking truly relevant results\n const originalTermsList = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const originalTermsQuery = originalTermsList.join(' ');\n const expandedQuery = expandQuery(query);\n\n // First pass: original terms, moderate threshold; second pass: synonyms, permissive\n const originalResults = search(index, { term: originalTermsQuery, ...boostConfig, threshold: 0.8 });\n const expandedResults = search(index, { term: expandedQuery, ...boostConfig, threshold: 1 });\n\n type Hit = { score: number; document: { name: string } };\n const origHits = (originalResults as unknown as { hits: Hit[] }).hits;\n const expHits = (expandedResults as unknown as { hits: Hit[] }).hits;\n\n // Combine scores: original terms get 2x weight\n const scoreMap = new Map<string, number>();\n for (const hit of origHits) {\n scoreMap.set(hit.document.name, (hit.score || 0) * 2);\n }\n for (const hit of expHits) {\n const name = hit.document.name;\n const existing = scoreMap.get(name) ?? 0;\n scoreMap.set(name, existing + (hit.score || 0));\n }\n\n // Build a name→fragment lookup for status bonuses\n const fragmentMap = new Map<string, McpComponent>();\n for (const f of normalized) {\n fragmentMap.set(f.name.toLowerCase(), f);\n }\n\n // Exact name match bonus: if a component name matches an original query term exactly,\n // boost it above similar-named components (e.g., \"Button\" > \"ButtonGroup\" for \"button action\")\n const originalTermsSet = new Set(originalTermsList);\n\n // Build scored results with status + name match adjustments\n const scored: ScoredResult[] = [];\n for (const [name, rawScore] of scoreMap) {\n let score = rawScore;\n const nameLower = name.toLowerCase();\n const fragment = fragmentMap.get(nameLower);\n\n // Exact name match bonus — strong signal that this specific component was requested\n // Must be large enough to overcome BM25 score differences from compound names\n // (e.g., \"ButtonGroup\" matching more fields than \"Button\")\n if (originalTermsSet.has(nameLower)) {\n score += 25;\n }\n\n // Apply status bonus/penalty (matches old scorer)\n if (fragment) {\n if (fragment.status === 'stable') score += 5;\n else if (fragment.status === 'beta') score += 2;\n if (fragment.status === 'deprecated') score -= 25;\n }\n\n if (score > 0) {\n scored.push({ name, kind: 'component' as EntryKind, rank: scored.length, score });\n }\n }\n\n // Sort by score descending and assign ranks\n scored.sort((a, b) => b.score - a.score);\n scored.forEach((s, i) => { s.rank = i; });\n\n return scored;\n}\n\n// ---------------------------------------------------------------------------\n// Block index\n// ---------------------------------------------------------------------------\n\nconst blockSchema = {\n name: 'string' as const,\n description: 'string' as const,\n category: 'string' as const,\n tags: 'string' as const,\n components: 'string' as const,\n};\n\nexport type BlockIndex = AnyOrama;\n\nfunction normalizeBlock(value: McpBlock | CompiledBlock): McpBlock {\n if ('id' in value) return value;\n return {\n id: value.filePath ?? value.name,\n name: value.name,\n description: value.description ?? '',\n category: value.category ?? 'uncategorized',\n components: value.components ?? [],\n tags: value.tags ?? [],\n code: value.code ?? '',\n };\n}\n\nexport function buildBlockIndex(\n blocks: Array<McpBlock | CompiledBlock>,\n): BlockIndex {\n const db = create({ schema: blockSchema, language: 'english' });\n const normalized = blocks.map(normalizeBlock);\n\n const docs = normalized.map((b) => ({\n name: b.name,\n description: b.description ?? '',\n category: b.category ?? '',\n tags: (b.tags ?? []).join(' '),\n components: b.components.join(' '),\n }));\n\n insertMultiple(db, docs);\n return db;\n}\n\nexport function searchBlocks(\n query: string,\n index: BlockIndex,\n limit = 50,\n): ScoredResult[] {\n return twoPassSearch({\n index,\n query,\n properties: ['name', 'description', 'components', 'tags', 'category'],\n boost: {\n name: 3,\n description: 2,\n components: 1.5,\n tags: 1.5,\n category: 1.5,\n },\n limit,\n kind: 'block' as EntryKind,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Token index\n// ---------------------------------------------------------------------------\n\nconst tokenSchema = {\n name: 'string' as const,\n category: 'string' as const,\n description: 'string' as const,\n};\n\nexport type TokenIndex = AnyOrama;\n\nfunction normalizeTokenData(\n tokenData: McpTokenData | CompiledTokenData,\n): McpTokenData {\n if ('flat' in tokenData) return tokenData;\n const categories = Object.fromEntries(\n Object.entries(tokenData.categories).map(([category, entries]) => [\n category,\n entries.map((entry) => ({\n name: entry.name,\n category,\n value: typeof entry.value === 'string' ? entry.value : undefined,\n description: entry.description,\n })),\n ]),\n );\n return {\n prefix: tokenData.prefix,\n total: tokenData.total,\n categories,\n flat: Object.values(categories).flat(),\n };\n}\n\nexport function buildTokenIndex(\n tokenData: McpTokenData | CompiledTokenData,\n): TokenIndex {\n const db = create({ schema: tokenSchema, language: 'english' });\n const normalizedData = normalizeTokenData(tokenData);\n\n const docs: Array<{ name: string; category: string; description: string }> = [];\n for (const [cat, tokens] of Object.entries(normalizedData.categories) as Array<\n [string, McpTokenData['categories'][string]]\n >) {\n for (const token of tokens) {\n docs.push({\n name: token.name,\n category: cat,\n description: token.description ?? '',\n });\n }\n }\n\n insertMultiple(db, docs);\n return db;\n}\n\nexport function searchTokens(\n query: string,\n index: TokenIndex,\n limit = 50,\n): ScoredResult[] {\n return twoPassSearch({\n index,\n query,\n properties: ['name', 'category', 'description'],\n boost: {\n name: 2.5,\n category: 2,\n description: 1.5,\n },\n limit,\n kind: 'token' as EntryKind,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Semantic category extraction for implement tool token matching\n// ---------------------------------------------------------------------------\n\n/** Maps use-case keywords to relevant token categories */\nexport const USE_CASE_TOKEN_CATEGORIES: Record<string, string[]> = {\n 'table': ['spacing', 'borders', 'surfaces', 'text'],\n 'data': ['spacing', 'borders', 'surfaces'],\n 'grid': ['spacing', 'layout'],\n 'form': ['spacing', 'borders', 'radius', 'focus'],\n 'input': ['spacing', 'borders', 'radius', 'focus'],\n 'card': ['surfaces', 'shadows', 'radius', 'borders', 'spacing'],\n 'button': ['colors', 'radius', 'spacing', 'focus'],\n 'layout': ['spacing', 'layout', 'surfaces'],\n 'dashboard': ['spacing', 'surfaces', 'borders', 'shadows'],\n 'chat': ['spacing', 'surfaces', 'radius', 'shadows'],\n 'modal': ['shadows', 'surfaces', 'radius', 'spacing'],\n 'dialog': ['shadows', 'surfaces', 'radius', 'spacing'],\n 'navigation': ['spacing', 'surfaces', 'borders'],\n 'sidebar': ['spacing', 'surfaces', 'borders'],\n 'hero': ['spacing', 'typography', 'colors'],\n 'landing': ['spacing', 'typography', 'colors'],\n 'pricing': ['spacing', 'surfaces', 'borders', 'radius'],\n 'auth': ['spacing', 'borders', 'radius', 'focus'],\n 'login': ['spacing', 'borders', 'radius', 'focus'],\n 'dark': ['colors', 'surfaces'],\n 'theme': ['colors', 'surfaces', 'text'],\n};\n\n/**\n * Extract relevant token categories from a use-case query.\n * Returns category names that should be included in implement results.\n */\nexport function extractTokenCategories(query: string): string[] {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const categories = new Set<string>();\n\n for (const term of terms) {\n const cats = USE_CASE_TOKEN_CATEGORIES[term];\n if (cats) {\n for (const cat of cats) categories.add(cat);\n }\n }\n\n // If nothing matched, return common defaults\n if (categories.size === 0) {\n return ['spacing', 'colors', 'surfaces'];\n }\n\n return Array.from(categories);\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","/**\n * Search module for MCP server component discovery.\n *\n * Default (free): BM25 scoring via Orama with synonym expansion and multi-field\n * boosted matching against fragments.json. No external API calls.\n *\n * Premium (--api-key): adds Convex-hosted vector search (Voyage-Code-3 embeddings)\n * fused with keyword results via Reciprocal Rank Fusion (RRF).\n */\n\nimport type { McpBlock, McpComponent, McpTokenData } from '@fragments-sdk/core';\nimport type {\n CompiledBlock,\n CompiledFragment,\n CompiledTokenData,\n} from '@fragments-sdk/context/types';\nimport type { SerializedComponentGraph } from '@fragments-sdk/context/graph';\nimport {\n buildComponentIndex,\n buildBlockIndex,\n buildTokenIndex,\n searchComponents as oramaSearchComponents,\n searchBlocks as oramaSearchBlocks,\n searchTokens as oramaSearchTokens,\n type ComponentIndex,\n type BlockIndex,\n type TokenIndex,\n} from './orama-index.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Entry kind discriminator — matches the Convex schema */\nexport type EntryKind = 'component' | 'block' | 'token';\n\nexport interface ScoredResult {\n /** Entry name */\n name: string;\n /** What kind of entry (component, block, token) */\n kind: EntryKind;\n /** Rank position (0-indexed) */\n rank: number;\n /** Raw score from the search system */\n score: number;\n}\n\ninterface ConvexSearchResponse {\n results: Array<{\n kind: string;\n name: string;\n score: number;\n description: string;\n category: string;\n }>;\n}\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\nconst CONVEX_SEARCH_URL = 'https://combative-jay-834.convex.site/search';\nconst CONVEX_TIMEOUT_MS = 3000;\n\n// ---------------------------------------------------------------------------\n// Vector search via Convex (PREMIUM)\n// ---------------------------------------------------------------------------\n\n/**\n * PREMIUM — Convex-hosted semantic vector search.\n *\n * This function is only called when a valid API key is provided via --api-key.\n * The Convex endpoint is auth-gated (SEARCH_API_KEY env var in Convex dashboard).\n *\n * Re-enablement checklist (for when you're ready to sell premium):\n * 1. Convex endpoint auth is already in place (SEARCH_API_KEY env var)\n * 2. --api-key CLI flag and Authorization header plumbing already wired below\n * 3. To enable for a paying customer: issue them a key matching SEARCH_API_KEY,\n * they add --api-key <key> to their MCP config\n * 4. Optionally add per-key rate limiting in convex/search.ts later\n *\n * @param apiKey - Bearer token passed as Authorization header to Convex\n * @param kind - Optional filter to only search components, blocks, or tokens\n * Returns an empty array if Convex is unreachable (offline, timeout, error, 401).\n */\nexport async function searchConvex(\n query: string,\n apiKey: string,\n limit = 10,\n kind?: EntryKind\n): Promise<ScoredResult[]> {\n try {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), CONVEX_TIMEOUT_MS);\n\n const response = await fetch(CONVEX_SEARCH_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ query, limit, ...(kind && { kind }) }),\n signal: controller.signal,\n });\n\n clearTimeout(timeout);\n\n if (!response.ok) {\n return [];\n }\n\n const data = (await response.json()) as ConvexSearchResponse;\n\n return data.results.map((r, i) => ({\n name: r.name,\n kind: (r.kind as EntryKind) ?? 'component',\n rank: i,\n score: r.score,\n }));\n } catch {\n // Network error, timeout, or Convex unreachable — silent fallback\n return [];\n }\n}\n\n// ---------------------------------------------------------------------------\n// Local BM25 scoring via Orama — components\n// ---------------------------------------------------------------------------\n\n/**\n * Score components against a query using BM25 via Orama.\n *\n * If an Orama index is provided (via LocalSearchData.componentIndex),\n * it will be used directly. Otherwise, a temporary index is built on the fly.\n */\nexport function keywordScoreComponents(\n query: string,\n fragments: Array<McpComponent | CompiledFragment>,\n componentIndex?: ComponentIndex,\n): ScoredResult[] {\n const index = componentIndex ?? buildComponentIndex(fragments);\n return oramaSearchComponents(query, index, fragments);\n}\n\n// ---------------------------------------------------------------------------\n// Local BM25 scoring via Orama — blocks\n// ---------------------------------------------------------------------------\n\n/**\n * Score blocks against a query using BM25 via Orama.\n */\nexport function keywordScoreBlocks(\n query: string,\n blocks: Array<McpBlock | CompiledBlock>,\n blockIndex?: BlockIndex,\n): ScoredResult[] {\n const index = blockIndex ?? buildBlockIndex(blocks);\n return oramaSearchBlocks(query, index);\n}\n\n// ---------------------------------------------------------------------------\n// Local BM25 scoring via Orama — tokens\n// ---------------------------------------------------------------------------\n\n/**\n * Score tokens against a query using BM25 via Orama.\n */\nexport function keywordScoreTokens(\n query: string,\n tokenData: McpTokenData | CompiledTokenData,\n tokenIndex?: TokenIndex,\n): ScoredResult[] {\n const index = tokenIndex ?? buildTokenIndex(tokenData);\n return oramaSearchTokens(query, index);\n}\n\n// ---------------------------------------------------------------------------\n// Reciprocal Rank Fusion\n// ---------------------------------------------------------------------------\n\n/**\n * Reciprocal Rank Fusion (RRF) — merges multiple ranked result lists\n * into a single ranking using the formula: score = sum(1 / (k + rank))\n */\nfunction reciprocalRankFusion(\n resultSets: Array<{ label: string; results: ScoredResult[] }>,\n k = 60\n): ScoredResult[] {\n // Use kind:name as key to avoid collisions across kinds\n const scoreMap = new Map<string, { score: number; kind: EntryKind; name: string }>();\n\n for (const { results } of resultSets) {\n for (let rank = 0; rank < results.length; rank++) {\n const result = results[rank];\n const key = `${result.kind}:${result.name}`;\n const rrfScore = 1 / (k + rank + 1);\n\n const existing = scoreMap.get(key);\n if (existing) {\n existing.score += rrfScore;\n } else {\n scoreMap.set(key, { score: rrfScore, kind: result.kind, name: result.name });\n }\n }\n }\n\n const fused: ScoredResult[] = [];\n for (const [, { score, kind, name }] of scoreMap) {\n fused.push({ name, kind, rank: 0, score });\n }\n\n fused.sort((a, b) => b.score - a.score);\n fused.forEach((r, i) => { r.rank = i; });\n\n return fused;\n}\n\n// ---------------------------------------------------------------------------\n// Hybrid search (public API)\n// ---------------------------------------------------------------------------\n\n/** Data sources for local keyword scoring */\nexport interface LocalSearchData {\n fragments: Array<McpComponent | CompiledFragment>;\n blocks?: Array<McpBlock | CompiledBlock>;\n tokenData?: McpTokenData | CompiledTokenData;\n /** Serialized component graph for neighbor boosting */\n graph?: SerializedComponentGraph;\n /** Pre-built Orama indexes (set at server startup for performance) */\n componentIndex?: ComponentIndex;\n blockIndex?: BlockIndex;\n tokenIndex?: TokenIndex;\n}\n\n/** Options for hybridSearch */\nexport interface HybridSearchOptions {\n /** Max results to return */\n limit?: number;\n /** Filter to a specific entry kind */\n kind?: EntryKind;\n /** Premium API key — when provided, enables Convex vector search + RRF fusion */\n apiKey?: string;\n}\n\n/**\n * Search across components, blocks, and tokens.\n *\n * Default: BM25 scoring via Orama with synonym expansion and field boosting.\n * Premium (apiKey provided): adds Convex vector search fused via RRF.\n *\n * @param kind - Optional filter to restrict results to a specific kind\n */\nexport async function hybridSearch(\n query: string,\n data: LocalSearchData,\n limit = 10,\n kind?: EntryKind,\n apiKey?: string,\n): Promise<ScoredResult[]> {\n // Build local BM25 results based on requested kind(s)\n const keywordResults: ScoredResult[] = [];\n\n if (!kind || kind === 'component') {\n keywordResults.push(...keywordScoreComponents(query, data.fragments, data.componentIndex));\n }\n if ((!kind || kind === 'block') && data.blocks) {\n keywordResults.push(...keywordScoreBlocks(query, data.blocks, data.blockIndex));\n }\n if ((!kind || kind === 'token') && data.tokenData) {\n keywordResults.push(...keywordScoreTokens(query, data.tokenData, data.tokenIndex));\n }\n\n // Re-sort combined keyword results\n keywordResults.sort((a, b) => b.score - a.score);\n keywordResults.forEach((r, i) => { r.rank = i; });\n\n // --- Premium: vector search (only when API key is provided) ---\n if (!apiKey) {\n return keywordResults.slice(0, limit);\n }\n\n const vectorResults = await searchConvex(query, apiKey, limit, kind);\n\n // If vector search returned nothing, just use keyword results\n if (vectorResults.length === 0) {\n return keywordResults.slice(0, limit);\n }\n\n // Build graph neighbor boost list if graph data is available\n const graphBoostResults: ScoredResult[] = [];\n if (data.graph) {\n try {\n const { ComponentGraphEngine, deserializeGraph } = await import('@fragments-sdk/context/graph');\n const graph = deserializeGraph(data.graph);\n const engine = new ComponentGraphEngine(graph);\n\n // Collect top component results from keyword+vector\n const topComponents = [...keywordResults, ...vectorResults]\n .filter(r => r.kind === 'component')\n .slice(0, 5);\n\n // Find graph neighbors of top results\n const neighborSet = new Set<string>();\n for (const result of topComponents) {\n const neighbors = engine.neighbors(result.name, 1);\n for (const n of neighbors.neighbors) {\n if (!neighborSet.has(n.component)) {\n neighborSet.add(n.component);\n graphBoostResults.push({\n name: n.component,\n kind: 'component',\n rank: graphBoostResults.length,\n score: 1, // Will be normalized through RRF\n });\n }\n }\n }\n } catch {\n // Graph boost is best-effort — fail silently\n }\n }\n\n // Fuse with RRF\n const resultSets: Array<{ label: string; results: ScoredResult[] }> = [\n { label: 'vector', results: vectorResults },\n { label: 'keyword', results: keywordResults },\n ];\n\n if (graphBoostResults.length > 0) {\n resultSets.push({ label: 'graph', results: graphBoostResults });\n }\n\n const fused = reciprocalRankFusion(resultSets);\n\n return fused.slice(0, limit);\n}\n","/**\n * Scoring utilities for MCP tool result ranking.\n *\n * Extracted as pure functions for easy testing and reuse across\n * discover, implement, and other search-driven tools.\n */\n\nimport type { ScoredResult } from './search.js';\n\n// ---------------------------------------------------------------------------\n// Confidence assignment — ratio-to-max (scale-independent)\n// ---------------------------------------------------------------------------\n\n/**\n * Minimum absolute score floor. If the best result scores below this,\n * results are considered a no-match rather than low-confidence garbage.\n *\n * BM25 scores for a 60-component corpus typically range 10-100+ for real\n * matches (including name-match bonuses of +25 and status bonuses of +5).\n * A maxScore below 5 means no meaningful term overlap was found — only\n * status bonuses and/or minimal synonym noise.\n *\n * Note: this threshold is calibrated for BM25 keyword scores. When hybrid\n * search uses RRF fusion (premium API key), scores are in a different range\n * (~0.01-0.05) and the threshold should be bypassed via a maxScore > 1 guard.\n */\nexport const MINIMUM_SCORE_THRESHOLD = 5;\n\n/**\n * Assign a confidence level based on how a score compares to the best result.\n *\n * Uses ratio-to-max instead of absolute thresholds so the same function works\n * for both keyword scores (8-50+) and RRF scores (0.01-0.02).\n *\n * - high: score >= 70% of maxScore (\"this is almost certainly what you need\")\n * - medium: score >= 40% of maxScore (\"this could be useful\")\n * - low: score < 40% of maxScore (\"tangentially related\")\n */\nexport function assignConfidence(\n score: number,\n maxScore: number,\n): 'high' | 'medium' | 'low' {\n if (maxScore <= 0) return 'low';\n const ratio = score / maxScore;\n if (ratio >= 0.7) return 'high';\n if (ratio >= 0.4) return 'medium';\n return 'low';\n}\n\n/**\n * Check if the best score in a result set meets the minimum quality threshold.\n * Returns true if results are meaningful, false if they're noise.\n */\nexport function meetsMinimumThreshold(maxScore: number): boolean {\n return maxScore >= MINIMUM_SCORE_THRESHOLD;\n}\n\n// ---------------------------------------------------------------------------\n// Levenshtein distance — for fuzzy \"did you mean?\" suggestions\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the Levenshtein edit distance between two strings.\n * Used for suggesting closest component name matches on typos.\n */\nexport function levenshtein(a: string, b: string): number {\n const la = a.length;\n const lb = b.length;\n const dp: number[] = Array.from({ length: lb + 1 }, (_, i) => i);\n\n for (let i = 1; i <= la; i++) {\n let prev = i - 1;\n dp[0] = i;\n for (let j = 1; j <= lb; j++) {\n const temp = dp[j];\n dp[j] = a[i - 1] === b[j - 1]\n ? prev\n : 1 + Math.min(prev, dp[j], dp[j - 1]);\n prev = temp;\n }\n }\n\n return dp[lb];\n}\n\n/**\n * Find the closest matching name from a list, using Levenshtein distance.\n * Returns the closest match if it's within `maxDistance`, or null otherwise.\n */\nexport function findClosestMatch(\n input: string,\n candidates: string[],\n maxDistance = 3,\n): string | null {\n const inputLower = input.toLowerCase();\n let bestMatch: string | null = null;\n let bestDist = maxDistance + 1;\n\n for (const candidate of candidates) {\n const candidateLower = candidate.toLowerCase();\n const dist = levenshtein(inputLower, candidateLower);\n if (dist < bestDist) {\n bestDist = dist;\n bestMatch = candidate;\n } else if (dist === bestDist && bestMatch) {\n // Tie-break: prefer the candidate whose length is closer to input length\n const currentLenDiff = Math.abs(bestMatch.length - input.length);\n const newLenDiff = Math.abs(candidate.length - input.length);\n if (newLenDiff < currentLenDiff) {\n bestMatch = candidate;\n }\n }\n }\n\n return bestDist <= maxDistance ? bestMatch : null;\n}\n\n// ---------------------------------------------------------------------------\n// Block-first component ranking\n// ---------------------------------------------------------------------------\n\n/** Points added per block occurrence (e.g., Card in 3 blocks → +15) */\nexport const BLOCK_BOOST_PER_OCCURRENCE = 5;\n\n/**\n * Count how many blocks each component appears in.\n *\n * Returns a Map<lowercase component name, count>.\n * This is the core signal for block-first ranking: if Card appears in 5/5\n * marketing blocks, it's clearly more important than Sidebar which appears in 0.\n */\nexport function buildBlockComponentFrequency(\n blocks: Array<{ components: string[] }>,\n): Map<string, number> {\n const freq = new Map<string, number>();\n for (const block of blocks) {\n for (const comp of block.components) {\n const key = comp.toLowerCase();\n freq.set(key, (freq.get(key) ?? 0) + 1);\n }\n }\n return freq;\n}\n\n/**\n * Boost component search results by how frequently they appear in matching blocks.\n *\n * Mutates scores in-place and re-sorts. Components that appear in more blocks\n * get a proportionally higher boost (freq * BLOCK_BOOST_PER_OCCURRENCE).\n *\n * Returns the mutated+sorted array for convenience.\n */\nexport function boostByBlockFrequency(\n results: ScoredResult[],\n freq: Map<string, number>,\n): ScoredResult[] {\n for (const result of results) {\n const count = freq.get(result.name.toLowerCase()) ?? 0;\n if (count > 0) {\n result.score += count * BLOCK_BOOST_PER_OCCURRENCE;\n }\n }\n results.sort((a, b) => b.score - a.score);\n results.forEach((r, i) => { r.rank = i; });\n return results;\n}\n","import type {\n McpBlock,\n McpComponent,\n McpTokenData,\n} from '@fragments-sdk/core';\nimport type { SerializedComponentGraph } from '@fragments-sdk/context/graph';\nimport type {\n CompiledBlock,\n CompiledFragment,\n CompiledFragmentsFile,\n CompiledTokenData,\n} from '@fragments-sdk/context/types';\n\nimport type { LocalSearchData } from './search.js';\nimport type { BlockIndex, ComponentIndex, TokenIndex } from './orama-index.js';\n\ninterface SearchIndexes {\n componentIndex: ComponentIndex | null;\n blockIndex: BlockIndex | null;\n tokenIndex: TokenIndex | null;\n}\n\ninterface BuildSearchDataResult {\n allFragments: Array<McpComponent | CompiledFragment>;\n allBlocks: Array<McpBlock | CompiledBlock>;\n localData: LocalSearchData;\n}\n\nexport function normalizeFilter(value: string | undefined): string | undefined {\n const normalized = value?.trim().toLowerCase();\n return normalized && normalized.length > 0 ? normalized : undefined;\n}\n\nexport function categoryMatches(\n category: string | undefined,\n categoryFilter: string | undefined\n): boolean {\n if (!categoryFilter) return true;\n return normalizeFilter(category) === categoryFilter;\n}\n\nexport function buildLocalSearchData(\n data:\n | {\n components: Record<string, McpComponent>;\n blocks?: Record<string, McpBlock>;\n tokens?: McpTokenData;\n graph?: SerializedComponentGraph;\n }\n | Pick<\n CompiledFragmentsFile,\n 'fragments' | 'blocks' | 'recipes' | 'tokens' | 'graph'\n >,\n indexes: SearchIndexes\n): BuildSearchDataResult {\n const isLegacy = 'fragments' in data;\n const allFragments = Object.values(\n isLegacy ? data.fragments : data.components,\n ) as BuildSearchDataResult['allFragments'];\n const allBlocks = Object.values(\n isLegacy ? data.blocks ?? data.recipes ?? {} : data.blocks ?? {},\n ) as BuildSearchDataResult['allBlocks'];\n const tokens = (isLegacy ? data.tokens : data.tokens) as\n | McpTokenData\n | CompiledTokenData\n | undefined;\n const graph = isLegacy ? data.graph : data.graph;\n\n const localData: LocalSearchData = {\n fragments: allFragments,\n blocks: allBlocks,\n tokenData: tokens,\n graph,\n componentIndex: indexes.componentIndex ?? undefined,\n blockIndex: indexes.blockIndex ?? undefined,\n tokenIndex: indexes.tokenIndex ?? undefined,\n };\n\n return { allFragments, allBlocks, localData };\n}\n\nexport async function buildImportStatements(\n components: string[],\n resolvePackageName: (component: string) => Promise<string>\n): Promise<string[]> {\n const grouped = new Map<string, string[]>();\n\n for (const component of components) {\n if (!component) continue;\n\n const packageName = await resolvePackageName(component);\n const existing = grouped.get(packageName);\n\n if (!existing) {\n grouped.set(packageName, [component]);\n continue;\n }\n\n if (!existing.includes(component)) {\n existing.push(component);\n }\n }\n\n return Array.from(grouped.entries()).map(\n ([packageName, componentNames]) =>\n `import { ${componentNames.join(', ')} } from '${packageName}';`\n );\n}\n\nexport function 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, tokens) => sum + tokens.length, 0),\n };\n }\n\n const limited: Record<string, T[]> = {};\n let total = 0;\n\n for (const [category, tokens] of Object.entries(categories)) {\n const sliced = tokens.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","import type {\n McpBlock,\n McpComponent,\n McpComponentExample,\n McpComponentRelation,\n} from '@fragments-sdk/core';\nimport type { SerializedComponentGraph } from '@fragments-sdk/context/graph';\nimport { hybridSearch, keywordScoreBlocks } from '../search.js';\nimport {\n assignConfidence,\n buildBlockComponentFrequency,\n boostByBlockFrequency,\n findClosestMatch,\n meetsMinimumThreshold,\n} from '../scoring.js';\nimport {\n buildLocalSearchData,\n categoryMatches,\n normalizeFilter,\n} from '../server-helpers.js';\nimport {\n componentNames,\n findComponentByName,\n getGuidanceWhen,\n getGuidanceWhenNot,\n listBlocks,\n listComponents,\n} from '../snapshot-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nfunction renderContextMarkdown(args: {\n components: ReturnType<typeof listComponents>;\n blocks: Array<{ name: string; description: string }>;\n includeCode: boolean;\n includeRelations: boolean;\n compact: boolean;\n}) {\n const lines: string[] = ['# Design System Context', ''];\n\n for (const component of args.components) {\n lines.push(`## ${component.name}`);\n if (component.description) {\n lines.push(component.description);\n }\n lines.push(\n `- Category: ${component.category}`,\n `- Status: ${component.status}`,\n );\n if (component.propsSummary.length > 0) {\n lines.push(`- Props: ${component.propsSummary.join(', ')}`);\n }\n const when = getGuidanceWhen(component);\n if (when.length > 0) {\n lines.push(`- Use when: ${when.slice(0, args.compact ? 1 : 3).join('; ')}`);\n }\n const whenNot = getGuidanceWhenNot(component);\n if (whenNot.length > 0) {\n lines.push(\n `- Avoid when: ${whenNot.slice(0, args.compact ? 1 : 2).join('; ')}`,\n );\n }\n if (args.includeRelations && component.relations.length > 0) {\n lines.push(\n `- Related: ${component.relations\n .slice(0, 5)\n .map(\n (relation: McpComponentRelation) =>\n `${relation.componentName} (${relation.relationship})`,\n )\n .join(', ')}`,\n );\n }\n if (args.includeCode && component.examples[0]?.code) {\n lines.push('', '```tsx', component.examples[0].code, '```');\n }\n lines.push('');\n }\n\n if (args.blocks.length > 0) {\n lines.push('## Blocks', '');\n for (const block of args.blocks) {\n lines.push(`- ${block.name}: ${block.description}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n').trim();\n}\n\nfunction renderContextJson(args: {\n components: ReturnType<typeof listComponents>;\n blocks: Array<{ name: string; description: string }>;\n includeCode: boolean;\n includeRelations: boolean;\n}) {\n return JSON.stringify({\n components: args.components.map((component) => ({\n name: component.name,\n description: component.description,\n category: component.category,\n status: component.status,\n propsSummary: component.propsSummary,\n when: getGuidanceWhen(component),\n whenNot: getGuidanceWhenNot(component),\n ...(args.includeRelations && { relations: component.relations }),\n ...(args.includeCode && {\n examples: component.examples\n .filter((example: McpComponentExample) => Boolean(example.code))\n .slice(0, 2),\n }),\n })),\n blocks: args.blocks,\n });\n}\n\nexport const discoverHandler: ToolHandler = async (args, ctx) => {\n const data = ctx.data;\n const snapshotComponents = listComponents(data.snapshot);\n const componentsByName = new Map(\n snapshotComponents.map((component) => [\n component.name.toLowerCase(),\n component,\n ]),\n );\n const useCase = (args?.useCase as string) ?? undefined;\n const componentForAlts = (args?.component as string) ?? undefined;\n const category = normalizeFilter(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 const suggestLimit =\n typeof args?.limit === 'number'\n ? Math.min(Math.max(args.limit, 1), 25)\n : 10;\n const listLimit =\n typeof args?.limit === 'number'\n ? Math.min(Math.max(args.limit, 1), 25)\n : undefined;\n const verbosity =\n (args?.verbosity as string) ?? (compact ? 'compact' : 'standard');\n\n if (args?.format && !useCase && !componentForAlts) {\n let components = listComponents(data.snapshot);\n const allBlocks = listBlocks(data.snapshot);\n\n if (category) {\n components = components.filter((component) =>\n categoryMatches(component.category, category),\n );\n }\n if (search) {\n components = components.filter((component) => {\n const tagMatch = component.tags.some((tag: string) =>\n tag.toLowerCase().includes(search),\n );\n return (\n component.name.toLowerCase().includes(search) ||\n component.description.toLowerCase().includes(search) ||\n tagMatch\n );\n });\n }\n if (status) {\n components = components.filter((component) => component.status === status);\n }\n\n const blocks = allBlocks.map((block: McpBlock) => ({\n name: block.name,\n description: block.description,\n }));\n\n const ctxContent =\n format === 'json'\n ? renderContextJson({\n components,\n blocks,\n includeCode: includeCode || verbosity === 'full',\n includeRelations,\n })\n : renderContextMarkdown({\n components,\n blocks,\n includeCode: includeCode || verbosity === 'full',\n includeRelations,\n compact: verbosity === 'compact',\n });\n\n return {\n content: [{ type: 'text' as const, text: ctxContent }],\n _meta: {\n componentCount: components.length,\n blockCount: blocks.length,\n },\n };\n }\n\n if (useCase) {\n const { allFragments, allBlocks, localData } = buildLocalSearchData(\n {\n components: data.components,\n blocks: data.blocks,\n tokens: data.tokens,\n graph: data.graph as SerializedComponentGraph | undefined,\n },\n {\n componentIndex: ctx.indexes.componentIndex,\n blockIndex: ctx.indexes.blockIndex,\n tokenIndex: ctx.indexes.tokenIndex,\n },\n );\n const context =\n ((args as Record<string, unknown>)?.context as string)?.toLowerCase() ??\n '';\n const fullQuery = context ? `${useCase} ${context}` : useCase;\n\n const searchResults = await hybridSearch(\n fullQuery,\n localData,\n suggestLimit,\n 'component',\n ctx.config.searchApiKey,\n );\n\n const blockMatches = keywordScoreBlocks(\n fullQuery,\n allBlocks,\n ctx.indexes.blockIndex ?? undefined,\n ).slice(0, 5);\n if (blockMatches.length > 0) {\n const matchedBlocks = blockMatches\n .map((match) =>\n allBlocks.find((block) => block.name.toLowerCase() === match.name.toLowerCase()),\n )\n .filter(Boolean) as typeof allBlocks;\n const blockFreq = buildBlockComponentFrequency(matchedBlocks);\n boostByBlockFrequency(searchResults, blockFreq);\n }\n\n const maxScore = searchResults.length > 0 ? searchResults[0].score : 0;\n\n const scored = searchResults\n .map((result) => {\n const component = componentsByName.get(result.name.toLowerCase());\n if (!component) return null;\n\n return {\n component: component.name,\n category: component.category,\n description: component.description,\n confidence: assignConfidence(result.score, maxScore),\n reasons: [`Matched via hybrid search (score: ${result.score.toFixed(4)})`],\n usage: {\n when: getGuidanceWhen(component).slice(0, 3),\n whenNot: getGuidanceWhenNot(component).slice(0, 2),\n },\n exampleCount: component.examples.length,\n status: component.status,\n };\n })\n .filter(Boolean);\n\n const suggestions: typeof scored = [];\n const categoryCount: Record<string, number> = {};\n for (const item of scored) {\n if (!item) continue;\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 =\n suggestions.length >= 2\n ? `These components work well together. For example, ${suggestions[0]!.component} can be combined with ${suggestions\n .slice(1, 3)\n .map((item) => item!.component)\n .join(' and ')}.`\n : undefined;\n\n const useCaseLower = useCase.toLowerCase();\n const styleKeywords = [\n 'color',\n 'spacing',\n 'padding',\n 'margin',\n 'font',\n 'border',\n 'radius',\n 'shadow',\n 'variable',\n 'token',\n 'css',\n 'theme',\n 'dark mode',\n 'background',\n 'hover',\n ];\n const isStyleQuery = styleKeywords.some((keyword) =>\n useCaseLower.includes(keyword),\n );\n\n const noMatch = suggestions.length === 0;\n const belowThreshold =\n !noMatch && maxScore > 1 && !meetsMinimumThreshold(maxScore);\n const weakMatch =\n !noMatch &&\n (belowThreshold || suggestions.every((item) => item!.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 ${ctx.toolNames.tokens} to find tokens.`\n : `No matching components found. Try different keywords or browse all components with ${ctx.toolNames.discover}.`;\n nextStep = isStyleQuery\n ? `Use ${ctx.toolNames.tokens}(search: \"${useCaseLower.split(/\\s+/)[0]}\") to find 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 tokens, try ${ctx.toolNames.tokens}.` : ''}`;\n nextStep = `Use ${ctx.toolNames.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 ${ctx.toolNames.inspect}(\"${suggestions[0]!.component}\") for full details.`;\n }\n\n const tokenHint =\n isStyleQuery && !noMatch\n ? `Your query includes styling terms. For tokens, also try ${ctx.toolNames.tokens}(search: \"${useCaseLower.split(/\\s+/)[0]}\").`\n : undefined;\n\n const blockNames = blockMatches\n .map((match) =>\n allBlocks.find((block) => block.name.toLowerCase() === match.name.toLowerCase()),\n )\n .filter(Boolean)\n .slice(0, 3)\n .map((block) => block!.name);\n const blockHint =\n blockNames.length > 0\n ? `Related blocks: ${blockNames.join(', ')}. Use ${ctx.toolNames.blocks}(search: \"${useCase}\") for ready-to-use patterns.`\n : undefined;\n\n const suggestResponse =\n verbosity === 'compact'\n ? {\n useCase,\n suggestions: suggestions.map((item) => ({\n component: item!.component,\n description: item!.description,\n confidence: item!.confidence,\n })),\n recommendation,\n }\n : {\n useCase,\n context: context || undefined,\n suggestions,\n noMatch,\n weakMatch,\n recommendation,\n compositionHint,\n ...(tokenHint && { tokenHint }),\n ...(blockHint && { blockHint }),\n nextStep,\n };\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify(suggestResponse),\n },\n ],\n };\n }\n\n if (componentForAlts) {\n const component = findComponentByName(data.snapshot, componentForAlts);\n\n if (!component) {\n const closest = findClosestMatch(\n componentForAlts,\n componentNames(data.snapshot),\n );\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n throw new Error(\n `Component \"${componentForAlts}\" not found.${suggestion} Use ${ctx.toolNames.discover} to see available components.`,\n );\n }\n\n const relations = component.relations;\n\n const referencedBy = listComponents(data.snapshot)\n .filter((entry) =>\n entry.relations.some(\n (relation: McpComponentRelation) =>\n relation.componentName.toLowerCase() ===\n componentForAlts.toLowerCase(),\n ),\n )\n .map((entry) => ({\n component: entry.name,\n relationship: entry.relations.find(\n (relation: McpComponentRelation) =>\n relation.componentName.toLowerCase() ===\n componentForAlts.toLowerCase(),\n )?.relationship,\n note: entry.relations.find(\n (relation: McpComponentRelation) =>\n relation.componentName.toLowerCase() ===\n componentForAlts.toLowerCase(),\n )?.note,\n }));\n\n const sameCategory = listComponents(data.snapshot)\n .filter(\n (entry) =>\n entry.category === component.category &&\n entry.name.toLowerCase() !== componentForAlts.toLowerCase(),\n )\n .map((entry) => ({\n component: entry.name,\n description: entry.description,\n }));\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n component: component.name,\n category: component.category,\n directRelations: relations,\n referencedBy,\n sameCategory,\n suggestion: relations.find(\n (relation: McpComponentRelation) =>\n relation.relationship === 'alternative',\n )\n ? `Consider ${relations.find((relation: McpComponentRelation) => relation.relationship === 'alternative')?.componentName}: ${relations.find((relation: McpComponentRelation) => relation.relationship === 'alternative')?.note}`\n : undefined,\n }),\n },\n ],\n };\n }\n\n const filteredComponents = listComponents(data.snapshot).filter((component) => {\n if (category && !categoryMatches(component.category, category)) return false;\n if (status && (component.status ?? 'stable') !== status) return false;\n if (search) {\n const nameMatch = component.name.toLowerCase().includes(search);\n const descMatch = component.description.toLowerCase().includes(search);\n const tagMatch = component.tags.some((tag: string) =>\n tag.toLowerCase().includes(search),\n );\n if (!nameMatch && !descMatch && !tagMatch) return false;\n }\n return true;\n });\n\n const limitedComponents =\n listLimit === undefined\n ? filteredComponents\n : filteredComponents.slice(0, listLimit);\n\n const components = limitedComponents.map((component) => {\n if (verbosity === 'compact') {\n return {\n name: component.name,\n category: component.category,\n ...(component.propsSummary.length > 0 && {\n propsSummary: component.propsSummary,\n }),\n };\n }\n return {\n name: component.name,\n category: component.category,\n description: component.description,\n status: component.status ?? 'stable',\n exampleCount: component.examples.length,\n tags: component.tags,\n ...((includeCode || verbosity === 'full') && component.examples[0]?.code\n ? {\n example: component.examples[0].code,\n }\n : {}),\n };\n });\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n total: filteredComponents.length,\n returned: components.length,\n components,\n categories: [...new Set(components.map((component) => component.category))],\n hint:\n components.length === 0\n ? 'No components found. Try broader search terms or check available categories.'\n : components.length > 5\n ? `Use ${ctx.toolNames.discover} with useCase for recommendations, or ${ctx.toolNames.inspect} for details on a specific component.`\n : undefined,\n }),\n },\n ],\n };\n};\n","import { readFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { McpComponent } from '@fragments-sdk/core';\nimport { projectFields } from '../utils.js';\nimport { findClosestMatch } from '../scoring.js';\nimport { componentNames, findComponentByName, getGuidanceWhen, getGuidanceWhenNot } from '../snapshot-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nfunction getSourceCode(\n component: McpComponent,\n projectRoot: string,\n): { path: string; code: string | null } | undefined {\n const sourcePath = component.sourcePath;\n if (!sourcePath) return undefined;\n\n const fullPath = join(projectRoot, sourcePath);\n if (!existsSync(fullPath)) return { path: sourcePath, code: null };\n\n try {\n const code = readFileSync(fullPath, 'utf-8');\n return { path: sourcePath, code };\n } catch {\n return { path: sourcePath, code: null };\n }\n}\n\nexport const inspectHandler: ToolHandler = async (args, ctx) => {\n const componentName = args?.component as string;\n const fields = args?.fields as string[] | undefined;\n const exampleName = (args?.variant as string) ?? undefined;\n const maxExamples = args?.maxExamples as number | undefined;\n const maxLines = args?.maxLines as number | undefined;\n const verbosity = (args?.verbosity as string) ?? 'standard';\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const component = findComponentByName(ctx.data.snapshot, componentName);\n\n if (!component) {\n const closest = findClosestMatch(\n componentName,\n componentNames(ctx.data.snapshot),\n );\n const suggestion = closest\n ? ` Did you mean \"${closest}\"? Use ${ctx.toolNames.inspect}(\"${closest}\") to inspect it.`\n : '';\n throw new Error(\n `Component \"${componentName}\" not found.${suggestion} Use ${ctx.toolNames.discover} to see available components.`,\n );\n }\n\n const pkgName = ctx.resolvePackageName(component.name);\n\n let examples = component.examples;\n if (exampleName) {\n const query = exampleName.toLowerCase();\n let filtered = examples.filter((example) => example.name.toLowerCase() === query);\n if (filtered.length === 0) {\n filtered = examples.filter((example) =>\n example.name.toLowerCase().startsWith(query),\n );\n }\n if (filtered.length === 0) {\n filtered = examples.filter((example) =>\n example.name.toLowerCase().includes(query),\n );\n }\n if (filtered.length > 0) {\n examples = filtered;\n } else {\n throw new Error(\n `Example \"${exampleName}\" not found for ${componentName}. Available: ${component.examples.map((example) => example.name).join(', ')}`,\n );\n }\n }\n if (maxExamples && maxExamples > 0) {\n examples = examples.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 renderedExamples = examples.map((example) => ({\n variant: example.name,\n description: example.description,\n code: example.code ? truncateCode(example.code) : `<${component.name} />`,\n ...(example.code\n ? {}\n : {\n note: 'No code example provided. Refer to props for customization.',\n }),\n }));\n\n const propsReference = Object.entries(component.props ?? {}).map(\n ([propName, prop]: [string, McpComponent['props'][string]]) => ({\n name: propName,\n type: prop.type,\n required: prop.required,\n default: prop.default,\n description: prop.description,\n values: prop.values,\n }),\n );\n\n const propConstraints = Object.entries(component.props ?? {})\n .filter(([, prop]: [string, McpComponent['props'][string]]) =>\n Boolean(prop.constraints && prop.constraints.length > 0),\n )\n .map(([propName, prop]: [string, McpComponent['props'][string]]) => ({\n prop: propName,\n constraints: prop.constraints,\n }));\n\n const fullResult = {\n meta: {\n id: component.id,\n name: component.name,\n description: component.description,\n category: component.category,\n status: component.status,\n publicRef: component.publicRef,\n publicSlug: component.publicSlug,\n tier: component.tier,\n },\n props: component.props,\n examples: {\n import: `import { ${component.name} } from '${pkgName}';`,\n code: renderedExamples,\n propsReference,\n },\n relations: component.relations,\n compoundChildren: component.compoundChildren,\n guidance: {\n when: getGuidanceWhen(component),\n whenNot: getGuidanceWhenNot(component),\n guidelines: component.guidance.guidelines,\n accessibility: component.guidance.accessibility,\n usageGuidance: component.guidance.usageGuidance,\n dos: component.guidance.dos,\n donts: component.guidance.donts,\n patterns: component.guidance.patterns,\n propConstraints,\n alternatives:\n component.relations\n ?.filter((relation) => relation.relationship === 'alternative')\n .map((relation) => ({\n component: relation.componentName,\n note: relation.note,\n })) ?? [],\n },\n metadata: component.metadata,\n source: getSourceCode(component, ctx.config.projectRoot),\n };\n\n const aliasMap: Record<string, string> = { usage: 'guidance' };\n const resolvedFields = fields?.map((field) => {\n const parts = field.split('.');\n if (aliasMap[parts[0]]) parts[0] = aliasMap[parts[0]];\n return parts.join('.');\n });\n\n let result: unknown;\n if (verbosity === 'compact' && !resolvedFields?.length) {\n result = {\n meta: fullResult.meta,\n propsSummary: component.propsSummary,\n metadata: component.metadata,\n };\n } else if (verbosity === 'full') {\n result =\n resolvedFields && resolvedFields.length > 0\n ? projectFields(fullResult as Record<string, unknown>, resolvedFields)\n : fullResult;\n } else if (resolvedFields && resolvedFields.length > 0) {\n result = projectFields(fullResult as Record<string, unknown>, resolvedFields);\n } else {\n const { source: _source, ...withoutSource } = fullResult;\n result = withoutSource;\n }\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result) }],\n };\n};\n","/**\n * Utility functions for the MCP server.\n *\n * Inlined from @fragments-sdk/cli to avoid pulling in the full CLI dependency.\n */\n\n/**\n * Extract specific fields from an object using dot notation paths.\n * E.g., projectFields(obj, ['meta.name', 'usage.when']) returns { meta: { name: ... }, usage: { when: ... } }\n *\n * @param obj - The source object to extract fields from\n * @param fields - Array of field paths (supports dot notation for nested fields)\n * @returns A new object containing only the requested fields\n */\nexport function projectFields<T extends Record<string, unknown>>(\n obj: T,\n fields: string[]\n): Partial<T> {\n if (!fields || fields.length === 0) {\n return obj;\n }\n\n const result: Record<string, unknown> = {};\n\n for (const field of fields) {\n const parts = field.split('.');\n let source: unknown = obj;\n let target = result;\n\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n const isLast = i === parts.length - 1;\n\n if (source === null || source === undefined || typeof source !== 'object') {\n break;\n }\n\n const sourceObj = source as Record<string, unknown>;\n const value = sourceObj[part];\n\n if (isLast) {\n // Set the final value\n target[part] = value;\n } else {\n // Create nested object if needed\n if (!(part in target)) {\n target[part] = {};\n }\n target = target[part] as Record<string, unknown>;\n source = value;\n }\n }\n }\n\n return result as Partial<T>;\n}\n","import { BRAND } from '../constants.js';\nimport { buildImportStatements } from '../server-helpers.js';\nimport { findClosestMatch } from '../scoring.js';\nimport { searchBlocks } from '../orama-index.js';\nimport { listBlocks } from '../snapshot-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nexport const blocksHandler: ToolHandler = async (args, ctx) => {\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 const blocksLimit = typeof args?.limit === 'number' ? Math.min(Math.max(args.limit, 1), 50) : undefined;\n\n const allBlocks = listBlocks(ctx.data.snapshot);\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 composition blocks found. Blocks are reusable patterns showing how components wire together (e.g., \"Login Form\", \"Settings Page\"). Create .block.ts files and run \\`${BRAND.cliCommand} build\\`.`,\n }),\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 if (filtered.length === 0) {\n const allBlockNames = allBlocks.map(b => b.name);\n const closest = findClosestMatch(blockName, allBlockNames);\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n throw new Error(`Block \"${blockName}\" not found.${suggestion} Use ${ctx.toolNames.blocks} to see available blocks.`);\n }\n }\n\n if (search) {\n if (ctx.indexes.blockIndex) {\n // Use Orama BM25 search with synonym expansion for relevance-ranked results\n const ranked = searchBlocks(search, ctx.indexes.blockIndex, 50);\n const rankedNames = new Set(ranked.map(r => r.name.toLowerCase()));\n filtered = filtered.filter(b => rankedNames.has(b.name.toLowerCase()));\n // Re-order filtered to match Orama relevance ranking\n filtered.sort((a, b) => {\n const aIdx = ranked.findIndex(r => r.name.toLowerCase() === a.name.toLowerCase());\n const bIdx = ranked.findIndex(r => r.name.toLowerCase() === b.name.toLowerCase());\n return (aIdx === -1 ? Infinity : aIdx) - (bIdx === -1 ? Infinity : bIdx);\n });\n } else {\n // Fallback: substring matching (blockIndex should always exist, but defensive)\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\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 // Check if any blocks use Icon components — add import hint\n const blocksUseIcons = filtered.some(\n (b) => b.components.some((c) => c === 'Icon') ||\n (b.code && /\\bIcon\\b/.test(b.code))\n );\n const iconHint = blocksUseIcons\n ? \"Icon components in block code are from @phosphor-icons/react. Import them as: import { IconName } from '@phosphor-icons/react';\"\n : undefined;\n\n // Apply limit if specified\n if (blocksLimit !== undefined) {\n filtered = filtered.slice(0, blocksLimit);\n }\n\n const verbosity = (args?.verbosity as string) ?? 'standard';\n const blocksWithImports = await Promise.all(filtered.map(async (b) => {\n const imports = await buildImportStatements(\n b.components,\n async (componentName) => ctx.resolvePackageName(componentName)\n );\n const base = {\n name: b.name,\n description: b.description,\n category: b.category,\n components: b.components,\n tags: b.tags,\n import: imports.join('\\n'),\n imports,\n };\n if (verbosity === 'compact') return base;\n if (verbosity === 'full') return { ...base, code: b.code };\n // standard: code preview for long blocks\n const codeLines = b.code.split('\\n');\n const code = codeLines.length > 30\n ? codeLines.slice(0, 20).join('\\n') + '\\n// ... truncated (' + codeLines.length + ' lines total)'\n : b.code;\n return { ...base, code };\n }));\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: blocksWithImports.length,\n blocks: blocksWithImports,\n ...(iconHint && { iconHint }),\n ...(blocksWithImports.length === 0 && allBlocks.length > 0 && {\n hint: 'No blocks matching your query. Try broader search terms.',\n }),\n }),\n }],\n };\n};\n","import { BRAND } from '../constants.js';\nimport { limitTokensPerCategory } from '../server-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nconst TOKEN_CATEGORY_ALIASES: Record<string, string[]> = {\n colors: ['color', 'colors', 'accent', 'background', 'foreground', 'theme'],\n spacing: ['spacing', 'space', 'spaces', 'padding', 'margin', 'gap', 'inset'],\n typography: ['typography', 'type', 'font', 'fonts', 'letter', 'line-height'],\n surfaces: ['surface', 'surfaces', 'canvas'],\n shadows: ['shadow', 'shadows', 'elevation'],\n radius: ['radius', 'radii', 'corner', 'corners', '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\nfunction normalizeCategoryValue(value: string | undefined): string | undefined {\n const normalized = value?.toLowerCase().replace(/[^a-z0-9]+/g, ' ').trim();\n return normalized && normalized.length > 0 ? normalized : undefined;\n}\n\nfunction resolveCategoryKeys(\n categories: Record<string, Array<{ name: string; description?: string }>>,\n requestedCategory: string | undefined\n): string[] {\n const normalized = normalizeCategoryValue(requestedCategory);\n if (!normalized) {\n return Object.keys(categories);\n }\n\n const keys = Object.keys(categories);\n const exactMatches = keys.filter((key) => normalizeCategoryValue(key) === normalized);\n if (exactMatches.length > 0) {\n return exactMatches;\n }\n\n const canonical = Object.entries(TOKEN_CATEGORY_ALIASES).find(([categoryName, aliases]) =>\n categoryName === normalized || aliases.includes(normalized)\n );\n if (canonical) {\n const aliases = [canonical[0], ...canonical[1]];\n const aliasMatches = keys.filter((key) => {\n const normalizedKey = normalizeCategoryValue(key) ?? '';\n return aliases.some((alias) => normalizedKey.includes(alias));\n });\n if (aliasMatches.length > 0) {\n return aliasMatches;\n }\n }\n\n return keys.filter((key) => (normalizeCategoryValue(key) ?? '').includes(normalized));\n}\n\nexport const tokensHandler: ToolHandler = async (args, ctx) => {\n const category = args?.category as string | undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n const tokensLimit = typeof args?.limit === 'number' ? Math.min(Math.max(args.limit, 1), 100) : (search ? 25 : undefined);\n\n const tokenData = ctx.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 }),\n }],\n };\n }\n\n let filteredCategories: Record<string, Array<{ name: string; description?: string }>> = {};\n let filteredTotal = 0;\n const resolvedCategoryKeys = resolveCategoryKeys(tokenData.categories, category);\n const friendlyCategories = Object.keys(TOKEN_CATEGORY_ALIASES);\n\n // Fix: when search term matches a category name exactly, return all\n // tokens in that category (previously only searched token names/descriptions)\n const searchMatchesCategory = search\n ? resolveCategoryKeys(tokenData.categories, search)\n : [];\n\n for (const [cat, tokens] of Object.entries(tokenData.categories) as Array<\n [string, typeof tokenData.categories[string]]\n >) {\n if (category && !resolvedCategoryKeys.includes(cat)) continue;\n\n let filtered = tokens;\n if (search) {\n // If the search term IS a category name, include all tokens in that category\n if (searchMatchesCategory.includes(cat)) {\n filtered = tokens; // include all\n } else {\n filtered = tokens.filter(\n (t) => t.name.toLowerCase().includes(search) ||\n (t.description && t.description.toLowerCase().includes(search)) ||\n (normalizeCategoryValue(cat) ?? '').includes(search)\n );\n }\n }\n\n if (filtered.length > 0) {\n filteredCategories[cat] = filtered;\n filteredTotal += filtered.length;\n }\n }\n\n // Apply token limit per category (default 25 per category for search queries)\n if (tokensLimit !== undefined) {\n const limited = limitTokensPerCategory(filteredCategories, tokensLimit);\n filteredCategories = limited.categories;\n filteredTotal = limited.total;\n }\n\n let hint: string | undefined;\n if (filteredTotal === 0) {\n if (category && search) {\n // Combined category + search returned no results\n const categoryTotal = resolvedCategoryKeys.reduce(\n (sum, key) => sum + (tokenData.categories[key]?.length ?? 0),\n 0\n );\n hint = categoryTotal > 0\n ? `No tokens matching \"${search}\" in category \"${category}\" (${categoryTotal} tokens in this category). Try a broader search or remove the search term.`\n : `Category \"${category}\" not found. Try categories like: ${friendlyCategories.join(', ')}.`;\n } else if (search) {\n hint = `No tokens matching \"${search}\". Try categories like: ${friendlyCategories.join(', ')}.`;\n } else if (category) {\n hint = `Category \"${category}\" not found. Try categories like: ${friendlyCategories.join(', ')}.`;\n }\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(([cat, tokens]) => ({\n category: cat,\n count: tokens.length,\n })),\n }),\n }),\n }],\n };\n};\n","import type { McpComponent } from '@fragments-sdk/core';\nimport type { SerializedComponentGraph } from '@fragments-sdk/context/graph';\nimport { hybridSearch } from '../search.js';\nimport {\n assignConfidence,\n buildBlockComponentFrequency,\n boostByBlockFrequency,\n} from '../scoring.js';\nimport { extractTokenCategories } from '../orama-index.js';\nimport {\n buildImportStatements,\n buildLocalSearchData,\n} from '../server-helpers.js';\nimport { getGuidanceWhen, listComponents } from '../snapshot-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nexport const implementHandler: ToolHandler = async (args, ctx) => {\n const useCase = args?.useCase as string;\n if (!useCase) {\n throw new Error('useCase is required');\n }\n\n const verbosity = (args?.verbosity as string) ?? 'standard';\n const snapshotComponents = listComponents(ctx.data.snapshot);\n const componentsByName = new Map(\n snapshotComponents.map((component) => [\n component.name.toLowerCase(),\n component,\n ]),\n );\n const { allBlocks, localData } = buildLocalSearchData(\n {\n components: ctx.data.components,\n blocks: ctx.data.blocks,\n tokens: ctx.data.tokens,\n graph: ctx.data.graph as SerializedComponentGraph | undefined,\n },\n {\n componentIndex: ctx.indexes.componentIndex,\n blockIndex: ctx.indexes.blockIndex,\n tokenIndex: ctx.indexes.tokenIndex,\n },\n );\n const tokenData = ctx.data.tokens;\n const implLimit =\n typeof args?.limit === 'number'\n ? Math.min(Math.max(args.limit, 1), 15)\n : 5;\n\n const [componentResults, blockResults, tokenResults] = await Promise.all([\n hybridSearch(\n useCase,\n localData,\n implLimit * 3,\n 'component',\n ctx.config.searchApiKey,\n ),\n hybridSearch(\n useCase,\n localData,\n implLimit,\n 'block',\n ctx.config.searchApiKey,\n ),\n hybridSearch(\n useCase,\n localData,\n implLimit,\n 'token',\n ctx.config.searchApiKey,\n ),\n ]);\n\n const topBlockScore = blockResults.length > 0 ? blockResults[0].score : 0;\n const filteredBlockResults = blockResults.filter(\n (result) => result.score >= topBlockScore * 0.3,\n );\n\n if (filteredBlockResults.length > 0) {\n const matchedBlocks = filteredBlockResults\n .map((result) =>\n allBlocks.find((block) => block.name.toLowerCase() === result.name.toLowerCase()),\n )\n .filter(Boolean) as typeof allBlocks;\n const blockFreq = buildBlockComponentFrequency(matchedBlocks);\n boostByBlockFrequency(componentResults, blockFreq);\n }\n\n const topComponentResults = componentResults.slice(0, implLimit);\n const maxCompScore =\n topComponentResults.length > 0 ? topComponentResults[0].score : 0;\n\n const topMatches = topComponentResults\n .map((result) => {\n const component = componentsByName.get(result.name.toLowerCase());\n return component ? { component, score: result.score } : null;\n })\n .filter(Boolean) as Array<{ component: McpComponent; score: number }>;\n\n const components = await Promise.all(\n topMatches.map(async ({ component, score }) => {\n const pkgName = ctx.resolvePackageName(component.name);\n if (verbosity === 'compact') {\n return {\n name: component.name,\n description: component.description,\n confidence: assignConfidence(score, maxCompScore),\n import: `import { ${component.name} } from '${pkgName}';`,\n };\n }\n const exampleLimit =\n verbosity === 'full' ? component.examples.length : 2;\n const propsLimit =\n verbosity === 'full'\n ? Object.keys(component.props ?? {}).length\n : 5;\n const examples = component.examples.slice(0, exampleLimit).map((example) => ({\n variant: example.name,\n code: example.code ?? `<${component.name} />`,\n }));\n const propsSummary = Object.entries(component.props ?? {})\n .slice(0, propsLimit)\n .map(\n ([propName, prop]: [string, McpComponent['props'][string]]) =>\n `${propName}${prop.required ? ' (required)' : ''}: ${prop.type}${prop.values ? ` = ${prop.values.join('|')}` : ''}`,\n );\n return {\n name: component.name,\n category: component.category,\n description: component.description,\n confidence: assignConfidence(score, maxCompScore),\n import: `import { ${component.name} } from '${pkgName}';`,\n props: propsSummary,\n examples,\n guidelines: getGuidanceWhen(component).slice(0, 3),\n accessibility: component.guidance.accessibility.slice(0, 2),\n };\n }),\n );\n\n const matchingBlocks = (\n await Promise.all(\n filteredBlockResults.slice(0, 5).map(async (result) => {\n const block = allBlocks.find(\n (entry) => entry.name.toLowerCase() === result.name.toLowerCase(),\n );\n if (!block) return null;\n const imports = await buildImportStatements(\n block.components,\n async (componentName) => ctx.resolvePackageName(componentName),\n );\n const codeLines = block.code.split('\\n');\n const code =\n codeLines.length > 30\n ? `${codeLines.slice(0, 20).join('\\n')}\\n// ... truncated (${codeLines.length} lines total)`\n : block.code;\n return {\n name: block.name,\n description: block.description,\n components: block.components,\n code,\n import: imports.join('\\n'),\n imports,\n };\n }),\n )\n ).filter(Boolean) as Array<{\n name: string;\n description: string;\n components: string[];\n code: string;\n import: string;\n imports: string[];\n }>;\n\n let relevantTokens: Record<string, string[]> | undefined;\n if (tokenResults.length > 0 && tokenData) {\n relevantTokens = {};\n for (const result of tokenResults) {\n for (const [category, tokens] of Object.entries(tokenData.categories) as Array<\n [string, NonNullable<typeof tokenData>['categories'][string]]\n >) {\n if (tokens.some((token) => token.name === result.name)) {\n if (!relevantTokens[category]) relevantTokens[category] = [];\n relevantTokens[category].push(result.name);\n break;\n }\n }\n }\n if (Object.keys(relevantTokens).length === 0) {\n relevantTokens = undefined;\n }\n }\n\n if (!relevantTokens && tokenData) {\n const categories = extractTokenCategories(useCase);\n relevantTokens = {};\n for (const category of categories) {\n const tokens = tokenData.categories[category];\n if (tokens && tokens.length > 0) {\n relevantTokens[category] = tokens\n .slice(0, 5)\n .map((token) => token.name);\n }\n }\n if (Object.keys(relevantTokens).length === 0) {\n relevantTokens = undefined;\n }\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n components,\n blocks:\n verbosity !== 'compact' && matchingBlocks.length > 0\n ? matchingBlocks\n : undefined,\n tokens: verbosity !== 'compact' ? relevantTokens : undefined,\n noMatch: components.length === 0,\n summary:\n 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 ${ctx.toolNames.discover} with different terms${tokenData ? ` or ${ctx.toolNames.tokens} for tokens` : ''}.`,\n }),\n },\n ],\n };\n};\n","/**\n * HTTP-based render/fix service — no Playwright dependency.\n *\n * When a viewer URL is configured (e.g., the Fragments dev server is running),\n * these functions proxy render/fix requests to the viewer's HTTP API.\n * When no viewer is available, they return helpful error messages.\n */\n\nexport interface ServiceEndpoints {\n render: string;\n compare: string;\n fix: string;\n a11y: string;\n}\n\nexport const DEFAULT_ENDPOINTS: ServiceEndpoints = {\n render: '/fragments/render',\n compare: '/fragments/compare',\n fix: '/fragments/fix',\n a11y: '/fragments/a11y',\n};\n\nexport interface RenderRequest {\n component: string;\n props?: Record<string, unknown>;\n variant?: string;\n viewport?: { width?: number; height?: number };\n}\n\nexport interface RenderResult {\n screenshot?: string;\n error?: string;\n}\n\nexport interface CompareRequest {\n component: string;\n variant?: string;\n props?: Record<string, unknown>;\n figmaUrl: string;\n threshold?: number;\n}\n\nexport 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\nexport interface FixRequest {\n component: string;\n variant?: string;\n fixType?: 'token' | 'all';\n}\n\nexport interface FixResult {\n patches: Array<{ file: string; diff: string }>;\n summary: string;\n error?: string;\n}\n\nexport interface A11yRequest {\n component: string;\n variant?: string;\n standard?: 'AA' | 'AAA';\n includeFixPatches?: boolean;\n}\n\nexport interface A11yVariantResult {\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\nexport interface A11yResult {\n component: string;\n results: A11yVariantResult[];\n score: number;\n aaPercent: number;\n aaaPercent: number;\n passed: boolean;\n /** True when axe found no testable elements (e.g., nonexistent variant) */\n emptyAudit?: boolean;\n standard: string;\n error?: string;\n}\n\n/**\n * Render a component via the viewer's HTTP API.\n */\nexport async function renderComponent(\n viewerUrl: string,\n request: RenderRequest,\n endpoints?: Partial<ServiceEndpoints>\n): Promise<RenderResult> {\n const renderUrl = `${viewerUrl}${endpoints?.render ?? DEFAULT_ENDPOINTS.render}`;\n\n const response = await fetch(renderUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: request.component,\n props: request.props ?? {},\n variant: request.variant,\n viewport: request.viewport ?? { width: 800, height: 600 },\n }),\n });\n\n return (await response.json()) as RenderResult;\n}\n\n/**\n * Compare a component render against a Figma design via the viewer's HTTP API.\n */\nexport async function compareComponent(\n viewerUrl: string,\n request: CompareRequest,\n endpoints?: Partial<ServiceEndpoints>\n): Promise<CompareResult> {\n const compareUrl = `${viewerUrl}${endpoints?.compare ?? DEFAULT_ENDPOINTS.compare}`;\n\n const response = await fetch(compareUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n });\n\n return (await response.json()) as CompareResult;\n}\n\n/**\n * Generate fix patches via the viewer's HTTP API.\n */\nexport async function fixComponent(\n viewerUrl: string,\n request: FixRequest,\n endpoints?: Partial<ServiceEndpoints>\n): Promise<FixResult> {\n const fixUrl = `${viewerUrl}${endpoints?.fix ?? DEFAULT_ENDPOINTS.fix}`;\n\n const response = await fetch(fixUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n });\n\n return (await response.json()) as FixResult;\n}\n\n/**\n * Run an accessibility audit on a component via the viewer's HTTP API.\n */\nexport async function auditComponent(\n viewerUrl: string,\n request: A11yRequest,\n endpoints?: Partial<ServiceEndpoints>\n): Promise<A11yResult> {\n const a11yUrl = `${viewerUrl}${endpoints?.a11y ?? DEFAULT_ENDPOINTS.a11y}`;\n\n const response = await fetch(a11yUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: request.component,\n variant: request.variant,\n standard: request.standard,\n includeFixPatches: request.includeFixPatches,\n }),\n });\n\n const raw = (await response.json()) as {\n results: A11yVariantResult[];\n error?: string;\n };\n\n if (raw.error) {\n return {\n component: request.component,\n results: [],\n score: 0,\n aaPercent: 0,\n aaaPercent: 0,\n passed: false,\n standard: request.standard ?? 'AA',\n error: raw.error,\n };\n }\n\n const results = raw.results ?? [];\n const standard = request.standard ?? 'AA';\n\n // Calculate totals\n let totalCritical = 0;\n let totalSerious = 0;\n let totalModerate = 0;\n let totalMinor = 0;\n\n for (const r of results) {\n totalCritical += r.summary.critical;\n totalSerious += r.summary.serious;\n totalModerate += r.summary.moderate;\n totalMinor += r.summary.minor;\n }\n\n // Score: start at 100, subtract per violation\n const deductions =\n totalCritical * 10 +\n totalSerious * 5 +\n totalModerate * 2 +\n totalMinor * 1;\n const score = Math.max(0, 100 - deductions);\n\n // Per-variant compliance: calculate the percentage of variants that pass,\n // not a binary gate. A component with 5 clean variants and 1 with a violation\n // should show ~83% AA compliance, not 0%.\n const variantCount = results.length;\n const aaPassCount = results.filter(r => {\n const critical = r.summary.critical;\n const serious = r.summary.serious;\n return critical === 0 && serious === 0;\n }).length;\n const aaaPassCount = results.filter(r => {\n const total = r.summary.critical + r.summary.serious + r.summary.moderate + r.summary.minor;\n return total === 0;\n }).length;\n // Detect empty audits: if every variant has 0 passes AND 0 violations,\n // axe found no testable elements (e.g., nonexistent variant rendered empty).\n // Report this as an inconclusive result rather than a false pass.\n const totalPasses = results.reduce((sum, r) => sum + r.passes, 0);\n const totalViolations = totalCritical + totalSerious + totalModerate + totalMinor;\n const emptyAudit = results.length > 0 && totalPasses === 0 && totalViolations === 0;\n\n const aaPercent = variantCount > 0 ? Math.round((aaPassCount / variantCount) * 100) : 100;\n const aaaPercent = variantCount > 0 ? Math.round((aaaPassCount / variantCount) * 100) : 100;\n\n // Overall pass/fail uses aggregate totals (matches original behavior for the `passed` field)\n // An empty audit (nothing tested) is NOT a pass\n const aaPass = !emptyAudit && totalCritical === 0 && totalSerious === 0;\n const aaaPass = !emptyAudit && totalViolations === 0;\n\n const passed = standard === 'AAA' ? aaaPass : aaPass;\n\n return {\n component: request.component,\n results,\n score: emptyAudit ? 0 : score,\n aaPercent: emptyAudit ? 0 : aaPercent,\n aaaPercent: emptyAudit ? 0 : aaaPercent,\n ...(emptyAudit && { emptyAudit }),\n passed,\n standard,\n };\n}\n","import { renderComponent, compareComponent } from '../service.js';\nimport { findClosestMatch } from '../scoring.js';\nimport { DEFAULTS } from '../constants.js';\nimport { componentNames, findComponentByName } from '../snapshot-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nconst NO_VIEWER_MSG = \"This tool requires a running dev server. Add --viewer-url http://localhost:PORT to this server's config args. Start the viewer with 'fragments dev' in your component library directory.\";\n\nexport const renderHandler: ToolHandler = async (args, ctx) => {\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 figmaUrl = args?.figmaUrl as string | undefined;\n const threshold = (args?.threshold as number) ?? (figmaUrl ? 1.0 : ctx.config.threshold ?? DEFAULTS.diffThreshold);\n\n if (!componentName) {\n return {\n content: [{ type: 'text' as const, text: 'Error: component name is required' }],\n isError: true,\n };\n }\n\n // Validate component exists (provides \"did you mean?\" on typos)\n {\n const component = findComponentByName(ctx.data.snapshot, componentName);\n if (!component) {\n const allNames = componentNames(ctx.data.snapshot);\n const closest = findClosestMatch(componentName, allNames);\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n throw new Error(`Component \"${componentName}\" not found.${suggestion} Use ${ctx.toolNames.discover} to see available components.`);\n }\n }\n\n const viewerUrl = ctx.config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: NO_VIEWER_MSG,\n }],\n isError: true,\n };\n }\n\n // --- Figma compare mode ---\n if (figmaUrl) {\n try {\n const result = await compareComponent(viewerUrl, {\n component: componentName,\n variant: variantName,\n props,\n figmaUrl,\n threshold,\n }, ctx.config.fileConfig?.endpoints);\n\n if (result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Compare error: ${result.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 }),\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 try {\n const result = await renderComponent(viewerUrl, {\n component: componentName,\n props,\n variant: variantName,\n viewport: viewport ?? { width: 800, height: 600 },\n }, ctx.config.fileConfig?.endpoints);\n\n if (result.error) {\n return {\n content: [{ type: 'text' as const, text: `Render error: ${result.error}` }],\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}${variantName ? ` (variant: \"${variantName}\")` : ''}${Object.keys(props).length > 0 ? ` 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","import { fixComponent } from '../service.js';\nimport { findClosestMatch } from '../scoring.js';\nimport { componentNames, findComponentByName } from '../snapshot-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nconst NO_VIEWER_MSG = \"This tool requires a running dev server. Add --viewer-url http://localhost:PORT to this server's config args. Start the viewer with 'fragments dev' in your component library directory.\";\n\nexport const fixHandler: ToolHandler = async (args, ctx) => {\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 = findComponentByName(ctx.data.snapshot, componentName);\n\n if (!fragment) {\n const allNames = componentNames(ctx.data.snapshot);\n const closest = findClosestMatch(componentName, allNames);\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n throw new Error(`Component \"${componentName}\" not found.${suggestion} Use ${ctx.toolNames.discover} to see available components.`);\n }\n\n const viewerUrl = ctx.config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: NO_VIEWER_MSG,\n }],\n isError: true,\n };\n }\n\n try {\n const result = await fixComponent(viewerUrl, {\n component: componentName,\n variant: variantName,\n fixType,\n }, ctx.config.fileConfig?.endpoints);\n\n if (result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Fix generation error: ${result.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 ${ctx.toolNames.render} to confirm fixes.`\n : undefined,\n }),\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","import { auditComponent } from '../service.js';\nimport { findClosestMatch } from '../scoring.js';\nimport { componentNames, findComponentByName } from '../snapshot-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nconst NO_VIEWER_MSG = \"This tool requires a running dev server. Add --viewer-url http://localhost:PORT to this server's config args. Start the viewer with 'fragments dev' in your component library directory.\";\n\nexport const a11yHandler: ToolHandler = async (args, ctx) => {\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 const includeFixPatches = (args?.includeFixPatches as boolean) ?? false;\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n // Validate component exists (provides \"did you mean?\" on typos)\n {\n const fragment = findComponentByName(ctx.data.snapshot, componentName);\n if (!fragment) {\n const allNames = componentNames(ctx.data.snapshot);\n const closest = findClosestMatch(componentName, allNames);\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n throw new Error(`Component \"${componentName}\" not found.${suggestion} Use ${ctx.toolNames.discover} to see available components.`);\n }\n }\n\n const viewerUrl = ctx.config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: NO_VIEWER_MSG,\n }],\n isError: true,\n };\n }\n\n try {\n const result = await auditComponent(viewerUrl, {\n component: componentName,\n variant: variantName,\n standard,\n includeFixPatches,\n }, ctx.config.fileConfig?.endpoints);\n\n if (result.error) {\n return {\n content: [{\n type: 'text' as const,\n text: `A11y audit error: ${result.error}`,\n }],\n isError: true,\n };\n }\n\n let nextStep: string;\n if (result.emptyAudit) {\n nextStep = `No testable elements found for ${variantName ? `variant \"${variantName}\"` : componentName}. The variant may not exist or renders no accessible content. Check available variants with ${ctx.toolNames.inspect}(\"${componentName}\").`;\n } else if (result.passed) {\n nextStep = 'All accessibility checks passed. Consider running with standard: \"AAA\" for enhanced compliance.';\n } else {\n nextStep = `Fix the violations above, then re-run ${ctx.toolNames.a11y} to verify. Use ${ctx.toolNames.fix} for automated fixes.`;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: componentName,\n variant: variantName ?? 'all',\n standard,\n totalViolations: result.results.reduce((sum, r) => sum + r.summary.total, 0),\n variantsPassingAA: `${result.aaPercent}%`,\n variantsPassingAAA: `${result.aaaPercent}%`,\n passed: result.passed,\n ...(result.emptyAudit && { emptyAudit: true }),\n results: result.results,\n nextStep,\n }),\n }],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to audit 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 * MCP tool handler for the graph tool.\n *\n * Dispatches graph queries to the ComponentGraphEngine and formats\n * results as structured markdown/JSON for AI consumption.\n */\n\nimport {\n ComponentGraphEngine,\n deserializeGraph,\n} from '@fragments-sdk/context/graph';\nimport type {\n SerializedComponentGraph,\n GraphEdgeType,\n} from '@fragments-sdk/context/graph';\nimport { findClosestMatch } from './scoring.js';\n\nexport interface GraphToolArgs {\n mode: string;\n component?: string;\n target?: string;\n edgeTypes?: string[];\n maxDepth?: number;\n}\n\nexport function handleGraphTool(\n args: GraphToolArgs,\n serializedGraph: SerializedComponentGraph | undefined,\n blocks?: Record<string, { components: string[] }>,\n componentNames?: string[],\n): { text: string; isError?: boolean } {\n if (!serializedGraph) {\n return {\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 isError: true,\n };\n }\n\n const graph = deserializeGraph(serializedGraph);\n const blockData = blocks\n ? Object.fromEntries(\n Object.entries(blocks).map(([k, v]) => [k, { components: v.components }])\n )\n : undefined;\n const engine = new ComponentGraphEngine(graph, blockData);\n const edgeTypes = args.edgeTypes as GraphEdgeType[] | undefined;\n\n switch (args.mode) {\n case 'health': {\n const health = engine.getHealth();\n const blockCount = blocks ? Object.keys(blocks).length : 0;\n return {\n text: JSON.stringify({\n mode: 'health',\n ...health,\n ...(health.compositionCoverage === 0 && blockCount === 0 && {\n compositionNote: 'No composition blocks defined yet — compositionCoverage will increase as blocks are added',\n }),\n summary: `${health.nodeCount} components, ${health.edgeCount} edges, ${health.connectedComponents.length} island(s), ${health.orphans.length} orphan(s), ${health.compositionCoverage}% in blocks`,\n }),\n };\n }\n\n case 'dependencies': {\n if (!args.component) {\n return { text: JSON.stringify({ error: 'component is required for dependencies mode' }), isError: true };\n }\n if (!engine.hasNode(args.component)) {\n const closest = componentNames ? findClosestMatch(args.component, componentNames) : null;\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph.${suggestion}` }), isError: true };\n }\n const deps = engine.dependencies(args.component, edgeTypes);\n return {\n text: JSON.stringify({\n mode: 'dependencies',\n component: args.component,\n count: deps.length,\n dependencies: deps.map(e => ({\n component: e.target,\n type: e.type,\n weight: e.weight,\n note: e.note,\n provenance: e.provenance,\n })),\n }),\n };\n }\n\n case 'dependents': {\n if (!args.component) {\n return { text: JSON.stringify({ error: 'component is required for dependents mode' }), isError: true };\n }\n if (!engine.hasNode(args.component)) {\n const closest = componentNames ? findClosestMatch(args.component, componentNames) : null;\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph.${suggestion}` }), isError: true };\n }\n const deps = engine.dependents(args.component, edgeTypes);\n return {\n text: JSON.stringify({\n mode: 'dependents',\n component: args.component,\n count: deps.length,\n dependents: deps.map(e => ({\n component: e.source,\n type: e.type,\n weight: e.weight,\n note: e.note,\n provenance: e.provenance,\n })),\n }),\n };\n }\n\n case 'impact': {\n if (!args.component) {\n return { text: JSON.stringify({ error: 'component is required for impact mode' }), isError: true };\n }\n if (!engine.hasNode(args.component)) {\n const closest = componentNames ? findClosestMatch(args.component, componentNames) : null;\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph.${suggestion}` }), isError: true };\n }\n const result = engine.impact(args.component, args.maxDepth ?? 3);\n return {\n text: JSON.stringify({\n mode: 'impact',\n ...result,\n summary: `Changing ${args.component} affects ${result.totalAffected} component(s) and ${result.affectedBlocks.length} block(s)`,\n }),\n };\n }\n\n case 'path': {\n if (!args.component || !args.target) {\n return { text: JSON.stringify({ error: 'component and target are required for path mode' }), isError: true };\n }\n const result = engine.path(args.component, args.target);\n return {\n text: JSON.stringify({\n mode: 'path',\n from: args.component,\n to: args.target,\n ...result,\n edges: result.edges.map(e => ({\n source: e.source,\n target: e.target,\n type: e.type,\n })),\n }),\n };\n }\n\n case 'composition': {\n if (!args.component) {\n return { text: JSON.stringify({ error: 'component is required for composition mode' }), isError: true };\n }\n if (!engine.hasNode(args.component)) {\n const closest = componentNames ? findClosestMatch(args.component, componentNames) : null;\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph.${suggestion}` }), isError: true };\n }\n const tree = engine.composition(args.component);\n return {\n text: JSON.stringify({\n mode: 'composition',\n ...tree,\n }),\n };\n }\n\n case 'alternatives': {\n if (!args.component) {\n return { text: JSON.stringify({ error: 'component is required for alternatives mode' }), isError: true };\n }\n if (!engine.hasNode(args.component)) {\n const closest = componentNames ? findClosestMatch(args.component, componentNames) : null;\n const suggestion = closest ? ` Did you mean \"${closest}\"?` : '';\n return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph.${suggestion}` }), isError: true };\n }\n const alts = engine.alternatives(args.component);\n return {\n text: JSON.stringify({\n mode: 'alternatives',\n component: args.component,\n count: alts.length,\n alternatives: alts,\n }),\n };\n }\n\n case 'islands': {\n const islands = engine.islands();\n return {\n text: JSON.stringify({\n mode: 'islands',\n count: islands.length,\n islands: islands.map((island, i) => ({\n id: i + 1,\n size: island.length,\n components: island,\n })),\n }),\n };\n }\n\n default:\n return {\n text: JSON.stringify({\n error: `Unknown mode: \"${args.mode}\". Valid modes: dependencies, dependents, impact, path, composition, alternatives, islands, health`,\n }),\n isError: true,\n };\n }\n}\n","import type { SerializedComponentGraph } from '@fragments-sdk/context/graph';\nimport { handleGraphTool } from '../graph-handler.js';\nimport type { GraphToolArgs } from '../graph-handler.js';\nimport { componentNames } from '../snapshot-helpers.js';\nimport type { ToolHandler } from '../types.js';\n\nexport const graphHandler: ToolHandler = async (args, ctx) => {\n const graphArgs: GraphToolArgs = {\n mode: (args?.mode as string) ?? 'health',\n component: args?.component as string | undefined,\n target: args?.target as string | undefined,\n edgeTypes: args?.edgeTypes as string[] | undefined,\n maxDepth: args?.maxDepth as number | undefined,\n };\n\n const data = ctx.data;\n const allNames = componentNames(data.snapshot);\n const result = handleGraphTool(\n graphArgs,\n data.graph as SerializedComponentGraph | undefined,\n data.blocks,\n allNames,\n );\n\n if (result.isError) {\n return {\n content: [{ type: 'text' as const, text: result.text }],\n isError: true,\n };\n }\n\n return {\n content: [{ type: 'text' as const, text: result.text }],\n };\n};\n","import { BRAND } from '../constants.js';\nimport type { ToolHandler } from '../types.js';\n\nexport const perfHandler: ToolHandler = async (args, ctx) => {\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 let entries = Object.values(ctx.data.components)\n .filter((component) => component.performance)\n .map((component) => ({\n name: component.name,\n ...component.performance!,\n }));\n\n if (entries.length === 0) {\n return {\n content: [\n {\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 }),\n },\n ],\n };\n }\n\n if (componentName) {\n entries = entries.filter(\n (entry) => entry.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 if (filter) {\n if (filter === 'over-budget') {\n entries = entries.filter((entry) => entry.overBudget);\n } else {\n entries = entries.filter((entry) => entry.complexity === filter);\n }\n }\n\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 {\n type: 'text' as const,\n text: JSON.stringify({\n total: entries.length,\n summary: ctx.data.performanceSummary ?? undefined,\n components: entries,\n }),\n },\n ],\n };\n};\n","import {\n handleGovernTool,\n formatVerdict,\n universal,\n fragments as fragmentsPreset,\n} from '@fragments-sdk/govern';\nimport type { McpGovernInput } from '@fragments-sdk/govern';\nimport type { EngineOptions } from '@fragments-sdk/govern';\nimport type { ToolHandler } from '../types.js';\n\nexport const governHandler: ToolHandler = async (args, ctx) => {\n const spec = args?.spec;\n if (!spec || typeof spec !== 'object') {\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error:\n 'spec is required and must be an object with { nodes: [{ id, type, props, children }] }',\n }),\n },\n ],\n isError: true,\n };\n }\n\n const policyOverrides = args?.policy as Record<string, unknown> | undefined;\n const format = (args?.format as 'json' | 'summary') ?? 'json';\n\n // Auto-select base policy: fragments preset for fui- projects, universal otherwise\n const tokenPrefix = ctx.data.tokens?.prefix;\n const basePolicy =\n tokenPrefix === 'fui-'\n ? { rules: fragmentsPreset().rules }\n : { rules: universal().rules };\n\n // Enrich with token data when available\n const engineOptions: EngineOptions | undefined = ctx.data.tokens\n ? { tokenData: ctx.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\n const text =\n format === 'summary'\n ? formatVerdict(verdict, 'summary')\n : JSON.stringify(verdict);\n\n return {\n content: [{ type: 'text' as const, text }],\n _meta: {\n score: verdict.score,\n passed: verdict.passed,\n violationCount: verdict.results.reduce(\n (sum, r) => sum + r.violations.length,\n 0,\n ),\n },\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const isSpecError =\n message.includes('Expected') || message.includes('Required');\n return {\n content: [\n {\n type: 'text' as const,\n text: JSON.stringify({\n error: isSpecError\n ? `Invalid spec format: ${message}. Expected: { nodes: [{ id: string, type: string, props: object, children?: string[] }] }`\n : message,\n }),\n },\n ],\n isError: true,\n };\n }\n};\n","import type { ToolHandler } from '../types.js';\n\nexport const generateUiHandler: ToolHandler = async (args, ctx) => {\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 = ctx.config.playgroundUrl ?? 'https://usefragments.com';\n\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 const errorBody = await response.text();\n throw new Error(`Playground API error (${response.status}): ${errorBody}`);\n }\n\n // The API returns a streaming text response with the element tree JSON\n const text = await response.text();\n\n return {\n content: [{\n type: 'text' as const,\n text,\n }],\n };\n};\n","import type { ToolHandler } from '../types.js';\nimport type { McpCapability } from '@fragments-sdk/core';\nimport { discoverHandler } from './discover.js';\nimport { inspectHandler } from './inspect.js';\nimport { blocksHandler } from './blocks.js';\nimport { tokensHandler } from './tokens.js';\nimport { implementHandler } from './implement.js';\nimport { renderHandler } from './render.js';\nimport { fixHandler } from './fix.js';\nimport { a11yHandler } from './a11y.js';\nimport { graphHandler } from './graph.js';\nimport { perfHandler } from './perf.js';\nimport { governHandler } from './govern.js';\nimport { generateUiHandler } from './generate-ui.js';\n\n/** Core tools — always available */\nexport const CORE_TOOLS: Record<string, ToolHandler> = {\n discover: discoverHandler,\n inspect: inspectHandler,\n blocks: blocksHandler,\n tokens: tokensHandler,\n implement: implementHandler,\n graph: graphHandler,\n perf: perfHandler,\n govern: governHandler,\n};\n\n/** Viewer-dependent tools — only available when viewerUrl is configured */\nexport const VIEWER_TOOLS: Record<string, ToolHandler> = {\n render: renderHandler,\n fix: fixHandler,\n a11y: a11yHandler,\n};\n\n/** Infrastructure-dependent tools — only available when their URL is configured */\nexport const INFRA_TOOLS: Record<string, ToolHandler> = {\n generate_ui: generateUiHandler,\n};\n\n/** All built-in tools */\nexport const BUILTIN_TOOLS: Record<string, ToolHandler> = {\n ...CORE_TOOLS,\n ...VIEWER_TOOLS,\n ...INFRA_TOOLS,\n};\n\nexport const TOOL_CAPABILITIES: Partial<Record<string, McpCapability[]>> = {\n discover: ['components'],\n inspect: ['components'],\n blocks: ['blocks'],\n tokens: ['tokens'],\n implement: ['components'],\n graph: ['graph'],\n perf: ['performance'],\n render: ['components'],\n fix: ['components'],\n a11y: ['components'],\n};\n","import type { Tool } from '@modelcontextprotocol/sdk/types.js';\nimport type { McpCapability } from '@fragments-sdk/core';\nimport type { ToolHandler, ToolResult, ToolContext } from './types.js';\nimport type { McpToolDefinition } from '@fragments-sdk/context/mcp-tools';\n\nexport type ToolAvailability = 'always' | 'viewer' | 'playground';\n\nexport interface AvailabilityContext {\n hasViewer: boolean;\n hasPlayground: boolean;\n capabilities: Set<McpCapability>;\n}\n\ninterface RegisteredTool {\n key: string;\n handler: ToolHandler;\n definition?: McpToolDefinition;\n availability: ToolAvailability;\n requiredCapabilities: McpCapability[];\n}\n\nexport class ToolRegistry {\n private tools = new Map<string, RegisteredTool>();\n private prefix: string;\n private onChanged?: () => void;\n\n constructor(prefix: string, opts?: { onChanged?: () => void }) {\n this.prefix = prefix;\n this.onChanged = opts?.onChanged;\n }\n\n /** Register a single tool */\n register(\n key: string,\n handler: ToolHandler,\n definition?: McpToolDefinition,\n availability: ToolAvailability = 'always',\n requiredCapabilities: McpCapability[] = [],\n ): void {\n this.tools.set(key, {\n key,\n handler,\n definition,\n availability,\n requiredCapabilities,\n });\n this.onChanged?.();\n }\n\n /** Unregister a tool by key */\n unregister(key: string): void {\n if (this.tools.delete(key)) {\n this.onChanged?.();\n }\n }\n\n /** Bulk register built-in tools with availability metadata */\n registerBuiltins(\n toolSets: { core: Record<string, ToolHandler>; viewer: Record<string, ToolHandler>; infra: Record<string, ToolHandler> },\n definitions: McpToolDefinition[],\n capabilityByKey: Partial<Record<string, McpCapability[]>> = {},\n ): void {\n const defMap = new Map(definitions.map(d => [d.key, d]));\n for (const [key, handler] of Object.entries(toolSets.core)) {\n this.tools.set(key, {\n key,\n handler,\n definition: defMap.get(key),\n availability: 'always',\n requiredCapabilities: capabilityByKey[key] ?? [],\n });\n }\n for (const [key, handler] of Object.entries(toolSets.viewer)) {\n this.tools.set(key, {\n key,\n handler,\n definition: defMap.get(key),\n availability: 'viewer',\n requiredCapabilities: capabilityByKey[key] ?? [],\n });\n }\n for (const [key, handler] of Object.entries(toolSets.infra)) {\n this.tools.set(key, {\n key,\n handler,\n definition: defMap.get(key),\n availability: 'playground',\n requiredCapabilities: capabilityByKey[key] ?? [],\n });\n }\n // Don't fire onChanged during bulk init\n }\n\n /** Get handler for a tool (by unprefixed key or prefixed name) */\n getHandler(nameOrKey: string): ToolHandler | undefined {\n // Try direct key first\n const direct = this.tools.get(nameOrKey);\n if (direct) return direct.handler;\n // Try stripping prefix (only if prefix is set)\n if (!this.prefix) return undefined;\n const prefixStr = this.prefix + '_';\n if (nameOrKey.startsWith(prefixStr)) {\n const key = nameOrKey.slice(prefixStr.length);\n return this.tools.get(key)?.handler;\n }\n return undefined;\n }\n\n /** Resolve unprefixed key from a potentially prefixed tool name */\n resolveKey(name: string): string {\n if (!this.prefix) return name;\n const prefixStr = this.prefix + '_';\n return name.startsWith(prefixStr) ? name.slice(prefixStr.length) : name;\n }\n\n /** List available tools as MCP Tool[] based on current availability context */\n listTools(ctx: AvailabilityContext, allToolSchemas: Tool[]): Tool[] {\n const availableKeys = new Set<string>();\n for (const [key, tool] of this.tools) {\n const hasCapabilities = tool.requiredCapabilities.every((capability) =>\n ctx.capabilities.has(capability),\n );\n if (!hasCapabilities) continue;\n\n if (tool.availability === 'always') {\n availableKeys.add(key);\n } else if (tool.availability === 'viewer' && ctx.hasViewer) {\n availableKeys.add(key);\n } else if (tool.availability === 'playground' && ctx.hasPlayground) {\n availableKeys.add(key);\n }\n }\n if (!this.prefix) {\n return allToolSchemas.filter(t => availableKeys.has(t.name));\n }\n const prefixStr = this.prefix + '_';\n return allToolSchemas.filter(t => {\n const key = t.name.startsWith(prefixStr) ? t.name.slice(prefixStr.length) : t.name;\n return availableKeys.has(key);\n });\n }\n\n /** Execute a tool by name, dispatching to its handler */\n async execute(name: string, args: Record<string, unknown>, ctx: ToolContext): Promise<ToolResult> {\n const key = this.resolveKey(name);\n const registered = this.tools.get(key);\n if (!registered) {\n throw new Error(`Unknown tool: ${name}`);\n }\n return registered.handler(args, ctx);\n }\n\n /** Get the number of registered tools */\n get size(): number {\n return this.tools.size;\n }\n\n /** Get all registered keys */\n keys(): string[] {\n return Array.from(this.tools.keys());\n }\n}\n","import type { ToolResult, ToolContext } from './types.js';\n\nexport type MiddlewareNext = () => Promise<ToolResult>;\n\nexport interface MiddlewareContext {\n /** Tool name as received from the MCP client (e.g., 'discover') */\n toolName: string;\n /** Tool key (e.g., 'discover') */\n toolKey: string;\n /** Arguments passed to the tool */\n args: Record<string, unknown>;\n /** Tool execution context */\n ctx: ToolContext;\n}\n\nexport type Middleware = (\n mCtx: MiddlewareContext,\n next: MiddlewareNext,\n) => Promise<ToolResult>;\n\n/**\n * Execute a handler through a middleware chain (onion pattern).\n * Middleware wraps the handler — first registered runs outermost.\n */\nexport function executeWithMiddleware(\n middlewares: Middleware[],\n mCtx: MiddlewareContext,\n handler: () => Promise<ToolResult>,\n): Promise<ToolResult> {\n const chain = [...middlewares].reverse().reduce<MiddlewareNext>(\n (next, mw) => () => mw(mCtx, next),\n handler,\n );\n return chain();\n}\n\n/**\n * Built-in telemetry middleware — logs tool name and execution time.\n */\nexport function telemetryMiddleware(\n logger: (msg: string) => void,\n): Middleware {\n return async (mCtx, next) => {\n const start = Date.now();\n const result = await next();\n logger(`${mCtx.toolKey}: ${Date.now() - start}ms`);\n return result;\n };\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { FragmentsJsonAdapter } from './adapters/fragments-json.js';\nimport { AutoExtractionAdapter } from './adapters/auto-extract.js';\nimport { CloudCatalogAdapter } from './adapters/cloud-catalog.js';\nimport { BundleAdapter } from './adapters/bundle.js';\nimport type { DataAdapter } from './adapters/types.js';\nimport { findBundleManifest, findFragmentsJson } from './discovery.js';\nimport type { McpServerConfig } from './types.js';\nimport type { DsMcpConfigFile } from './config.js';\n\nexport interface ResolvedSource {\n adapter: DataAdapter;\n mode: 'fragments-json' | 'cloud' | 'bundle' | 'extract';\n}\n\nfunction resolveCloudApiKey(\n config: McpServerConfig,\n fileConfig?: DsMcpConfigFile,\n): string | undefined {\n return (\n config.cloudApiKey ??\n fileConfig?.cloud?.apiKey ??\n process.env.FRAGMENTS_API_KEY\n );\n}\n\nfunction resolveCloudUrl(\n fileConfig?: DsMcpConfigFile,\n): string | undefined {\n return fileConfig?.cloud?.url ?? process.env.FRAGMENTS_CLOUD_URL;\n}\n\nfunction hasTsProject(projectRoot: string): boolean {\n return (\n existsSync(join(projectRoot, 'tsconfig.json')) ||\n existsSync(join(projectRoot, 'tsconfig.app.json'))\n );\n}\n\nexport function resolveDataAdapter(\n config: McpServerConfig,\n fileConfig?: DsMcpConfigFile,\n): ResolvedSource {\n const source = config.source ?? fileConfig?.source ?? 'auto';\n const fragmentsJsonPaths = findFragmentsJson(config.projectRoot);\n const bundleManifestPaths = findBundleManifest(config.projectRoot);\n const cloudApiKey = resolveCloudApiKey(config, fileConfig);\n const cloudUrl = resolveCloudUrl(fileConfig);\n\n switch (source) {\n case 'fragments-json':\n return { adapter: new FragmentsJsonAdapter(), mode: 'fragments-json' };\n case 'cloud':\n if (!cloudApiKey) {\n throw new Error(\n 'Cloud source requires a Cloud API key. Set FRAGMENTS_API_KEY or pass cloudApiKey.',\n );\n }\n return {\n adapter: new CloudCatalogAdapter({ apiKey: cloudApiKey, url: cloudUrl }),\n mode: 'cloud',\n };\n case 'bundle':\n return { adapter: new BundleAdapter(), mode: 'bundle' };\n case 'extract':\n return { adapter: new AutoExtractionAdapter(), mode: 'extract' };\n case 'auto':\n default:\n if (fragmentsJsonPaths.length > 0) {\n return {\n adapter: new FragmentsJsonAdapter(),\n mode: 'fragments-json',\n };\n }\n if (cloudApiKey) {\n return {\n adapter: new CloudCatalogAdapter({\n apiKey: cloudApiKey,\n url: cloudUrl,\n }),\n mode: 'cloud',\n };\n }\n if (bundleManifestPaths.length > 0) {\n return {\n adapter: new BundleAdapter(),\n mode: 'bundle',\n };\n }\n if (hasTsProject(config.projectRoot)) {\n return { adapter: new AutoExtractionAdapter(), mode: 'extract' };\n }\n return {\n adapter: new FragmentsJsonAdapter(),\n mode: 'fragments-json',\n };\n }\n}\n\nexport function resolveSearchApiKey(\n config: McpServerConfig,\n fileConfig?: DsMcpConfigFile,\n): string | undefined {\n return config.searchApiKey ?? config.apiKey ?? fileConfig?.vectorSearch?.apiKey;\n}\n","import { readFile } from 'node:fs/promises';\nimport type { CompiledFragmentsFile } from '@fragments-sdk/context/types';\nimport type { McpSnapshot } from '@fragments-sdk/core';\nimport { findFragmentsJson } from '../discovery.js';\nimport { BRAND } from '../constants.js';\nimport type { DesignSystemData } from '../types.js';\nimport type { DataAdapter } from './types.js';\nimport {\n blockFromCompiledBlock,\n buildCapabilities,\n componentFromCompiledFragment,\n tokensFromCompiledTokenData,\n validateSnapshot,\n} from './snapshot-converters.js';\n\nexport class FragmentsJsonAdapter implements DataAdapter {\n readonly name = 'fragments-json';\n\n discover(startDir: string): string[] {\n return findFragmentsJson(startDir);\n }\n\n async load(projectRoot: string): Promise<DesignSystemData> {\n const paths = this.discover(projectRoot);\n\n if (paths.length === 0) {\n throw new Error(\n `No ${BRAND.outFile} found. Searched ${projectRoot} and package.json dependencies.\\n\\n` +\n `Fix: Add a project-level MCP config so the server runs from your workspace root:\\n\\n` +\n ` Cursor: .cursor/mcp.json\\n` +\n ` VS Code: .vscode/mcp.json\\n` +\n ` Claude: claude mcp add ${BRAND.nameLower} -- npx @fragments-sdk/mcp\\n` +\n ` Windsurf: .windsurf/mcp.json\\n\\n` +\n `Or pass --project-root: npx @fragments-sdk/mcp -p /path/to/project\\n\\n` +\n `If you're a library author, run \\`${BRAND.cliCommand} build\\` first.`\n );\n }\n\n // Load primary file\n const content = await readFile(paths[0], 'utf-8');\n const primary = JSON.parse(content) as CompiledFragmentsFile;\n\n // Normalize legacy \"recipes\" key\n if (!primary.blocks && primary.recipes) {\n primary.blocks = primary.recipes;\n }\n\n // Build package map from primary file\n const packageMap: Record<string, string> = {};\n if (primary.packageName) {\n for (const name of Object.keys(primary.fragments)) {\n packageMap[name] = primary.packageName;\n }\n }\n\n // Merge additional files (monorepo packages)\n for (let i = 1; i < paths.length; i++) {\n const extra = JSON.parse(await readFile(paths[i], 'utf-8')) as CompiledFragmentsFile;\n if (extra.packageName) {\n for (const name of Object.keys(extra.fragments)) {\n packageMap[name] = extra.packageName;\n }\n }\n Object.assign(primary.fragments, extra.fragments);\n const extraBlocks = extra.blocks ?? extra.recipes;\n if (extraBlocks) {\n primary.blocks = { ...primary.blocks, ...extraBlocks };\n }\n }\n\n const components = Object.fromEntries(\n Object.entries(primary.fragments).map(([key, fragment]) => [\n key,\n componentFromCompiledFragment({\n id: key,\n fragment,\n sourceType: 'fragments-json',\n packageName: packageMap[fragment.meta.name] ?? primary.packageName,\n importPath: packageMap[fragment.meta.name] ?? primary.packageName,\n }),\n ]),\n );\n const blocks = primary.blocks\n ? Object.fromEntries(\n Object.entries(primary.blocks).map(([key, block]) => [\n key,\n blockFromCompiledBlock(key, block),\n ]),\n )\n : undefined;\n const tokens = primary.tokens\n ? tokensFromCompiledTokenData(primary.tokens)\n : undefined;\n const snapshot: McpSnapshot = validateSnapshot({\n schemaVersion: 1,\n sourceType: 'fragments-json',\n sourceLabel: BRAND.outFile,\n capabilities: buildCapabilities({\n components,\n blocks,\n tokens,\n graph: primary.graph,\n performanceSummary: primary.performanceSummary,\n }),\n metadata: {\n designSystemName: primary.packageName,\n packageName: primary.packageName,\n importPath: primary.packageName,\n },\n components,\n blocks,\n tokens,\n graph: primary.graph,\n performanceSummary: primary.performanceSummary,\n packageMap,\n defaultPackageName: primary.packageName,\n });\n\n return {\n snapshot,\n components: snapshot.components,\n blocks: snapshot.blocks,\n tokens: snapshot.tokens,\n graph: primary.graph,\n performanceSummary: primary.performanceSummary,\n packageMap: snapshot.packageMap,\n defaultPackageName: snapshot.defaultPackageName,\n capabilities: new Set(snapshot.capabilities),\n };\n }\n}\n","/**\n * Fragment discovery — finds fragments.json files in the project.\n *\n * Extracted from @fragments-sdk/cli to avoid pulling in the full CLI dependency.\n */\n\nimport { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, dirname, resolve } from 'node:path';\nimport { createRequire } from 'node:module';\nimport { BRAND } from './constants.js';\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;\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;\n }\n }\n }\n } catch { /* unreadable */ }\n }\n\n return dirs;\n}\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\n/**\n * Scan a directory's package.json deps for packages with a given dep field.\n */\nfunction findFragmentsInDeps(dir: string, found: string[], depField: 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[depField]) {\n const fragmentsPath = join(dirname(depPkgPath), depPkg[depField]);\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 design system JSON files (parameterized version):\n * 1. Walk up from startDir looking for outFile\n * 2. Read package.json deps and resolve packages with a depField 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 findDesignSystemJson(startDir: string, outFile: string, depField: 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, 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, depField);\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, depField);\n }\n }\n\n return found;\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 *\n * Backward-compatible wrapper around findDesignSystemJson.\n */\nexport function findFragmentsJson(startDir: string): string[] {\n return findDesignSystemJson(startDir, BRAND.outFile, 'fragments');\n}\n\n/**\n * Find a local Fragments bundle manifest by walking upward from startDir.\n *\n * Unlike fragments.json discovery, bundles are local workspace artifacts and\n * are not currently resolved through package dependencies.\n */\nexport function findBundleManifest(startDir: string): string[] {\n const found: string[] = [];\n let dir = resolve(startDir);\n\n while (true) {\n const candidate = join(dir, BRAND.dataDir, BRAND.manifestFile);\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 return found;\n}\n","import type {\n CompiledBlock,\n CompiledFragment,\n CompiledTokenData,\n} from '@fragments-sdk/context/types';\nimport type {\n McpBlock,\n McpCapability,\n McpComponent,\n McpSnapshot,\n McpToken,\n McpTokenData,\n McpSourceType,\n} from '@fragments-sdk/core';\nimport { mcpSnapshotSchema } from '@fragments-sdk/core';\n\nfunction slugify(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 80);\n}\n\nexport function buildComponentId(args: {\n name: string;\n filePath?: string;\n packageName?: string;\n}): string {\n const base = args.filePath ?? args.packageName ?? args.name;\n return `${slugify(args.name)}:${base}`;\n}\n\nfunction valueToString(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value === 'string') return value;\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n return String(value);\n }\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n\nexport function componentFromCompiledFragment(args: {\n id?: string;\n fragment: CompiledFragment;\n sourceType: McpSourceType;\n packageName?: string;\n importPath?: string;\n}): McpComponent {\n const { fragment, sourceType } = args;\n const name = fragment.meta.name;\n const description = fragment.meta.description ?? '';\n const usage = fragment.usage ?? { when: [], whenNot: [] };\n const contract = fragment.contract;\n const ai = fragment.ai;\n const guidancePatterns = ((fragment as CompiledFragment & {\n _cloudPatterns?: Array<{ name?: string; description?: string }>;\n })._cloudPatterns ?? [])\n .map((pattern) => ({\n name: pattern.name ?? 'Pattern',\n description: pattern.description,\n }));\n\n return {\n id:\n args.id ??\n buildComponentId({\n name,\n filePath: fragment.sourcePath ?? fragment.filePath,\n packageName: args.packageName,\n }),\n name,\n description,\n category: fragment.meta.category ?? 'uncategorized',\n status: fragment.meta.status ?? 'stable',\n tags: fragment.meta.tags ?? [],\n props: Object.fromEntries(\n Object.entries(fragment.props ?? {}).map(([propName, prop]) => [\n propName,\n {\n type: prop.type,\n description: prop.description ?? '',\n required: prop.required ?? false,\n default: prop.default,\n values: prop.values ? [...prop.values] : undefined,\n constraints: prop.constraints ? [...prop.constraints] : undefined,\n },\n ]),\n ),\n propsSummary:\n fragment.propsSummary ??\n contract?.propsSummary ??\n Object.entries(fragment.props ?? {}).map(\n ([propName, prop]) =>\n `${propName}${prop.required ? ' (required)' : ''}: ${prop.type}`,\n ),\n examples: (fragment.variants ?? []).map((variant) => ({\n name: variant.name,\n description: variant.description,\n code: variant.code,\n kind: 'example',\n })),\n relations: (fragment.relations ?? []).map((relation) => ({\n componentName: relation.component,\n relationship: relation.relationship,\n note: relation.note,\n })),\n compoundChildren: Object.entries(contract?.compoundChildren ?? {}).map(\n ([childName, child]) => ({\n name: childName,\n description: child.description,\n required: child.required,\n accepts: child.accepts,\n visibility: 'public' as const,\n }),\n ),\n guidance: {\n when: usage.when ?? [],\n whenNot: usage.whenNot ?? [],\n guidelines: usage.guidelines ?? [],\n accessibility: usage.accessibility ?? [],\n dos: usage.when ?? [],\n donts: usage.whenNot ?? [],\n patterns:\n guidancePatterns.length > 0\n ? guidancePatterns\n : (ai?.commonPatterns ?? []).map((pattern) => ({\n name: pattern,\n })),\n },\n sourceType,\n sourcePath: fragment.sourcePath ?? fragment.filePath,\n packageName: args.packageName,\n importPath: args.importPath ?? args.packageName,\n performance: fragment.performance\n ? {\n bundleSize: fragment.performance.bundleSize,\n rawSize: fragment.performance.rawSize,\n complexity: fragment.performance.complexity,\n budgetPercent: fragment.performance.budgetPercent,\n overBudget: fragment.performance.overBudget,\n measuredAt: fragment.performance.measuredAt,\n imports: fragment.performance.imports?.map((entry) => ({\n path: entry.path,\n bytes: entry.bytes,\n percent: entry.percent,\n })),\n }\n : undefined,\n metadata: {\n a11yRules: contract?.a11yRules ?? [],\n scenarioTags: contract?.scenarioTags ?? [],\n },\n };\n}\n\nexport function blockFromCompiledBlock(\n key: string,\n block: CompiledBlock,\n): McpBlock {\n return {\n id: key,\n name: block.name,\n description: block.description ?? '',\n category: block.category ?? 'uncategorized',\n components: block.components ?? [],\n tags: block.tags ?? [],\n code: block.code ?? '',\n };\n}\n\nexport function tokensFromCompiledTokenData(\n tokens: CompiledTokenData,\n): McpTokenData {\n const flat: McpToken[] = [];\n const categories: Record<string, McpToken[]> = {};\n\n for (const [category, entries] of Object.entries(tokens.categories)) {\n const normalized = entries.map((entry) => ({\n name: entry.name,\n category,\n value: valueToString(entry.value),\n description: entry.description,\n }));\n categories[category] = normalized;\n flat.push(...normalized);\n }\n\n return {\n prefix: tokens.prefix,\n total: tokens.total,\n categories,\n flat,\n };\n}\n\nexport function buildCapabilities(args: {\n components: Record<string, McpComponent>;\n blocks?: Record<string, McpBlock>;\n tokens?: McpTokenData;\n graph?: unknown;\n performanceSummary?: unknown;\n}): McpCapability[] {\n const capabilities = new Set<McpCapability>();\n\n if (Object.keys(args.components).length > 0) {\n capabilities.add('components');\n }\n if (args.tokens && args.tokens.total > 0) {\n capabilities.add('tokens');\n }\n if (args.blocks && Object.keys(args.blocks).length > 0) {\n capabilities.add('blocks');\n }\n if (args.graph) {\n capabilities.add('graph');\n }\n const hasPerformance =\n Boolean(args.performanceSummary) ||\n Object.values(args.components).some((component) => Boolean(component.performance));\n if (hasPerformance) {\n capabilities.add('performance');\n }\n\n return Array.from(capabilities);\n}\n\nexport function validateSnapshot(snapshot: McpSnapshot): McpSnapshot {\n return mcpSnapshotSchema.parse(snapshot);\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join, relative, sep, dirname, basename } from 'node:path';\nimport type { CompiledFragment, PropDefinition, FragmentMeta } from '@fragments-sdk/context/types';\nimport type { McpSnapshot } from '@fragments-sdk/core';\nimport type { DesignSystemData } from '../types.js';\nimport type { DataAdapter } from './types.js';\nimport { discoverComponentFiles } from './discover-components.js';\nimport { scanTokens } from './scan-tokens.js';\nimport {\n buildCapabilities,\n componentFromCompiledFragment,\n tokensFromCompiledTokenData,\n validateSnapshot,\n} from './snapshot-converters.js';\n\n/**\n * Auto-extract adapter: discovers and extracts component data\n * directly from source code without requiring fragments.json.\n *\n * Requires TypeScript to be installed (used by @fragments-sdk/extract\n * for LanguageService-based prop extraction).\n */\nexport class AutoExtractionAdapter implements DataAdapter {\n readonly name = 'auto-extract';\n\n discover(startDir: string): string[] {\n return discoverComponentFiles(startDir).map(f => f.filePath);\n }\n\n async load(projectRoot: string): Promise<DesignSystemData> {\n // Dynamic import — keeps startup fast when FragmentsJsonAdapter is used\n let extractMod: { createComponentExtractor: (tsconfigPath?: string) => {\n extract: (filePath: string, exportName?: string) => unknown | null;\n extractAll: (filePath: string) => unknown[];\n dispose: () => void;\n }};\n try {\n extractMod = await import('@fragments-sdk/extract');\n } catch (e) {\n throw new Error(\n 'Auto-extraction requires @fragments-sdk/extract and TypeScript.\\n\\n' +\n 'If you see this error, the MCP server may not be installed correctly.\\n' +\n 'Alternative: pre-build your design system with `npx fragments build`'\n );\n }\n\n // Find tsconfig.json\n const tsconfigPath = findTsConfig(projectRoot);\n\n // Create extractor\n const extractor = extractMod.createComponentExtractor(tsconfigPath ?? undefined);\n\n try {\n // Discover component files\n const discovered = discoverComponentFiles(projectRoot);\n\n if (discovered.length === 0) {\n throw new Error(\n `No component files found in ${projectRoot}.\\n` +\n 'Searched: src/components/, components/, lib/components/, src/ui/\\n\\n' +\n 'If your components are elsewhere, create a fragments.json with:\\n' +\n ' npx fragments build'\n );\n }\n\n const components: Record<string, CompiledFragment> = {};\n const packageMap = new Map<string, string>();\n const defaultPackageName = readPackageName(projectRoot);\n let extractedCount = 0;\n\n // Track which file each component came from (for compound component detection)\n const fileToComponents = new Map<string, string[]>();\n\n for (const { filePath, componentName } of discovered) {\n try {\n const metas = extractor.extractAll(filePath) as ExtractedMeta[];\n\n for (const meta of metas) {\n const fragment = mapToCompiledFragment(meta, filePath, projectRoot);\n components[meta.name] = fragment;\n if (defaultPackageName) {\n packageMap.set(meta.name, defaultPackageName);\n }\n extractedCount++;\n // Track file → components for relationship inference\n const relPath = relative(projectRoot, filePath);\n if (!fileToComponents.has(relPath)) fileToComponents.set(relPath, []);\n fileToComponents.get(relPath)!.push(meta.name);\n }\n\n // If extractAll returns nothing, try with the inferred name\n if (metas.length === 0) {\n const meta = extractor.extract(filePath, componentName) as ExtractedMeta | null;\n if (meta) {\n const fragment = mapToCompiledFragment(meta, filePath, projectRoot);\n components[meta.name] = fragment;\n if (defaultPackageName) {\n packageMap.set(meta.name, defaultPackageName);\n }\n extractedCount++;\n const relPath = relative(projectRoot, filePath);\n if (!fileToComponents.has(relPath)) fileToComponents.set(relPath, []);\n fileToComponents.get(relPath)!.push(meta.name);\n }\n }\n } catch {\n // Skip files that fail extraction — non-fatal\n continue;\n }\n }\n\n // Infer compound component relationships from co-located exports\n inferRelations(components, fileToComponents);\n\n // Log progress to stderr (stdout is reserved for MCP JSON-RPC)\n console.error(`[fragments-mcp] Extracted ${extractedCount} components from ${discovered.length} files.`);\n\n if (extractedCount === 0) {\n throw new Error(\n `Found ${discovered.length} component files but could not extract any props.\\n` +\n 'This usually means TypeScript cannot parse the files.\\n' +\n 'Check that your tsconfig.json includes the component directories.'\n );\n }\n\n // Scan for CSS design tokens\n const tokens = scanTokens(projectRoot);\n if (tokens) {\n console.error(`[fragments-mcp] Found ${tokens.total} design tokens across ${Object.keys(tokens.categories).length} categories.`);\n }\n\n const snapshotComponents = Object.fromEntries(\n Object.entries(components).map(([key, fragment]) => [\n key,\n componentFromCompiledFragment({\n id: key,\n fragment,\n sourceType: 'auto-extract',\n packageName: packageMap.get(fragment.meta.name) ?? defaultPackageName,\n importPath:\n packageMap.get(fragment.meta.name) ?? defaultPackageName,\n }),\n ]),\n );\n const snapshotTokens = tokens\n ? tokensFromCompiledTokenData(tokens)\n : undefined;\n const packageMapRecord = Object.fromEntries(packageMap.entries());\n const snapshot: McpSnapshot = validateSnapshot({\n schemaVersion: 1,\n sourceType: 'auto-extract',\n sourceLabel: 'Auto-extracted source files',\n capabilities: buildCapabilities({\n components: snapshotComponents,\n tokens: snapshotTokens,\n }),\n metadata: {\n packageName: defaultPackageName,\n importPath: defaultPackageName,\n },\n components: snapshotComponents,\n tokens: snapshotTokens,\n packageMap: packageMapRecord,\n defaultPackageName,\n });\n\n return {\n snapshot,\n components: snapshot.components,\n blocks: snapshot.blocks,\n tokens: snapshot.tokens,\n graph: undefined,\n performanceSummary: undefined,\n packageMap: snapshot.packageMap,\n defaultPackageName: snapshot.defaultPackageName,\n capabilities: new Set(snapshot.capabilities),\n };\n } finally {\n extractor.dispose();\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ninterface ExtractedPropMeta {\n name: string;\n type: string;\n typeKind: string;\n values?: string[];\n default?: string;\n description?: string;\n required: boolean;\n source: string;\n}\n\ninterface ExtractedMeta {\n name: string;\n filePath: string;\n description: string;\n props: Record<string, ExtractedPropMeta>;\n composition: { pattern: string } | null;\n exports: string[];\n dependencies: string[];\n}\n\n// Inherited props that AI agents commonly need, grouped by relevance.\n// Universal props apply to all components. Form props only apply to input-like components.\nconst UNIVERSAL_INHERITED = new Set(['children', 'className', 'id', 'disabled']);\nconst FORM_INPUT_INHERITED = new Set([\n 'placeholder', 'value', 'defaultValue', 'onChange', 'name', 'required',\n 'autoFocus', 'autoComplete', 'checked', 'defaultChecked', 'type',\n]);\nconst LABEL_INHERITED = new Set(['htmlFor']);\n\n// Component names that behave like form inputs\nconst INPUT_LIKE_NAMES = /input|select|textarea|checkbox|radio|switch|slider|combobox/i;\nconst LABEL_LIKE_NAMES = /label/i;\n\nfunction getRelevantInheritedProps(componentName: string): Set<string> {\n const allowed = new Set(UNIVERSAL_INHERITED);\n if (INPUT_LIKE_NAMES.test(componentName)) {\n for (const p of FORM_INPUT_INHERITED) allowed.add(p);\n }\n if (LABEL_LIKE_NAMES.test(componentName)) {\n for (const p of LABEL_INHERITED) allowed.add(p);\n }\n return allowed;\n}\n\nfunction mapToCompiledFragment(\n meta: ExtractedMeta,\n filePath: string,\n projectRoot: string,\n): CompiledFragment {\n // Map props: local props + context-appropriate inherited props\n const relevantInherited = getRelevantInheritedProps(meta.name);\n const props: Record<string, PropDefinition> = {};\n for (const [name, propMeta] of Object.entries(meta.props)) {\n if (propMeta.source === 'inherited' && !relevantInherited.has(name)) continue;\n props[name] = {\n type: propMeta.type,\n description: propMeta.description ?? '',\n required: propMeta.required,\n ...(propMeta.values && { values: propMeta.values }),\n ...(propMeta.default !== undefined && { default: propMeta.default }),\n };\n }\n\n const relativePath = relative(projectRoot, filePath);\n const category = inferCategory(relativePath);\n const importPath = buildImportPath(relativePath);\n const description = buildDescription(meta, props);\n const propsSummary = buildPropsSummary(props);\n const codeExample = buildCodeExample(meta.name, props);\n\n const fragmentMeta: FragmentMeta = {\n name: meta.name,\n description,\n category,\n };\n\n return {\n filePath: relativePath,\n meta: fragmentMeta,\n usage: {\n when: [`Use ${meta.name} when you need a ${category} ${meta.name.toLowerCase()} element.`],\n whenNot: [],\n guidelines: importPath ? [`import { ${meta.name} } from \"${importPath}\"`] : [],\n },\n props,\n propsSummary,\n variants: codeExample ? [{ name: 'Default', description: `Basic ${meta.name} usage`, code: codeExample }] : [],\n sourcePath: relativePath,\n exportName: meta.name,\n _generated: {\n source: 'extracted',\n verified: false,\n timestamp: new Date().toISOString(),\n },\n ...(meta.composition && {\n ai: {\n compositionPattern: meta.composition.pattern as 'compound' | 'simple' | 'controlled' | 'wrapper',\n },\n }),\n };\n}\n\n/**\n * Generate an import path from a relative file path.\n * Converts `src/components/ui/button.tsx` → `@/components/ui/button`\n */\nfunction buildImportPath(relativePath: string): string | null {\n // Strip extension\n const withoutExt = relativePath.replace(/\\.(tsx|jsx|ts|js)$/, '');\n // Common alias: src/ → @/\n if (withoutExt.startsWith(`src${sep}`)) {\n return '@/' + withoutExt.slice(4).split(sep).join('/');\n }\n // Relative path\n return './' + withoutExt.split(sep).join('/');\n}\n\n/**\n * Generate a useful description from extracted metadata.\n */\nfunction buildDescription(meta: ExtractedMeta, localProps: Record<string, PropDefinition>): string {\n // Use JSDoc description if the extractor found one\n if (meta.description && meta.description !== meta.name && !meta.description.endsWith(' component')) {\n return meta.description;\n }\n // Generate from props\n const propEntries = Object.entries(localProps);\n if (propEntries.length === 0) {\n return `${meta.name} component`;\n }\n const details: string[] = [];\n for (const [name, prop] of propEntries) {\n if (prop.values && prop.values.length > 0) {\n details.push(`${prop.values.length} ${name} options`);\n }\n }\n if (details.length > 0) {\n return `${meta.name} component with ${details.join(' and ')}.`;\n }\n return `${meta.name} component with ${propEntries.length} configurable prop${propEntries.length === 1 ? '' : 's'}.`;\n}\n\n/**\n * Generate human-readable prop summaries for AI agents.\n */\nfunction buildPropsSummary(props: Record<string, PropDefinition>): string[] {\n const summaries: string[] = [];\n for (const [name, prop] of Object.entries(props)) {\n let summary = `${name}`;\n if (prop.values && prop.values.length > 0) {\n summary += `: ${prop.values.map(v => `\"${v}\"`).join(' | ')}`;\n } else {\n summary += `: ${prop.type}`;\n }\n if (prop.default !== undefined) {\n summary += ` (default: ${JSON.stringify(prop.default)})`;\n }\n if (prop.required) {\n summary += ' (required)';\n }\n summaries.push(summary);\n }\n return summaries;\n}\n\n/**\n * Generate a basic JSX code example from props.\n */\nfunction buildCodeExample(name: string, props: Record<string, PropDefinition>): string | null {\n const propsStr: string[] = [];\n\n for (const [pName, prop] of Object.entries(props)) {\n if (pName === 'children' || pName === 'asChild' || pName === 'className') continue;\n if (pName === 'onChange' || pName === 'onSubmit' || pName === 'value' ||\n pName === 'defaultValue' || pName === 'checked' || pName === 'defaultChecked' ||\n pName === 'autoFocus' || pName === 'autoComplete' || pName === 'required' ||\n pName === 'disabled' || pName === 'name') continue; // skip state/handler props in examples\n\n if (prop.default !== undefined) {\n if (prop.values && prop.values.length > 1) {\n const nonDefault = prop.values.find(v => v !== String(prop.default));\n if (nonDefault) {\n propsStr.push(`${pName}=\"${nonDefault}\"`);\n continue;\n }\n }\n }\n // Show placeholder for Input-like components\n if (pName === 'placeholder' && INPUT_LIKE_NAMES.test(name)) {\n propsStr.push(`placeholder=\"Enter ${name.toLowerCase()}...\"`);\n continue;\n }\n // Show htmlFor for Label\n if (pName === 'htmlFor' && LABEL_LIKE_NAMES.test(name)) {\n propsStr.push(`htmlFor=\"field-id\"`);\n continue;\n }\n // Skip id/className/children in examples — they're boilerplate\n if (pName === 'id' || pName === 'className' || pName === 'children') continue;\n if (prop.required) {\n if (prop.values && prop.values.length > 0) {\n propsStr.push(`${pName}=\"${prop.values[0]}\"`);\n } else if (prop.type === 'string') {\n propsStr.push(`${pName}=\"...\"`);\n }\n }\n }\n\n const propsJsx = propsStr.length > 0 ? ' ' + propsStr.join(' ') : '';\n // Self-closing for input-like components\n const nameLower = name.toLowerCase();\n const selfClosing = nameLower.includes('input') || nameLower.includes('separator') ||\n nameLower.includes('slider') || nameLower.includes('switch');\n if (selfClosing) {\n return `<${name}${propsJsx} />`;\n }\n return `<${name}${propsJsx}>${name}</${name}>`;\n}\n\n/**\n * Generate a composition example showing how compound sub-components nest together.\n * Returns a JSX snippet like: <Card><CardHeader><CardTitle>Title</CardTitle></CardHeader>...</Card>\n */\nfunction buildCompositionExample(root: string, subs: string[]): string {\n // Group sub-components by likely nesting based on naming conventions\n const header = subs.filter(s => s.includes('Header'));\n const title = subs.filter(s => s.includes('Title'));\n const description = subs.filter(s => s.includes('Description'));\n const content = subs.filter(s => s.includes('Content') || s.includes('Body'));\n const footer = subs.filter(s => s.includes('Footer'));\n const action = subs.filter(s => s.includes('Action'));\n const other = subs.filter(s =>\n !header.includes(s) && !title.includes(s) && !description.includes(s) &&\n !content.includes(s) && !footer.includes(s) && !action.includes(s)\n );\n\n const lines: string[] = [`<${root}>`];\n\n // Header section (with title and description nested inside)\n if (header.length > 0) {\n lines.push(` <${header[0]}>`);\n for (const t of title) lines.push(` <${t}>Title</${t}>`);\n for (const d of description) lines.push(` <${d}>Description</${d}>`);\n lines.push(` </${header[0]}>`);\n } else {\n for (const t of title) lines.push(` <${t}>Title</${t}>`);\n for (const d of description) lines.push(` <${d}>Description</${d}>`);\n }\n\n // Content section\n for (const c of content) lines.push(` <${c}>Content</${c}>`);\n\n // Other sub-components\n for (const o of other) lines.push(` <${o}>...</${o}>`);\n\n // Footer section (with action inside)\n if (footer.length > 0) {\n lines.push(` <${footer[0]}>`);\n for (const a of action) lines.push(` <${a}>Action</${a}>`);\n lines.push(` </${footer[0]}>`);\n } else {\n for (const a of action) lines.push(` <${a}>Action</${a}>`);\n }\n\n lines.push(`</${root}>`);\n return lines.join('\\n');\n}\n\n/**\n * Infer compound component relationships from co-located exports.\n * If Card, CardHeader, CardContent all come from card.tsx, they're related.\n */\nfunction inferRelations(\n components: Record<string, CompiledFragment>,\n fileToComponents: Map<string, string[]>,\n): void {\n for (const [_file, names] of fileToComponents) {\n if (names.length <= 1) continue;\n\n // Find the \"root\" component (shortest name, or the one others are prefixed with)\n const sorted = [...names].sort((a, b) => a.length - b.length);\n const root = sorted[0];\n const subs = sorted.slice(1).filter(n => n.startsWith(root));\n\n if (subs.length === 0) continue;\n\n // Mark the root as a compound component\n const rootComp = components[root];\n if (rootComp) {\n rootComp.ai = {\n ...rootComp.ai,\n compositionPattern: 'compound',\n subComponents: subs,\n };\n // Add relations pointing subs → root\n rootComp.relations = subs.map(sub => ({\n component: sub,\n relationship: 'parent-of',\n note: `${sub} is a sub-component of ${root}`,\n }));\n // Add composition example as a variant\n const compositionCode = buildCompositionExample(root, subs);\n rootComp.variants = [\n ...(rootComp.variants ?? []),\n { name: 'Composition', description: `${root} with all sub-components`, code: compositionCode },\n ];\n }\n\n // Mark each sub-component with a relation back to root + consolidated import\n const rootImportPath = rootComp?.usage?.guidelines?.[0];\n for (const sub of subs) {\n const subComp = components[sub];\n if (subComp) {\n subComp.relations = [{\n component: root,\n relationship: 'child-of',\n note: `Use inside <${root}>`,\n }];\n // Override import to show consolidated multi-import from parent's file\n if (rootImportPath) {\n const allNames = [root, ...subs].join(', ');\n const fromPath = rootImportPath.match(/from\\s+\"([^\"]+)\"/)?.[1] ?? '';\n if (fromPath) {\n subComp.usage = {\n ...subComp.usage,\n guidelines: [`import { ${allNames} } from \"${fromPath}\"`],\n };\n }\n }\n }\n }\n\n // Also update root's import to show all sub-components\n if (rootComp && rootComp.usage?.guidelines?.[0]) {\n const fromPath = rootComp.usage.guidelines[0].match(/from\\s+\"([^\"]+)\"/)?.[1] ?? '';\n if (fromPath) {\n const allNames = [root, ...subs].join(', ');\n rootComp.usage.guidelines = [`import { ${allNames} } from \"${fromPath}\"`];\n }\n }\n }\n}\n\nfunction inferCategory(relativePath: string): string {\n const parts = relativePath.split(sep);\n const componentsIdx = parts.findIndex(p =>\n p === 'components' || p === 'ui'\n );\n if (componentsIdx >= 0 && componentsIdx + 1 < parts.length - 1) {\n const nextPart = parts[componentsIdx + 1];\n if (/^[A-Z]/.test(nextPart)) return parts[componentsIdx] || 'uncategorized';\n return nextPart;\n }\n return 'uncategorized';\n}\n\nfunction findTsConfig(projectRoot: string): string | null {\n const candidates = ['tsconfig.json', 'tsconfig.app.json'];\n for (const name of candidates) {\n const p = join(projectRoot, name);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction readPackageName(projectRoot: string): string | undefined {\n try {\n const pkgPath = join(projectRoot, 'package.json');\n if (!existsSync(pkgPath)) return undefined;\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string };\n return pkg.name;\n } catch {\n return undefined;\n }\n}\n","import { readdirSync, existsSync } from 'node:fs';\nimport { join, extname, basename } from 'node:path';\n\nexport interface DiscoveredComponentFile {\n /** Absolute file path */\n filePath: string;\n /** Inferred PascalCase component name */\n componentName: string;\n}\n\nconst EXCLUDED_DIRS = new Set([\n 'node_modules', 'dist', 'build', '.next', '.nuxt', 'coverage',\n '__tests__', '__mocks__', '.git', '.cache', '.turbo', 'out',\n]);\n\nconst EXCLUDED_PATTERNS = [\n /\\.test\\./,\n /\\.spec\\./,\n /\\.stories\\./,\n /\\.story\\./,\n /\\.fragment\\./,\n /\\.d\\.ts$/,\n /\\.config\\./,\n /\\.mock\\./,\n /\\.fixture\\./,\n];\n\n/**\n * Discover component files by walking common directories.\n * Returns all .tsx/.jsx files (excluding tests, stories, etc.).\n * The extractor determines which files actually export React components.\n */\nexport function discoverComponentFiles(projectRoot: string): DiscoveredComponentFile[] {\n const results: DiscoveredComponentFile[] = [];\n const seen = new Set<string>();\n\n // Common component locations to scan\n const scanDirs = [\n 'src/components', 'components', 'lib/components',\n 'src/ui', 'lib/ui', 'packages',\n ].map(d => join(projectRoot, d)).filter(d => existsSync(d));\n\n // If no conventional dirs exist, scan src/ itself\n if (scanDirs.length === 0) {\n const srcDir = join(projectRoot, 'src');\n if (existsSync(srcDir)) scanDirs.push(srcDir);\n }\n\n for (const dir of scanDirs) {\n walkDir(dir, results, seen);\n }\n\n return results;\n}\n\nfunction walkDir(\n dir: string,\n results: DiscoveredComponentFile[],\n seen: Set<string>,\n depth = 0,\n): void {\n if (depth > 6) return; // prevent deep recursion\n\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch { return; }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.')) continue;\n\n if (entry.isDirectory()) {\n if (EXCLUDED_DIRS.has(entry.name)) continue;\n walkDir(join(dir, entry.name), results, seen, depth + 1);\n continue;\n }\n\n if (!entry.isFile()) continue;\n const ext = extname(entry.name);\n if (ext !== '.tsx' && ext !== '.jsx') continue;\n if (EXCLUDED_PATTERNS.some(p => p.test(entry.name))) continue;\n\n const filePath = join(dir, entry.name);\n if (seen.has(filePath)) continue;\n seen.add(filePath);\n\n // Infer component name — accept all files, let extractor determine if it's a component\n const name = inferComponentName(entry.name, dir);\n if (name) {\n results.push({ filePath, componentName: name });\n }\n }\n}\n\nfunction inferComponentName(fileName: string, dirPath: string): string | null {\n const withoutExt = fileName.replace(/\\.(tsx|jsx)$/, '');\n if (withoutExt === 'index') {\n // Use parent directory name\n return basename(dirPath);\n }\n return withoutExt;\n}\n","import { readdirSync, readFileSync, existsSync } from 'node:fs';\nimport { join, extname } from 'node:path';\nimport type { CompiledTokenData } from '@fragments-sdk/context/types';\n\ninterface TokenEntry {\n name: string;\n value?: string;\n description?: string;\n}\n\n/**\n * Scan a project for CSS custom property declarations and return them\n * as CompiledTokenData. Lightweight alternative to the full compiler\n * token pipeline — handles CSS custom properties in :root blocks.\n */\nexport function scanTokens(projectRoot: string): CompiledTokenData | undefined {\n // Find CSS files in common locations\n const cssFiles = discoverCssFiles(projectRoot);\n if (cssFiles.length === 0) return undefined;\n\n const allTokens: TokenEntry[] = [];\n let prefix = '';\n\n for (const filePath of cssFiles) {\n try {\n const content = readFileSync(filePath, 'utf-8');\n const tokens = extractCustomProperties(content);\n allTokens.push(...tokens);\n } catch {\n continue;\n }\n }\n\n if (allTokens.length === 0) return undefined;\n\n // Detect common prefix\n prefix = detectPrefix(allTokens.map(t => t.name));\n\n // Group by category (inferred from token name)\n const categories: Record<string, TokenEntry[]> = {};\n for (const token of allTokens) {\n const category = inferTokenCategory(token.name);\n if (!categories[category]) categories[category] = [];\n // Deduplicate by name (keep first occurrence — light mode)\n if (!categories[category].some(t => t.name === token.name)) {\n categories[category].push(token);\n }\n }\n\n return {\n prefix,\n total: Object.values(categories).reduce((sum, arr) => sum + arr.length, 0),\n categories,\n };\n}\n\n/**\n * Find CSS files in common project locations.\n */\nfunction discoverCssFiles(projectRoot: string): string[] {\n const files: string[] = [];\n const searchDirs = [\n 'src', 'styles', 'css', 'app',\n ].map(d => join(projectRoot, d)).filter(d => existsSync(d));\n\n // Also check root for standalone CSS files\n searchDirs.push(projectRoot);\n\n for (const dir of searchDirs) {\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isFile()) continue;\n const ext = extname(entry.name);\n if (ext === '.css' || ext === '.scss') {\n files.push(join(dir, entry.name));\n }\n }\n } catch {\n continue;\n }\n }\n\n // Also check one level deep in src/\n const srcDir = join(projectRoot, 'src');\n if (existsSync(srcDir)) {\n try {\n for (const subEntry of readdirSync(srcDir, { withFileTypes: true })) {\n if (subEntry.isDirectory() && ['styles', 'css', 'theme', 'tokens'].includes(subEntry.name)) {\n const subDir = join(srcDir, subEntry.name);\n for (const file of readdirSync(subDir, { withFileTypes: true })) {\n if (file.isFile() && (file.name.endsWith('.css') || file.name.endsWith('.scss'))) {\n files.push(join(subDir, file.name));\n }\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n return [...new Set(files)]; // deduplicate\n}\n\n/**\n * Extract CSS custom property declarations from file content.\n * Handles :root { ... } blocks and extracts --name: value; pairs.\n * Only extracts from :root and top-level selectors (not nested component styles).\n */\nfunction extractCustomProperties(content: string): TokenEntry[] {\n const tokens: TokenEntry[] = [];\n // Only extract from :root, .dark, [data-theme], @theme blocks\n // Track if we're inside a relevant block\n let inRelevantBlock = false;\n let braceDepth = 0;\n const relevantSelectors = [':root', '.dark', '[data-theme', '@theme'];\n\n const lines = content.split('\\n');\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Check if entering a relevant block\n if (!inRelevantBlock && braceDepth === 0) {\n if (relevantSelectors.some(sel => trimmed.startsWith(sel) || trimmed.includes(sel))) {\n if (trimmed.includes('{')) {\n inRelevantBlock = true;\n braceDepth = 1;\n }\n }\n }\n\n // Track brace depth\n if (inRelevantBlock) {\n for (const ch of trimmed) {\n if (ch === '{') braceDepth++;\n else if (ch === '}') {\n braceDepth--;\n if (braceDepth <= 0) {\n inRelevantBlock = false;\n braceDepth = 0;\n }\n }\n }\n }\n\n // Only extract tokens from relevant blocks, or at top level in @theme\n if (!inRelevantBlock && braceDepth === 0) continue;\n\n const match = trimmed.match(/^(--[\\w-]+)\\s*:\\s*(.+?)\\s*;/);\n if (match) {\n const [, name, value] = match;\n // Extract inline comment as description\n const commentMatch = value.match(/\\/\\*\\s*(.+?)\\s*\\*\\//);\n const cleanValue = value.replace(/\\/\\*.*?\\*\\//, '').trim();\n tokens.push({\n name,\n value: cleanValue,\n description: commentMatch?.[1],\n });\n }\n }\n\n return tokens;\n}\n\n/**\n * Detect common prefix from token names.\n * e.g., [\"--fui-color-accent\", \"--fui-space-2\"] → \"--fui-\"\n * e.g., [\"--background\", \"--foreground\"] → \"--\"\n */\nfunction detectPrefix(names: string[]): string {\n if (names.length === 0) return '--';\n // Remove the leading -- for comparison\n const stripped = names.map(n => n.slice(2));\n // Find common prefix among stripped names\n let prefix = '';\n const first = stripped[0];\n for (let i = 0; i < first.length; i++) {\n const ch = first[i];\n if (stripped.every(n => n[i] === ch)) {\n prefix += ch;\n } else {\n break;\n }\n }\n // Only use prefix if it ends at a word boundary (-)\n const lastDash = prefix.lastIndexOf('-');\n if (lastDash > 0) {\n return '--' + prefix.slice(0, lastDash + 1);\n }\n return '--';\n}\n\n/**\n * Infer token category from its name using naming conventions.\n */\nfunction inferTokenCategory(name: string): string {\n const n = name.toLowerCase();\n if (n.includes('color') || n.includes('background') || n.includes('foreground') ||\n n.includes('primary') || n.includes('secondary') || n.includes('accent') ||\n n.includes('muted') || n.includes('destructive') || n.includes('popover') ||\n n.includes('card') && !n.includes('card-') || n.includes('chart')) {\n return 'colors';\n }\n if (n.includes('font') || n.includes('text') || n.includes('letter') || n.includes('line-height')) {\n return 'typography';\n }\n if (n.includes('space') || n.includes('gap') || n.includes('padding') || n.includes('margin')) {\n return 'spacing';\n }\n if (n.includes('radius')) {\n return 'radius';\n }\n if (n.includes('shadow')) {\n return 'shadows';\n }\n if (n.includes('border')) {\n return 'borders';\n }\n if (n.includes('ring')) {\n return 'focus';\n }\n if (n.includes('sidebar')) {\n return 'sidebar';\n }\n if (n.includes('input')) {\n return 'forms';\n }\n return 'other';\n}\n","import type {\n McpComponent,\n McpSnapshot,\n McpToken,\n McpTokenData,\n} from '@fragments-sdk/core';\nimport type { DesignSystemData } from '../types.js';\nimport type { DataAdapter } from './types.js';\nimport { buildCapabilities, validateSnapshot } from './snapshot-converters.js';\n\nconst DEFAULT_CLOUD_URL = 'https://app.usefragments.com/api/catalog';\n\ninterface CloudCatalogResponse {\n version: 1;\n org: {\n id: string;\n name: string;\n slug: string;\n };\n designSystem?: {\n name?: string;\n packageName?: string | null;\n importPath?: string | null;\n };\n sourceBinding?: {\n repoFullName?: string;\n };\n revision?: string;\n updatedAt?: number;\n components?: Array<{\n componentKey: string;\n publicRef?: string;\n publicSlug?: string | null;\n name: string;\n category?: string;\n status?: string;\n tier?: string;\n description?: string;\n usageGuidance?: string;\n dos?: string[];\n donts?: string[];\n props?: Record<\n string,\n {\n type?: string;\n values?: string[];\n required?: boolean;\n default?: unknown;\n description?: string;\n }\n >;\n relations?: Array<{\n component?: string;\n componentKey?: string;\n relationship?: string;\n type?: string;\n note?: string;\n description?: string;\n }>;\n compoundChildren?: Array<{\n name: string;\n componentKey?: string;\n description?: string;\n required?: boolean;\n accepts?: string[];\n subcomponentVisibility?: 'public' | 'internal';\n }>;\n examples?: Array<{\n title?: string;\n kind?: string;\n code?: string;\n }>;\n sourcePath?: string;\n sourceRepoFullName?: string;\n parentComponentName?: string;\n parentComponentKey?: string;\n }>;\n tokens?: {\n flat?: Array<{\n name: string;\n value?: string;\n category?: string;\n path?: string[];\n type?: string;\n description?: string;\n }>;\n };\n}\n\nfunction normalizeCatalogUrl(url?: string): string {\n if (!url) return DEFAULT_CLOUD_URL;\n if (url.endsWith('/api/catalog')) return url;\n return `${url.replace(/\\/+$/, '')}/api/catalog`;\n}\n\nfunction groupTokens(flat: NonNullable<CloudCatalogResponse['tokens']>['flat']): McpTokenData {\n const categories: Record<string, McpToken[]> = {};\n const normalizedFlat = (flat ?? []).map((token) => {\n const category = token.category?.trim() || 'other';\n const normalized: McpToken = {\n name: token.name,\n category,\n value: token.value,\n description: token.description,\n path: token.path,\n type: token.type,\n };\n if (!categories[category]) {\n categories[category] = [];\n }\n categories[category].push(normalized);\n return normalized;\n });\n\n return {\n prefix: '',\n total: normalizedFlat.length,\n categories,\n flat: normalizedFlat,\n };\n}\n\nfunction mapComponent(\n component: NonNullable<CloudCatalogResponse['components']>[number],\n designSystem: CloudCatalogResponse['designSystem'],\n): McpComponent {\n return {\n id: component.componentKey,\n name: component.name,\n description: component.description ?? '',\n category: component.category ?? 'uncategorized',\n status: component.status ?? 'stable',\n tags: [],\n props: Object.fromEntries(\n Object.entries(component.props ?? {}).map(([propName, prop]) => [\n propName,\n {\n type: prop.type ?? 'unknown',\n description: prop.description ?? '',\n required: prop.required ?? false,\n default: prop.default,\n values: prop.values,\n },\n ]),\n ),\n propsSummary: Object.entries(component.props ?? {}).map(\n ([propName, prop]) =>\n `${propName}${prop.required ? ' (required)' : ''}: ${prop.type ?? 'unknown'}`,\n ),\n examples: (component.examples ?? []).map((example) => ({\n name: example.title ?? 'Example',\n description: example.kind,\n code: example.code,\n kind: example.kind,\n })),\n relations: (component.relations ?? []).map((relation) => ({\n componentName: relation.component ?? relation.componentKey ?? 'Unknown',\n componentId: relation.componentKey,\n relationship: relation.relationship ?? relation.type ?? 'related',\n note: relation.note,\n description: relation.description,\n })),\n compoundChildren: (component.compoundChildren ?? [])\n .filter((child) => child.subcomponentVisibility !== 'internal')\n .map((child) => ({\n name: child.name,\n componentId: child.componentKey,\n description: child.description,\n required: child.required,\n accepts: child.accepts,\n visibility:\n child.subcomponentVisibility === 'internal'\n ? 'internal'\n : 'public',\n })),\n guidance: {\n when: component.usageGuidance ? [component.usageGuidance] : [],\n whenNot: component.donts ?? [],\n guidelines: component.usageGuidance ? [component.usageGuidance] : [],\n accessibility: [],\n usageGuidance: component.usageGuidance,\n dos: component.dos ?? [],\n donts: component.donts ?? [],\n patterns: [],\n },\n sourceType: 'cloud',\n sourcePath: component.sourcePath,\n sourceRepoFullName:\n component.sourceRepoFullName ?? undefined,\n packageName: designSystem?.packageName ?? undefined,\n importPath:\n designSystem?.importPath ??\n designSystem?.packageName ??\n undefined,\n publicRef: component.publicRef,\n publicSlug: component.publicSlug ?? null,\n tier: component.tier,\n parentComponentId: component.parentComponentKey,\n parentComponentName: component.parentComponentName,\n metadata: {\n a11yRules: [],\n scenarioTags: [],\n },\n };\n}\n\nexport class CloudCatalogAdapter implements DataAdapter {\n readonly name = 'cloud';\n\n constructor(\n private readonly options: {\n apiKey: string;\n url?: string;\n },\n ) {}\n\n async load(_projectRoot: string): Promise<DesignSystemData> {\n const response = await fetch(normalizeCatalogUrl(this.options.url), {\n headers: {\n Authorization: `Bearer ${this.options.apiKey}`,\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to load Cloud catalog (${response.status} ${response.statusText}).`,\n );\n }\n\n const raw = (await response.json()) as CloudCatalogResponse;\n const components = Object.fromEntries(\n (raw.components ?? []).map((component) => [\n component.componentKey,\n mapComponent(component, raw.designSystem),\n ]),\n );\n const tokens = raw.tokens?.flat ? groupTokens(raw.tokens.flat) : undefined;\n const packageName = raw.designSystem?.packageName ?? undefined;\n const importPath =\n raw.designSystem?.importPath ?? raw.designSystem?.packageName ?? undefined;\n const packageMap = packageName\n ? Object.fromEntries(\n Object.values(components).map((component) => [\n component.name,\n packageName,\n ]),\n )\n : {};\n\n const snapshot: McpSnapshot = validateSnapshot({\n schemaVersion: 1,\n sourceType: 'cloud',\n sourceLabel: 'Fragments Cloud catalog',\n capabilities: buildCapabilities({\n components,\n tokens,\n }),\n metadata: {\n designSystemName: raw.designSystem?.name ?? raw.org.name,\n packageName,\n importPath,\n revision: raw.revision,\n updatedAt:\n typeof raw.updatedAt === 'number'\n ? new Date(raw.updatedAt).toISOString()\n : undefined,\n },\n components,\n tokens,\n packageMap,\n defaultPackageName: packageName,\n });\n\n return {\n snapshot,\n components: snapshot.components,\n blocks: snapshot.blocks,\n tokens: snapshot.tokens,\n graph: undefined,\n performanceSummary: undefined,\n packageMap: snapshot.packageMap,\n defaultPackageName: snapshot.defaultPackageName,\n capabilities: new Set(snapshot.capabilities),\n };\n }\n}\n","import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { dirname, resolve } from 'node:path';\nimport type {\n BundleComponentShard,\n BundleManifest,\n BundleTokenFile,\n McpComponent,\n McpSnapshot,\n} from '@fragments-sdk/core';\nimport {\n bundleComponentShardSchema,\n bundleManifestSchema,\n bundleTokenFileSchema,\n} from '@fragments-sdk/core';\nimport { BRAND } from '../constants.js';\nimport { findBundleManifest } from '../discovery.js';\nimport type { DesignSystemData } from '../types.js';\nimport type { DataAdapter } from './types.js';\nimport { buildCapabilities, validateSnapshot } from './snapshot-converters.js';\n\nasync function readJsonFile<T>(\n path: string,\n parser: { parse(value: unknown): T },\n label: string,\n): Promise<T> {\n const content = await readFile(path, 'utf-8');\n try {\n return parser.parse(JSON.parse(content));\n } catch (error) {\n throw new Error(\n `Invalid ${label} at ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n}\n\nfunction normalizeProps(\n props: BundleComponentShard['component']['props'],\n): McpComponent['props'] {\n return Object.fromEntries(\n Object.entries(props ?? {}).map(([propName, value]) => {\n const prop =\n value && typeof value === 'object' ? (value as Record<string, unknown>) : {};\n return [\n propName,\n {\n type:\n typeof prop.type === 'string' && prop.type.length > 0\n ? prop.type\n : 'unknown',\n description:\n typeof prop.description === 'string' ? prop.description : '',\n required: Boolean(prop.required),\n default: prop.default,\n values: Array.isArray(prop.values)\n ? prop.values.filter((entry): entry is string => typeof entry === 'string')\n : undefined,\n constraints: Array.isArray(prop.constraints)\n ? prop.constraints.filter(\n (entry): entry is string => typeof entry === 'string',\n )\n : undefined,\n },\n ];\n }),\n );\n}\n\nfunction normalizeExamples(\n examples: BundleComponentShard['component']['examples'],\n): McpComponent['examples'] {\n return examples.map((example) => {\n const record =\n example && typeof example === 'object'\n ? (example as Record<string, unknown>)\n : {};\n return {\n name:\n (typeof record.title === 'string' && record.title) ||\n (typeof record.name === 'string' && record.name) ||\n 'Example',\n description:\n typeof record.description === 'string'\n ? record.description\n : undefined,\n code: typeof record.code === 'string' ? record.code : undefined,\n kind: typeof record.kind === 'string' ? record.kind : undefined,\n };\n });\n}\n\nfunction normalizeRelations(\n relations: BundleComponentShard['component']['relations'],\n fallback: BundleManifest['components'][string]['relations'],\n): McpComponent['relations'] {\n if (relations.length > 0) {\n return relations.map((relation) => {\n const record =\n relation && typeof relation === 'object'\n ? (relation as Record<string, unknown>)\n : {};\n return {\n componentName:\n (typeof record.component === 'string' && record.component) ||\n (typeof record.name === 'string' && record.name) ||\n (typeof record.componentName === 'string' && record.componentName) ||\n (typeof record.componentId === 'string' && record.componentId) ||\n 'Unknown',\n componentId:\n typeof record.componentId === 'string'\n ? record.componentId\n : undefined,\n relationship:\n (typeof record.relationship === 'string' && record.relationship) ||\n (typeof record.type === 'string' && record.type) ||\n 'related',\n note: typeof record.note === 'string' ? record.note : undefined,\n description:\n typeof record.description === 'string'\n ? record.description\n : undefined,\n };\n });\n }\n\n return fallback.map((relation) => ({\n componentName: relation.name,\n componentId: relation.componentId,\n relationship: relation.type,\n }));\n}\n\nfunction buildComponent(\n manifest: BundleManifest,\n entry: BundleManifest['components'][string],\n shard: BundleComponentShard,\n): McpComponent {\n const sourcePackage =\n manifest.designSystem.importPath ?? manifest.designSystem.packageName ?? undefined;\n const component = shard.component;\n const props = normalizeProps(component.props);\n\n return {\n id: shard.componentId,\n name: component.name,\n description: component.description,\n category: component.category,\n status: component.status,\n tags: [],\n props,\n propsSummary: Object.entries(props).map(([propName, prop]) =>\n `${propName}${prop.required ? ' (required)' : ''}: ${prop.type}`,\n ),\n examples: normalizeExamples(component.examples),\n relations: normalizeRelations(component.relations, entry.relations),\n compoundChildren: entry.compoundChildren.map((child) => ({\n name: child.name,\n componentId: child.componentId,\n visibility: 'public',\n })),\n guidance: {\n when: component.usageGuidance ? [component.usageGuidance] : [],\n whenNot: component.donts,\n guidelines: component.usageGuidance ? [component.usageGuidance] : [],\n accessibility: [],\n usageGuidance: component.usageGuidance || undefined,\n dos: component.dos,\n donts: component.donts,\n patterns: [],\n },\n sourceType: 'bundle',\n sourcePath: component.sourcePath,\n sourceRepoFullName: component.sourceRepoFullName,\n packageName: manifest.designSystem.packageName ?? undefined,\n importPath: sourcePackage,\n publicRef: component.publicRef,\n publicSlug: component.publicSlug,\n tier: component.tier,\n parentComponentName: component.parentComponentName,\n metadata: {\n a11yRules: [],\n scenarioTags: [],\n },\n };\n}\n\nexport class BundleAdapter implements DataAdapter {\n readonly name = 'bundle';\n\n discover(startDir: string): string[] {\n return findBundleManifest(startDir);\n }\n\n async load(projectRoot: string): Promise<DesignSystemData> {\n const manifests = this.discover(projectRoot);\n\n if (manifests.length === 0) {\n throw new Error(\n `No ${BRAND.dataDir}/${BRAND.manifestFile} found. Run \\`${BRAND.cliCommand} context install --cloud\\` or commit a Fragments bundle into your workspace.`,\n );\n }\n\n const manifestPath = manifests[0];\n const manifest = await readJsonFile(\n manifestPath,\n bundleManifestSchema,\n 'bundle manifest',\n );\n const bundleDir = dirname(manifestPath);\n const repoRoot = dirname(bundleDir);\n\n const tokensPath = resolve(bundleDir, 'tokens.json');\n const tokensFile = existsSync(tokensPath)\n ? await readJsonFile(tokensPath, bundleTokenFileSchema, 'bundle tokens')\n : undefined;\n\n const components = Object.fromEntries(\n await Promise.all(\n Object.values(manifest.components).map(async (entry) => {\n const shardPath = resolve(repoRoot, entry.file);\n const shard = await readJsonFile(\n shardPath,\n bundleComponentShardSchema,\n `bundle component shard (${entry.name})`,\n );\n return [entry.componentId, buildComponent(manifest, entry, shard)] as const;\n }),\n ),\n );\n\n const packageName =\n manifest.designSystem.importPath ?? manifest.designSystem.packageName ?? undefined;\n const packageMap = packageName\n ? Object.fromEntries(\n Object.values(components).map((component) => [component.name, packageName]),\n )\n : {};\n\n const tokens = tokensFile\n ? {\n prefix: '',\n total: tokensFile.flat.length,\n categories: Object.fromEntries(\n Object.entries(tokensFile.categories).map(([category, value]) => [\n category,\n value.tokens.map((token) => ({\n name: token.name,\n category: token.category,\n value: token.value,\n description: token.description,\n path: token.path,\n type: token.type,\n })),\n ]),\n ),\n flat: tokensFile.flat.map((token) => ({\n name: token.name,\n category: token.category,\n value: token.value,\n description: token.description,\n path: token.path,\n type: token.type,\n })),\n }\n : undefined;\n\n const snapshot: McpSnapshot = validateSnapshot({\n schemaVersion: 1,\n sourceType: 'bundle',\n sourceLabel: `${BRAND.dataDir}/${BRAND.manifestFile}`,\n capabilities: buildCapabilities({\n components,\n tokens,\n }),\n metadata: {\n designSystemName: manifest.designSystem.name,\n packageName: manifest.designSystem.packageName ?? undefined,\n importPath: manifest.designSystem.importPath ?? undefined,\n revision: manifest.catalogRevision,\n updatedAt: manifest.catalogUpdatedAt,\n },\n components,\n tokens,\n packageMap,\n defaultPackageName: packageName,\n });\n\n return {\n snapshot,\n components: snapshot.components,\n blocks: snapshot.blocks,\n tokens: snapshot.tokens,\n graph: snapshot.graph,\n performanceSummary: snapshot.performanceSummary,\n packageMap: snapshot.packageMap,\n defaultPackageName: snapshot.defaultPackageName,\n capabilities: new Set(snapshot.capabilities),\n };\n }\n}\n"],"mappings":"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","names":["existsSync","readFileSync","join","readFileSync","ComponentGraphEngine","deserializeGraph","componentNames","search","components","readFileSync","existsSync","join","join","existsSync","readFileSync","search","search","NO_VIEWER_MSG","NO_VIEWER_MSG","componentNames","existsSync","join","existsSync","readFileSync","join","join","existsSync","readFileSync","existsSync","readFileSync","join","readdirSync","existsSync","join","readdirSync","readFileSync","existsSync","join","extname","join","existsSync","readFileSync","existsSync","readFile","dirname","resolve","readFile","dirname","resolve","existsSync","existsSync","join","name","join","existsSync","readFileSync"]}