@fragments-sdk/mcp 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -13
- package/dist/bin.js +9 -4
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-QAXQVJOS.js → chunk-LASUFXDO.js} +13 -7
- package/dist/chunk-LASUFXDO.js.map +1 -0
- package/dist/server.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-QAXQVJOS.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @fragments-sdk/mcp
|
|
2
2
|
|
|
3
|
-
Standalone MCP server for the Fragments design system. Gives AI coding assistants (Claude Code, Cursor, etc.)
|
|
3
|
+
Standalone MCP server for the Fragments design system. Gives AI coding assistants (Claude Code, Cursor, etc.) intelligent component discovery over components, blocks, and tokens — no Playwright or build tools required.
|
|
4
4
|
|
|
5
5
|
## Setup
|
|
6
6
|
|
|
@@ -78,24 +78,19 @@ Once the project root is known, the server walks up from it, scans `package.json
|
|
|
78
78
|
| `fragments_implement` | One-shot: components + blocks + tokens for a use case |
|
|
79
79
|
| `fragments_render` | Render a component screenshot (requires dev server) |
|
|
80
80
|
| `fragments_fix` | Generate token-compliance patches (requires dev server) |
|
|
81
|
+
| `fragments_graph` | Query the component relationship graph (dependencies, impact, composition, health) |
|
|
82
|
+
| `fragments_a11y` | Run an accessibility audit on a component (requires dev server) |
|
|
81
83
|
|
|
82
84
|
## How search works
|
|
83
85
|
|
|
84
|
-
Queries
|
|
86
|
+
Queries use **keyword search** with synonym expansion, weighted multi-field scoring (name, description, tags, usage, category, variants), and category-aware ranking — all running locally against your `fragments.json`. No external API calls are made.
|
|
87
|
+
|
|
88
|
+
**Premium:** Pass `--api-key` to enable semantic vector search (Voyage-Code-3 embeddings) fused with keyword results via Reciprocal Rank Fusion for deeper, meaning-based discovery.
|
|
85
89
|
|
|
86
90
|
## Options
|
|
87
91
|
|
|
88
92
|
```
|
|
89
93
|
-p, --project-root <path> Project root (default: cwd)
|
|
90
|
-
-u, --viewer-url <url> Dev server URL for render/fix tools
|
|
94
|
+
-u, --viewer-url <url> Dev server URL for render/fix/a11y tools
|
|
95
|
+
-k, --api-key <key> Premium API key for semantic vector search
|
|
91
96
|
```
|
|
92
|
-
|
|
93
|
-
## Convex backend
|
|
94
|
-
|
|
95
|
-
The `convex/` directory contains the hosted search backend:
|
|
96
|
-
|
|
97
|
-
- **schema.ts** — `entries` table with vector index (components, blocks, tokens)
|
|
98
|
-
- **search.ts** — HTTP action that embeds queries with Voyage-Code-3 and runs vector search
|
|
99
|
-
- **ingest.ts** — Mutation to upsert entries at publish time
|
|
100
|
-
|
|
101
|
-
Index entries: `pnpm --filter @fragments-sdk/mcp index` (requires `VOYAGE_API_KEY` and `CONVEX_URL`).
|
package/dist/bin.js
CHANGED
|
@@ -1,29 +1,33 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
startMcpServer
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-LASUFXDO.js";
|
|
5
5
|
import "./chunk-WXUZ55XQ.js";
|
|
6
6
|
|
|
7
7
|
// src/bin.ts
|
|
8
8
|
var args = process.argv.slice(2);
|
|
9
9
|
var projectRoot = process.cwd();
|
|
10
10
|
var viewerUrl;
|
|
11
|
+
var apiKey;
|
|
11
12
|
for (let i = 0; i < args.length; i++) {
|
|
12
13
|
const arg = args[i];
|
|
13
14
|
if (arg === "--project-root" || arg === "-p") {
|
|
14
15
|
projectRoot = args[++i] ?? projectRoot;
|
|
15
16
|
} else if (arg === "--viewer-url" || arg === "-u") {
|
|
16
17
|
viewerUrl = args[++i];
|
|
18
|
+
} else if (arg === "--api-key" || arg === "-k") {
|
|
19
|
+
apiKey = args[++i];
|
|
17
20
|
} else if (arg === "--help" || arg === "-h") {
|
|
18
21
|
console.log(`
|
|
19
22
|
Usage: fragments-mcp [options]
|
|
20
23
|
|
|
21
24
|
Standalone MCP server for Fragments design system.
|
|
22
|
-
Provides component discovery with
|
|
25
|
+
Provides component discovery with keyword search, no CLI/Playwright needed.
|
|
23
26
|
|
|
24
27
|
Options:
|
|
25
28
|
-p, --project-root <path> Project root directory (default: cwd)
|
|
26
|
-
-u, --viewer-url <url> Viewer URL for render/fix tools (optional)
|
|
29
|
+
-u, --viewer-url <url> Viewer URL for render/fix/a11y tools (optional)
|
|
30
|
+
-k, --api-key <key> Premium API key for semantic vector search (optional)
|
|
27
31
|
-h, --help Show this help message
|
|
28
32
|
|
|
29
33
|
Setup (Claude Code / Cursor):
|
|
@@ -41,7 +45,8 @@ Setup (Claude Code / Cursor):
|
|
|
41
45
|
}
|
|
42
46
|
startMcpServer({
|
|
43
47
|
projectRoot,
|
|
44
|
-
viewerUrl
|
|
48
|
+
viewerUrl,
|
|
49
|
+
apiKey
|
|
45
50
|
}).catch((error) => {
|
|
46
51
|
console.error("Failed to start MCP server:", error);
|
|
47
52
|
process.exit(1);
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { startMcpServer } from './server.js';\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\nlet projectRoot = process.cwd();\nlet viewerUrl: string | undefined;\n\nfor (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--project-root' || arg === '-p') {\n projectRoot = args[++i] ?? projectRoot;\n } else if (arg === '--viewer-url' || arg === '-u') {\n viewerUrl = args[++i];\n } else if (arg === '--help' || arg === '-h') {\n console.log(`\nUsage: fragments-mcp [options]\n\nStandalone MCP server for Fragments design system.\nProvides component discovery with
|
|
1
|
+
{"version":3,"sources":["../src/bin.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { startMcpServer } from './server.js';\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\nlet projectRoot = process.cwd();\nlet viewerUrl: string | undefined;\nlet apiKey: string | undefined;\n\nfor (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '--project-root' || arg === '-p') {\n projectRoot = args[++i] ?? projectRoot;\n } else if (arg === '--viewer-url' || arg === '-u') {\n viewerUrl = args[++i];\n } else if (arg === '--api-key' || arg === '-k') {\n apiKey = args[++i];\n } else if (arg === '--help' || arg === '-h') {\n console.log(`\nUsage: fragments-mcp [options]\n\nStandalone MCP server for Fragments design system.\nProvides component discovery with keyword search, no CLI/Playwright needed.\n\nOptions:\n -p, --project-root <path> Project root directory (default: cwd)\n -u, --viewer-url <url> Viewer URL for render/fix/a11y tools (optional)\n -k, --api-key <key> Premium API key for semantic vector search (optional)\n -h, --help Show this help message\n\nSetup (Claude Code / Cursor):\n {\n \"mcpServers\": {\n \"fragments\": {\n \"command\": \"npx\",\n \"args\": [\"@fragments-sdk/mcp\"]\n }\n }\n }\n`);\n process.exit(0);\n }\n}\n\n// Start server\nstartMcpServer({\n projectRoot,\n viewerUrl,\n apiKey,\n}).catch((error) => {\n console.error('Failed to start MCP server:', error);\n process.exit(1);\n});\n"],"mappings":";;;;;;;AAIA,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAI,cAAc,QAAQ,IAAI;AAC9B,IAAI;AACJ,IAAI;AAEJ,SAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAM,MAAM,KAAK,CAAC;AAElB,MAAI,QAAQ,oBAAoB,QAAQ,MAAM;AAC5C,kBAAc,KAAK,EAAE,CAAC,KAAK;AAAA,EAC7B,WAAW,QAAQ,kBAAkB,QAAQ,MAAM;AACjD,gBAAY,KAAK,EAAE,CAAC;AAAA,EACtB,WAAW,QAAQ,eAAe,QAAQ,MAAM;AAC9C,aAAS,KAAK,EAAE,CAAC;AAAA,EACnB,WAAW,QAAQ,YAAY,QAAQ,MAAM;AAC3C,YAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAqBf;AACG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAGA,eAAe;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACF,CAAC,EAAE,MAAM,CAAC,UAAU;AAClB,UAAQ,MAAM,+BAA+B,KAAK;AAClD,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
|
|
@@ -757,13 +757,16 @@ var SYNONYM_MAP = {
|
|
|
757
757
|
"chat": ["message", "conversation", "ai"],
|
|
758
758
|
"table": ["data", "grid", "list", "rows"]
|
|
759
759
|
};
|
|
760
|
-
async function searchConvex(query, limit = 10, kind) {
|
|
760
|
+
async function searchConvex(query, apiKey, limit = 10, kind) {
|
|
761
761
|
try {
|
|
762
762
|
const controller = new AbortController();
|
|
763
763
|
const timeout = setTimeout(() => controller.abort(), CONVEX_TIMEOUT_MS);
|
|
764
764
|
const response = await fetch(CONVEX_SEARCH_URL, {
|
|
765
765
|
method: "POST",
|
|
766
|
-
headers: {
|
|
766
|
+
headers: {
|
|
767
|
+
"Content-Type": "application/json",
|
|
768
|
+
"Authorization": `Bearer ${apiKey}`
|
|
769
|
+
},
|
|
767
770
|
body: JSON.stringify({ query, limit, ...kind && { kind } }),
|
|
768
771
|
signal: controller.signal
|
|
769
772
|
});
|
|
@@ -896,7 +899,7 @@ function reciprocalRankFusion(resultSets, k = 60) {
|
|
|
896
899
|
});
|
|
897
900
|
return fused;
|
|
898
901
|
}
|
|
899
|
-
async function hybridSearch(query, data, limit = 10, kind) {
|
|
902
|
+
async function hybridSearch(query, data, limit = 10, kind, apiKey) {
|
|
900
903
|
const keywordResults = [];
|
|
901
904
|
if (!kind || kind === "component") {
|
|
902
905
|
keywordResults.push(...keywordScoreComponents(query, data.fragments));
|
|
@@ -911,7 +914,10 @@ async function hybridSearch(query, data, limit = 10, kind) {
|
|
|
911
914
|
keywordResults.forEach((r, i) => {
|
|
912
915
|
r.rank = i;
|
|
913
916
|
});
|
|
914
|
-
|
|
917
|
+
if (!apiKey) {
|
|
918
|
+
return keywordResults.slice(0, limit);
|
|
919
|
+
}
|
|
920
|
+
const vectorResults = await searchConvex(query, apiKey, limit, kind);
|
|
915
921
|
if (vectorResults.length === 0) {
|
|
916
922
|
return keywordResults.slice(0, limit);
|
|
917
923
|
}
|
|
@@ -1387,7 +1393,7 @@ If you're a library author, run \`${BRAND.cliCommand} build\` first.`
|
|
|
1387
1393
|
blocks: allBlocks,
|
|
1388
1394
|
tokenData: data.tokens
|
|
1389
1395
|
};
|
|
1390
|
-
const searchResults = await hybridSearch(fullQuery, localData, 10, "component");
|
|
1396
|
+
const searchResults = await hybridSearch(fullQuery, localData, 10, "component", config.apiKey);
|
|
1391
1397
|
const scored = searchResults.map((result) => {
|
|
1392
1398
|
const fragment = allFragments.find(
|
|
1393
1399
|
(s) => s.meta.name.toLowerCase() === result.name.toLowerCase()
|
|
@@ -1764,7 +1770,7 @@ If you're a library author, run \`${BRAND.cliCommand} build\` first.`
|
|
|
1764
1770
|
blocks: allBlocks,
|
|
1765
1771
|
tokenData
|
|
1766
1772
|
};
|
|
1767
|
-
const searchResults = await hybridSearch(useCase, localData, 15);
|
|
1773
|
+
const searchResults = await hybridSearch(useCase, localData, 15, void 0, config.apiKey);
|
|
1768
1774
|
const componentResults = searchResults.filter((r) => r.kind === "component").slice(0, 3);
|
|
1769
1775
|
const blockResults = searchResults.filter((r) => r.kind === "block").slice(0, 2);
|
|
1770
1776
|
const tokenResults = searchResults.filter((r) => r.kind === "token").slice(0, 5);
|
|
@@ -2129,4 +2135,4 @@ export {
|
|
|
2129
2135
|
createMcpServer,
|
|
2130
2136
|
startMcpServer
|
|
2131
2137
|
};
|
|
2132
|
-
//# sourceMappingURL=chunk-
|
|
2138
|
+
//# sourceMappingURL=chunk-LASUFXDO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/constants.ts","../../context/dist/chunk-2UQY4VNM.js","../../context/dist/chunk-HAJWPNLU.js","../src/discovery.ts","../src/search.ts","../src/service.ts","../src/utils.ts","../src/graph-handler.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 * - 8 tools: discover, inspect, blocks, tokens, implement, render, fix, a11y\n * - Hybrid search: Convex-backed vector search + local keyword scoring + RRF\n * - HTTP-only render/fix (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 { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { BRAND, DEFAULTS } from './constants.js';\nimport { generateContext, filterPlaceholders } from '@fragments-sdk/context/generate';\nimport type { CompiledFragmentsFile, CompiledFragment, Theme } from '@fragments-sdk/context/types';\nimport { buildMcpTools, buildToolNames } from '@fragments-sdk/context/mcp-tools';\nimport { findFragmentsJson } from './discovery.js';\nimport { hybridSearch, keywordScoreComponents } from './search.js';\nimport type { LocalSearchData } from './search.js';\nimport { renderComponent, compareComponent, fixComponent, auditComponent } from './service.js';\nimport { projectFields } from './utils.js';\nimport { handleGraphTool } from './graph-handler.js';\nimport type { GraphToolArgs } from './graph-handler.js';\n\n// ---------------------------------------------------------------------------\n// Tool names & definitions (from shared source of truth)\n// ---------------------------------------------------------------------------\n\nconst TOOL_NAMES = buildToolNames(BRAND.nameLower) as Record<string, string> & {\n discover: string;\n inspect: string;\n blocks: string;\n tokens: string;\n implement: string;\n render: string;\n fix: string;\n graph: string;\n a11y: string;\n};\n\n// ---------------------------------------------------------------------------\n// Server configuration\n// ---------------------------------------------------------------------------\n\nexport interface McpServerConfig {\n /** Project root directory */\n projectRoot: string;\n /** Viewer base URL (for render/fix tools) */\n viewerUrl?: string;\n /** Default theme for verification */\n theme?: Theme;\n /** Diff threshold percentage */\n threshold?: number;\n /** Premium API key — enables semantic vector search when provided */\n apiKey?: string;\n}\n\nconst TOOLS = buildMcpTools(BRAND.nameLower) 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: '0.3.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Lazy-loaded resources\n let fragmentsData: CompiledFragmentsFile | null = null;\n const fragmentPackageMap = new Map<string, string>();\n let defaultPackageName: string | null = null;\n let resolvedRoot: string | 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 loadFragments(): Promise<CompiledFragmentsFile> {\n if (fragmentsData) return fragmentsData;\n\n const projectRoot = await resolveProjectRoot();\n const paths = findFragmentsJson(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 const content = await readFile(paths[0], 'utf-8');\n fragmentsData = JSON.parse(content) as CompiledFragmentsFile;\n\n // Normalize legacy \"recipes\" key to \"blocks\"\n if (!fragmentsData.blocks && fragmentsData.recipes) {\n fragmentsData.blocks = fragmentsData.recipes;\n }\n\n if (fragmentsData.packageName) {\n for (const name of Object.keys(fragmentsData.fragments)) {\n fragmentPackageMap.set(name, fragmentsData.packageName);\n }\n }\n\n for (let i = 1; i < paths.length; i++) {\n const extra = JSON.parse(await readFile(paths[i], 'utf-8')) as CompiledFragmentsFile;\n if (extra.packageName) {\n for (const name of Object.keys(extra.fragments)) {\n fragmentPackageMap.set(name, extra.packageName);\n }\n }\n Object.assign(fragmentsData.fragments, extra.fragments);\n const extraBlocks = extra.blocks ?? extra.recipes;\n if (extraBlocks) {\n fragmentsData.blocks = { ...fragmentsData.blocks, ...extraBlocks };\n }\n }\n\n return fragmentsData;\n }\n\n async function getPackageName(fragmentName?: string): Promise<string> {\n await loadFragments();\n\n if (fragmentName) {\n const segPkg = fragmentPackageMap.get(fragmentName);\n if (segPkg) return segPkg;\n }\n\n if (defaultPackageName) return defaultPackageName;\n\n if (fragmentsData?.packageName) {\n defaultPackageName = fragmentsData.packageName;\n return defaultPackageName;\n }\n\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 defaultPackageName = pkg.name;\n return defaultPackageName;\n }\n } catch {\n // Fall through\n }\n }\n\n defaultPackageName = 'your-component-library';\n return defaultPackageName;\n }\n\n // Register tool listing\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return { tools: TOOLS };\n });\n\n // Register tool execution\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n // ================================================================\n // DISCOVER — list, suggest, context, alternatives\n // ================================================================\n case TOOL_NAMES.discover: {\n const data = await loadFragments();\n const useCase = (args?.useCase as string) ?? undefined;\n const componentForAlts = (args?.component as string) ?? undefined;\n const category = (args?.category as string) ?? undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n const status = (args?.status as string) ?? undefined;\n const format = (args?.format as 'markdown' | 'json') ?? 'markdown';\n const compact = (args?.compact as boolean) ?? false;\n const includeCode = (args?.includeCode as boolean) ?? false;\n const includeRelations = (args?.includeRelations as boolean) ?? false;\n\n // --- Context mode ---\n if (compact || (args?.format && !useCase && !componentForAlts && !category && !search && !status)) {\n const fragments = Object.values(data.fragments);\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n\n const { content: ctxContent, tokenEstimate } = generateContext(fragments, {\n format,\n compact,\n include: {\n code: includeCode,\n relations: includeRelations,\n },\n }, allBlocks);\n\n return {\n content: [{ type: 'text' as const, text: ctxContent }],\n _meta: { tokenEstimate },\n };\n }\n\n // --- Suggest mode: useCase provided (uses hybrid search) ---\n if (useCase) {\n const allFragments = Object.values(data.fragments);\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n const context = ((args as Record<string, unknown>)?.context as string)?.toLowerCase() ?? '';\n const fullQuery = context ? `${useCase} ${context}` : useCase;\n\n // Use hybrid search — filter to components only for discover suggest\n const localData: LocalSearchData = {\n fragments: allFragments,\n blocks: allBlocks,\n tokenData: data.tokens,\n };\n const searchResults = await hybridSearch(fullQuery, localData, 10, 'component', config.apiKey);\n\n // Build detailed suggestions from search results\n const scored = searchResults.map((result) => {\n const fragment = allFragments.find(\n (s) => s.meta.name.toLowerCase() === result.name.toLowerCase()\n );\n if (!fragment) return null;\n\n const filteredWhen = filterPlaceholders(fragment.usage?.when).slice(0, 3);\n const filteredWhenNot = filterPlaceholders(fragment.usage?.whenNot).slice(0, 2);\n\n let confidence: 'high' | 'medium' | 'low';\n if (result.score >= 0.025) confidence = 'high';\n else if (result.score >= 0.015) confidence = 'medium';\n else confidence = 'low';\n\n return {\n component: fragment.meta.name,\n category: fragment.meta.category,\n description: fragment.meta.description,\n confidence,\n reasons: [`Matched via hybrid search (score: ${result.score.toFixed(4)})`],\n usage: { when: filteredWhen, whenNot: filteredWhenNot },\n variantCount: fragment.variants.length,\n status: fragment.meta.status,\n };\n }).filter(Boolean);\n\n // Diversify by category (max 2 per category, max 5 total)\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 >= 5) break;\n }\n }\n\n const compositionHint = suggestions.length >= 2\n ? `These components work well together. For example, ${suggestions[0]!.component} can be combined with ${suggestions.slice(1, 3).map(s => s!.component).join(' and ')}.`\n : undefined;\n\n const useCaseLower = useCase.toLowerCase();\n const STYLE_KEYWORDS = ['color', 'spacing', 'padding', 'margin', 'font', 'border', 'radius', 'shadow', 'variable', 'token', 'css', 'theme', 'dark mode', 'background', 'hover'];\n const isStyleQuery = STYLE_KEYWORDS.some((kw) => useCaseLower.includes(kw));\n\n const noMatch = suggestions.length === 0;\n const weakMatch = !noMatch && suggestions.every((s) => s!.confidence === 'low');\n\n let recommendation: string;\n let nextStep: string | undefined;\n if (noMatch) {\n recommendation = isStyleQuery\n ? `No matching components found. Your query seems styling-related — try ${TOOL_NAMES.tokens} to find CSS custom properties.`\n : 'No matching components found. Try different keywords or browse all components with fragments_discover.';\n nextStep = isStyleQuery\n ? `Use ${TOOL_NAMES.tokens}(search: \"${useCaseLower.split(/\\s+/)[0]}\") to find design tokens.`\n : undefined;\n } else if (weakMatch) {\n recommendation = `Weak matches only — ${suggestions[0]!.component} might work but confidence is low.${isStyleQuery ? ` If you need a CSS variable, try ${TOOL_NAMES.tokens}.` : ''}`;\n nextStep = `Use ${TOOL_NAMES.inspect}(\"${suggestions[0]!.component}\") to check if it fits, or try broader search terms.`;\n } else {\n recommendation = `Best match: ${suggestions[0]!.component} (${suggestions[0]!.confidence} confidence) - ${suggestions[0]!.description}`;\n nextStep = `Use ${TOOL_NAMES.inspect}(\"${suggestions[0]!.component}\") for full details.`;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n context: context || undefined,\n suggestions,\n noMatch,\n weakMatch,\n recommendation,\n compositionHint,\n nextStep,\n }, null, 2),\n }],\n };\n }\n\n // --- Alternatives mode ---\n if (componentForAlts) {\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentForAlts.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentForAlts}\" not found. Use fragments_discover to see available components.`);\n }\n\n const relations = fragment.relations ?? [];\n\n const referencedBy = Object.values(data.fragments)\n .filter((s) =>\n s.relations?.some((r) => r.component.toLowerCase() === componentForAlts.toLowerCase())\n )\n .map((s) => ({\n component: s.meta.name,\n relationship: s.relations?.find(\n (r) => r.component.toLowerCase() === componentForAlts.toLowerCase()\n )?.relationship,\n note: s.relations?.find(\n (r) => r.component.toLowerCase() === componentForAlts.toLowerCase()\n )?.note,\n }));\n\n const sameCategory = Object.values(data.fragments)\n .filter(\n (s) =>\n s.meta.category === fragment.meta.category &&\n s.meta.name.toLowerCase() !== componentForAlts.toLowerCase()\n )\n .map((s) => ({\n component: s.meta.name,\n description: s.meta.description,\n }));\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: fragment.meta.name,\n category: fragment.meta.category,\n directRelations: relations,\n referencedBy,\n sameCategory,\n suggestion: relations.find((r) => r.relationship === 'alternative')\n ? `Consider ${relations.find((r) => r.relationship === 'alternative')?.component}: ${relations.find((r) => r.relationship === 'alternative')?.note}`\n : undefined,\n }, null, 2),\n }],\n };\n }\n\n // --- Default: list mode ---\n const fragments = Object.values(data.fragments)\n .filter((s) => {\n if (category && s.meta.category !== category) return false;\n if (status && (s.meta.status ?? 'stable') !== status) return false;\n if (search) {\n const nameMatch = s.meta.name.toLowerCase().includes(search);\n const descMatch = s.meta.description?.toLowerCase().includes(search);\n const tagMatch = s.meta.tags?.some((t) => t.toLowerCase().includes(search));\n if (!nameMatch && !descMatch && !tagMatch) return false;\n }\n return true;\n })\n .map((s) => ({\n name: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n status: s.meta.status ?? 'stable',\n variantCount: s.variants.length,\n tags: s.meta.tags ?? [],\n }));\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: fragments.length,\n fragments,\n categories: [...new Set(fragments.map((s) => s.category))],\n hint: fragments.length === 0\n ? 'No components found. Try broader search terms or check available categories.'\n : fragments.length > 5\n ? 'Use fragments_discover with useCase for recommendations, or fragments_inspect for details on a specific component.'\n : undefined,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // INSPECT\n // ================================================================\n case TOOL_NAMES.inspect: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const fields = args?.fields as string[] | undefined;\n const variantName = (args?.variant as string) ?? undefined;\n const maxExamples = args?.maxExamples as number | undefined;\n const maxLines = args?.maxLines as number | undefined;\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use fragments_discover to see available components.`);\n }\n\n const pkgName = await getPackageName(fragment.meta.name);\n\n let variants = fragment.variants;\n if (variantName) {\n const query = variantName.toLowerCase();\n let filtered = variants.filter((v) => v.name.toLowerCase() === query);\n if (filtered.length === 0) {\n filtered = variants.filter((v) => v.name.toLowerCase().startsWith(query));\n }\n if (filtered.length === 0) {\n filtered = variants.filter((v) => v.name.toLowerCase().includes(query));\n }\n if (filtered.length > 0) {\n variants = filtered;\n } else {\n throw new Error(\n `Variant \"${variantName}\" not found for ${componentName}. ` +\n `Available: ${fragment.variants.map((v) => v.name).join(', ')}`\n );\n }\n }\n if (maxExamples && maxExamples > 0) {\n variants = variants.slice(0, maxExamples);\n }\n\n const truncateCode = (code: string): string => {\n if (!maxLines || maxLines <= 0) return code;\n const lines = code.split('\\n');\n if (lines.length <= maxLines) return code;\n return lines.slice(0, maxLines).join('\\n') + '\\n// ... truncated';\n };\n\n const examples = variants.map((variant) => {\n if (variant.code) {\n return {\n variant: variant.name,\n description: variant.description,\n code: truncateCode(variant.code),\n };\n }\n return {\n variant: variant.name,\n description: variant.description,\n code: `<${fragment.meta.name} />`,\n note: 'No code example provided in fragment. Refer to props for customization.',\n };\n });\n\n const propsReference = Object.entries(fragment.props ?? {}).map(([propName, prop]) => ({\n name: propName,\n type: prop.type,\n required: prop.required,\n default: prop.default,\n description: prop.description,\n }));\n\n const propConstraints = Object.entries(fragment.props ?? {})\n .filter(([, prop]) => prop.constraints && prop.constraints.length > 0)\n .map(([pName, prop]) => ({\n prop: pName,\n constraints: prop.constraints,\n }));\n\n const fullResult = {\n meta: fragment.meta,\n props: fragment.props,\n variants: fragment.variants,\n relations: fragment.relations,\n contract: fragment.contract,\n generated: fragment._generated,\n guidelines: {\n when: filterPlaceholders(fragment.usage?.when),\n whenNot: filterPlaceholders(fragment.usage?.whenNot),\n guidelines: fragment.usage?.guidelines ?? [],\n accessibility: fragment.usage?.accessibility ?? [],\n propConstraints,\n alternatives: fragment.relations\n ?.filter((r) => r.relationship === 'alternative')\n .map((r) => ({\n component: r.component,\n note: r.note,\n })) ?? [],\n },\n examples: {\n import: `import { ${fragment.meta.name} } from '${pkgName}';`,\n code: examples,\n propsReference,\n },\n };\n\n const result = fields && fields.length > 0\n ? projectFields(fullResult as unknown as Record<string, unknown>, fields)\n : fullResult;\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n }\n\n // ================================================================\n // BLOCKS\n // ================================================================\n case TOOL_NAMES.blocks: {\n const data = await loadFragments();\n const blockName = args?.name as string | undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n const component = (args?.component as string)?.toLowerCase() ?? undefined;\n const category = (args?.category as string)?.toLowerCase() ?? undefined;\n\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n\n if (allBlocks.length === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n blocks: [],\n hint: `No blocks found. Run \\`${BRAND.cliCommand} build\\` after adding .block.ts files.`,\n }, null, 2),\n }],\n };\n }\n\n let filtered = allBlocks;\n\n if (blockName) {\n filtered = filtered.filter(\n b => b.name.toLowerCase() === blockName.toLowerCase()\n );\n }\n\n if (search) {\n filtered = filtered.filter(b => {\n const haystack = [\n b.name,\n b.description,\n ...(b.tags ?? []),\n ...b.components,\n b.category,\n ].join(' ').toLowerCase();\n return haystack.includes(search);\n });\n }\n\n if (component) {\n filtered = filtered.filter(b =>\n b.components.some(c => c.toLowerCase() === component)\n );\n }\n\n if (category) {\n filtered = filtered.filter(b =>\n b.category.toLowerCase() === category\n );\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: filtered.length,\n blocks: filtered,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // TOKENS\n // ================================================================\n case TOOL_NAMES.tokens: {\n const data = await loadFragments();\n const category = (args?.category as string)?.toLowerCase() ?? undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n\n const tokenData = data.tokens;\n\n if (!tokenData || tokenData.total === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n categories: {},\n hint: `No design tokens found. Add a tokens.include pattern to your ${BRAND.configFile} and run \\`${BRAND.cliCommand} build\\`.`,\n }, null, 2),\n }],\n };\n }\n\n let filteredCategories: Record<string, Array<{ name: string; description?: string }>> = {};\n let filteredTotal = 0;\n\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n if (category && cat !== category) continue;\n\n let filtered = tokens;\n if (search) {\n filtered = tokens.filter(\n (t) => t.name.toLowerCase().includes(search) ||\n (t.description && t.description.toLowerCase().includes(search))\n );\n }\n\n if (filtered.length > 0) {\n filteredCategories[cat] = filtered;\n filteredTotal += filtered.length;\n }\n }\n\n let hint: string | undefined;\n if (filteredTotal === 0) {\n const availableCategories = Object.keys(tokenData.categories);\n hint = search\n ? `No tokens matching \"${search}\". Try: ${availableCategories.join(', ')}`\n : category\n ? `Category \"${category}\" not found. Available: ${availableCategories.join(', ')}`\n : undefined;\n } else if (!category && !search) {\n hint = `Use var(--token-name) in your CSS/styles. Filter by category or search to narrow results.`;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n prefix: tokenData.prefix,\n total: filteredTotal,\n totalAvailable: tokenData.total,\n categories: filteredCategories,\n ...(hint && { hint }),\n ...((!category && !search) && {\n availableCategories: Object.entries(tokenData.categories).map(\n ([cat, tokens]) => ({ category: cat, count: tokens.length })\n ),\n }),\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // IMPLEMENT — one-shot discover + inspect + blocks + tokens\n // ================================================================\n case TOOL_NAMES.implement: {\n const data = await loadFragments();\n const useCase = args?.useCase as string;\n if (!useCase) {\n throw new Error('useCase is required');\n }\n\n const allFragments = Object.values(data.fragments);\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n const tokenData = data.tokens;\n\n // Use hybrid search across ALL kinds — implement is a one-shot helper\n const localData: LocalSearchData = {\n fragments: allFragments,\n blocks: allBlocks,\n tokenData,\n };\n const searchResults = await hybridSearch(useCase, localData, 15, undefined, config.apiKey);\n\n // Separate results by kind\n const componentResults = searchResults.filter((r) => r.kind === 'component').slice(0, 3);\n const blockResults = searchResults.filter((r) => r.kind === 'block').slice(0, 2);\n const tokenResults = searchResults.filter((r) => r.kind === 'token').slice(0, 5);\n\n // Map component results back to fragments\n const topMatches = componentResults.map((result) => {\n const fragment = allFragments.find(\n (s) => s.meta.name.toLowerCase() === result.name.toLowerCase()\n );\n return fragment ? { fragment, score: result.score } : null;\n }).filter(Boolean) as Array<{ fragment: CompiledFragment; score: number }>;\n\n // Build component details for top matches\n const components = await Promise.all(\n topMatches.map(async ({ fragment: s, score }) => {\n const pkgName = await getPackageName(s.meta.name);\n const examples = s.variants.slice(0, 2).map((v) => ({\n variant: v.name,\n code: v.code ?? `<${s.meta.name} />`,\n }));\n const propsSummary = Object.entries(s.props ?? {}).slice(0, 10).map(\n ([pName, p]) => `${pName}${p.required ? ' (required)' : ''}: ${p.type}${p.values ? ` = ${p.values.join('|')}` : ''}`\n );\n return {\n name: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n confidence: score >= 0.025 ? 'high' : score >= 0.015 ? 'medium' : 'low',\n import: `import { ${s.meta.name} } from '${pkgName}';`,\n props: propsSummary,\n examples,\n guidelines: filterPlaceholders(s.usage?.when).slice(0, 3),\n accessibility: s.usage?.accessibility?.slice(0, 2) ?? [],\n };\n })\n );\n\n // Map block results back to full block data\n const matchingBlocks = blockResults.map((result) => {\n const block = allBlocks.find(\n (b) => b.name.toLowerCase() === result.name.toLowerCase()\n );\n return block\n ? { name: block.name, description: block.description, components: block.components, code: block.code }\n : null;\n }).filter(Boolean) as Array<{ name: string; description: string; components: string[]; code: string }>;\n\n // Map token results to grouped format\n let relevantTokens: Record<string, string[]> | undefined;\n if (tokenResults.length > 0 && tokenData) {\n relevantTokens = {};\n for (const result of tokenResults) {\n // Find which category this token belongs to\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n if (tokens.some((t) => t.name === result.name)) {\n if (!relevantTokens[cat]) relevantTokens[cat] = [];\n relevantTokens[cat].push(result.name);\n break;\n }\n }\n }\n if (Object.keys(relevantTokens).length === 0) relevantTokens = undefined;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n components,\n blocks: matchingBlocks.length > 0 ? matchingBlocks : undefined,\n tokens: relevantTokens,\n noMatch: components.length === 0,\n summary: components.length > 0\n ? `Found ${components.length} component(s) for \"${useCase}\". ${matchingBlocks.length > 0 ? `Plus ${matchingBlocks.length} ready-to-use block(s).` : ''}`\n : `No components match \"${useCase}\". Try ${TOOL_NAMES.discover} with different terms${tokenData ? ` or ${TOOL_NAMES.tokens} for CSS variables` : ''}.`,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // RENDER — HTTP-only (no Playwright)\n // ================================================================\n case TOOL_NAMES.render: {\n const componentName = args?.component as string;\n const variantName = args?.variant as string | undefined;\n const props = (args?.props as Record<string, unknown>) ?? {};\n const viewport = args?.viewport as { width?: number; height?: number } | undefined;\n const figmaUrl = args?.figmaUrl as string | undefined;\n const threshold = (args?.threshold as number) ?? (figmaUrl ? 1.0 : 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 const viewerUrl = config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: 'Render requires a running Fragments dev server. Start it with `fragments dev` and pass --viewer-url, or use the CLI MCP server which includes Playwright.',\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 });\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 }, null, 2),\n });\n\n return { content };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to compare component: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running and FIGMA_ACCESS_TOKEN is set.`,\n }],\n isError: true,\n };\n }\n }\n\n // --- Default: pure render mode ---\n try {\n const result = await renderComponent(viewerUrl, {\n component: componentName,\n props,\n viewport: viewport ?? { width: 800, height: 600 },\n });\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} with props: ${JSON.stringify(props)}`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to render component: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // FIX — HTTP-only (no Playwright)\n // ================================================================\n case TOOL_NAMES.fix: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const variantName = (args?.variant as string) ?? undefined;\n const fixType = (args?.fixType as 'token' | 'all') ?? 'all';\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use fragments_discover to see available components.`);\n }\n\n const viewerUrl = config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: 'Fix requires a running Fragments dev server. Start it with `fragments dev` and pass --viewer-url.',\n }],\n isError: true,\n };\n }\n\n try {\n const result = await fixComponent(viewerUrl, {\n component: componentName,\n variant: variantName,\n fixType,\n });\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 fragments_render to confirm fixes.'\n : undefined,\n }, null, 2),\n }],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to generate fixes: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // A11Y — accessibility audit\n // ================================================================\n case TOOL_NAMES.a11y: {\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 const viewerUrl = config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: 'A11y audit requires a running Fragments dev server. Start it with `fragments dev` and pass --viewer-url.',\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 });\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 return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: componentName,\n variant: variantName ?? 'all',\n standard,\n score: result.score,\n aaCompliance: `${result.aaPercent}%`,\n aaaCompliance: `${result.aaaPercent}%`,\n passed: result.passed,\n results: result.results,\n nextStep: result.passed\n ? 'All accessibility checks passed. Consider running with standard: \"AAA\" for enhanced compliance.'\n : `Fix the violations above, then re-run ${TOOL_NAMES.a11y} to verify. Use ${TOOL_NAMES.fix} for automated fixes.`,\n }, null, 2),\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 // ================================================================\n // GRAPH — component relationship queries\n // ================================================================\n case TOOL_NAMES.graph: {\n const data = await loadFragments();\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 result = handleGraphTool(\n graphArgs,\n data.graph,\n data.blocks ?? data.recipes,\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\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n }],\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 * Brand constants for easy rebranding if domain availability requires it.\n * All naming throughout the codebase should reference these constants.\n *\n * Inlined from @fragments-sdk/cli to avoid pulling in the full CLI dependency.\n */\nexport const BRAND = {\n /** Display name (e.g., \"Fragments\") */\n name: \"Fragments\",\n\n /** Lowercase name for file paths and CLI (e.g., \"fragments\") */\n nameLower: \"fragments\",\n\n /** File extension for fragment definition files (e.g., \".fragment.tsx\") */\n fileExtension: \".fragment.tsx\",\n\n /** Legacy file extension for segments (still supported for migration) */\n legacyFileExtension: \".segment.tsx\",\n\n /** JSON file extension for compiled output */\n jsonExtension: \".fragment.json\",\n\n /** Default output file name (e.g., \"fragments.json\") */\n outFile: \"fragments.json\",\n\n /** Config file name (e.g., \"fragments.config.ts\") */\n configFile: \"fragments.config.ts\",\n\n /** Legacy config file name (still supported for migration) */\n legacyConfigFile: \"segments.config.ts\",\n\n /** CLI command name (e.g., \"fragments\") */\n cliCommand: \"fragments\",\n\n /** Package scope (e.g., \"@fragments\") */\n packageScope: \"@fragments\",\n\n /** Directory for storing fragments, registry, and cache */\n dataDir: \".fragments\",\n\n /** Components subdirectory within .fragments/ */\n componentsDir: \"components\",\n\n /** Registry file name */\n registryFile: \"registry.json\",\n\n /** Context file name (AI-ready markdown) */\n contextFile: \"context.md\",\n\n /** Screenshots subdirectory */\n screenshotsDir: \"screenshots\",\n\n /** Cache subdirectory (gitignored) */\n cacheDir: \"cache\",\n\n /** Diff output subdirectory (gitignored) */\n diffDir: \"diff\",\n\n /** Manifest filename */\n manifestFile: \"manifest.json\",\n\n /** Prefix for localStorage keys (e.g., \"fragments-\") */\n storagePrefix: \"fragments-\",\n\n /** Static viewer HTML file name */\n viewerHtmlFile: \"fragments-viewer.html\",\n\n /** MCP tool name prefix (e.g., \"fragments_\") */\n mcpToolPrefix: \"fragments_\",\n\n /** File extension for block definition files */\n blockFileExtension: \".block.ts\",\n\n /** @deprecated Use blockFileExtension instead */\n recipeFileExtension: \".recipe.ts\",\n\n /** Vite plugin namespace */\n vitePluginNamespace: \"fragments-core-shim\",\n} as const;\n\nexport type Brand = typeof BRAND;\n\n/**\n * Default configuration values for the service.\n *\n * Inlined from @fragments-sdk/cli to avoid pulling in the full CLI dependency.\n */\nexport const DEFAULTS = {\n /** Default viewport dimensions */\n viewport: {\n width: 1280,\n height: 800,\n },\n\n /** Default diff threshold (percentage) */\n diffThreshold: 5,\n\n /** Browser pool size */\n poolSize: 3,\n\n /** Idle timeout before browser shutdown (ms) - 5 minutes */\n idleTimeoutMs: 5 * 60 * 1000,\n\n /** Delay after render before capture (ms) */\n captureDelayMs: 100,\n\n /** Font loading timeout (ms) */\n fontTimeoutMs: 3000,\n\n /** Default theme */\n theme: \"light\" as const,\n\n /** Dev server port */\n port: 6006,\n} as const;\n\nexport type Defaults = typeof DEFAULTS;\n","// src/generate/index.ts\nvar PLACEHOLDER_PATTERNS = [\n /^\\w+ component is needed$/i,\n /^Alternative component is more appropriate$/i,\n /^Use \\w+ when you need/i\n];\nfunction filterPlaceholders(items) {\n if (!items) return [];\n return items.filter(\n (item) => !PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(item.trim()))\n );\n}\nfunction generateContext(fragments, options = {}, blocks) {\n const format = options.format ?? \"markdown\";\n const compact = options.compact ?? false;\n const include = {\n props: options.include?.props ?? true,\n variants: options.include?.variants ?? true,\n usage: options.include?.usage ?? true,\n relations: options.include?.relations ?? false,\n code: options.include?.code ?? false\n };\n const sorted = [...fragments].sort((a, b) => {\n const catCompare = a.meta.category.localeCompare(b.meta.category);\n if (catCompare !== 0) return catCompare;\n return a.meta.name.localeCompare(b.meta.name);\n });\n if (format === \"json\") {\n return generateJsonContext(sorted, include, compact, blocks);\n }\n return generateMarkdownContext(sorted, include, compact, blocks);\n}\nfunction generateMarkdownContext(fragments, include, compact, blocks) {\n const lines = [];\n lines.push(\"# Design System Reference\");\n lines.push(\"\");\n lines.push(\"## Quick Reference\");\n lines.push(\"\");\n lines.push(\"| Component | Category | Use For |\");\n lines.push(\"|-----------|----------|---------|\");\n for (const fragment of fragments) {\n const filteredWhen = filterPlaceholders(fragment.usage.when);\n const useFor = filteredWhen.slice(0, 2).join(\", \") || fragment.meta.description;\n lines.push(`| ${fragment.meta.name} | ${fragment.meta.category} | ${truncate(useFor, 50)} |`);\n }\n lines.push(\"\");\n if (compact) {\n const content2 = lines.join(\"\\n\");\n return { content: content2, tokenEstimate: estimateTokens(content2) };\n }\n lines.push(\"## Components\");\n lines.push(\"\");\n for (const fragment of fragments) {\n lines.push(`### ${fragment.meta.name}`);\n lines.push(\"\");\n const statusParts = [`**Category:** ${fragment.meta.category}`];\n if (fragment.meta.status) {\n statusParts.push(`**Status:** ${fragment.meta.status}`);\n }\n lines.push(statusParts.join(\" | \"));\n lines.push(\"\");\n if (fragment.meta.description) {\n lines.push(fragment.meta.description);\n lines.push(\"\");\n }\n const whenFiltered = filterPlaceholders(fragment.usage.when);\n const whenNotFiltered = filterPlaceholders(fragment.usage.whenNot);\n if (include.usage && (whenFiltered.length > 0 || whenNotFiltered.length > 0)) {\n if (whenFiltered.length > 0) {\n lines.push(\"**When to use:**\");\n for (const when of whenFiltered) {\n lines.push(`- ${when}`);\n }\n lines.push(\"\");\n }\n if (whenNotFiltered.length > 0) {\n lines.push(\"**When NOT to use:**\");\n for (const whenNot of whenNotFiltered) {\n lines.push(`- ${whenNot}`);\n }\n lines.push(\"\");\n }\n }\n if (include.props && Object.keys(fragment.props).length > 0) {\n lines.push(\"**Props:**\");\n for (const [name, prop] of Object.entries(fragment.props)) {\n lines.push(`- \\`${name}\\`: ${formatPropType(prop)}${prop.required ? \" (required)\" : \"\"}`);\n }\n lines.push(\"\");\n }\n if (include.variants && fragment.variants.length > 0) {\n const variantNames = fragment.variants.map((v) => v.name).join(\", \");\n lines.push(`**Variants:** ${variantNames}`);\n lines.push(\"\");\n if (include.code) {\n for (const variant of fragment.variants) {\n if (variant.code) {\n lines.push(`*${variant.name}:*`);\n lines.push(\"```tsx\");\n lines.push(variant.code);\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n }\n }\n if (include.relations && fragment.relations && fragment.relations.length > 0) {\n lines.push(\"**Related:**\");\n for (const relation of fragment.relations) {\n lines.push(`- ${relation.component} (${relation.relationship}): ${relation.note}`);\n }\n lines.push(\"\");\n }\n lines.push(\"---\");\n lines.push(\"\");\n }\n if (blocks && blocks.length > 0) {\n lines.push(\"## Blocks\");\n lines.push(\"\");\n lines.push(\"Composition patterns showing how components wire together.\");\n lines.push(\"\");\n for (const block of blocks) {\n lines.push(`### ${block.name}`);\n lines.push(\"\");\n lines.push(block.description);\n lines.push(\"\");\n lines.push(`**Category:** ${block.category}`);\n lines.push(`**Components:** ${block.components.join(\", \")}`);\n if (block.tags && block.tags.length > 0) {\n lines.push(`**Tags:** ${block.tags.join(\", \")}`);\n }\n lines.push(\"\");\n lines.push(\"```tsx\");\n lines.push(block.code);\n lines.push(\"```\");\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n }\n }\n const content = lines.join(\"\\n\");\n return { content, tokenEstimate: estimateTokens(content) };\n}\nfunction generateJsonContext(fragments, include, compact, blocks) {\n const categories = [...new Set(fragments.map((s) => s.meta.category))].sort();\n const components = {};\n for (const fragment of fragments) {\n const component = {\n category: fragment.meta.category,\n description: fragment.meta.description\n };\n if (fragment.meta.status) {\n component.status = fragment.meta.status;\n }\n if (!compact) {\n if (include.usage) {\n const whenFiltered = filterPlaceholders(fragment.usage.when);\n const whenNotFiltered = filterPlaceholders(fragment.usage.whenNot);\n if (whenFiltered.length > 0) component.whenToUse = whenFiltered;\n if (whenNotFiltered.length > 0) component.whenNotToUse = whenNotFiltered;\n }\n if (include.props && Object.keys(fragment.props).length > 0) {\n component.props = {};\n for (const [name, prop] of Object.entries(fragment.props)) {\n component.props[name] = {\n type: formatPropType(prop),\n description: prop.description\n };\n if (prop.required) component.props[name].required = true;\n if (prop.default !== void 0) component.props[name].default = prop.default;\n }\n }\n if (include.variants && fragment.variants.length > 0) {\n component.variants = fragment.variants.map((v) => v.name);\n }\n if (include.relations && fragment.relations && fragment.relations.length > 0) {\n component.relations = fragment.relations.map((r) => ({\n component: r.component,\n relationship: r.relationship,\n note: r.note\n }));\n }\n }\n components[fragment.meta.name] = component;\n }\n const blocksMap = blocks && blocks.length > 0 ? Object.fromEntries(blocks.map((b) => [b.name, {\n description: b.description,\n category: b.category,\n components: b.components,\n code: b.code,\n tags: b.tags\n }])) : void 0;\n const output = {\n version: \"1.0\",\n generatedAt: (/* @__PURE__ */ new Date()).toISOString(),\n summary: {\n totalComponents: fragments.length,\n categories,\n ...blocksMap && { totalBlocks: blocks.length }\n },\n components,\n ...blocksMap && { blocks: blocksMap }\n };\n const content = JSON.stringify(output, null, 2);\n return { content, tokenEstimate: estimateTokens(content) };\n}\nfunction formatPropType(prop) {\n if (prop.type === \"enum\" && prop.values) {\n return prop.values.map((v) => `\"${v}\"`).join(\" | \");\n }\n if (prop.default !== void 0) {\n return `${prop.type} (default: ${JSON.stringify(prop.default)})`;\n }\n return prop.type;\n}\nfunction truncate(str, maxLength) {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\nfunction estimateTokens(text) {\n return Math.ceil(text.length / 4);\n}\n\nexport {\n PLACEHOLDER_PATTERNS,\n filterPlaceholders,\n generateContext\n};\n","// src/mcp-tools/index.ts\nvar MCP_TOOL_DEFINITIONS = [\n {\n key: \"discover\",\n description: \"Discover components in the design system. Use with no params to list all components. Use 'useCase' for AI-powered suggestions. Use 'component' to find alternatives. Use 'compact' for a token-efficient overview.\",\n params: {\n useCase: {\n type: \"string\",\n description: 'Description of what you want to build \\u2014 returns ranked suggestions (e.g., \"form for user email input\", \"button to submit data\")'\n },\n component: {\n type: \"string\",\n description: 'Component name to find alternatives for (e.g., \"Button\")'\n },\n category: {\n type: \"string\",\n description: 'Filter by category (e.g., \"actions\", \"forms\", \"layout\")'\n },\n search: {\n type: \"string\",\n description: \"Search term to filter by name, description, or tags\"\n },\n status: {\n type: \"string\",\n enum: [\"stable\", \"beta\", \"deprecated\", \"experimental\"],\n description: \"Filter by component status\"\n },\n format: {\n type: \"string\",\n enum: [\"markdown\", \"json\"],\n description: \"Output format for context mode (default: markdown)\"\n },\n compact: {\n type: \"boolean\",\n description: \"If true, returns minimal output (just component names and categories)\"\n },\n includeCode: {\n type: \"boolean\",\n description: \"If true, includes code examples for each variant\"\n },\n includeRelations: {\n type: \"boolean\",\n description: \"If true, includes component relationships\"\n }\n }\n },\n {\n key: \"inspect\",\n description: \"Get detailed information about a specific component: props, usage guidelines, code examples, accessibility \\u2014 all in one call. Use 'fields' to request only specific data for token efficiency.\",\n params: {\n component: {\n type: \"string\",\n description: 'Component name (e.g., \"Button\", \"Input\")'\n },\n fields: {\n type: \"array\",\n items: { type: \"string\" },\n description: 'Specific fields to return (e.g., [\"meta\", \"usage.when\", \"contract.propsSummary\", \"props\", \"examples\", \"guidelines\"]). If omitted, returns everything. Supports dot notation.'\n },\n variant: {\n type: \"string\",\n description: 'Filter examples to a specific variant name (e.g., \"Default\", \"Primary\")'\n },\n maxExamples: {\n type: \"number\",\n description: \"Maximum number of code examples to return (default: all)\"\n },\n maxLines: {\n type: \"number\",\n description: \"Maximum lines per code example (truncates longer examples)\"\n }\n },\n required: [\"component\"]\n },\n {\n key: \"blocks\",\n description: 'Search and retrieve composition blocks \\u2014 named patterns showing how design system components wire together for common use cases (e.g., \"Login Form\", \"Settings Page\"). Returns the block with its code pattern.',\n params: {\n name: {\n type: \"string\",\n description: 'Exact block name to retrieve (e.g., \"Login Form\")'\n },\n search: {\n type: \"string\",\n description: \"Free-text search across block names, descriptions, tags, and components\"\n },\n component: {\n type: \"string\",\n description: 'Filter blocks that use a specific component (e.g., \"Button\")'\n },\n category: {\n type: \"string\",\n description: 'Filter by category (e.g., \"authentication\", \"marketing\", \"dashboard\", \"settings\", \"ecommerce\", \"ai\")'\n }\n }\n },\n {\n key: \"tokens\",\n description: \"List available CSS design tokens (custom properties) by category. Use this when you need to style custom elements or override defaults \\u2014 no more guessing variable names. Filter by category or search by keyword.\",\n params: {\n category: {\n type: \"string\",\n description: 'Filter by category (e.g., \"colors\", \"spacing\", \"typography\", \"surfaces\", \"shadows\", \"radius\", \"borders\", \"text\", \"focus\", \"layout\", \"code\", \"component-sizing\")'\n },\n search: {\n type: \"string\",\n description: 'Search token names (e.g., \"accent\", \"hover\", \"padding\")'\n }\n }\n },\n {\n key: \"implement\",\n description: \"One-shot implementation helper. Describe what you want to build and get everything needed in a single call: best-matching component(s) with full props and code examples, relevant composition blocks, and applicable CSS tokens. Saves multiple round-trips.\",\n params: {\n useCase: {\n type: \"string\",\n description: 'What you want to implement (e.g., \"login form\", \"data table with sorting\", \"streaming chat messages\")'\n }\n },\n required: [\"useCase\"]\n },\n {\n key: \"render\",\n description: \"Render a component and return a screenshot. Optionally compare against a Figma design ('figmaUrl'). Requires a running Fragments dev server (viewer URL). Use this to verify your implementation looks correct.\",\n params: {\n component: {\n type: \"string\",\n description: 'Component name (e.g., \"Button\", \"Card\", \"Input\")'\n },\n props: {\n type: \"object\",\n description: 'Props to pass to the component (e.g., { \"variant\": \"primary\", \"children\": \"Click me\" })'\n },\n viewport: {\n type: \"object\",\n properties: {\n width: {\n type: \"number\",\n description: \"Viewport width (default: 800)\"\n },\n height: {\n type: \"number\",\n description: \"Viewport height (default: 600)\"\n }\n },\n description: \"Optional viewport size for the render\"\n },\n figmaUrl: {\n type: \"string\",\n description: \"Figma frame URL \\u2014 if provided, compares the render against the Figma design\"\n },\n variant: {\n type: \"string\",\n description: \"Variant name for compare mode\"\n },\n threshold: {\n type: \"number\",\n description: \"Diff threshold percentage (default: 1 for Figma)\"\n }\n },\n required: [\"component\"]\n },\n {\n key: \"fix\",\n description: \"Generate patches to fix token compliance issues in a component. Returns unified diff patches that replace hardcoded CSS values with design token references. Requires a running Fragments dev server.\",\n params: {\n component: {\n type: \"string\",\n description: 'Component name to generate fixes for (e.g., \"Button\", \"Card\")'\n },\n variant: {\n type: \"string\",\n description: \"Specific variant to fix (optional, fixes all variants if omitted)\"\n },\n fixType: {\n type: \"string\",\n enum: [\"token\", \"all\"],\n description: 'Type of fixes to generate: \"token\" for hardcoded\\u2192token replacements, \"all\" for all available fixes (default: \"all\")'\n }\n },\n required: [\"component\"]\n },\n {\n key: \"graph\",\n description: 'Query the component relationship graph. Understand dependencies, impact analysis, composition trees, alternatives, and design system health. Use \"health\" for an overview, \"dependencies\"/\"dependents\" for direct relationships, \"impact\" for change analysis, \"composition\" for compound component trees.',\n params: {\n mode: {\n type: \"string\",\n enum: [\"dependencies\", \"dependents\", \"impact\", \"path\", \"composition\", \"alternatives\", \"islands\", \"health\"],\n description: \"Query mode\"\n },\n component: {\n type: \"string\",\n description: \"Component name (required for most modes)\"\n },\n target: {\n type: \"string\",\n description: 'Target component for \"path\" mode'\n },\n edgeTypes: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by edge types (imports, hook-depends, renders, composes, parent-of, alternative-to, sibling-of)\"\n },\n maxDepth: {\n type: \"number\",\n description: \"Max traversal depth for impact mode (default: 3)\"\n }\n },\n required: [\"mode\"]\n },\n {\n key: \"a11y\",\n description: \"Run an accessibility audit on a component. Returns axe-core violations, a WCAG compliance score, and optional fix suggestions. Requires a running Fragments dev server.\",\n params: {\n component: {\n type: \"string\",\n description: 'Component name to audit (e.g., \"Button\", \"Card\")'\n },\n variant: {\n type: \"string\",\n description: \"Specific variant to audit (optional, audits all variants if omitted)\"\n },\n standard: {\n type: \"string\",\n enum: [\"AA\", \"AAA\"],\n description: \"WCAG compliance level to check against (default: AA)\"\n },\n includeFixPatches: {\n type: \"boolean\",\n description: \"If true, includes auto-fix suggestions for each violation\"\n }\n },\n required: [\"component\"]\n }\n];\nvar CLI_TOOL_EXTENSIONS = [\n {\n key: \"render\",\n description: \"Render a component and return a screenshot. Optionally compare against a stored baseline ('baseline: true') or against a Figma design ('figmaUrl'). Use this to verify your implementation looks correct.\",\n params: {\n baseline: {\n type: \"boolean\",\n description: \"If true, compares the render against the stored baseline screenshot (requires variant)\"\n },\n theme: {\n type: \"string\",\n enum: [\"light\", \"dark\"],\n description: \"Theme for baseline verification (default: light)\"\n }\n }\n },\n {\n key: \"fix\",\n description: \"Generate patches to fix token compliance issues in a component. Returns unified diff patches that replace hardcoded CSS values with design token references. Use this after fragments_render identifies issues to automatically fix them.\",\n params: {}\n }\n];\nfunction buildToolNames(prefix) {\n const map = {};\n for (const def of MCP_TOOL_DEFINITIONS) {\n map[def.key] = `${prefix}_${def.key}`;\n }\n return map;\n}\nfunction buildMcpTools(prefix, extensions) {\n const extMap = /* @__PURE__ */ new Map();\n if (extensions) {\n for (const ext of extensions) {\n extMap.set(ext.key, ext);\n }\n }\n return MCP_TOOL_DEFINITIONS.map((def) => {\n const ext = extMap.get(def.key);\n const mergedParams = ext ? { ...def.params, ...ext.params } : def.params;\n const properties = {};\n for (const [name, param] of Object.entries(mergedParams)) {\n const prop = {\n type: param.type,\n description: param.description\n };\n if (param.enum) prop.enum = param.enum;\n if (param.items) prop.items = param.items;\n if (param.properties) {\n const nested = {};\n for (const [k, v] of Object.entries(param.properties)) {\n nested[k] = { type: v.type, description: v.description };\n }\n prop.properties = nested;\n }\n properties[name] = prop;\n }\n return {\n name: `${prefix}_${def.key}`,\n description: ext?.description ?? def.description,\n inputSchema: {\n type: \"object\",\n properties,\n ...def.required && { required: def.required }\n }\n };\n });\n}\n\nexport {\n MCP_TOOL_DEFINITIONS,\n CLI_TOOL_EXTENSIONS,\n buildToolNames,\n buildMcpTools\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 \"fragments\" field.\n */\nfunction findFragmentsInDeps(dir: string, found: string[]): void {\n const pkgJsonPath = join(dir, 'package.json');\n if (!existsSync(pkgJsonPath)) return;\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n };\n const localRequire = createRequire(join(dir, 'noop.js'));\n for (const depName of Object.keys(allDeps)) {\n try {\n const depPkgPath = resolveDepPackageJson(localRequire, depName);\n if (!depPkgPath) continue;\n const depPkg = JSON.parse(readFileSync(depPkgPath, 'utf-8'));\n if (depPkg.fragments) {\n const fragmentsPath = join(dirname(depPkgPath), depPkg.fragments);\n if (existsSync(fragmentsPath) && !found.includes(fragmentsPath)) {\n found.push(fragmentsPath);\n }\n }\n } catch {\n // Package not resolvable or unreadable, skip\n }\n }\n } catch {\n // No package.json or unreadable\n }\n}\n\n/**\n * Find fragments.json files:\n * 1. Walk up from startDir (for library authors with a local build)\n * 2. Read package.json deps and resolve packages with a \"fragments\" field\n * 3. Check workspace packages' deps (monorepo support)\n *\n * Uses Node.js module resolution (createRequire) to handle all package\n * managers: pnpm symlinks, yarn PnP, monorepo hoisting, etc.\n */\nexport function findFragmentsJson(startDir: string): string[] {\n const found: string[] = [];\n const resolvedStart = resolve(startDir);\n\n // 1. Walk upward from startDir (library author flow)\n let dir = resolvedStart;\n while (true) {\n const candidate = join(dir, BRAND.outFile);\n if (existsSync(candidate)) {\n found.push(candidate);\n break;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n // 2. Check root package.json deps\n findFragmentsInDeps(resolvedStart, found);\n\n // 3. Check workspace packages' deps (monorepo support)\n if (found.length === 0 || existsSync(join(resolvedStart, 'pnpm-workspace.yaml'))) {\n const workspaceDirs = getWorkspaceDirs(resolvedStart);\n for (const wsDir of workspaceDirs) {\n findFragmentsInDeps(wsDir, found);\n }\n }\n\n return found;\n}\n","/**\n * Search module for MCP server component discovery.\n *\n * Default (free): local keyword scoring with synonym expansion and multi-field\n * weighted 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 { CompiledFragment, CompiledBlock, CompiledTokenData } from '@fragments-sdk/context/types';\nimport type { SerializedComponentGraph } from '@fragments-sdk/context/graph';\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// Synonym map for keyword expansion\n// ---------------------------------------------------------------------------\n\nconst 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 'alert': ['notification', 'message', 'warning', 'error', 'feedback'],\n 'notification': ['alert', 'message', 'toast'],\n 'card': ['container', 'panel', 'box', 'content'],\n 'toggle': ['switch', 'checkbox', 'boolean', 'on/off'],\n 'switch': ['toggle', 'checkbox', 'boolean'],\n 'badge': ['tag', 'label', 'status', 'indicator'],\n 'status': ['badge', 'indicator', 'state'],\n 'login': ['auth', 'signin', 'authentication', 'form'],\n 'auth': ['login', 'signin', 'authentication'],\n 'chat': ['message', 'conversation', 'ai'],\n 'table': ['data', 'grid', 'list', 'rows'],\n};\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 keyword scoring — components\n// ---------------------------------------------------------------------------\n\n/**\n * Score components against a query using weighted keyword matching.\n */\nexport function keywordScoreComponents(\n query: string,\n fragments: CompiledFragment[]\n): ScoredResult[] {\n const searchTerms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n\n const expandedTerms = new Set(searchTerms);\n for (const term of searchTerms) {\n const synonyms = SYNONYM_MAP[term];\n if (synonyms) {\n for (const syn of synonyms) expandedTerms.add(syn);\n }\n }\n\n const scored = fragments.map((s) => {\n let score = 0;\n\n const nameLower = s.meta.name.toLowerCase();\n if (searchTerms.some((term) => nameLower.includes(term))) {\n score += 15;\n } else if (Array.from(expandedTerms).some((term) => nameLower.includes(term))) {\n score += 8;\n }\n\n const desc = s.meta.description?.toLowerCase() ?? '';\n score += searchTerms.filter((term) => desc.includes(term)).length * 6;\n\n const tags = s.meta.tags?.map((t) => t.toLowerCase()) ?? [];\n score += searchTerms.filter((term) => tags.some((tag) => tag.includes(term))).length * 4;\n\n const whenUsed = s.usage?.when?.join(' ').toLowerCase() ?? '';\n score += searchTerms.filter((term) => whenUsed.includes(term)).length * 10;\n\n score += Array.from(expandedTerms)\n .filter((term) => !searchTerms.includes(term) && whenUsed.includes(term)).length * 5;\n\n const cat = s.meta.category?.toLowerCase() ?? '';\n if (searchTerms.some((term) => cat.includes(term))) {\n score += 8;\n }\n\n const variantText = s.variants\n .map(v => `${v.name} ${v.description || ''}`.toLowerCase())\n .join(' ');\n score += searchTerms.filter(term => variantText.includes(term)).length * 3;\n\n if (s.meta.status === 'stable') score += 5;\n else if (s.meta.status === 'beta') score += 2;\n if (s.meta.status === 'deprecated') score -= 25;\n\n return { name: s.meta.name, kind: 'component' as EntryKind, score };\n });\n\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((s, i) => ({ ...s, rank: i }));\n}\n\n// ---------------------------------------------------------------------------\n// Local keyword scoring — blocks\n// ---------------------------------------------------------------------------\n\n/**\n * Score blocks against a query using keyword matching.\n */\nexport function keywordScoreBlocks(\n query: string,\n blocks: CompiledBlock[]\n): ScoredResult[] {\n const searchTerms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n\n const expandedTerms = new Set(searchTerms);\n for (const term of searchTerms) {\n const synonyms = SYNONYM_MAP[term];\n if (synonyms) {\n for (const syn of synonyms) expandedTerms.add(syn);\n }\n }\n\n const scored = blocks.map((b) => {\n let score = 0;\n\n const nameLower = b.name.toLowerCase();\n if (searchTerms.some((term) => nameLower.includes(term))) {\n score += 15;\n } else if (Array.from(expandedTerms).some((term) => nameLower.includes(term))) {\n score += 8;\n }\n\n const desc = b.description.toLowerCase();\n score += searchTerms.filter((term) => desc.includes(term)).length * 6;\n\n const tags = b.tags?.map((t) => t.toLowerCase()) ?? [];\n score += searchTerms.filter((term) => tags.some((tag) => tag.includes(term))).length * 4;\n\n const componentText = b.components.join(' ').toLowerCase();\n score += searchTerms.filter((term) => componentText.includes(term)).length * 5;\n\n const cat = b.category.toLowerCase();\n if (searchTerms.some((term) => cat.includes(term))) {\n score += 8;\n }\n\n return { name: b.name, kind: 'block' as EntryKind, score };\n });\n\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((s, i) => ({ ...s, rank: i }));\n}\n\n// ---------------------------------------------------------------------------\n// Local keyword scoring — tokens\n// ---------------------------------------------------------------------------\n\n/**\n * Score tokens against a query using keyword matching on name and category.\n */\nexport function keywordScoreTokens(\n query: string,\n tokenData: CompiledTokenData\n): ScoredResult[] {\n const searchTerms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n\n const scored: Array<{ name: string; kind: EntryKind; score: number }> = [];\n\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n const catLower = cat.toLowerCase();\n const catBonus = searchTerms.some((term) => catLower.includes(term)) ? 8 : 0;\n\n for (const token of tokens) {\n let score = catBonus;\n\n const nameLower = token.name.toLowerCase();\n score += searchTerms.filter((term) => nameLower.includes(term)).length * 10;\n\n if (token.description) {\n const descLower = token.description.toLowerCase();\n score += searchTerms.filter((term) => descLower.includes(term)).length * 6;\n }\n\n if (score > 0) {\n scored.push({ name: token.name, kind: 'token', score });\n }\n }\n }\n\n return scored\n .sort((a, b) => b.score - a.score)\n .map((s, i) => ({ ...s, rank: i }));\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: CompiledFragment[];\n blocks?: CompiledBlock[];\n tokenData?: CompiledTokenData;\n /** Serialized component graph for neighbor boosting */\n graph?: SerializedComponentGraph;\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: local keyword scoring with synonym expansion and multi-field matching.\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 keyword results based on requested kind(s)\n const keywordResults: ScoredResult[] = [];\n\n if (!kind || kind === 'component') {\n keywordResults.push(...keywordScoreComponents(query, data.fragments));\n }\n if ((!kind || kind === 'block') && data.blocks) {\n keywordResults.push(...keywordScoreBlocks(query, data.blocks));\n }\n if ((!kind || kind === 'token') && data.tokenData) {\n keywordResults.push(...keywordScoreTokens(query, data.tokenData));\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 * 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 RenderRequest {\n component: string;\n props?: Record<string, unknown>;\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}\n\nexport interface A11yResult {\n component: string;\n results: A11yVariantResult[];\n score: number;\n aaPercent: number;\n aaaPercent: number;\n passed: 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): Promise<RenderResult> {\n const renderUrl = `${viewerUrl}/fragments/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 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): Promise<CompareResult> {\n const compareUrl = `${viewerUrl}/fragments/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): Promise<FixResult> {\n const fixUrl = `${viewerUrl}/fragments/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): Promise<A11yResult> {\n const a11yUrl = `${viewerUrl}/fragments/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 }),\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 // AA = no critical/serious\n const totalViolations = totalCritical + totalSerious + totalModerate + totalMinor;\n const aaPass = totalCritical === 0 && totalSerious === 0;\n const aaaPass = totalViolations === 0;\n const aaPercent = aaPass ? 100 : 0;\n const aaaPercent = aaaPass ? 100 : 0;\n\n const passed = standard === 'AAA' ? aaaPass : aaPass;\n\n return {\n component: request.component,\n results,\n score,\n aaPercent,\n aaaPercent,\n passed,\n standard,\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","/**\n * MCP tool handler for the fragments_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 ComponentGraph,\n} from '@fragments-sdk/context/graph';\nimport type { CompiledBlock } from '@fragments-sdk/context/types';\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, CompiledBlock>,\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 return {\n text: JSON.stringify({\n mode: 'health',\n ...health,\n summary: `${health.nodeCount} components, ${health.edgeCount} edges, ${health.connectedComponents.length} island(s), ${health.orphans.length} orphan(s), ${health.compositionCoverage}% in blocks`,\n }, null, 2),\n };\n }\n\n 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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), 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 }, null, 2),\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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), 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 }, null, 2),\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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), 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 }, null, 2),\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 }, null, 2),\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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), isError: true };\n }\n const tree = engine.composition(args.component);\n return {\n text: JSON.stringify({\n mode: 'composition',\n ...tree,\n }, null, 2),\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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), 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 }, null, 2),\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 }, null, 2),\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"],"mappings":"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","names":["existsSync","readFileSync","join","ComponentGraphEngine","deserializeGraph","join","existsSync","readFileSync","fragments"]}
|
package/dist/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts","../src/constants.ts","../../context/dist/chunk-2UQY4VNM.js","../../context/dist/chunk-HAJWPNLU.js","../src/discovery.ts","../src/search.ts","../src/service.ts","../src/utils.ts","../src/graph-handler.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 * - 8 tools: discover, inspect, blocks, tokens, implement, render, fix, a11y\n * - Hybrid search: Convex-backed vector search + local keyword scoring + RRF\n * - HTTP-only render/fix (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 { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport { BRAND, DEFAULTS } from './constants.js';\nimport { generateContext, filterPlaceholders } from '@fragments-sdk/context/generate';\nimport type { CompiledFragmentsFile, CompiledFragment, Theme } from '@fragments-sdk/context/types';\nimport { buildMcpTools, buildToolNames } from '@fragments-sdk/context/mcp-tools';\nimport { findFragmentsJson } from './discovery.js';\nimport { hybridSearch, keywordScoreComponents } from './search.js';\nimport type { LocalSearchData } from './search.js';\nimport { renderComponent, compareComponent, fixComponent, auditComponent } from './service.js';\nimport { projectFields } from './utils.js';\nimport { handleGraphTool } from './graph-handler.js';\nimport type { GraphToolArgs } from './graph-handler.js';\n\n// ---------------------------------------------------------------------------\n// Tool names & definitions (from shared source of truth)\n// ---------------------------------------------------------------------------\n\nconst TOOL_NAMES = buildToolNames(BRAND.nameLower) as Record<string, string> & {\n discover: string;\n inspect: string;\n blocks: string;\n tokens: string;\n implement: string;\n render: string;\n fix: string;\n graph: string;\n a11y: string;\n};\n\n// ---------------------------------------------------------------------------\n// Server configuration\n// ---------------------------------------------------------------------------\n\nexport interface McpServerConfig {\n /** Project root directory */\n projectRoot: string;\n /** Viewer base URL (for render/fix tools) */\n viewerUrl?: string;\n /** Default theme for verification */\n theme?: Theme;\n /** Diff threshold percentage */\n threshold?: number;\n}\n\nconst TOOLS = buildMcpTools(BRAND.nameLower) 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: '0.3.0',\n },\n {\n capabilities: {\n tools: {},\n },\n }\n );\n\n // Lazy-loaded resources\n let fragmentsData: CompiledFragmentsFile | null = null;\n const fragmentPackageMap = new Map<string, string>();\n let defaultPackageName: string | null = null;\n let resolvedRoot: string | 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 loadFragments(): Promise<CompiledFragmentsFile> {\n if (fragmentsData) return fragmentsData;\n\n const projectRoot = await resolveProjectRoot();\n const paths = findFragmentsJson(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 const content = await readFile(paths[0], 'utf-8');\n fragmentsData = JSON.parse(content) as CompiledFragmentsFile;\n\n // Normalize legacy \"recipes\" key to \"blocks\"\n if (!fragmentsData.blocks && fragmentsData.recipes) {\n fragmentsData.blocks = fragmentsData.recipes;\n }\n\n if (fragmentsData.packageName) {\n for (const name of Object.keys(fragmentsData.fragments)) {\n fragmentPackageMap.set(name, fragmentsData.packageName);\n }\n }\n\n for (let i = 1; i < paths.length; i++) {\n const extra = JSON.parse(await readFile(paths[i], 'utf-8')) as CompiledFragmentsFile;\n if (extra.packageName) {\n for (const name of Object.keys(extra.fragments)) {\n fragmentPackageMap.set(name, extra.packageName);\n }\n }\n Object.assign(fragmentsData.fragments, extra.fragments);\n const extraBlocks = extra.blocks ?? extra.recipes;\n if (extraBlocks) {\n fragmentsData.blocks = { ...fragmentsData.blocks, ...extraBlocks };\n }\n }\n\n return fragmentsData;\n }\n\n async function getPackageName(fragmentName?: string): Promise<string> {\n await loadFragments();\n\n if (fragmentName) {\n const segPkg = fragmentPackageMap.get(fragmentName);\n if (segPkg) return segPkg;\n }\n\n if (defaultPackageName) return defaultPackageName;\n\n if (fragmentsData?.packageName) {\n defaultPackageName = fragmentsData.packageName;\n return defaultPackageName;\n }\n\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 defaultPackageName = pkg.name;\n return defaultPackageName;\n }\n } catch {\n // Fall through\n }\n }\n\n defaultPackageName = 'your-component-library';\n return defaultPackageName;\n }\n\n // Register tool listing\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n return { tools: TOOLS };\n });\n\n // Register tool execution\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n\n try {\n switch (name) {\n // ================================================================\n // DISCOVER — list, suggest, context, alternatives\n // ================================================================\n case TOOL_NAMES.discover: {\n const data = await loadFragments();\n const useCase = (args?.useCase as string) ?? undefined;\n const componentForAlts = (args?.component as string) ?? undefined;\n const category = (args?.category as string) ?? undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n const status = (args?.status as string) ?? undefined;\n const format = (args?.format as 'markdown' | 'json') ?? 'markdown';\n const compact = (args?.compact as boolean) ?? false;\n const includeCode = (args?.includeCode as boolean) ?? false;\n const includeRelations = (args?.includeRelations as boolean) ?? false;\n\n // --- Context mode ---\n if (compact || (args?.format && !useCase && !componentForAlts && !category && !search && !status)) {\n const fragments = Object.values(data.fragments);\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n\n const { content: ctxContent, tokenEstimate } = generateContext(fragments, {\n format,\n compact,\n include: {\n code: includeCode,\n relations: includeRelations,\n },\n }, allBlocks);\n\n return {\n content: [{ type: 'text' as const, text: ctxContent }],\n _meta: { tokenEstimate },\n };\n }\n\n // --- Suggest mode: useCase provided (uses hybrid search) ---\n if (useCase) {\n const allFragments = Object.values(data.fragments);\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n const context = ((args as Record<string, unknown>)?.context as string)?.toLowerCase() ?? '';\n const fullQuery = context ? `${useCase} ${context}` : useCase;\n\n // Use hybrid search — filter to components only for discover suggest\n const localData: LocalSearchData = {\n fragments: allFragments,\n blocks: allBlocks,\n tokenData: data.tokens,\n };\n const searchResults = await hybridSearch(fullQuery, localData, 10, 'component');\n\n // Build detailed suggestions from search results\n const scored = searchResults.map((result) => {\n const fragment = allFragments.find(\n (s) => s.meta.name.toLowerCase() === result.name.toLowerCase()\n );\n if (!fragment) return null;\n\n const filteredWhen = filterPlaceholders(fragment.usage?.when).slice(0, 3);\n const filteredWhenNot = filterPlaceholders(fragment.usage?.whenNot).slice(0, 2);\n\n let confidence: 'high' | 'medium' | 'low';\n if (result.score >= 0.025) confidence = 'high';\n else if (result.score >= 0.015) confidence = 'medium';\n else confidence = 'low';\n\n return {\n component: fragment.meta.name,\n category: fragment.meta.category,\n description: fragment.meta.description,\n confidence,\n reasons: [`Matched via hybrid search (score: ${result.score.toFixed(4)})`],\n usage: { when: filteredWhen, whenNot: filteredWhenNot },\n variantCount: fragment.variants.length,\n status: fragment.meta.status,\n };\n }).filter(Boolean);\n\n // Diversify by category (max 2 per category, max 5 total)\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 >= 5) break;\n }\n }\n\n const compositionHint = suggestions.length >= 2\n ? `These components work well together. For example, ${suggestions[0]!.component} can be combined with ${suggestions.slice(1, 3).map(s => s!.component).join(' and ')}.`\n : undefined;\n\n const useCaseLower = useCase.toLowerCase();\n const STYLE_KEYWORDS = ['color', 'spacing', 'padding', 'margin', 'font', 'border', 'radius', 'shadow', 'variable', 'token', 'css', 'theme', 'dark mode', 'background', 'hover'];\n const isStyleQuery = STYLE_KEYWORDS.some((kw) => useCaseLower.includes(kw));\n\n const noMatch = suggestions.length === 0;\n const weakMatch = !noMatch && suggestions.every((s) => s!.confidence === 'low');\n\n let recommendation: string;\n let nextStep: string | undefined;\n if (noMatch) {\n recommendation = isStyleQuery\n ? `No matching components found. Your query seems styling-related — try ${TOOL_NAMES.tokens} to find CSS custom properties.`\n : 'No matching components found. Try different keywords or browse all components with fragments_discover.';\n nextStep = isStyleQuery\n ? `Use ${TOOL_NAMES.tokens}(search: \"${useCaseLower.split(/\\s+/)[0]}\") to find design tokens.`\n : undefined;\n } else if (weakMatch) {\n recommendation = `Weak matches only — ${suggestions[0]!.component} might work but confidence is low.${isStyleQuery ? ` If you need a CSS variable, try ${TOOL_NAMES.tokens}.` : ''}`;\n nextStep = `Use ${TOOL_NAMES.inspect}(\"${suggestions[0]!.component}\") to check if it fits, or try broader search terms.`;\n } else {\n recommendation = `Best match: ${suggestions[0]!.component} (${suggestions[0]!.confidence} confidence) - ${suggestions[0]!.description}`;\n nextStep = `Use ${TOOL_NAMES.inspect}(\"${suggestions[0]!.component}\") for full details.`;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n context: context || undefined,\n suggestions,\n noMatch,\n weakMatch,\n recommendation,\n compositionHint,\n nextStep,\n }, null, 2),\n }],\n };\n }\n\n // --- Alternatives mode ---\n if (componentForAlts) {\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentForAlts.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentForAlts}\" not found. Use fragments_discover to see available components.`);\n }\n\n const relations = fragment.relations ?? [];\n\n const referencedBy = Object.values(data.fragments)\n .filter((s) =>\n s.relations?.some((r) => r.component.toLowerCase() === componentForAlts.toLowerCase())\n )\n .map((s) => ({\n component: s.meta.name,\n relationship: s.relations?.find(\n (r) => r.component.toLowerCase() === componentForAlts.toLowerCase()\n )?.relationship,\n note: s.relations?.find(\n (r) => r.component.toLowerCase() === componentForAlts.toLowerCase()\n )?.note,\n }));\n\n const sameCategory = Object.values(data.fragments)\n .filter(\n (s) =>\n s.meta.category === fragment.meta.category &&\n s.meta.name.toLowerCase() !== componentForAlts.toLowerCase()\n )\n .map((s) => ({\n component: s.meta.name,\n description: s.meta.description,\n }));\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: fragment.meta.name,\n category: fragment.meta.category,\n directRelations: relations,\n referencedBy,\n sameCategory,\n suggestion: relations.find((r) => r.relationship === 'alternative')\n ? `Consider ${relations.find((r) => r.relationship === 'alternative')?.component}: ${relations.find((r) => r.relationship === 'alternative')?.note}`\n : undefined,\n }, null, 2),\n }],\n };\n }\n\n // --- Default: list mode ---\n const fragments = Object.values(data.fragments)\n .filter((s) => {\n if (category && s.meta.category !== category) return false;\n if (status && (s.meta.status ?? 'stable') !== status) return false;\n if (search) {\n const nameMatch = s.meta.name.toLowerCase().includes(search);\n const descMatch = s.meta.description?.toLowerCase().includes(search);\n const tagMatch = s.meta.tags?.some((t) => t.toLowerCase().includes(search));\n if (!nameMatch && !descMatch && !tagMatch) return false;\n }\n return true;\n })\n .map((s) => ({\n name: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n status: s.meta.status ?? 'stable',\n variantCount: s.variants.length,\n tags: s.meta.tags ?? [],\n }));\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: fragments.length,\n fragments,\n categories: [...new Set(fragments.map((s) => s.category))],\n hint: fragments.length === 0\n ? 'No components found. Try broader search terms or check available categories.'\n : fragments.length > 5\n ? 'Use fragments_discover with useCase for recommendations, or fragments_inspect for details on a specific component.'\n : undefined,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // INSPECT\n // ================================================================\n case TOOL_NAMES.inspect: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const fields = args?.fields as string[] | undefined;\n const variantName = (args?.variant as string) ?? undefined;\n const maxExamples = args?.maxExamples as number | undefined;\n const maxLines = args?.maxLines as number | undefined;\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use fragments_discover to see available components.`);\n }\n\n const pkgName = await getPackageName(fragment.meta.name);\n\n let variants = fragment.variants;\n if (variantName) {\n const query = variantName.toLowerCase();\n let filtered = variants.filter((v) => v.name.toLowerCase() === query);\n if (filtered.length === 0) {\n filtered = variants.filter((v) => v.name.toLowerCase().startsWith(query));\n }\n if (filtered.length === 0) {\n filtered = variants.filter((v) => v.name.toLowerCase().includes(query));\n }\n if (filtered.length > 0) {\n variants = filtered;\n } else {\n throw new Error(\n `Variant \"${variantName}\" not found for ${componentName}. ` +\n `Available: ${fragment.variants.map((v) => v.name).join(', ')}`\n );\n }\n }\n if (maxExamples && maxExamples > 0) {\n variants = variants.slice(0, maxExamples);\n }\n\n const truncateCode = (code: string): string => {\n if (!maxLines || maxLines <= 0) return code;\n const lines = code.split('\\n');\n if (lines.length <= maxLines) return code;\n return lines.slice(0, maxLines).join('\\n') + '\\n// ... truncated';\n };\n\n const examples = variants.map((variant) => {\n if (variant.code) {\n return {\n variant: variant.name,\n description: variant.description,\n code: truncateCode(variant.code),\n };\n }\n return {\n variant: variant.name,\n description: variant.description,\n code: `<${fragment.meta.name} />`,\n note: 'No code example provided in fragment. Refer to props for customization.',\n };\n });\n\n const propsReference = Object.entries(fragment.props ?? {}).map(([propName, prop]) => ({\n name: propName,\n type: prop.type,\n required: prop.required,\n default: prop.default,\n description: prop.description,\n }));\n\n const propConstraints = Object.entries(fragment.props ?? {})\n .filter(([, prop]) => prop.constraints && prop.constraints.length > 0)\n .map(([pName, prop]) => ({\n prop: pName,\n constraints: prop.constraints,\n }));\n\n const fullResult = {\n meta: fragment.meta,\n props: fragment.props,\n variants: fragment.variants,\n relations: fragment.relations,\n contract: fragment.contract,\n generated: fragment._generated,\n guidelines: {\n when: filterPlaceholders(fragment.usage?.when),\n whenNot: filterPlaceholders(fragment.usage?.whenNot),\n guidelines: fragment.usage?.guidelines ?? [],\n accessibility: fragment.usage?.accessibility ?? [],\n propConstraints,\n alternatives: fragment.relations\n ?.filter((r) => r.relationship === 'alternative')\n .map((r) => ({\n component: r.component,\n note: r.note,\n })) ?? [],\n },\n examples: {\n import: `import { ${fragment.meta.name} } from '${pkgName}';`,\n code: examples,\n propsReference,\n },\n };\n\n const result = fields && fields.length > 0\n ? projectFields(fullResult as unknown as Record<string, unknown>, fields)\n : fullResult;\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n };\n }\n\n // ================================================================\n // BLOCKS\n // ================================================================\n case TOOL_NAMES.blocks: {\n const data = await loadFragments();\n const blockName = args?.name as string | undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n const component = (args?.component as string)?.toLowerCase() ?? undefined;\n const category = (args?.category as string)?.toLowerCase() ?? undefined;\n\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n\n if (allBlocks.length === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n blocks: [],\n hint: `No blocks found. Run \\`${BRAND.cliCommand} build\\` after adding .block.ts files.`,\n }, null, 2),\n }],\n };\n }\n\n let filtered = allBlocks;\n\n if (blockName) {\n filtered = filtered.filter(\n b => b.name.toLowerCase() === blockName.toLowerCase()\n );\n }\n\n if (search) {\n filtered = filtered.filter(b => {\n const haystack = [\n b.name,\n b.description,\n ...(b.tags ?? []),\n ...b.components,\n b.category,\n ].join(' ').toLowerCase();\n return haystack.includes(search);\n });\n }\n\n if (component) {\n filtered = filtered.filter(b =>\n b.components.some(c => c.toLowerCase() === component)\n );\n }\n\n if (category) {\n filtered = filtered.filter(b =>\n b.category.toLowerCase() === category\n );\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: filtered.length,\n blocks: filtered,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // TOKENS\n // ================================================================\n case TOOL_NAMES.tokens: {\n const data = await loadFragments();\n const category = (args?.category as string)?.toLowerCase() ?? undefined;\n const search = (args?.search as string)?.toLowerCase() ?? undefined;\n\n const tokenData = data.tokens;\n\n if (!tokenData || tokenData.total === 0) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n total: 0,\n categories: {},\n hint: `No design tokens found. Add a tokens.include pattern to your ${BRAND.configFile} and run \\`${BRAND.cliCommand} build\\`.`,\n }, null, 2),\n }],\n };\n }\n\n let filteredCategories: Record<string, Array<{ name: string; description?: string }>> = {};\n let filteredTotal = 0;\n\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n if (category && cat !== category) continue;\n\n let filtered = tokens;\n if (search) {\n filtered = tokens.filter(\n (t) => t.name.toLowerCase().includes(search) ||\n (t.description && t.description.toLowerCase().includes(search))\n );\n }\n\n if (filtered.length > 0) {\n filteredCategories[cat] = filtered;\n filteredTotal += filtered.length;\n }\n }\n\n let hint: string | undefined;\n if (filteredTotal === 0) {\n const availableCategories = Object.keys(tokenData.categories);\n hint = search\n ? `No tokens matching \"${search}\". Try: ${availableCategories.join(', ')}`\n : category\n ? `Category \"${category}\" not found. Available: ${availableCategories.join(', ')}`\n : undefined;\n } else if (!category && !search) {\n hint = `Use var(--token-name) in your CSS/styles. Filter by category or search to narrow results.`;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n prefix: tokenData.prefix,\n total: filteredTotal,\n totalAvailable: tokenData.total,\n categories: filteredCategories,\n ...(hint && { hint }),\n ...((!category && !search) && {\n availableCategories: Object.entries(tokenData.categories).map(\n ([cat, tokens]) => ({ category: cat, count: tokens.length })\n ),\n }),\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // IMPLEMENT — one-shot discover + inspect + blocks + tokens\n // ================================================================\n case TOOL_NAMES.implement: {\n const data = await loadFragments();\n const useCase = args?.useCase as string;\n if (!useCase) {\n throw new Error('useCase is required');\n }\n\n const allFragments = Object.values(data.fragments);\n const allBlocks = Object.values(data.blocks ?? data.recipes ?? {});\n const tokenData = data.tokens;\n\n // Use hybrid search across ALL kinds — implement is a one-shot helper\n const localData: LocalSearchData = {\n fragments: allFragments,\n blocks: allBlocks,\n tokenData,\n };\n const searchResults = await hybridSearch(useCase, localData, 15);\n\n // Separate results by kind\n const componentResults = searchResults.filter((r) => r.kind === 'component').slice(0, 3);\n const blockResults = searchResults.filter((r) => r.kind === 'block').slice(0, 2);\n const tokenResults = searchResults.filter((r) => r.kind === 'token').slice(0, 5);\n\n // Map component results back to fragments\n const topMatches = componentResults.map((result) => {\n const fragment = allFragments.find(\n (s) => s.meta.name.toLowerCase() === result.name.toLowerCase()\n );\n return fragment ? { fragment, score: result.score } : null;\n }).filter(Boolean) as Array<{ fragment: CompiledFragment; score: number }>;\n\n // Build component details for top matches\n const components = await Promise.all(\n topMatches.map(async ({ fragment: s, score }) => {\n const pkgName = await getPackageName(s.meta.name);\n const examples = s.variants.slice(0, 2).map((v) => ({\n variant: v.name,\n code: v.code ?? `<${s.meta.name} />`,\n }));\n const propsSummary = Object.entries(s.props ?? {}).slice(0, 10).map(\n ([pName, p]) => `${pName}${p.required ? ' (required)' : ''}: ${p.type}${p.values ? ` = ${p.values.join('|')}` : ''}`\n );\n return {\n name: s.meta.name,\n category: s.meta.category,\n description: s.meta.description,\n confidence: score >= 0.025 ? 'high' : score >= 0.015 ? 'medium' : 'low',\n import: `import { ${s.meta.name} } from '${pkgName}';`,\n props: propsSummary,\n examples,\n guidelines: filterPlaceholders(s.usage?.when).slice(0, 3),\n accessibility: s.usage?.accessibility?.slice(0, 2) ?? [],\n };\n })\n );\n\n // Map block results back to full block data\n const matchingBlocks = blockResults.map((result) => {\n const block = allBlocks.find(\n (b) => b.name.toLowerCase() === result.name.toLowerCase()\n );\n return block\n ? { name: block.name, description: block.description, components: block.components, code: block.code }\n : null;\n }).filter(Boolean) as Array<{ name: string; description: string; components: string[]; code: string }>;\n\n // Map token results to grouped format\n let relevantTokens: Record<string, string[]> | undefined;\n if (tokenResults.length > 0 && tokenData) {\n relevantTokens = {};\n for (const result of tokenResults) {\n // Find which category this token belongs to\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n if (tokens.some((t) => t.name === result.name)) {\n if (!relevantTokens[cat]) relevantTokens[cat] = [];\n relevantTokens[cat].push(result.name);\n break;\n }\n }\n }\n if (Object.keys(relevantTokens).length === 0) relevantTokens = undefined;\n }\n\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n useCase,\n components,\n blocks: matchingBlocks.length > 0 ? matchingBlocks : undefined,\n tokens: relevantTokens,\n noMatch: components.length === 0,\n summary: components.length > 0\n ? `Found ${components.length} component(s) for \"${useCase}\". ${matchingBlocks.length > 0 ? `Plus ${matchingBlocks.length} ready-to-use block(s).` : ''}`\n : `No components match \"${useCase}\". Try ${TOOL_NAMES.discover} with different terms${tokenData ? ` or ${TOOL_NAMES.tokens} for CSS variables` : ''}.`,\n }, null, 2),\n }],\n };\n }\n\n // ================================================================\n // RENDER — HTTP-only (no Playwright)\n // ================================================================\n case TOOL_NAMES.render: {\n const componentName = args?.component as string;\n const variantName = args?.variant as string | undefined;\n const props = (args?.props as Record<string, unknown>) ?? {};\n const viewport = args?.viewport as { width?: number; height?: number } | undefined;\n const figmaUrl = args?.figmaUrl as string | undefined;\n const threshold = (args?.threshold as number) ?? (figmaUrl ? 1.0 : 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 const viewerUrl = config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: 'Render requires a running Fragments dev server. Start it with `fragments dev` and pass --viewer-url, or use the CLI MCP server which includes Playwright.',\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 });\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 }, null, 2),\n });\n\n return { content };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to compare component: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running and FIGMA_ACCESS_TOKEN is set.`,\n }],\n isError: true,\n };\n }\n }\n\n // --- Default: pure render mode ---\n try {\n const result = await renderComponent(viewerUrl, {\n component: componentName,\n props,\n viewport: viewport ?? { width: 800, height: 600 },\n });\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} with props: ${JSON.stringify(props)}`,\n },\n ],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to render component: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // FIX — HTTP-only (no Playwright)\n // ================================================================\n case TOOL_NAMES.fix: {\n const data = await loadFragments();\n const componentName = args?.component as string;\n const variantName = (args?.variant as string) ?? undefined;\n const fixType = (args?.fixType as 'token' | 'all') ?? 'all';\n\n if (!componentName) {\n throw new Error('component is required');\n }\n\n const fragment = Object.values(data.fragments).find(\n (s) => s.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!fragment) {\n throw new Error(`Component \"${componentName}\" not found. Use fragments_discover to see available components.`);\n }\n\n const viewerUrl = config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: 'Fix requires a running Fragments dev server. Start it with `fragments dev` and pass --viewer-url.',\n }],\n isError: true,\n };\n }\n\n try {\n const result = await fixComponent(viewerUrl, {\n component: componentName,\n variant: variantName,\n fixType,\n });\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 fragments_render to confirm fixes.'\n : undefined,\n }, null, 2),\n }],\n };\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: `Failed to generate fixes: ${error instanceof Error ? error.message : 'Unknown error'}. Make sure the Fragments dev server is running.`,\n }],\n isError: true,\n };\n }\n }\n\n // ================================================================\n // A11Y — accessibility audit\n // ================================================================\n case TOOL_NAMES.a11y: {\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 const viewerUrl = config.viewerUrl;\n if (!viewerUrl) {\n return {\n content: [{\n type: 'text' as const,\n text: 'A11y audit requires a running Fragments dev server. Start it with `fragments dev` and pass --viewer-url.',\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 });\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 return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n component: componentName,\n variant: variantName ?? 'all',\n standard,\n score: result.score,\n aaCompliance: `${result.aaPercent}%`,\n aaaCompliance: `${result.aaaPercent}%`,\n passed: result.passed,\n results: result.results,\n nextStep: result.passed\n ? 'All accessibility checks passed. Consider running with standard: \"AAA\" for enhanced compliance.'\n : `Fix the violations above, then re-run ${TOOL_NAMES.a11y} to verify. Use ${TOOL_NAMES.fix} for automated fixes.`,\n }, null, 2),\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 // ================================================================\n // GRAPH — component relationship queries\n // ================================================================\n case TOOL_NAMES.graph: {\n const data = await loadFragments();\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 result = handleGraphTool(\n graphArgs,\n data.graph,\n data.blocks ?? data.recipes,\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\n default:\n throw new Error(`Unknown tool: ${name}`);\n }\n } catch (error) {\n return {\n content: [{\n type: 'text' as const,\n text: JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n }),\n }],\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 * Brand constants for easy rebranding if domain availability requires it.\n * All naming throughout the codebase should reference these constants.\n *\n * Inlined from @fragments-sdk/cli to avoid pulling in the full CLI dependency.\n */\nexport const BRAND = {\n /** Display name (e.g., \"Fragments\") */\n name: \"Fragments\",\n\n /** Lowercase name for file paths and CLI (e.g., \"fragments\") */\n nameLower: \"fragments\",\n\n /** File extension for fragment definition files (e.g., \".fragment.tsx\") */\n fileExtension: \".fragment.tsx\",\n\n /** Legacy file extension for segments (still supported for migration) */\n legacyFileExtension: \".segment.tsx\",\n\n /** JSON file extension for compiled output */\n jsonExtension: \".fragment.json\",\n\n /** Default output file name (e.g., \"fragments.json\") */\n outFile: \"fragments.json\",\n\n /** Config file name (e.g., \"fragments.config.ts\") */\n configFile: \"fragments.config.ts\",\n\n /** Legacy config file name (still supported for migration) */\n legacyConfigFile: \"segments.config.ts\",\n\n /** CLI command name (e.g., \"fragments\") */\n cliCommand: \"fragments\",\n\n /** Package scope (e.g., \"@fragments\") */\n packageScope: \"@fragments\",\n\n /** Directory for storing fragments, registry, and cache */\n dataDir: \".fragments\",\n\n /** Components subdirectory within .fragments/ */\n componentsDir: \"components\",\n\n /** Registry file name */\n registryFile: \"registry.json\",\n\n /** Context file name (AI-ready markdown) */\n contextFile: \"context.md\",\n\n /** Screenshots subdirectory */\n screenshotsDir: \"screenshots\",\n\n /** Cache subdirectory (gitignored) */\n cacheDir: \"cache\",\n\n /** Diff output subdirectory (gitignored) */\n diffDir: \"diff\",\n\n /** Manifest filename */\n manifestFile: \"manifest.json\",\n\n /** Prefix for localStorage keys (e.g., \"fragments-\") */\n storagePrefix: \"fragments-\",\n\n /** Static viewer HTML file name */\n viewerHtmlFile: \"fragments-viewer.html\",\n\n /** MCP tool name prefix (e.g., \"fragments_\") */\n mcpToolPrefix: \"fragments_\",\n\n /** File extension for block definition files */\n blockFileExtension: \".block.ts\",\n\n /** @deprecated Use blockFileExtension instead */\n recipeFileExtension: \".recipe.ts\",\n\n /** Vite plugin namespace */\n vitePluginNamespace: \"fragments-core-shim\",\n} as const;\n\nexport type Brand = typeof BRAND;\n\n/**\n * Default configuration values for the service.\n *\n * Inlined from @fragments-sdk/cli to avoid pulling in the full CLI dependency.\n */\nexport const DEFAULTS = {\n /** Default viewport dimensions */\n viewport: {\n width: 1280,\n height: 800,\n },\n\n /** Default diff threshold (percentage) */\n diffThreshold: 5,\n\n /** Browser pool size */\n poolSize: 3,\n\n /** Idle timeout before browser shutdown (ms) - 5 minutes */\n idleTimeoutMs: 5 * 60 * 1000,\n\n /** Delay after render before capture (ms) */\n captureDelayMs: 100,\n\n /** Font loading timeout (ms) */\n fontTimeoutMs: 3000,\n\n /** Default theme */\n theme: \"light\" as const,\n\n /** Dev server port */\n port: 6006,\n} as const;\n\nexport type Defaults = typeof DEFAULTS;\n","// src/generate/index.ts\nvar PLACEHOLDER_PATTERNS = [\n /^\\w+ component is needed$/i,\n /^Alternative component is more appropriate$/i,\n /^Use \\w+ when you need/i\n];\nfunction filterPlaceholders(items) {\n if (!items) return [];\n return items.filter(\n (item) => !PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(item.trim()))\n );\n}\nfunction generateContext(fragments, options = {}, blocks) {\n const format = options.format ?? \"markdown\";\n const compact = options.compact ?? false;\n const include = {\n props: options.include?.props ?? true,\n variants: options.include?.variants ?? true,\n usage: options.include?.usage ?? true,\n relations: options.include?.relations ?? false,\n code: options.include?.code ?? false\n };\n const sorted = [...fragments].sort((a, b) => {\n const catCompare = a.meta.category.localeCompare(b.meta.category);\n if (catCompare !== 0) return catCompare;\n return a.meta.name.localeCompare(b.meta.name);\n });\n if (format === \"json\") {\n return generateJsonContext(sorted, include, compact, blocks);\n }\n return generateMarkdownContext(sorted, include, compact, blocks);\n}\nfunction generateMarkdownContext(fragments, include, compact, blocks) {\n const lines = [];\n lines.push(\"# Design System Reference\");\n lines.push(\"\");\n lines.push(\"## Quick Reference\");\n lines.push(\"\");\n lines.push(\"| Component | Category | Use For |\");\n lines.push(\"|-----------|----------|---------|\");\n for (const fragment of fragments) {\n const filteredWhen = filterPlaceholders(fragment.usage.when);\n const useFor = filteredWhen.slice(0, 2).join(\", \") || fragment.meta.description;\n lines.push(`| ${fragment.meta.name} | ${fragment.meta.category} | ${truncate(useFor, 50)} |`);\n }\n lines.push(\"\");\n if (compact) {\n const content2 = lines.join(\"\\n\");\n return { content: content2, tokenEstimate: estimateTokens(content2) };\n }\n lines.push(\"## Components\");\n lines.push(\"\");\n for (const fragment of fragments) {\n lines.push(`### ${fragment.meta.name}`);\n lines.push(\"\");\n const statusParts = [`**Category:** ${fragment.meta.category}`];\n if (fragment.meta.status) {\n statusParts.push(`**Status:** ${fragment.meta.status}`);\n }\n lines.push(statusParts.join(\" | \"));\n lines.push(\"\");\n if (fragment.meta.description) {\n lines.push(fragment.meta.description);\n lines.push(\"\");\n }\n const whenFiltered = filterPlaceholders(fragment.usage.when);\n const whenNotFiltered = filterPlaceholders(fragment.usage.whenNot);\n if (include.usage && (whenFiltered.length > 0 || whenNotFiltered.length > 0)) {\n if (whenFiltered.length > 0) {\n lines.push(\"**When to use:**\");\n for (const when of whenFiltered) {\n lines.push(`- ${when}`);\n }\n lines.push(\"\");\n }\n if (whenNotFiltered.length > 0) {\n lines.push(\"**When NOT to use:**\");\n for (const whenNot of whenNotFiltered) {\n lines.push(`- ${whenNot}`);\n }\n lines.push(\"\");\n }\n }\n if (include.props && Object.keys(fragment.props).length > 0) {\n lines.push(\"**Props:**\");\n for (const [name, prop] of Object.entries(fragment.props)) {\n lines.push(`- \\`${name}\\`: ${formatPropType(prop)}${prop.required ? \" (required)\" : \"\"}`);\n }\n lines.push(\"\");\n }\n if (include.variants && fragment.variants.length > 0) {\n const variantNames = fragment.variants.map((v) => v.name).join(\", \");\n lines.push(`**Variants:** ${variantNames}`);\n lines.push(\"\");\n if (include.code) {\n for (const variant of fragment.variants) {\n if (variant.code) {\n lines.push(`*${variant.name}:*`);\n lines.push(\"```tsx\");\n lines.push(variant.code);\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n }\n }\n if (include.relations && fragment.relations && fragment.relations.length > 0) {\n lines.push(\"**Related:**\");\n for (const relation of fragment.relations) {\n lines.push(`- ${relation.component} (${relation.relationship}): ${relation.note}`);\n }\n lines.push(\"\");\n }\n lines.push(\"---\");\n lines.push(\"\");\n }\n if (blocks && blocks.length > 0) {\n lines.push(\"## Blocks\");\n lines.push(\"\");\n lines.push(\"Composition patterns showing how components wire together.\");\n lines.push(\"\");\n for (const block of blocks) {\n lines.push(`### ${block.name}`);\n lines.push(\"\");\n lines.push(block.description);\n lines.push(\"\");\n lines.push(`**Category:** ${block.category}`);\n lines.push(`**Components:** ${block.components.join(\", \")}`);\n if (block.tags && block.tags.length > 0) {\n lines.push(`**Tags:** ${block.tags.join(\", \")}`);\n }\n lines.push(\"\");\n lines.push(\"```tsx\");\n lines.push(block.code);\n lines.push(\"```\");\n lines.push(\"\");\n lines.push(\"---\");\n lines.push(\"\");\n }\n }\n const content = lines.join(\"\\n\");\n return { content, tokenEstimate: estimateTokens(content) };\n}\nfunction generateJsonContext(fragments, include, compact, blocks) {\n const categories = [...new Set(fragments.map((s) => s.meta.category))].sort();\n const components = {};\n for (const fragment of fragments) {\n const component = {\n category: fragment.meta.category,\n description: fragment.meta.description\n };\n if (fragment.meta.status) {\n component.status = fragment.meta.status;\n }\n if (!compact) {\n if (include.usage) {\n const whenFiltered = filterPlaceholders(fragment.usage.when);\n const whenNotFiltered = filterPlaceholders(fragment.usage.whenNot);\n if (whenFiltered.length > 0) component.whenToUse = whenFiltered;\n if (whenNotFiltered.length > 0) component.whenNotToUse = whenNotFiltered;\n }\n if (include.props && Object.keys(fragment.props).length > 0) {\n component.props = {};\n for (const [name, prop] of Object.entries(fragment.props)) {\n component.props[name] = {\n type: formatPropType(prop),\n description: prop.description\n };\n if (prop.required) component.props[name].required = true;\n if (prop.default !== void 0) component.props[name].default = prop.default;\n }\n }\n if (include.variants && fragment.variants.length > 0) {\n component.variants = fragment.variants.map((v) => v.name);\n }\n if (include.relations && fragment.relations && fragment.relations.length > 0) {\n component.relations = fragment.relations.map((r) => ({\n component: r.component,\n relationship: r.relationship,\n note: r.note\n }));\n }\n }\n components[fragment.meta.name] = component;\n }\n const blocksMap = blocks && blocks.length > 0 ? Object.fromEntries(blocks.map((b) => [b.name, {\n description: b.description,\n category: b.category,\n components: b.components,\n code: b.code,\n tags: b.tags\n }])) : void 0;\n const output = {\n version: \"1.0\",\n generatedAt: (/* @__PURE__ */ new Date()).toISOString(),\n summary: {\n totalComponents: fragments.length,\n categories,\n ...blocksMap && { totalBlocks: blocks.length }\n },\n components,\n ...blocksMap && { blocks: blocksMap }\n };\n const content = JSON.stringify(output, null, 2);\n return { content, tokenEstimate: estimateTokens(content) };\n}\nfunction formatPropType(prop) {\n if (prop.type === \"enum\" && prop.values) {\n return prop.values.map((v) => `\"${v}\"`).join(\" | \");\n }\n if (prop.default !== void 0) {\n return `${prop.type} (default: ${JSON.stringify(prop.default)})`;\n }\n return prop.type;\n}\nfunction truncate(str, maxLength) {\n if (str.length <= maxLength) return str;\n return str.slice(0, maxLength - 3) + \"...\";\n}\nfunction estimateTokens(text) {\n return Math.ceil(text.length / 4);\n}\n\nexport {\n PLACEHOLDER_PATTERNS,\n filterPlaceholders,\n generateContext\n};\n","// src/mcp-tools/index.ts\nvar MCP_TOOL_DEFINITIONS = [\n {\n key: \"discover\",\n description: \"Discover components in the design system. Use with no params to list all components. Use 'useCase' for AI-powered suggestions. Use 'component' to find alternatives. Use 'compact' for a token-efficient overview.\",\n params: {\n useCase: {\n type: \"string\",\n description: 'Description of what you want to build \\u2014 returns ranked suggestions (e.g., \"form for user email input\", \"button to submit data\")'\n },\n component: {\n type: \"string\",\n description: 'Component name to find alternatives for (e.g., \"Button\")'\n },\n category: {\n type: \"string\",\n description: 'Filter by category (e.g., \"actions\", \"forms\", \"layout\")'\n },\n search: {\n type: \"string\",\n description: \"Search term to filter by name, description, or tags\"\n },\n status: {\n type: \"string\",\n enum: [\"stable\", \"beta\", \"deprecated\", \"experimental\"],\n description: \"Filter by component status\"\n },\n format: {\n type: \"string\",\n enum: [\"markdown\", \"json\"],\n description: \"Output format for context mode (default: markdown)\"\n },\n compact: {\n type: \"boolean\",\n description: \"If true, returns minimal output (just component names and categories)\"\n },\n includeCode: {\n type: \"boolean\",\n description: \"If true, includes code examples for each variant\"\n },\n includeRelations: {\n type: \"boolean\",\n description: \"If true, includes component relationships\"\n }\n }\n },\n {\n key: \"inspect\",\n description: \"Get detailed information about a specific component: props, usage guidelines, code examples, accessibility \\u2014 all in one call. Use 'fields' to request only specific data for token efficiency.\",\n params: {\n component: {\n type: \"string\",\n description: 'Component name (e.g., \"Button\", \"Input\")'\n },\n fields: {\n type: \"array\",\n items: { type: \"string\" },\n description: 'Specific fields to return (e.g., [\"meta\", \"usage.when\", \"contract.propsSummary\", \"props\", \"examples\", \"guidelines\"]). If omitted, returns everything. Supports dot notation.'\n },\n variant: {\n type: \"string\",\n description: 'Filter examples to a specific variant name (e.g., \"Default\", \"Primary\")'\n },\n maxExamples: {\n type: \"number\",\n description: \"Maximum number of code examples to return (default: all)\"\n },\n maxLines: {\n type: \"number\",\n description: \"Maximum lines per code example (truncates longer examples)\"\n }\n },\n required: [\"component\"]\n },\n {\n key: \"blocks\",\n description: 'Search and retrieve composition blocks \\u2014 named patterns showing how design system components wire together for common use cases (e.g., \"Login Form\", \"Settings Page\"). Returns the block with its code pattern.',\n params: {\n name: {\n type: \"string\",\n description: 'Exact block name to retrieve (e.g., \"Login Form\")'\n },\n search: {\n type: \"string\",\n description: \"Free-text search across block names, descriptions, tags, and components\"\n },\n component: {\n type: \"string\",\n description: 'Filter blocks that use a specific component (e.g., \"Button\")'\n },\n category: {\n type: \"string\",\n description: 'Filter by category (e.g., \"authentication\", \"marketing\", \"dashboard\", \"settings\", \"ecommerce\", \"ai\")'\n }\n }\n },\n {\n key: \"tokens\",\n description: \"List available CSS design tokens (custom properties) by category. Use this when you need to style custom elements or override defaults \\u2014 no more guessing variable names. Filter by category or search by keyword.\",\n params: {\n category: {\n type: \"string\",\n description: 'Filter by category (e.g., \"colors\", \"spacing\", \"typography\", \"surfaces\", \"shadows\", \"radius\", \"borders\", \"text\", \"focus\", \"layout\", \"code\", \"component-sizing\")'\n },\n search: {\n type: \"string\",\n description: 'Search token names (e.g., \"accent\", \"hover\", \"padding\")'\n }\n }\n },\n {\n key: \"implement\",\n description: \"One-shot implementation helper. Describe what you want to build and get everything needed in a single call: best-matching component(s) with full props and code examples, relevant composition blocks, and applicable CSS tokens. Saves multiple round-trips.\",\n params: {\n useCase: {\n type: \"string\",\n description: 'What you want to implement (e.g., \"login form\", \"data table with sorting\", \"streaming chat messages\")'\n }\n },\n required: [\"useCase\"]\n },\n {\n key: \"render\",\n description: \"Render a component and return a screenshot. Optionally compare against a Figma design ('figmaUrl'). Requires a running Fragments dev server (viewer URL). Use this to verify your implementation looks correct.\",\n params: {\n component: {\n type: \"string\",\n description: 'Component name (e.g., \"Button\", \"Card\", \"Input\")'\n },\n props: {\n type: \"object\",\n description: 'Props to pass to the component (e.g., { \"variant\": \"primary\", \"children\": \"Click me\" })'\n },\n viewport: {\n type: \"object\",\n properties: {\n width: {\n type: \"number\",\n description: \"Viewport width (default: 800)\"\n },\n height: {\n type: \"number\",\n description: \"Viewport height (default: 600)\"\n }\n },\n description: \"Optional viewport size for the render\"\n },\n figmaUrl: {\n type: \"string\",\n description: \"Figma frame URL \\u2014 if provided, compares the render against the Figma design\"\n },\n variant: {\n type: \"string\",\n description: \"Variant name for compare mode\"\n },\n threshold: {\n type: \"number\",\n description: \"Diff threshold percentage (default: 1 for Figma)\"\n }\n },\n required: [\"component\"]\n },\n {\n key: \"fix\",\n description: \"Generate patches to fix token compliance issues in a component. Returns unified diff patches that replace hardcoded CSS values with design token references. Requires a running Fragments dev server.\",\n params: {\n component: {\n type: \"string\",\n description: 'Component name to generate fixes for (e.g., \"Button\", \"Card\")'\n },\n variant: {\n type: \"string\",\n description: \"Specific variant to fix (optional, fixes all variants if omitted)\"\n },\n fixType: {\n type: \"string\",\n enum: [\"token\", \"all\"],\n description: 'Type of fixes to generate: \"token\" for hardcoded\\u2192token replacements, \"all\" for all available fixes (default: \"all\")'\n }\n },\n required: [\"component\"]\n },\n {\n key: \"graph\",\n description: 'Query the component relationship graph. Understand dependencies, impact analysis, composition trees, alternatives, and design system health. Use \"health\" for an overview, \"dependencies\"/\"dependents\" for direct relationships, \"impact\" for change analysis, \"composition\" for compound component trees.',\n params: {\n mode: {\n type: \"string\",\n enum: [\"dependencies\", \"dependents\", \"impact\", \"path\", \"composition\", \"alternatives\", \"islands\", \"health\"],\n description: \"Query mode\"\n },\n component: {\n type: \"string\",\n description: \"Component name (required for most modes)\"\n },\n target: {\n type: \"string\",\n description: 'Target component for \"path\" mode'\n },\n edgeTypes: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Filter by edge types (imports, hook-depends, renders, composes, parent-of, alternative-to, sibling-of)\"\n },\n maxDepth: {\n type: \"number\",\n description: \"Max traversal depth for impact mode (default: 3)\"\n }\n },\n required: [\"mode\"]\n },\n {\n key: \"a11y\",\n description: \"Run an accessibility audit on a component. Returns axe-core violations, a WCAG compliance score, and optional fix suggestions. Requires a running Fragments dev server.\",\n params: {\n component: {\n type: \"string\",\n description: 'Component name to audit (e.g., \"Button\", \"Card\")'\n },\n variant: {\n type: \"string\",\n description: \"Specific variant to audit (optional, audits all variants if omitted)\"\n },\n standard: {\n type: \"string\",\n enum: [\"AA\", \"AAA\"],\n description: \"WCAG compliance level to check against (default: AA)\"\n },\n includeFixPatches: {\n type: \"boolean\",\n description: \"If true, includes auto-fix suggestions for each violation\"\n }\n },\n required: [\"component\"]\n }\n];\nvar CLI_TOOL_EXTENSIONS = [\n {\n key: \"render\",\n description: \"Render a component and return a screenshot. Optionally compare against a stored baseline ('baseline: true') or against a Figma design ('figmaUrl'). Use this to verify your implementation looks correct.\",\n params: {\n baseline: {\n type: \"boolean\",\n description: \"If true, compares the render against the stored baseline screenshot (requires variant)\"\n },\n theme: {\n type: \"string\",\n enum: [\"light\", \"dark\"],\n description: \"Theme for baseline verification (default: light)\"\n }\n }\n },\n {\n key: \"fix\",\n description: \"Generate patches to fix token compliance issues in a component. Returns unified diff patches that replace hardcoded CSS values with design token references. Use this after fragments_render identifies issues to automatically fix them.\",\n params: {}\n }\n];\nfunction buildToolNames(prefix) {\n const map = {};\n for (const def of MCP_TOOL_DEFINITIONS) {\n map[def.key] = `${prefix}_${def.key}`;\n }\n return map;\n}\nfunction buildMcpTools(prefix, extensions) {\n const extMap = /* @__PURE__ */ new Map();\n if (extensions) {\n for (const ext of extensions) {\n extMap.set(ext.key, ext);\n }\n }\n return MCP_TOOL_DEFINITIONS.map((def) => {\n const ext = extMap.get(def.key);\n const mergedParams = ext ? { ...def.params, ...ext.params } : def.params;\n const properties = {};\n for (const [name, param] of Object.entries(mergedParams)) {\n const prop = {\n type: param.type,\n description: param.description\n };\n if (param.enum) prop.enum = param.enum;\n if (param.items) prop.items = param.items;\n if (param.properties) {\n const nested = {};\n for (const [k, v] of Object.entries(param.properties)) {\n nested[k] = { type: v.type, description: v.description };\n }\n prop.properties = nested;\n }\n properties[name] = prop;\n }\n return {\n name: `${prefix}_${def.key}`,\n description: ext?.description ?? def.description,\n inputSchema: {\n type: \"object\",\n properties,\n ...def.required && { required: def.required }\n }\n };\n });\n}\n\nexport {\n MCP_TOOL_DEFINITIONS,\n CLI_TOOL_EXTENSIONS,\n buildToolNames,\n buildMcpTools\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 \"fragments\" field.\n */\nfunction findFragmentsInDeps(dir: string, found: string[]): void {\n const pkgJsonPath = join(dir, 'package.json');\n if (!existsSync(pkgJsonPath)) return;\n\n try {\n const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'));\n const allDeps = {\n ...pkgJson.dependencies,\n ...pkgJson.devDependencies,\n };\n const localRequire = createRequire(join(dir, 'noop.js'));\n for (const depName of Object.keys(allDeps)) {\n try {\n const depPkgPath = resolveDepPackageJson(localRequire, depName);\n if (!depPkgPath) continue;\n const depPkg = JSON.parse(readFileSync(depPkgPath, 'utf-8'));\n if (depPkg.fragments) {\n const fragmentsPath = join(dirname(depPkgPath), depPkg.fragments);\n if (existsSync(fragmentsPath) && !found.includes(fragmentsPath)) {\n found.push(fragmentsPath);\n }\n }\n } catch {\n // Package not resolvable or unreadable, skip\n }\n }\n } catch {\n // No package.json or unreadable\n }\n}\n\n/**\n * Find fragments.json files:\n * 1. Walk up from startDir (for library authors with a local build)\n * 2. Read package.json deps and resolve packages with a \"fragments\" field\n * 3. Check workspace packages' deps (monorepo support)\n *\n * Uses Node.js module resolution (createRequire) to handle all package\n * managers: pnpm symlinks, yarn PnP, monorepo hoisting, etc.\n */\nexport function findFragmentsJson(startDir: string): string[] {\n const found: string[] = [];\n const resolvedStart = resolve(startDir);\n\n // 1. Walk upward from startDir (library author flow)\n let dir = resolvedStart;\n while (true) {\n const candidate = join(dir, BRAND.outFile);\n if (existsSync(candidate)) {\n found.push(candidate);\n break;\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n // 2. Check root package.json deps\n findFragmentsInDeps(resolvedStart, found);\n\n // 3. Check workspace packages' deps (monorepo support)\n if (found.length === 0 || existsSync(join(resolvedStart, 'pnpm-workspace.yaml'))) {\n const workspaceDirs = getWorkspaceDirs(resolvedStart);\n for (const wsDir of workspaceDirs) {\n findFragmentsInDeps(wsDir, found);\n }\n }\n\n return found;\n}\n","/**\n * Hybrid search: Convex-backed vector search + local keyword scoring + RRF fusion.\n *\n * This module powers semantic discovery in the MCP server for components,\n * blocks, and tokens. It combines two search strategies:\n * 1. Vector search via our hosted Convex backend (handles embedding server-side)\n * 2. Local keyword scoring against loaded fragments.json\n *\n * Results are fused using Reciprocal Rank Fusion (RRF) for best-of-both-worlds ranking.\n * If Convex is unreachable (offline), falls back silently to keyword-only.\n */\n\nimport type { CompiledFragment, CompiledBlock, CompiledTokenData } from '@fragments-sdk/context/types';\nimport type { SerializedComponentGraph } from '@fragments-sdk/context/graph';\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// Synonym map for keyword expansion\n// ---------------------------------------------------------------------------\n\nconst 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 'alert': ['notification', 'message', 'warning', 'error', 'feedback'],\n 'notification': ['alert', 'message', 'toast'],\n 'card': ['container', 'panel', 'box', 'content'],\n 'toggle': ['switch', 'checkbox', 'boolean', 'on/off'],\n 'switch': ['toggle', 'checkbox', 'boolean'],\n 'badge': ['tag', 'label', 'status', 'indicator'],\n 'status': ['badge', 'indicator', 'state'],\n 'login': ['auth', 'signin', 'authentication', 'form'],\n 'auth': ['login', 'signin', 'authentication'],\n 'chat': ['message', 'conversation', 'ai'],\n 'table': ['data', 'grid', 'list', 'rows'],\n};\n\n// ---------------------------------------------------------------------------\n// Vector search via Convex\n// ---------------------------------------------------------------------------\n\n/**\n * Call our hosted Convex HTTP action for vector-based search.\n * The Convex backend embeds the query server-side using our Voyage API key.\n *\n * @param kind - Optional filter to only search components, blocks, or tokens\n * Returns an empty array if Convex is unreachable (offline, timeout, error).\n */\nexport async function searchConvex(\n query: 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: { 'Content-Type': 'application/json' },\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 keyword scoring — components\n// ---------------------------------------------------------------------------\n\n/**\n * Score components against a query using weighted keyword matching.\n */\nexport function keywordScoreComponents(\n query: string,\n fragments: CompiledFragment[]\n): ScoredResult[] {\n const searchTerms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n\n const expandedTerms = new Set(searchTerms);\n for (const term of searchTerms) {\n const synonyms = SYNONYM_MAP[term];\n if (synonyms) {\n for (const syn of synonyms) expandedTerms.add(syn);\n }\n }\n\n const scored = fragments.map((s) => {\n let score = 0;\n\n const nameLower = s.meta.name.toLowerCase();\n if (searchTerms.some((term) => nameLower.includes(term))) {\n score += 15;\n } else if (Array.from(expandedTerms).some((term) => nameLower.includes(term))) {\n score += 8;\n }\n\n const desc = s.meta.description?.toLowerCase() ?? '';\n score += searchTerms.filter((term) => desc.includes(term)).length * 6;\n\n const tags = s.meta.tags?.map((t) => t.toLowerCase()) ?? [];\n score += searchTerms.filter((term) => tags.some((tag) => tag.includes(term))).length * 4;\n\n const whenUsed = s.usage?.when?.join(' ').toLowerCase() ?? '';\n score += searchTerms.filter((term) => whenUsed.includes(term)).length * 10;\n\n score += Array.from(expandedTerms)\n .filter((term) => !searchTerms.includes(term) && whenUsed.includes(term)).length * 5;\n\n const cat = s.meta.category?.toLowerCase() ?? '';\n if (searchTerms.some((term) => cat.includes(term))) {\n score += 8;\n }\n\n const variantText = s.variants\n .map(v => `${v.name} ${v.description || ''}`.toLowerCase())\n .join(' ');\n score += searchTerms.filter(term => variantText.includes(term)).length * 3;\n\n if (s.meta.status === 'stable') score += 5;\n else if (s.meta.status === 'beta') score += 2;\n if (s.meta.status === 'deprecated') score -= 25;\n\n return { name: s.meta.name, kind: 'component' as EntryKind, score };\n });\n\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((s, i) => ({ ...s, rank: i }));\n}\n\n// ---------------------------------------------------------------------------\n// Local keyword scoring — blocks\n// ---------------------------------------------------------------------------\n\n/**\n * Score blocks against a query using keyword matching.\n */\nexport function keywordScoreBlocks(\n query: string,\n blocks: CompiledBlock[]\n): ScoredResult[] {\n const searchTerms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n\n const expandedTerms = new Set(searchTerms);\n for (const term of searchTerms) {\n const synonyms = SYNONYM_MAP[term];\n if (synonyms) {\n for (const syn of synonyms) expandedTerms.add(syn);\n }\n }\n\n const scored = blocks.map((b) => {\n let score = 0;\n\n const nameLower = b.name.toLowerCase();\n if (searchTerms.some((term) => nameLower.includes(term))) {\n score += 15;\n } else if (Array.from(expandedTerms).some((term) => nameLower.includes(term))) {\n score += 8;\n }\n\n const desc = b.description.toLowerCase();\n score += searchTerms.filter((term) => desc.includes(term)).length * 6;\n\n const tags = b.tags?.map((t) => t.toLowerCase()) ?? [];\n score += searchTerms.filter((term) => tags.some((tag) => tag.includes(term))).length * 4;\n\n const componentText = b.components.join(' ').toLowerCase();\n score += searchTerms.filter((term) => componentText.includes(term)).length * 5;\n\n const cat = b.category.toLowerCase();\n if (searchTerms.some((term) => cat.includes(term))) {\n score += 8;\n }\n\n return { name: b.name, kind: 'block' as EntryKind, score };\n });\n\n return scored\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score)\n .map((s, i) => ({ ...s, rank: i }));\n}\n\n// ---------------------------------------------------------------------------\n// Local keyword scoring — tokens\n// ---------------------------------------------------------------------------\n\n/**\n * Score tokens against a query using keyword matching on name and category.\n */\nexport function keywordScoreTokens(\n query: string,\n tokenData: CompiledTokenData\n): ScoredResult[] {\n const searchTerms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n\n const scored: Array<{ name: string; kind: EntryKind; score: number }> = [];\n\n for (const [cat, tokens] of Object.entries(tokenData.categories)) {\n const catLower = cat.toLowerCase();\n const catBonus = searchTerms.some((term) => catLower.includes(term)) ? 8 : 0;\n\n for (const token of tokens) {\n let score = catBonus;\n\n const nameLower = token.name.toLowerCase();\n score += searchTerms.filter((term) => nameLower.includes(term)).length * 10;\n\n if (token.description) {\n const descLower = token.description.toLowerCase();\n score += searchTerms.filter((term) => descLower.includes(term)).length * 6;\n }\n\n if (score > 0) {\n scored.push({ name: token.name, kind: 'token', score });\n }\n }\n }\n\n return scored\n .sort((a, b) => b.score - a.score)\n .map((s, i) => ({ ...s, rank: i }));\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: CompiledFragment[];\n blocks?: CompiledBlock[];\n tokenData?: CompiledTokenData;\n /** Serialized component graph for neighbor boosting */\n graph?: SerializedComponentGraph;\n}\n\n/**\n * Hybrid search combining Convex vector search and local keyword scoring.\n *\n * Searches across components, blocks, and tokens simultaneously.\n * Results include a `kind` field so callers can route them appropriately.\n *\n * If Convex is unreachable, silently falls back to keyword-only.\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): Promise<ScoredResult[]> {\n // Build local keyword results based on requested kind(s)\n const keywordResults: ScoredResult[] = [];\n\n if (!kind || kind === 'component') {\n keywordResults.push(...keywordScoreComponents(query, data.fragments));\n }\n if ((!kind || kind === 'block') && data.blocks) {\n keywordResults.push(...keywordScoreBlocks(query, data.blocks));\n }\n if ((!kind || kind === 'token') && data.tokenData) {\n keywordResults.push(...keywordScoreTokens(query, data.tokenData));\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 // Fire vector search in parallel\n const vectorResults = await searchConvex(query, 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 (graph neighbors get 0.5x weight via smaller k)\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 * 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 RenderRequest {\n component: string;\n props?: Record<string, unknown>;\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}\n\nexport interface A11yResult {\n component: string;\n results: A11yVariantResult[];\n score: number;\n aaPercent: number;\n aaaPercent: number;\n passed: 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): Promise<RenderResult> {\n const renderUrl = `${viewerUrl}/fragments/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 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): Promise<CompareResult> {\n const compareUrl = `${viewerUrl}/fragments/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): Promise<FixResult> {\n const fixUrl = `${viewerUrl}/fragments/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): Promise<A11yResult> {\n const a11yUrl = `${viewerUrl}/fragments/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 }),\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 // AA = no critical/serious\n const totalViolations = totalCritical + totalSerious + totalModerate + totalMinor;\n const aaPass = totalCritical === 0 && totalSerious === 0;\n const aaaPass = totalViolations === 0;\n const aaPercent = aaPass ? 100 : 0;\n const aaaPercent = aaaPass ? 100 : 0;\n\n const passed = standard === 'AAA' ? aaaPass : aaPass;\n\n return {\n component: request.component,\n results,\n score,\n aaPercent,\n aaaPercent,\n passed,\n standard,\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","/**\n * MCP tool handler for the fragments_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 ComponentGraph,\n} from '@fragments-sdk/context/graph';\nimport type { CompiledBlock } from '@fragments-sdk/context/types';\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, CompiledBlock>,\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 return {\n text: JSON.stringify({\n mode: 'health',\n ...health,\n summary: `${health.nodeCount} components, ${health.edgeCount} edges, ${health.connectedComponents.length} island(s), ${health.orphans.length} orphan(s), ${health.compositionCoverage}% in blocks`,\n }, null, 2),\n };\n }\n\n 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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), 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 }, null, 2),\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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), 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 }, null, 2),\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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), 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 }, null, 2),\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 }, null, 2),\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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), isError: true };\n }\n const tree = engine.composition(args.component);\n return {\n text: JSON.stringify({\n mode: 'composition',\n ...tree,\n }, null, 2),\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 return { text: JSON.stringify({ error: `Component \"${args.component}\" not found in graph` }), 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 }, null, 2),\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 }, null, 2),\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"],"mappings":"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","names":["existsSync","readFileSync","join","ComponentGraphEngine","deserializeGraph","join","existsSync","readFileSync","fragments"]}
|