@fragments-sdk/mcp 0.5.4 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +2 -2
- package/dist/{chunk-WXUZ55XQ.js → chunk-IEJ7ZYTZ.js} +9 -6
- package/dist/chunk-IEJ7ZYTZ.js.map +1 -0
- package/dist/{chunk-LASUFXDO.js → chunk-WEHZRM4L.js} +25 -10
- package/dist/chunk-WEHZRM4L.js.map +1 -0
- package/dist/{graph-6PMJ6XCF.js → graph-UWOAWP4T.js} +2 -2
- package/dist/server.js +2 -2
- package/package.json +2 -2
- package/dist/chunk-LASUFXDO.js.map +0 -1
- package/dist/chunk-WXUZ55XQ.js.map +0 -1
- /package/dist/{graph-6PMJ6XCF.js.map → graph-UWOAWP4T.js.map} +0 -0
package/dist/bin.js
CHANGED
|
@@ -201,7 +201,7 @@ var ComponentGraphEngine = class {
|
|
|
201
201
|
const node = this.nodes.get(component);
|
|
202
202
|
const subComponents = node?.subComponents ?? [];
|
|
203
203
|
const parentEdges = (this.outgoing.get(component) ?? []).filter((e) => e.type === "parent-of");
|
|
204
|
-
const
|
|
204
|
+
const children = parentEdges.map((e) => e.target);
|
|
205
205
|
const childEdges = (this.incoming.get(component) ?? []).filter((e) => e.type === "parent-of");
|
|
206
206
|
const parent = childEdges.length > 0 ? childEdges[0].source : void 0;
|
|
207
207
|
const siblings = [];
|
|
@@ -225,22 +225,25 @@ var ComponentGraphEngine = class {
|
|
|
225
225
|
component,
|
|
226
226
|
compositionPattern: node?.compositionPattern,
|
|
227
227
|
subComponents,
|
|
228
|
-
|
|
228
|
+
children,
|
|
229
229
|
parent,
|
|
230
230
|
siblings,
|
|
231
231
|
blocks: this.blockIndex.get(component) ?? []
|
|
232
232
|
};
|
|
233
233
|
}
|
|
234
|
-
/** Get alternative components */
|
|
234
|
+
/** Get alternative components (deduplicated for bidirectional edges) */
|
|
235
235
|
alternatives(component) {
|
|
236
|
+
const seen = /* @__PURE__ */ new Set();
|
|
236
237
|
const alts = [];
|
|
237
238
|
for (const edge of this.outgoing.get(component) ?? []) {
|
|
238
|
-
if (edge.type === "alternative-to") {
|
|
239
|
+
if (edge.type === "alternative-to" && !seen.has(edge.target)) {
|
|
240
|
+
seen.add(edge.target);
|
|
239
241
|
alts.push({ component: edge.target, note: edge.note });
|
|
240
242
|
}
|
|
241
243
|
}
|
|
242
244
|
for (const edge of this.incoming.get(component) ?? []) {
|
|
243
|
-
if (edge.type === "alternative-to") {
|
|
245
|
+
if (edge.type === "alternative-to" && !seen.has(edge.source)) {
|
|
246
|
+
seen.add(edge.source);
|
|
244
247
|
alts.push({ component: edge.source, note: edge.note });
|
|
245
248
|
}
|
|
246
249
|
}
|
|
@@ -383,4 +386,4 @@ export {
|
|
|
383
386
|
serializeGraph,
|
|
384
387
|
deserializeGraph
|
|
385
388
|
};
|
|
386
|
-
//# sourceMappingURL=chunk-
|
|
389
|
+
//# sourceMappingURL=chunk-IEJ7ZYTZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../context/dist/graph/index.js"],"sourcesContent":["// src/graph/types.ts\nvar GRAPH_EDGE_TYPES = [\n \"imports\",\n \"hook-depends\",\n \"renders\",\n \"composes\",\n \"parent-of\",\n \"alternative-to\",\n \"sibling-of\"\n];\nvar EDGE_TYPE_WEIGHTS = {\n \"imports\": 1,\n \"hook-depends\": 0.75,\n \"renders\": 0.5,\n \"composes\": 0.5,\n \"parent-of\": 1,\n \"alternative-to\": 1,\n \"sibling-of\": 0.75\n};\n\n// src/graph/engine.ts\nvar ComponentGraphEngine = class {\n nodes;\n outgoing;\n incoming;\n edges;\n blockIndex;\n health;\n constructor(graph, blocks) {\n this.nodes = /* @__PURE__ */ new Map();\n this.outgoing = /* @__PURE__ */ new Map();\n this.incoming = /* @__PURE__ */ new Map();\n this.edges = graph.edges;\n this.health = graph.health;\n this.blockIndex = /* @__PURE__ */ new Map();\n for (const node of graph.nodes) {\n this.nodes.set(node.name, node);\n this.outgoing.set(node.name, []);\n this.incoming.set(node.name, []);\n }\n for (const edge of graph.edges) {\n const out = this.outgoing.get(edge.source);\n if (out) out.push(edge);\n else this.outgoing.set(edge.source, [edge]);\n const inc = this.incoming.get(edge.target);\n if (inc) inc.push(edge);\n else this.incoming.set(edge.target, [edge]);\n }\n if (blocks) {\n for (const [blockName, block] of Object.entries(blocks)) {\n for (const comp of block.components) {\n const existing = this.blockIndex.get(comp);\n if (existing) existing.push(blockName);\n else this.blockIndex.set(comp, [blockName]);\n }\n }\n }\n }\n // -------------------------------------------------------------------------\n // Core queries\n // -------------------------------------------------------------------------\n /** Get outgoing edges from a component, optionally filtered by edge type */\n dependencies(component, edgeTypes) {\n const edges = this.outgoing.get(component) ?? [];\n if (!edgeTypes || edgeTypes.length === 0) return edges;\n return edges.filter((e) => edgeTypes.includes(e.type));\n }\n /** Get incoming edges to a component, optionally filtered by edge type */\n dependents(component, edgeTypes) {\n const edges = this.incoming.get(component) ?? [];\n if (!edgeTypes || edgeTypes.length === 0) return edges;\n return edges.filter((e) => edgeTypes.includes(e.type));\n }\n /** BFS transitive closure — what's affected if this component changes */\n impact(component, maxDepth = 3) {\n const affected = [];\n const visited = /* @__PURE__ */ new Set([component]);\n const queue = [\n { name: component, depth: 0, path: [component] }\n ];\n while (queue.length > 0) {\n const current = queue.shift();\n if (current.depth >= maxDepth) continue;\n const deps = this.incoming.get(current.name) ?? [];\n for (const edge of deps) {\n if (visited.has(edge.source)) continue;\n visited.add(edge.source);\n const newPath = [...current.path, edge.source];\n affected.push({\n component: edge.source,\n depth: current.depth + 1,\n path: newPath,\n edgeType: edge.type\n });\n queue.push({ name: edge.source, depth: current.depth + 1, path: newPath });\n }\n }\n const affectedComponents = /* @__PURE__ */ new Set([component, ...affected.map((a) => a.component)]);\n const affectedBlocks = /* @__PURE__ */ new Set();\n for (const comp of affectedComponents) {\n const blocks = this.blockIndex.get(comp);\n if (blocks) {\n for (const b of blocks) affectedBlocks.add(b);\n }\n }\n return {\n component,\n affected,\n affectedBlocks: [...affectedBlocks],\n totalAffected: affected.length\n };\n }\n /** BFS shortest path between two components (undirected) */\n path(from, to) {\n if (from === to) {\n return { found: true, path: [from], edges: [] };\n }\n const visited = /* @__PURE__ */ new Set([from]);\n const queue = [\n { name: from, path: [from], edges: [] }\n ];\n while (queue.length > 0) {\n const current = queue.shift();\n const allEdges = [\n ...this.outgoing.get(current.name) ?? [],\n ...this.incoming.get(current.name) ?? []\n ];\n for (const edge of allEdges) {\n const neighbor = edge.source === current.name ? edge.target : edge.source;\n if (visited.has(neighbor)) continue;\n visited.add(neighbor);\n const newPath = [...current.path, neighbor];\n const newEdges = [...current.edges, edge];\n if (neighbor === to) {\n return { found: true, path: newPath, edges: newEdges };\n }\n queue.push({ name: neighbor, path: newPath, edges: newEdges });\n }\n }\n return { found: false, path: [], edges: [] };\n }\n /** Connected components via BFS on undirected projection */\n islands() {\n const visited = /* @__PURE__ */ new Set();\n const components = [];\n for (const nodeName of this.nodes.keys()) {\n if (visited.has(nodeName)) continue;\n const island = [];\n const queue = [nodeName];\n visited.add(nodeName);\n while (queue.length > 0) {\n const current = queue.shift();\n island.push(current);\n const allEdges = [\n ...this.outgoing.get(current) ?? [],\n ...this.incoming.get(current) ?? []\n ];\n for (const edge of allEdges) {\n const neighbor = edge.source === current ? edge.target : edge.source;\n if (!visited.has(neighbor) && this.nodes.has(neighbor)) {\n visited.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n components.push(island.sort());\n }\n return components.sort((a, b) => b.length - a.length);\n }\n /** All components reachable within N hops (undirected) */\n neighbors(component, maxHops = 1) {\n const neighbors = [];\n const visited = /* @__PURE__ */ new Set([component]);\n const queue = [\n { name: component, hops: 0 }\n ];\n while (queue.length > 0) {\n const current = queue.shift();\n if (current.hops >= maxHops) continue;\n const allEdges = [\n ...this.outgoing.get(current.name) ?? [],\n ...this.incoming.get(current.name) ?? []\n ];\n for (const edge of allEdges) {\n const neighbor = edge.source === current.name ? edge.target : edge.source;\n if (visited.has(neighbor)) continue;\n visited.add(neighbor);\n neighbors.push({\n component: neighbor,\n hops: current.hops + 1,\n edgeType: edge.type\n });\n queue.push({ name: neighbor, hops: current.hops + 1 });\n }\n }\n return { component, neighbors };\n }\n // -------------------------------------------------------------------------\n // Design-system queries\n // -------------------------------------------------------------------------\n /** Get the composition tree for a compound component */\n composition(component) {\n const node = this.nodes.get(component);\n const subComponents = node?.subComponents ?? [];\n const parentEdges = (this.outgoing.get(component) ?? []).filter((e) => e.type === \"parent-of\");\n const children = parentEdges.map((e) => e.target);\n const childEdges = (this.incoming.get(component) ?? []).filter((e) => e.type === \"parent-of\");\n const parent = childEdges.length > 0 ? childEdges[0].source : void 0;\n const siblings = [];\n if (parent) {\n const parentOut = (this.outgoing.get(parent) ?? []).filter((e) => e.type === \"parent-of\");\n for (const edge of parentOut) {\n if (edge.target !== component) {\n siblings.push(edge.target);\n }\n }\n }\n const siblingEdges = [\n ...(this.outgoing.get(component) ?? []).filter((e) => e.type === \"sibling-of\"),\n ...(this.incoming.get(component) ?? []).filter((e) => e.type === \"sibling-of\")\n ];\n for (const edge of siblingEdges) {\n const sib = edge.source === component ? edge.target : edge.source;\n if (!siblings.includes(sib)) siblings.push(sib);\n }\n return {\n component,\n compositionPattern: node?.compositionPattern,\n subComponents,\n children,\n parent,\n siblings,\n blocks: this.blockIndex.get(component) ?? []\n };\n }\n /** Get alternative components (deduplicated for bidirectional edges) */\n alternatives(component) {\n const seen = /* @__PURE__ */ new Set();\n const alts = [];\n for (const edge of this.outgoing.get(component) ?? []) {\n if (edge.type === \"alternative-to\" && !seen.has(edge.target)) {\n seen.add(edge.target);\n alts.push({ component: edge.target, note: edge.note });\n }\n }\n for (const edge of this.incoming.get(component) ?? []) {\n if (edge.type === \"alternative-to\" && !seen.has(edge.source)) {\n seen.add(edge.source);\n alts.push({ component: edge.source, note: edge.note });\n }\n }\n return alts;\n }\n /** Get blocks that use a component */\n blocksUsing(component) {\n return this.blockIndex.get(component) ?? [];\n }\n /** Extract an induced subgraph for a set of components */\n subgraph(components) {\n const componentSet = new Set(components);\n const nodes = components.map((name) => this.nodes.get(name)).filter((n) => n !== void 0);\n const edges = this.edges.filter(\n (e) => componentSet.has(e.source) && componentSet.has(e.target)\n );\n return {\n nodes,\n edges,\n health: computeHealthFromData(nodes, edges, this.blockIndex)\n };\n }\n /** Return precomputed health metrics */\n getHealth() {\n return this.health;\n }\n /** Get a single node by name */\n getNode(name) {\n return this.nodes.get(name);\n }\n /** Check if a component exists in the graph */\n hasNode(name) {\n return this.nodes.has(name);\n }\n};\nfunction computeHealthFromData(nodes, edges, blockIndex) {\n const nodeNames = new Set(nodes.map((n) => n.name));\n const degreeMap = /* @__PURE__ */ new Map();\n for (const name of nodeNames) {\n degreeMap.set(name, 0);\n }\n for (const edge of edges) {\n degreeMap.set(edge.source, (degreeMap.get(edge.source) ?? 0) + 1);\n degreeMap.set(edge.target, (degreeMap.get(edge.target) ?? 0) + 1);\n }\n const orphans = [];\n for (const [name, degree] of degreeMap) {\n if (degree === 0) orphans.push(name);\n }\n const hubs = [...degreeMap.entries()].map(([name, degree]) => ({ name, degree })).sort((a, b) => b.degree - a.degree).slice(0, 10);\n let inBlock = 0;\n if (blockIndex) {\n for (const name of nodeNames) {\n if ((blockIndex.get(name) ?? []).length > 0) inBlock++;\n }\n }\n const compositionCoverage = nodeNames.size > 0 ? Math.round(inBlock / nodeNames.size * 100) : 0;\n const adjacency = /* @__PURE__ */ new Map();\n for (const name of nodeNames) {\n adjacency.set(name, /* @__PURE__ */ new Set());\n }\n for (const edge of edges) {\n adjacency.get(edge.source)?.add(edge.target);\n adjacency.get(edge.target)?.add(edge.source);\n }\n const visited = /* @__PURE__ */ new Set();\n const connectedComponents = [];\n for (const name of nodeNames) {\n if (visited.has(name)) continue;\n const island = [];\n const queue = [name];\n visited.add(name);\n while (queue.length > 0) {\n const current = queue.shift();\n island.push(current);\n for (const neighbor of adjacency.get(current) ?? []) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n connectedComponents.push(island.sort());\n }\n connectedComponents.sort((a, b) => b.length - a.length);\n const totalDegree = [...degreeMap.values()].reduce((sum, d) => sum + d, 0);\n const averageDegree = nodeNames.size > 0 ? Math.round(totalDegree / nodeNames.size * 100) / 100 : 0;\n return {\n orphans: orphans.sort(),\n hubs,\n compositionCoverage,\n connectedComponents,\n averageDegree,\n nodeCount: nodeNames.size,\n edgeCount: edges.length\n };\n}\n\n// src/graph/serialization.ts\nfunction serializeGraph(graph) {\n return {\n nodes: graph.nodes,\n edges: graph.edges.map(serializeEdge),\n health: graph.health\n };\n}\nfunction deserializeGraph(serialized) {\n return {\n nodes: serialized.nodes,\n edges: serialized.edges.map(deserializeEdge),\n health: serialized.health\n };\n}\nfunction serializeEdge(edge) {\n const result = {\n s: edge.source,\n t: edge.target,\n ty: edge.type,\n w: edge.weight,\n p: edge.provenance\n };\n if (edge.note) result.no = edge.note;\n return result;\n}\nfunction deserializeEdge(edge) {\n const result = {\n source: edge.s,\n target: edge.t,\n type: edge.ty,\n weight: edge.w,\n provenance: edge.p\n };\n if (edge.no) result.note = edge.no;\n return result;\n}\nexport {\n ComponentGraphEngine,\n EDGE_TYPE_WEIGHTS,\n GRAPH_EDGE_TYPES,\n computeHealthFromData,\n deserializeGraph,\n serializeGraph\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ComponentGraphEngine,
|
|
3
3
|
deserializeGraph
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-IEJ7ZYTZ.js";
|
|
5
5
|
|
|
6
6
|
// src/server.ts
|
|
7
7
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
@@ -745,8 +745,10 @@ var SYNONYM_MAP = {
|
|
|
745
745
|
"input": ["form", "field", "text", "entry"],
|
|
746
746
|
"button": ["action", "click", "submit", "trigger"],
|
|
747
747
|
"action": ["button", "click", "trigger"],
|
|
748
|
+
"submit": ["button", "form", "action", "send"],
|
|
748
749
|
"alert": ["notification", "message", "warning", "error", "feedback"],
|
|
749
750
|
"notification": ["alert", "message", "toast"],
|
|
751
|
+
"feedback": ["form", "comment", "review", "rating"],
|
|
750
752
|
"card": ["container", "panel", "box", "content"],
|
|
751
753
|
"toggle": ["switch", "checkbox", "boolean", "on/off"],
|
|
752
754
|
"switch": ["toggle", "checkbox", "boolean"],
|
|
@@ -755,7 +757,9 @@ var SYNONYM_MAP = {
|
|
|
755
757
|
"login": ["auth", "signin", "authentication", "form"],
|
|
756
758
|
"auth": ["login", "signin", "authentication"],
|
|
757
759
|
"chat": ["message", "conversation", "ai"],
|
|
758
|
-
"table": ["data", "grid", "list", "rows"]
|
|
760
|
+
"table": ["data", "grid", "list", "rows"],
|
|
761
|
+
"textarea": ["text", "input", "multiline", "area", "comment"],
|
|
762
|
+
"area": ["textarea", "multiline", "text"]
|
|
759
763
|
};
|
|
760
764
|
async function searchConvex(query, apiKey, limit = 10, kind) {
|
|
761
765
|
try {
|
|
@@ -924,7 +928,7 @@ async function hybridSearch(query, data, limit = 10, kind, apiKey) {
|
|
|
924
928
|
const graphBoostResults = [];
|
|
925
929
|
if (data.graph) {
|
|
926
930
|
try {
|
|
927
|
-
const { ComponentGraphEngine: ComponentGraphEngine2, deserializeGraph: deserializeGraph2 } = await import("./graph-
|
|
931
|
+
const { ComponentGraphEngine: ComponentGraphEngine2, deserializeGraph: deserializeGraph2 } = await import("./graph-UWOAWP4T.js");
|
|
928
932
|
const graph = deserializeGraph2(data.graph);
|
|
929
933
|
const engine = new ComponentGraphEngine2(graph);
|
|
930
934
|
const topComponents = [...keywordResults, ...vectorResults].filter((r) => r.kind === "component").slice(0, 5);
|
|
@@ -1096,10 +1100,14 @@ function handleGraphTool(args, serializedGraph, blocks) {
|
|
|
1096
1100
|
switch (args.mode) {
|
|
1097
1101
|
case "health": {
|
|
1098
1102
|
const health = engine.getHealth();
|
|
1103
|
+
const blockCount = blocks ? Object.keys(blocks).length : 0;
|
|
1099
1104
|
return {
|
|
1100
1105
|
text: JSON.stringify({
|
|
1101
1106
|
mode: "health",
|
|
1102
1107
|
...health,
|
|
1108
|
+
...health.compositionCoverage === 0 && blockCount === 0 && {
|
|
1109
|
+
compositionNote: "No composition blocks defined yet \u2014 compositionCoverage will increase as blocks are added"
|
|
1110
|
+
},
|
|
1103
1111
|
summary: `${health.nodeCount} components, ${health.edgeCount} edges, ${health.connectedComponents.length} island(s), ${health.orphans.length} orphan(s), ${health.compositionCoverage}% in blocks`
|
|
1104
1112
|
}, null, 2)
|
|
1105
1113
|
};
|
|
@@ -1243,6 +1251,7 @@ function handleGraphTool(args, serializedGraph, blocks) {
|
|
|
1243
1251
|
|
|
1244
1252
|
// src/server.ts
|
|
1245
1253
|
var TOOL_NAMES = buildToolNames(BRAND.nameLower);
|
|
1254
|
+
var NO_VIEWER_MSG = "This tool requires a running dev server. Pass --viewer-url to the MCP server, or use the fragments-dev MCP config which connects to your local dev server.";
|
|
1246
1255
|
var TOOLS = buildMcpTools(BRAND.nameLower);
|
|
1247
1256
|
function createMcpServer(config) {
|
|
1248
1257
|
const server = new Server(
|
|
@@ -1517,7 +1526,10 @@ If you're a library author, run \`${BRAND.cliCommand} build\` first.`
|
|
|
1517
1526
|
description: s.meta.description,
|
|
1518
1527
|
status: s.meta.status ?? "stable",
|
|
1519
1528
|
variantCount: s.variants.length,
|
|
1520
|
-
tags: s.meta.tags ?? []
|
|
1529
|
+
tags: s.meta.tags ?? [],
|
|
1530
|
+
...includeCode && s.variants[0]?.code && {
|
|
1531
|
+
example: s.variants[0].code
|
|
1532
|
+
}
|
|
1521
1533
|
}));
|
|
1522
1534
|
return {
|
|
1523
1535
|
content: [{
|
|
@@ -1650,7 +1662,7 @@ If you're a library author, run \`${BRAND.cliCommand} build\` first.`
|
|
|
1650
1662
|
text: JSON.stringify({
|
|
1651
1663
|
total: 0,
|
|
1652
1664
|
blocks: [],
|
|
1653
|
-
hint: `No blocks found.
|
|
1665
|
+
hint: `No composition blocks found. Blocks are reusable patterns showing how components wire together (e.g., "Login Form", "Settings Page"). Create .block.ts files and run \`${BRAND.cliCommand} build\`.`
|
|
1654
1666
|
}, null, 2)
|
|
1655
1667
|
}]
|
|
1656
1668
|
};
|
|
@@ -1688,7 +1700,10 @@ If you're a library author, run \`${BRAND.cliCommand} build\` first.`
|
|
|
1688
1700
|
type: "text",
|
|
1689
1701
|
text: JSON.stringify({
|
|
1690
1702
|
total: filtered.length,
|
|
1691
|
-
blocks: filtered
|
|
1703
|
+
blocks: filtered,
|
|
1704
|
+
...filtered.length === 0 && allBlocks.length > 0 && {
|
|
1705
|
+
hint: "No blocks matching your query. Try broader search terms."
|
|
1706
|
+
}
|
|
1692
1707
|
}, null, 2)
|
|
1693
1708
|
}]
|
|
1694
1709
|
};
|
|
@@ -1858,7 +1873,7 @@ If you're a library author, run \`${BRAND.cliCommand} build\` first.`
|
|
|
1858
1873
|
return {
|
|
1859
1874
|
content: [{
|
|
1860
1875
|
type: "text",
|
|
1861
|
-
text:
|
|
1876
|
+
text: NO_VIEWER_MSG
|
|
1862
1877
|
}],
|
|
1863
1878
|
isError: true
|
|
1864
1879
|
};
|
|
@@ -1974,7 +1989,7 @@ Suggestion: ${result.suggestion}` : ""}`
|
|
|
1974
1989
|
return {
|
|
1975
1990
|
content: [{
|
|
1976
1991
|
type: "text",
|
|
1977
|
-
text:
|
|
1992
|
+
text: NO_VIEWER_MSG
|
|
1978
1993
|
}],
|
|
1979
1994
|
isError: true
|
|
1980
1995
|
};
|
|
@@ -2034,7 +2049,7 @@ Suggestion: ${result.suggestion}` : ""}`
|
|
|
2034
2049
|
return {
|
|
2035
2050
|
content: [{
|
|
2036
2051
|
type: "text",
|
|
2037
|
-
text:
|
|
2052
|
+
text: NO_VIEWER_MSG
|
|
2038
2053
|
}],
|
|
2039
2054
|
isError: true
|
|
2040
2055
|
};
|
|
@@ -2135,4 +2150,4 @@ export {
|
|
|
2135
2150
|
createMcpServer,
|
|
2136
2151
|
startMcpServer
|
|
2137
2152
|
};
|
|
2138
|
-
//# sourceMappingURL=chunk-
|
|
2153
|
+
//# sourceMappingURL=chunk-WEHZRM4L.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// Shared error messages\n// ---------------------------------------------------------------------------\n\nconst NO_VIEWER_MSG = 'This tool requires a running dev server. Pass --viewer-url to the MCP server, or use the fragments-dev MCP config which connects to your local dev server.';\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 ...(includeCode && s.variants[0]?.code && {\n example: s.variants[0].code,\n }),\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 composition blocks found. Blocks are reusable patterns showing how components wire together (e.g., \"Login Form\", \"Settings Page\"). Create .block.ts files and run \\`${BRAND.cliCommand} build\\`.`,\n }, 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 ...(filtered.length === 0 && allBlocks.length > 0 && {\n hint: 'No blocks matching your query. Try broader search terms.',\n }),\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: NO_VIEWER_MSG,\n }],\n isError: true,\n };\n }\n\n // --- Figma compare mode ---\n if (figmaUrl) {\n try {\n const result = await compareComponent(viewerUrl, {\n component: componentName,\n variant: variantName,\n props,\n figmaUrl,\n threshold,\n });\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: NO_VIEWER_MSG,\n }],\n isError: true,\n };\n }\n\n try {\n const result = await fixComponent(viewerUrl, {\n component: componentName,\n variant: variantName,\n fixType,\n });\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: NO_VIEWER_MSG,\n }],\n isError: true,\n };\n }\n\n try {\n const result = await auditComponent(viewerUrl, {\n component: componentName,\n variant: variantName,\n standard,\n includeFixPatches,\n });\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 'submit': ['button', 'form', 'action', 'send'],\n 'alert': ['notification', 'message', 'warning', 'error', 'feedback'],\n 'notification': ['alert', 'message', 'toast'],\n 'feedback': ['form', 'comment', 'review', 'rating'],\n 'card': ['container', 'panel', 'box', 'content'],\n 'toggle': ['switch', 'checkbox', 'boolean', 'on/off'],\n 'switch': ['toggle', 'checkbox', 'boolean'],\n 'badge': ['tag', 'label', 'status', 'indicator'],\n 'status': ['badge', 'indicator', 'state'],\n 'login': ['auth', 'signin', 'authentication', 'form'],\n 'auth': ['login', 'signin', 'authentication'],\n 'chat': ['message', 'conversation', 'ai'],\n 'table': ['data', 'grid', 'list', 'rows'],\n 'textarea': ['text', 'input', 'multiline', 'area', 'comment'],\n 'area': ['textarea', 'multiline', 'text'],\n};\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 const blockCount = blocks ? Object.keys(blocks).length : 0;\n return {\n text: JSON.stringify({\n mode: 'health',\n ...health,\n ...(health.compositionCoverage === 0 && blockCount === 0 && {\n compositionNote: 'No composition blocks defined yet — compositionCoverage will increase as blocks are added',\n }),\n summary: `${health.nodeCount} components, ${health.edgeCount} edges, ${health.connectedComponents.length} island(s), ${health.orphans.length} orphan(s), ${health.compositionCoverage}% in blocks`,\n }, 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"]}
|
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
computeHealthFromData,
|
|
6
6
|
deserializeGraph,
|
|
7
7
|
serializeGraph
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-IEJ7ZYTZ.js";
|
|
9
9
|
export {
|
|
10
10
|
ComponentGraphEngine,
|
|
11
11
|
EDGE_TYPE_WEIGHTS,
|
|
@@ -14,4 +14,4 @@ export {
|
|
|
14
14
|
deserializeGraph,
|
|
15
15
|
serializeGraph
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=graph-
|
|
17
|
+
//# sourceMappingURL=graph-UWOAWP4T.js.map
|
package/dist/server.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fragments-sdk/mcp",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"license": "FSL-1.1-MIT",
|
|
5
5
|
"description": "Standalone MCP server for Fragments design system — zero-config component discovery with semantic search",
|
|
6
6
|
"repository": {
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"tsx": "^4.19.0",
|
|
46
46
|
"typescript": "^5.7.2",
|
|
47
47
|
"vitest": "^2.1.8",
|
|
48
|
-
"@fragments-sdk/context": "0.3.
|
|
48
|
+
"@fragments-sdk/context": "0.3.2"
|
|
49
49
|
},
|
|
50
50
|
"scripts": {
|
|
51
51
|
"build": "tsup",
|
|
@@ -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 /** 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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../context/dist/graph/index.js"],"sourcesContent":["// src/graph/types.ts\nvar GRAPH_EDGE_TYPES = [\n \"imports\",\n \"hook-depends\",\n \"renders\",\n \"composes\",\n \"parent-of\",\n \"alternative-to\",\n \"sibling-of\"\n];\nvar EDGE_TYPE_WEIGHTS = {\n \"imports\": 1,\n \"hook-depends\": 0.75,\n \"renders\": 0.5,\n \"composes\": 0.5,\n \"parent-of\": 1,\n \"alternative-to\": 1,\n \"sibling-of\": 0.75\n};\n\n// src/graph/engine.ts\nvar ComponentGraphEngine = class {\n nodes;\n outgoing;\n incoming;\n edges;\n blockIndex;\n health;\n constructor(graph, blocks) {\n this.nodes = /* @__PURE__ */ new Map();\n this.outgoing = /* @__PURE__ */ new Map();\n this.incoming = /* @__PURE__ */ new Map();\n this.edges = graph.edges;\n this.health = graph.health;\n this.blockIndex = /* @__PURE__ */ new Map();\n for (const node of graph.nodes) {\n this.nodes.set(node.name, node);\n this.outgoing.set(node.name, []);\n this.incoming.set(node.name, []);\n }\n for (const edge of graph.edges) {\n const out = this.outgoing.get(edge.source);\n if (out) out.push(edge);\n else this.outgoing.set(edge.source, [edge]);\n const inc = this.incoming.get(edge.target);\n if (inc) inc.push(edge);\n else this.incoming.set(edge.target, [edge]);\n }\n if (blocks) {\n for (const [blockName, block] of Object.entries(blocks)) {\n for (const comp of block.components) {\n const existing = this.blockIndex.get(comp);\n if (existing) existing.push(blockName);\n else this.blockIndex.set(comp, [blockName]);\n }\n }\n }\n }\n // -------------------------------------------------------------------------\n // Core queries\n // -------------------------------------------------------------------------\n /** Get outgoing edges from a component, optionally filtered by edge type */\n dependencies(component, edgeTypes) {\n const edges = this.outgoing.get(component) ?? [];\n if (!edgeTypes || edgeTypes.length === 0) return edges;\n return edges.filter((e) => edgeTypes.includes(e.type));\n }\n /** Get incoming edges to a component, optionally filtered by edge type */\n dependents(component, edgeTypes) {\n const edges = this.incoming.get(component) ?? [];\n if (!edgeTypes || edgeTypes.length === 0) return edges;\n return edges.filter((e) => edgeTypes.includes(e.type));\n }\n /** BFS transitive closure — what's affected if this component changes */\n impact(component, maxDepth = 3) {\n const affected = [];\n const visited = /* @__PURE__ */ new Set([component]);\n const queue = [\n { name: component, depth: 0, path: [component] }\n ];\n while (queue.length > 0) {\n const current = queue.shift();\n if (current.depth >= maxDepth) continue;\n const deps = this.incoming.get(current.name) ?? [];\n for (const edge of deps) {\n if (visited.has(edge.source)) continue;\n visited.add(edge.source);\n const newPath = [...current.path, edge.source];\n affected.push({\n component: edge.source,\n depth: current.depth + 1,\n path: newPath,\n edgeType: edge.type\n });\n queue.push({ name: edge.source, depth: current.depth + 1, path: newPath });\n }\n }\n const affectedComponents = /* @__PURE__ */ new Set([component, ...affected.map((a) => a.component)]);\n const affectedBlocks = /* @__PURE__ */ new Set();\n for (const comp of affectedComponents) {\n const blocks = this.blockIndex.get(comp);\n if (blocks) {\n for (const b of blocks) affectedBlocks.add(b);\n }\n }\n return {\n component,\n affected,\n affectedBlocks: [...affectedBlocks],\n totalAffected: affected.length\n };\n }\n /** BFS shortest path between two components (undirected) */\n path(from, to) {\n if (from === to) {\n return { found: true, path: [from], edges: [] };\n }\n const visited = /* @__PURE__ */ new Set([from]);\n const queue = [\n { name: from, path: [from], edges: [] }\n ];\n while (queue.length > 0) {\n const current = queue.shift();\n const allEdges = [\n ...this.outgoing.get(current.name) ?? [],\n ...this.incoming.get(current.name) ?? []\n ];\n for (const edge of allEdges) {\n const neighbor = edge.source === current.name ? edge.target : edge.source;\n if (visited.has(neighbor)) continue;\n visited.add(neighbor);\n const newPath = [...current.path, neighbor];\n const newEdges = [...current.edges, edge];\n if (neighbor === to) {\n return { found: true, path: newPath, edges: newEdges };\n }\n queue.push({ name: neighbor, path: newPath, edges: newEdges });\n }\n }\n return { found: false, path: [], edges: [] };\n }\n /** Connected components via BFS on undirected projection */\n islands() {\n const visited = /* @__PURE__ */ new Set();\n const components = [];\n for (const nodeName of this.nodes.keys()) {\n if (visited.has(nodeName)) continue;\n const island = [];\n const queue = [nodeName];\n visited.add(nodeName);\n while (queue.length > 0) {\n const current = queue.shift();\n island.push(current);\n const allEdges = [\n ...this.outgoing.get(current) ?? [],\n ...this.incoming.get(current) ?? []\n ];\n for (const edge of allEdges) {\n const neighbor = edge.source === current ? edge.target : edge.source;\n if (!visited.has(neighbor) && this.nodes.has(neighbor)) {\n visited.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n components.push(island.sort());\n }\n return components.sort((a, b) => b.length - a.length);\n }\n /** All components reachable within N hops (undirected) */\n neighbors(component, maxHops = 1) {\n const neighbors = [];\n const visited = /* @__PURE__ */ new Set([component]);\n const queue = [\n { name: component, hops: 0 }\n ];\n while (queue.length > 0) {\n const current = queue.shift();\n if (current.hops >= maxHops) continue;\n const allEdges = [\n ...this.outgoing.get(current.name) ?? [],\n ...this.incoming.get(current.name) ?? []\n ];\n for (const edge of allEdges) {\n const neighbor = edge.source === current.name ? edge.target : edge.source;\n if (visited.has(neighbor)) continue;\n visited.add(neighbor);\n neighbors.push({\n component: neighbor,\n hops: current.hops + 1,\n edgeType: edge.type\n });\n queue.push({ name: neighbor, hops: current.hops + 1 });\n }\n }\n return { component, neighbors };\n }\n // -------------------------------------------------------------------------\n // Design-system queries\n // -------------------------------------------------------------------------\n /** Get the composition tree for a compound component */\n composition(component) {\n const node = this.nodes.get(component);\n const subComponents = node?.subComponents ?? [];\n const parentEdges = (this.outgoing.get(component) ?? []).filter((e) => e.type === \"parent-of\");\n const requiredChildren = parentEdges.map((e) => e.target);\n const childEdges = (this.incoming.get(component) ?? []).filter((e) => e.type === \"parent-of\");\n const parent = childEdges.length > 0 ? childEdges[0].source : void 0;\n const siblings = [];\n if (parent) {\n const parentOut = (this.outgoing.get(parent) ?? []).filter((e) => e.type === \"parent-of\");\n for (const edge of parentOut) {\n if (edge.target !== component) {\n siblings.push(edge.target);\n }\n }\n }\n const siblingEdges = [\n ...(this.outgoing.get(component) ?? []).filter((e) => e.type === \"sibling-of\"),\n ...(this.incoming.get(component) ?? []).filter((e) => e.type === \"sibling-of\")\n ];\n for (const edge of siblingEdges) {\n const sib = edge.source === component ? edge.target : edge.source;\n if (!siblings.includes(sib)) siblings.push(sib);\n }\n return {\n component,\n compositionPattern: node?.compositionPattern,\n subComponents,\n requiredChildren,\n parent,\n siblings,\n blocks: this.blockIndex.get(component) ?? []\n };\n }\n /** Get alternative components */\n alternatives(component) {\n const alts = [];\n for (const edge of this.outgoing.get(component) ?? []) {\n if (edge.type === \"alternative-to\") {\n alts.push({ component: edge.target, note: edge.note });\n }\n }\n for (const edge of this.incoming.get(component) ?? []) {\n if (edge.type === \"alternative-to\") {\n alts.push({ component: edge.source, note: edge.note });\n }\n }\n return alts;\n }\n /** Get blocks that use a component */\n blocksUsing(component) {\n return this.blockIndex.get(component) ?? [];\n }\n /** Extract an induced subgraph for a set of components */\n subgraph(components) {\n const componentSet = new Set(components);\n const nodes = components.map((name) => this.nodes.get(name)).filter((n) => n !== void 0);\n const edges = this.edges.filter(\n (e) => componentSet.has(e.source) && componentSet.has(e.target)\n );\n return {\n nodes,\n edges,\n health: computeHealthFromData(nodes, edges, this.blockIndex)\n };\n }\n /** Return precomputed health metrics */\n getHealth() {\n return this.health;\n }\n /** Get a single node by name */\n getNode(name) {\n return this.nodes.get(name);\n }\n /** Check if a component exists in the graph */\n hasNode(name) {\n return this.nodes.has(name);\n }\n};\nfunction computeHealthFromData(nodes, edges, blockIndex) {\n const nodeNames = new Set(nodes.map((n) => n.name));\n const degreeMap = /* @__PURE__ */ new Map();\n for (const name of nodeNames) {\n degreeMap.set(name, 0);\n }\n for (const edge of edges) {\n degreeMap.set(edge.source, (degreeMap.get(edge.source) ?? 0) + 1);\n degreeMap.set(edge.target, (degreeMap.get(edge.target) ?? 0) + 1);\n }\n const orphans = [];\n for (const [name, degree] of degreeMap) {\n if (degree === 0) orphans.push(name);\n }\n const hubs = [...degreeMap.entries()].map(([name, degree]) => ({ name, degree })).sort((a, b) => b.degree - a.degree).slice(0, 10);\n let inBlock = 0;\n if (blockIndex) {\n for (const name of nodeNames) {\n if ((blockIndex.get(name) ?? []).length > 0) inBlock++;\n }\n }\n const compositionCoverage = nodeNames.size > 0 ? Math.round(inBlock / nodeNames.size * 100) : 0;\n const adjacency = /* @__PURE__ */ new Map();\n for (const name of nodeNames) {\n adjacency.set(name, /* @__PURE__ */ new Set());\n }\n for (const edge of edges) {\n adjacency.get(edge.source)?.add(edge.target);\n adjacency.get(edge.target)?.add(edge.source);\n }\n const visited = /* @__PURE__ */ new Set();\n const connectedComponents = [];\n for (const name of nodeNames) {\n if (visited.has(name)) continue;\n const island = [];\n const queue = [name];\n visited.add(name);\n while (queue.length > 0) {\n const current = queue.shift();\n island.push(current);\n for (const neighbor of adjacency.get(current) ?? []) {\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n queue.push(neighbor);\n }\n }\n }\n connectedComponents.push(island.sort());\n }\n connectedComponents.sort((a, b) => b.length - a.length);\n const totalDegree = [...degreeMap.values()].reduce((sum, d) => sum + d, 0);\n const averageDegree = nodeNames.size > 0 ? Math.round(totalDegree / nodeNames.size * 100) / 100 : 0;\n return {\n orphans: orphans.sort(),\n hubs,\n compositionCoverage,\n connectedComponents,\n averageDegree,\n nodeCount: nodeNames.size,\n edgeCount: edges.length\n };\n}\n\n// src/graph/serialization.ts\nfunction serializeGraph(graph) {\n return {\n nodes: graph.nodes,\n edges: graph.edges.map(serializeEdge),\n health: graph.health\n };\n}\nfunction deserializeGraph(serialized) {\n return {\n nodes: serialized.nodes,\n edges: serialized.edges.map(deserializeEdge),\n health: serialized.health\n };\n}\nfunction serializeEdge(edge) {\n const result = {\n s: edge.source,\n t: edge.target,\n ty: edge.type,\n w: edge.weight,\n p: edge.provenance\n };\n if (edge.note) result.no = edge.note;\n return result;\n}\nfunction deserializeEdge(edge) {\n const result = {\n source: edge.s,\n target: edge.t,\n type: edge.ty,\n weight: edge.w,\n provenance: edge.p\n };\n if (edge.no) result.note = edge.no;\n return result;\n}\nexport {\n ComponentGraphEngine,\n EDGE_TYPE_WEIGHTS,\n GRAPH_EDGE_TYPES,\n computeHealthFromData,\n deserializeGraph,\n serializeGraph\n};\n"],"mappings":";AACA,IAAI,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AACA,IAAI,oBAAoB;AAAA,EACtB,WAAW;AAAA,EACX,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,cAAc;AAChB;AAGA,IAAI,uBAAuB,MAAM;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,OAAO,QAAQ;AACzB,SAAK,QAAwB,oBAAI,IAAI;AACrC,SAAK,WAA2B,oBAAI,IAAI;AACxC,SAAK,WAA2B,oBAAI,IAAI;AACxC,SAAK,QAAQ,MAAM;AACnB,SAAK,SAAS,MAAM;AACpB,SAAK,aAA6B,oBAAI,IAAI;AAC1C,eAAW,QAAQ,MAAM,OAAO;AAC9B,WAAK,MAAM,IAAI,KAAK,MAAM,IAAI;AAC9B,WAAK,SAAS,IAAI,KAAK,MAAM,CAAC,CAAC;AAC/B,WAAK,SAAS,IAAI,KAAK,MAAM,CAAC,CAAC;AAAA,IACjC;AACA,eAAW,QAAQ,MAAM,OAAO;AAC9B,YAAM,MAAM,KAAK,SAAS,IAAI,KAAK,MAAM;AACzC,UAAI,IAAK,KAAI,KAAK,IAAI;AAAA,UACjB,MAAK,SAAS,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC;AAC1C,YAAM,MAAM,KAAK,SAAS,IAAI,KAAK,MAAM;AACzC,UAAI,IAAK,KAAI,KAAK,IAAI;AAAA,UACjB,MAAK,SAAS,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC;AAAA,IAC5C;AACA,QAAI,QAAQ;AACV,iBAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,mBAAW,QAAQ,MAAM,YAAY;AACnC,gBAAM,WAAW,KAAK,WAAW,IAAI,IAAI;AACzC,cAAI,SAAU,UAAS,KAAK,SAAS;AAAA,cAChC,MAAK,WAAW,IAAI,MAAM,CAAC,SAAS,CAAC;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,WAAW,WAAW;AACjC,UAAM,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC;AAC/C,QAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AACjD,WAAO,MAAM,OAAO,CAAC,MAAM,UAAU,SAAS,EAAE,IAAI,CAAC;AAAA,EACvD;AAAA;AAAA,EAEA,WAAW,WAAW,WAAW;AAC/B,UAAM,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC;AAC/C,QAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO;AACjD,WAAO,MAAM,OAAO,CAAC,MAAM,UAAU,SAAS,EAAE,IAAI,CAAC;AAAA,EACvD;AAAA;AAAA,EAEA,OAAO,WAAW,WAAW,GAAG;AAC9B,UAAM,WAAW,CAAC;AAClB,UAAM,UAA0B,oBAAI,IAAI,CAAC,SAAS,CAAC;AACnD,UAAM,QAAQ;AAAA,MACZ,EAAE,MAAM,WAAW,OAAO,GAAG,MAAM,CAAC,SAAS,EAAE;AAAA,IACjD;AACA,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,UAAU,MAAM,MAAM;AAC5B,UAAI,QAAQ,SAAS,SAAU;AAC/B,YAAM,OAAO,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,CAAC;AACjD,iBAAW,QAAQ,MAAM;AACvB,YAAI,QAAQ,IAAI,KAAK,MAAM,EAAG;AAC9B,gBAAQ,IAAI,KAAK,MAAM;AACvB,cAAM,UAAU,CAAC,GAAG,QAAQ,MAAM,KAAK,MAAM;AAC7C,iBAAS,KAAK;AAAA,UACZ,WAAW,KAAK;AAAA,UAChB,OAAO,QAAQ,QAAQ;AAAA,UACvB,MAAM;AAAA,UACN,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM,KAAK,EAAE,MAAM,KAAK,QAAQ,OAAO,QAAQ,QAAQ,GAAG,MAAM,QAAQ,CAAC;AAAA,MAC3E;AAAA,IACF;AACA,UAAM,qBAAqC,oBAAI,IAAI,CAAC,WAAW,GAAG,SAAS,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACnG,UAAM,iBAAiC,oBAAI,IAAI;AAC/C,eAAW,QAAQ,oBAAoB;AACrC,YAAM,SAAS,KAAK,WAAW,IAAI,IAAI;AACvC,UAAI,QAAQ;AACV,mBAAW,KAAK,OAAQ,gBAAe,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,gBAAgB,CAAC,GAAG,cAAc;AAAA,MAClC,eAAe,SAAS;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA,EAEA,KAAK,MAAM,IAAI;AACb,QAAI,SAAS,IAAI;AACf,aAAO,EAAE,OAAO,MAAM,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,EAAE;AAAA,IAChD;AACA,UAAM,UAA0B,oBAAI,IAAI,CAAC,IAAI,CAAC;AAC9C,UAAM,QAAQ;AAAA,MACZ,EAAE,MAAM,MAAM,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,EAAE;AAAA,IACxC;AACA,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,UAAU,MAAM,MAAM;AAC5B,YAAM,WAAW;AAAA,QACf,GAAG,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,CAAC;AAAA,QACvC,GAAG,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,CAAC;AAAA,MACzC;AACA,iBAAW,QAAQ,UAAU;AAC3B,cAAM,WAAW,KAAK,WAAW,QAAQ,OAAO,KAAK,SAAS,KAAK;AACnE,YAAI,QAAQ,IAAI,QAAQ,EAAG;AAC3B,gBAAQ,IAAI,QAAQ;AACpB,cAAM,UAAU,CAAC,GAAG,QAAQ,MAAM,QAAQ;AAC1C,cAAM,WAAW,CAAC,GAAG,QAAQ,OAAO,IAAI;AACxC,YAAI,aAAa,IAAI;AACnB,iBAAO,EAAE,OAAO,MAAM,MAAM,SAAS,OAAO,SAAS;AAAA,QACvD;AACA,cAAM,KAAK,EAAE,MAAM,UAAU,MAAM,SAAS,OAAO,SAAS,CAAC;AAAA,MAC/D;AAAA,IACF;AACA,WAAO,EAAE,OAAO,OAAO,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EAC7C;AAAA;AAAA,EAEA,UAAU;AACR,UAAM,UAA0B,oBAAI,IAAI;AACxC,UAAM,aAAa,CAAC;AACpB,eAAW,YAAY,KAAK,MAAM,KAAK,GAAG;AACxC,UAAI,QAAQ,IAAI,QAAQ,EAAG;AAC3B,YAAM,SAAS,CAAC;AAChB,YAAM,QAAQ,CAAC,QAAQ;AACvB,cAAQ,IAAI,QAAQ;AACpB,aAAO,MAAM,SAAS,GAAG;AACvB,cAAM,UAAU,MAAM,MAAM;AAC5B,eAAO,KAAK,OAAO;AACnB,cAAM,WAAW;AAAA,UACf,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,UAClC,GAAG,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC;AAAA,QACpC;AACA,mBAAW,QAAQ,UAAU;AAC3B,gBAAM,WAAW,KAAK,WAAW,UAAU,KAAK,SAAS,KAAK;AAC9D,cAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,KAAK,MAAM,IAAI,QAAQ,GAAG;AACtD,oBAAQ,IAAI,QAAQ;AACpB,kBAAM,KAAK,QAAQ;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AACA,iBAAW,KAAK,OAAO,KAAK,CAAC;AAAA,IAC/B;AACA,WAAO,WAAW,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AAAA,EACtD;AAAA;AAAA,EAEA,UAAU,WAAW,UAAU,GAAG;AAChC,UAAM,YAAY,CAAC;AACnB,UAAM,UAA0B,oBAAI,IAAI,CAAC,SAAS,CAAC;AACnD,UAAM,QAAQ;AAAA,MACZ,EAAE,MAAM,WAAW,MAAM,EAAE;AAAA,IAC7B;AACA,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,UAAU,MAAM,MAAM;AAC5B,UAAI,QAAQ,QAAQ,QAAS;AAC7B,YAAM,WAAW;AAAA,QACf,GAAG,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,CAAC;AAAA,QACvC,GAAG,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,CAAC;AAAA,MACzC;AACA,iBAAW,QAAQ,UAAU;AAC3B,cAAM,WAAW,KAAK,WAAW,QAAQ,OAAO,KAAK,SAAS,KAAK;AACnE,YAAI,QAAQ,IAAI,QAAQ,EAAG;AAC3B,gBAAQ,IAAI,QAAQ;AACpB,kBAAU,KAAK;AAAA,UACb,WAAW;AAAA,UACX,MAAM,QAAQ,OAAO;AAAA,UACrB,UAAU,KAAK;AAAA,QACjB,CAAC;AACD,cAAM,KAAK,EAAE,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,CAAC;AAAA,MACvD;AAAA,IACF;AACA,WAAO,EAAE,WAAW,UAAU;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,WAAW;AACrB,UAAM,OAAO,KAAK,MAAM,IAAI,SAAS;AACrC,UAAM,gBAAgB,MAAM,iBAAiB,CAAC;AAC9C,UAAM,eAAe,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW;AAC7F,UAAM,mBAAmB,YAAY,IAAI,CAAC,MAAM,EAAE,MAAM;AACxD,UAAM,cAAc,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW;AAC5F,UAAM,SAAS,WAAW,SAAS,IAAI,WAAW,CAAC,EAAE,SAAS;AAC9D,UAAM,WAAW,CAAC;AAClB,QAAI,QAAQ;AACV,YAAM,aAAa,KAAK,SAAS,IAAI,MAAM,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,WAAW;AACxF,iBAAW,QAAQ,WAAW;AAC5B,YAAI,KAAK,WAAW,WAAW;AAC7B,mBAAS,KAAK,KAAK,MAAM;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAe;AAAA,MACnB,IAAI,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AAAA,MAC7E,IAAI,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AAAA,IAC/E;AACA,eAAW,QAAQ,cAAc;AAC/B,YAAM,MAAM,KAAK,WAAW,YAAY,KAAK,SAAS,KAAK;AAC3D,UAAI,CAAC,SAAS,SAAS,GAAG,EAAG,UAAS,KAAK,GAAG;AAAA,IAChD;AACA,WAAO;AAAA,MACL;AAAA,MACA,oBAAoB,MAAM;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,KAAK,WAAW,IAAI,SAAS,KAAK,CAAC;AAAA,IAC7C;AAAA,EACF;AAAA;AAAA,EAEA,aAAa,WAAW;AACtB,UAAM,OAAO,CAAC;AACd,eAAW,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC,GAAG;AACrD,UAAI,KAAK,SAAS,kBAAkB;AAClC,aAAK,KAAK,EAAE,WAAW,KAAK,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,MACvD;AAAA,IACF;AACA,eAAW,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,CAAC,GAAG;AACrD,UAAI,KAAK,SAAS,kBAAkB;AAClC,aAAK,KAAK,EAAE,WAAW,KAAK,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,MACvD;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAEA,YAAY,WAAW;AACrB,WAAO,KAAK,WAAW,IAAI,SAAS,KAAK,CAAC;AAAA,EAC5C;AAAA;AAAA,EAEA,SAAS,YAAY;AACnB,UAAM,eAAe,IAAI,IAAI,UAAU;AACvC,UAAM,QAAQ,WAAW,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,MAAM,MAAM;AACvF,UAAM,QAAQ,KAAK,MAAM;AAAA,MACvB,CAAC,MAAM,aAAa,IAAI,EAAE,MAAM,KAAK,aAAa,IAAI,EAAE,MAAM;AAAA,IAChE;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,sBAAsB,OAAO,OAAO,KAAK,UAAU;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA,EAEA,YAAY;AACV,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAEA,QAAQ,MAAM;AACZ,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AAAA;AAAA,EAEA,QAAQ,MAAM;AACZ,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AACF;AACA,SAAS,sBAAsB,OAAO,OAAO,YAAY;AACvD,QAAM,YAAY,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAClD,QAAM,YAA4B,oBAAI,IAAI;AAC1C,aAAW,QAAQ,WAAW;AAC5B,cAAU,IAAI,MAAM,CAAC;AAAA,EACvB;AACA,aAAW,QAAQ,OAAO;AACxB,cAAU,IAAI,KAAK,SAAS,UAAU,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;AAChE,cAAU,IAAI,KAAK,SAAS,UAAU,IAAI,KAAK,MAAM,KAAK,KAAK,CAAC;AAAA,EAClE;AACA,QAAM,UAAU,CAAC;AACjB,aAAW,CAAC,MAAM,MAAM,KAAK,WAAW;AACtC,QAAI,WAAW,EAAG,SAAQ,KAAK,IAAI;AAAA,EACrC;AACA,QAAM,OAAO,CAAC,GAAG,UAAU,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO,EAAE,MAAM,OAAO,EAAE,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,EAAE;AACjI,MAAI,UAAU;AACd,MAAI,YAAY;AACd,eAAW,QAAQ,WAAW;AAC5B,WAAK,WAAW,IAAI,IAAI,KAAK,CAAC,GAAG,SAAS,EAAG;AAAA,IAC/C;AAAA,EACF;AACA,QAAM,sBAAsB,UAAU,OAAO,IAAI,KAAK,MAAM,UAAU,UAAU,OAAO,GAAG,IAAI;AAC9F,QAAM,YAA4B,oBAAI,IAAI;AAC1C,aAAW,QAAQ,WAAW;AAC5B,cAAU,IAAI,MAAsB,oBAAI,IAAI,CAAC;AAAA,EAC/C;AACA,aAAW,QAAQ,OAAO;AACxB,cAAU,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,MAAM;AAC3C,cAAU,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,MAAM;AAAA,EAC7C;AACA,QAAM,UAA0B,oBAAI,IAAI;AACxC,QAAM,sBAAsB,CAAC;AAC7B,aAAW,QAAQ,WAAW;AAC5B,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,UAAM,SAAS,CAAC;AAChB,UAAM,QAAQ,CAAC,IAAI;AACnB,YAAQ,IAAI,IAAI;AAChB,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,UAAU,MAAM,MAAM;AAC5B,aAAO,KAAK,OAAO;AACnB,iBAAW,YAAY,UAAU,IAAI,OAAO,KAAK,CAAC,GAAG;AACnD,YAAI,CAAC,QAAQ,IAAI,QAAQ,GAAG;AAC1B,kBAAQ,IAAI,QAAQ;AACpB,gBAAM,KAAK,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AACA,wBAAoB,KAAK,OAAO,KAAK,CAAC;AAAA,EACxC;AACA,sBAAoB,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AACtD,QAAM,cAAc,CAAC,GAAG,UAAU,OAAO,CAAC,EAAE,OAAO,CAAC,KAAK,MAAM,MAAM,GAAG,CAAC;AACzE,QAAM,gBAAgB,UAAU,OAAO,IAAI,KAAK,MAAM,cAAc,UAAU,OAAO,GAAG,IAAI,MAAM;AAClG,SAAO;AAAA,IACL,SAAS,QAAQ,KAAK;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,UAAU;AAAA,IACrB,WAAW,MAAM;AAAA,EACnB;AACF;AAGA,SAAS,eAAe,OAAO;AAC7B,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,OAAO,MAAM,MAAM,IAAI,aAAa;AAAA,IACpC,QAAQ,MAAM;AAAA,EAChB;AACF;AACA,SAAS,iBAAiB,YAAY;AACpC,SAAO;AAAA,IACL,OAAO,WAAW;AAAA,IAClB,OAAO,WAAW,MAAM,IAAI,eAAe;AAAA,IAC3C,QAAQ,WAAW;AAAA,EACrB;AACF;AACA,SAAS,cAAc,MAAM;AAC3B,QAAM,SAAS;AAAA,IACb,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,IACR,IAAI,KAAK;AAAA,IACT,GAAG,KAAK;AAAA,IACR,GAAG,KAAK;AAAA,EACV;AACA,MAAI,KAAK,KAAM,QAAO,KAAK,KAAK;AAChC,SAAO;AACT;AACA,SAAS,gBAAgB,MAAM;AAC7B,QAAM,SAAS;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK;AAAA,IACb,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb,YAAY,KAAK;AAAA,EACnB;AACA,MAAI,KAAK,GAAI,QAAO,OAAO,KAAK;AAChC,SAAO;AACT;","names":[]}
|
|
File without changes
|