vlossom-mcp 0.3.0 → 0.4.0
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/server.d.ts.map +1 -1
- package/dist/server.js +10 -1
- package/dist/server.js.map +1 -1
- package/dist/services/relationships-registry.d.ts +7 -0
- package/dist/services/relationships-registry.d.ts.map +1 -0
- package/dist/services/relationships-registry.js +34 -0
- package/dist/services/relationships-registry.js.map +1 -0
- package/dist/tools/compare-components.d.ts +3 -0
- package/dist/tools/compare-components.d.ts.map +1 -0
- package/dist/tools/compare-components.js +109 -0
- package/dist/tools/compare-components.js.map +1 -0
- package/dist/tools/get-relationships.d.ts +3 -0
- package/dist/tools/get-relationships.d.ts.map +1 -0
- package/dist/tools/get-relationships.js +23 -0
- package/dist/tools/get-relationships.js.map +1 -0
- package/dist/tools/suggest-components.d.ts +3 -0
- package/dist/tools/suggest-components.d.ts.map +1 -0
- package/dist/tools/suggest-components.js +161 -0
- package/dist/tools/suggest-components.js.map +1 -0
- package/package.json +1 -1
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiCpE,wBAAgB,YAAY,IAAI,SAAS,CAexC"}
|
package/dist/server.js
CHANGED
|
@@ -3,6 +3,9 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
3
3
|
import { registerListComponents } from "./tools/list-components.js";
|
|
4
4
|
import { registerGetComponent } from "./tools/get-component.js";
|
|
5
5
|
import { registerSearchComponents } from "./tools/search-components.js";
|
|
6
|
+
import { registerSuggestComponents } from "./tools/suggest-components.js";
|
|
7
|
+
import { registerGetComponentRelationships } from "./tools/get-relationships.js";
|
|
8
|
+
import { registerCompareComponents } from "./tools/compare-components.js";
|
|
6
9
|
import { registerCheckGitHubToken } from "./tools/check-github-token.js";
|
|
7
10
|
import { registerSetGitHubToken } from "./tools/set-github-token.js";
|
|
8
11
|
import { registerDraftIssue } from "./tools/draft-issue.js";
|
|
@@ -15,8 +18,11 @@ Tool call flow guide:
|
|
|
15
18
|
- To list all components: list_components
|
|
16
19
|
- To look up a specific component: get_component (accepts VsButton or vs-button)
|
|
17
20
|
- To search components by keyword or use case: search_components → get_component for each result
|
|
21
|
+
- To suggest components for a use case or feature: suggest_components → get_component for each result
|
|
22
|
+
- To get component composition/relationships: get_component_relationships
|
|
23
|
+
- To compare two components: compare_components
|
|
18
24
|
- To generate component code:
|
|
19
|
-
1.
|
|
25
|
+
1. suggest_components (recommend components for the use case)
|
|
20
26
|
2. get_component (check props/StyleSet for each)
|
|
21
27
|
3. generate_component_code (generate code)
|
|
22
28
|
- To file a GitHub issue: check_github_token → set_github_token (if needed) → draft_issue → report_issue
|
|
@@ -28,6 +34,9 @@ export function createServer() {
|
|
|
28
34
|
registerListComponents(server);
|
|
29
35
|
registerGetComponent(server);
|
|
30
36
|
registerSearchComponents(server);
|
|
37
|
+
registerSuggestComponents(server);
|
|
38
|
+
registerGetComponentRelationships(server);
|
|
39
|
+
registerCompareComponents(server);
|
|
31
40
|
registerCheckGitHubToken(server);
|
|
32
41
|
registerSetGitHubToken(server);
|
|
33
42
|
registerDraftIssue(server);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,YAAY,GAAG
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,iCAAiC,EAAE,MAAM,8BAA8B,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAEtE,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;CAgBpB,CAAC;AAEF,MAAM,UAAU,YAAY;IACxB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC;IAE/F,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,iCAAiC,CAAC,MAAM,CAAC,CAAC;IAC1C,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships-registry.d.ts","sourceRoot":"","sources":["../../src/services/relationships-registry.ts"],"names":[],"mappings":"AAkCA,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,sBAAsB,CAarE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { createRequire } from "module";
|
|
2
|
+
import { dirname } from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const require = createRequire(import.meta.url);
|
|
6
|
+
let cache = null;
|
|
7
|
+
function loadRelationships() {
|
|
8
|
+
const jsonPath = `${__dirname}/../data/relationships.json`;
|
|
9
|
+
return require(jsonPath);
|
|
10
|
+
}
|
|
11
|
+
function getRelationshipsData() {
|
|
12
|
+
if (cache)
|
|
13
|
+
return cache;
|
|
14
|
+
cache = loadRelationships();
|
|
15
|
+
return cache;
|
|
16
|
+
}
|
|
17
|
+
function kebabToPascalCase(kebab) {
|
|
18
|
+
return kebab
|
|
19
|
+
.split("-")
|
|
20
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
21
|
+
.join("");
|
|
22
|
+
}
|
|
23
|
+
export function getRelationships(name) {
|
|
24
|
+
const data = getRelationshipsData();
|
|
25
|
+
const normalized = name.includes("-") ? kebabToPascalCase(name) : name;
|
|
26
|
+
const entry = data[normalized];
|
|
27
|
+
const children = entry?.children ?? [];
|
|
28
|
+
const siblings = entry?.siblings ?? [];
|
|
29
|
+
const parent = Object.entries(data)
|
|
30
|
+
.filter(([, rel]) => rel.children?.includes(normalized))
|
|
31
|
+
.map(([key]) => key);
|
|
32
|
+
return { parent, children, siblings };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=relationships-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relationships-registry.js","sourceRoot":"","sources":["../../src/services/relationships-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAS/C,IAAI,KAAK,GAA6B,IAAI,CAAC;AAE3C,SAAS,iBAAiB;IACtB,MAAM,QAAQ,GAAG,GAAG,SAAS,6BAA6B,CAAC;IAC3D,OAAO,OAAO,CAAC,QAAQ,CAAsB,CAAC;AAClD,CAAC;AAED,SAAS,oBAAoB;IACzB,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAC5B,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACpC,OAAO,KAAK;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAQD,MAAM,UAAU,gBAAgB,CAAC,IAAY;IACzC,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEvE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAQ,IAAI,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;SACvD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAEzB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-components.d.ts","sourceRoot":"","sources":["../../src/tools/compare-components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuGpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA8CjE"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getComponentMeta } from "../services/meta-registry.js";
|
|
3
|
+
import { textResponse } from "../utils/mcp-response.js";
|
|
4
|
+
const RECOMMENDATIONS = {
|
|
5
|
+
"VsModal vs VsDrawer": "Use VsModal for centered dialogs requiring user attention. Use VsDrawer for side panels and navigation menus.",
|
|
6
|
+
"VsInput vs VsTextarea": "Use VsInput for single-line text. Use VsTextarea for multi-line content.",
|
|
7
|
+
"VsInput vs VsSearchInput": "Use VsInput for general text input. Use VsSearchInput when you need built-in search functionality with regex/case options.",
|
|
8
|
+
"VsSelect vs VsRadio": "Use VsSelect for dropdown selection (space-efficient). Use VsRadio when all options should be visible simultaneously.",
|
|
9
|
+
"VsCheckbox vs VsSwitch": "Use VsCheckbox for multi-select or form submission. Use VsSwitch for immediate binary on/off toggles.",
|
|
10
|
+
"VsLoading vs VsSkeleton": "Use VsLoading for action feedback (button clicks, data fetching). Use VsSkeleton as a content placeholder while page data loads.",
|
|
11
|
+
"VsToast vs VsModal": "Use VsToast for brief non-blocking notifications. Use VsModal when you need user interaction or confirmation.",
|
|
12
|
+
"VsTabs vs VsSteps": "Use VsTabs for parallel content switching. Use VsSteps for sequential workflows or wizards.",
|
|
13
|
+
"VsAccordion vs VsBlock": "Use VsAccordion for collapsible sections. Use VsBlock for always-visible content sections with optional title.",
|
|
14
|
+
"VsHeader vs VsBar": "Use VsHeader for the main app header at the top. Use VsBar for any horizontal toolbar within a layout.",
|
|
15
|
+
};
|
|
16
|
+
function getRecommendation(nameA, nameB) {
|
|
17
|
+
const keyAB = `${nameA} vs ${nameB}`;
|
|
18
|
+
const keyBA = `${nameB} vs ${nameA}`;
|
|
19
|
+
return (RECOMMENDATIONS[keyAB] ??
|
|
20
|
+
RECOMMENDATIONS[keyBA] ??
|
|
21
|
+
"Both components serve similar purposes. Check props for your specific use case.");
|
|
22
|
+
}
|
|
23
|
+
function computeDifferences(a, b) {
|
|
24
|
+
const differences = [];
|
|
25
|
+
// 1. Props count difference
|
|
26
|
+
const propsCountA = a.props.length;
|
|
27
|
+
const propsCountB = b.props.length;
|
|
28
|
+
differences.push(`${a.name} has ${propsCountA} props, ${b.name} has ${propsCountB} props`);
|
|
29
|
+
// 2. Unique props
|
|
30
|
+
const propNamesA = new Set(a.props.map((p) => p.name));
|
|
31
|
+
const propNamesB = new Set(b.props.map((p) => p.name));
|
|
32
|
+
const uniqueToA = [...propNamesA].filter((n) => !propNamesB.has(n));
|
|
33
|
+
const uniqueToB = [...propNamesB].filter((n) => !propNamesA.has(n));
|
|
34
|
+
if (uniqueToA.length > 0) {
|
|
35
|
+
differences.push(`${a.name} has unique props: ${uniqueToA.join(", ")}`);
|
|
36
|
+
}
|
|
37
|
+
if (uniqueToB.length > 0) {
|
|
38
|
+
differences.push(`${b.name} has unique props: ${uniqueToB.join(", ")}`);
|
|
39
|
+
}
|
|
40
|
+
// 3. StyleSet variables
|
|
41
|
+
const varsA = Object.keys(a.styleSet.variables);
|
|
42
|
+
const varsB = Object.keys(b.styleSet.variables);
|
|
43
|
+
if (varsA.length > 0 || varsB.length > 0) {
|
|
44
|
+
const varSummaryA = varsA.length > 0 ? varsA.join(", ") : "(none)";
|
|
45
|
+
const varSummaryB = varsB.length > 0 ? varsB.join(", ") : "(none)";
|
|
46
|
+
differences.push(`${a.name} styleSet variables: ${varSummaryA}; ${b.name} styleSet variables: ${varSummaryB}`);
|
|
47
|
+
}
|
|
48
|
+
// 4. Child component refs
|
|
49
|
+
const refsA = a.styleSet.childRefs;
|
|
50
|
+
const refsB = b.styleSet.childRefs;
|
|
51
|
+
const onlyInA = refsA.filter((r) => !refsB.includes(r));
|
|
52
|
+
const onlyInB = refsB.filter((r) => !refsA.includes(r));
|
|
53
|
+
const inBoth = refsA.filter((r) => refsB.includes(r));
|
|
54
|
+
if (onlyInA.length > 0) {
|
|
55
|
+
differences.push(`${a.name} uses exclusively: ${onlyInA.join(", ")}`);
|
|
56
|
+
}
|
|
57
|
+
if (onlyInB.length > 0) {
|
|
58
|
+
differences.push(`${b.name} uses exclusively: ${onlyInB.join(", ")}`);
|
|
59
|
+
}
|
|
60
|
+
if (inBoth.length > 0) {
|
|
61
|
+
differences.push(`Both use: ${inBoth.join(", ")}`);
|
|
62
|
+
}
|
|
63
|
+
// 5. Events count (only if different)
|
|
64
|
+
const eventsCountA = a.events.length;
|
|
65
|
+
const eventsCountB = b.events.length;
|
|
66
|
+
if (eventsCountA !== eventsCountB) {
|
|
67
|
+
differences.push(`${a.name} has ${eventsCountA} events, ${b.name} has ${eventsCountB} events`);
|
|
68
|
+
}
|
|
69
|
+
return differences;
|
|
70
|
+
}
|
|
71
|
+
export function registerCompareComponents(server) {
|
|
72
|
+
server.tool("compare_components", "Call this when the user asks 'when should I use X vs Y', 'difference between X and Y', or 'which component should I choose'. " +
|
|
73
|
+
"Returns both components' full metadata plus computed differences and a usage recommendation. " +
|
|
74
|
+
"No follow-up tool call is needed — the response is self-contained.", {
|
|
75
|
+
a: z
|
|
76
|
+
.string()
|
|
77
|
+
.describe('First component name — accepts PascalCase ("VsModal") or kebab-case ("vs-modal")'),
|
|
78
|
+
b: z
|
|
79
|
+
.string()
|
|
80
|
+
.describe('Second component name — accepts PascalCase ("VsDrawer") or kebab-case ("vs-drawer")'),
|
|
81
|
+
}, async ({ a, b }) => {
|
|
82
|
+
const metaA = getComponentMeta(a);
|
|
83
|
+
if (!metaA) {
|
|
84
|
+
return textResponse({
|
|
85
|
+
error: `Component '${a}' not found. Use list_components to see available components.`,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const metaB = getComponentMeta(b);
|
|
89
|
+
if (!metaB) {
|
|
90
|
+
return textResponse({
|
|
91
|
+
error: `Component '${b}' not found. Use list_components to see available components.`,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
if (metaA.name === metaB.name) {
|
|
95
|
+
return textResponse({
|
|
96
|
+
error: "Cannot compare a component with itself.",
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
const differences = computeDifferences(metaA, metaB);
|
|
100
|
+
const recommendation = getRecommendation(metaA.name, metaB.name);
|
|
101
|
+
return textResponse({
|
|
102
|
+
a: metaA,
|
|
103
|
+
b: metaB,
|
|
104
|
+
differences,
|
|
105
|
+
recommendation,
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=compare-components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-components.js","sourceRoot":"","sources":["../../src/tools/compare-components.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-relationships.d.ts","sourceRoot":"","sources":["../../src/tools/get-relationships.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwBzE"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getComponentMeta } from "../services/meta-registry.js";
|
|
3
|
+
import { getRelationships } from "../services/relationships-registry.js";
|
|
4
|
+
import { textResponse } from "../utils/mcp-response.js";
|
|
5
|
+
export function registerGetComponentRelationships(server) {
|
|
6
|
+
server.tool("get_component_relationships", "No prerequisite needed. " +
|
|
7
|
+
"Call this when the user asks about component composition, which components work together, or what wraps or contains a component. " +
|
|
8
|
+
"Returns parent, children, and siblings relationships from curated relationship data. " +
|
|
9
|
+
"Then use this with get_component to understand the full composition structure before generate_component_code.", { name: z.string().describe('Component name — accepts PascalCase ("VsButton") or kebab-case ("vs-button")') }, async ({ name }) => {
|
|
10
|
+
const meta = getComponentMeta(name);
|
|
11
|
+
if (!meta) {
|
|
12
|
+
return textResponse({
|
|
13
|
+
error: `Component '${name}' not found.`,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
const relationships = getRelationships(name);
|
|
17
|
+
return textResponse({
|
|
18
|
+
component: meta.name,
|
|
19
|
+
...relationships,
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=get-relationships.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-relationships.js","sourceRoot":"","sources":["../../src/tools/get-relationships.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,UAAU,iCAAiC,CAAC,MAAiB;IAC/D,MAAM,CAAC,IAAI,CACP,6BAA6B,EAC7B,0BAA0B;QACtB,mIAAmI;QACnI,uFAAuF;QACvF,+GAA+G,EACnH,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8EAA8E,CAAC,EAAE,EAC7G,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACf,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACR,OAAO,YAAY,CAAC;gBAChB,KAAK,EAAE,cAAc,IAAI,cAAc;aAC1C,CAAC,CAAC;QACP,CAAC;QAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO,YAAY,CAAC;YAChB,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,GAAG,aAAa;SACnB,CAAC,CAAC;IACP,CAAC,CACJ,CAAC;AACN,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-components.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuHpE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgEjE"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getAllComponentsMeta } from "../services/meta-registry.js";
|
|
3
|
+
import { textResponse } from "../utils/mcp-response.js";
|
|
4
|
+
const STOP_WORDS = new Set(["a", "an", "the", "for", "with", "and", "or", "to", "of", "in", "that", "is", "are"]);
|
|
5
|
+
const MAX_RESULTS = 8;
|
|
6
|
+
/** 키워드 → 컴포넌트 이름 매핑 */
|
|
7
|
+
const HEURISTIC_MAP = {
|
|
8
|
+
form: ["VsForm", "VsInput", "VsButton"],
|
|
9
|
+
login: ["VsForm", "VsInput", "VsButton"],
|
|
10
|
+
signup: ["VsForm", "VsInput", "VsButton"],
|
|
11
|
+
register: ["VsForm", "VsInput", "VsButton"],
|
|
12
|
+
submit: ["VsForm", "VsInput", "VsButton"],
|
|
13
|
+
table: ["VsTable", "VsPagination"],
|
|
14
|
+
list: ["VsTable", "VsPagination"],
|
|
15
|
+
grid: ["VsTable", "VsPagination"],
|
|
16
|
+
data: ["VsTable", "VsPagination"],
|
|
17
|
+
upload: ["VsFileDrop"],
|
|
18
|
+
file: ["VsFileDrop"],
|
|
19
|
+
drag: ["VsFileDrop"],
|
|
20
|
+
drop: ["VsFileDrop"],
|
|
21
|
+
modal: ["VsModal"],
|
|
22
|
+
dialog: ["VsModal"],
|
|
23
|
+
popup: ["VsModal"],
|
|
24
|
+
drawer: ["VsDrawer"],
|
|
25
|
+
sidebar: ["VsDrawer"],
|
|
26
|
+
panel: ["VsDrawer"],
|
|
27
|
+
toast: ["VsToast"],
|
|
28
|
+
notification: ["VsToast"],
|
|
29
|
+
alert: ["VsToast"],
|
|
30
|
+
loading: ["VsLoading", "VsSkeleton"],
|
|
31
|
+
spinner: ["VsLoading", "VsSkeleton"],
|
|
32
|
+
skeleton: ["VsLoading", "VsSkeleton"],
|
|
33
|
+
select: ["VsSelect"],
|
|
34
|
+
dropdown: ["VsSelect"],
|
|
35
|
+
choose: ["VsSelect"],
|
|
36
|
+
option: ["VsSelect"],
|
|
37
|
+
search: ["VsSearchInput"],
|
|
38
|
+
tab: ["VsTabs"],
|
|
39
|
+
tabs: ["VsTabs"],
|
|
40
|
+
pagination: ["VsPagination"],
|
|
41
|
+
page: ["VsPagination"],
|
|
42
|
+
paging: ["VsPagination"],
|
|
43
|
+
step: ["VsSteps", "VsProgress"],
|
|
44
|
+
wizard: ["VsSteps", "VsProgress"],
|
|
45
|
+
progress: ["VsSteps", "VsProgress"],
|
|
46
|
+
image: ["VsImage", "VsAvatar"],
|
|
47
|
+
photo: ["VsImage", "VsAvatar"],
|
|
48
|
+
avatar: ["VsImage", "VsAvatar"],
|
|
49
|
+
checkbox: ["VsCheckbox"],
|
|
50
|
+
check: ["VsCheckbox"],
|
|
51
|
+
multi: ["VsCheckbox"],
|
|
52
|
+
radio: ["VsRadio"],
|
|
53
|
+
switch: ["VsSwitch", "VsToggle"],
|
|
54
|
+
toggle: ["VsSwitch", "VsToggle"],
|
|
55
|
+
input: ["VsInput"],
|
|
56
|
+
text: ["VsInput"],
|
|
57
|
+
field: ["VsInput"],
|
|
58
|
+
textarea: ["VsTextarea"],
|
|
59
|
+
multiline: ["VsTextarea"],
|
|
60
|
+
paragraph: ["VsTextarea"],
|
|
61
|
+
layout: ["VsLayout", "VsHeader", "VsFooter"],
|
|
62
|
+
header: ["VsLayout", "VsHeader", "VsFooter"],
|
|
63
|
+
footer: ["VsLayout", "VsHeader", "VsFooter"],
|
|
64
|
+
accordion: ["VsAccordion"],
|
|
65
|
+
collapse: ["VsAccordion"],
|
|
66
|
+
expand: ["VsAccordion"],
|
|
67
|
+
chip: ["VsChip"],
|
|
68
|
+
tag: ["VsChip"],
|
|
69
|
+
badge: ["VsChip"],
|
|
70
|
+
tooltip: ["VsTooltip"],
|
|
71
|
+
hint: ["VsTooltip"],
|
|
72
|
+
help: ["VsTooltip"],
|
|
73
|
+
validation: ["VsForm", "VsInput", "VsMessage"],
|
|
74
|
+
rule: ["VsForm", "VsInput", "VsMessage"],
|
|
75
|
+
validate: ["VsForm", "VsInput", "VsMessage"],
|
|
76
|
+
password: ["VsInput", "VsForm", "VsButton"],
|
|
77
|
+
email: ["VsInput", "VsForm", "VsButton"],
|
|
78
|
+
auth: ["VsInput", "VsForm", "VsButton"],
|
|
79
|
+
};
|
|
80
|
+
function extractKeywords(useCase) {
|
|
81
|
+
return useCase
|
|
82
|
+
.toLowerCase()
|
|
83
|
+
.split(/[\s,./]+/)
|
|
84
|
+
.map((w) => w.replace(/[^a-z0-9]/g, ""))
|
|
85
|
+
.filter((w) => w.length > 1 && !STOP_WORDS.has(w));
|
|
86
|
+
}
|
|
87
|
+
function searchByKeyword(all, keyword) {
|
|
88
|
+
return all.filter((component) => {
|
|
89
|
+
if (component.name.toLowerCase().includes(keyword))
|
|
90
|
+
return true;
|
|
91
|
+
if (component.kebabName.toLowerCase().includes(keyword))
|
|
92
|
+
return true;
|
|
93
|
+
if (component.description.toLowerCase().includes(keyword))
|
|
94
|
+
return true;
|
|
95
|
+
return component.props.some((prop) => prop.name.toLowerCase().includes(keyword) || prop.description.toLowerCase().includes(keyword));
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
function buildReasoning(useCase, matchedNames, components) {
|
|
99
|
+
if (components.length === 0) {
|
|
100
|
+
return `No components matched for use case: '${useCase}'.`;
|
|
101
|
+
}
|
|
102
|
+
const nameToMeta = new Map(components.map((c) => [c.name, c]));
|
|
103
|
+
const descriptions = matchedNames
|
|
104
|
+
.map((name) => nameToMeta.get(name))
|
|
105
|
+
.filter((c) => c !== undefined)
|
|
106
|
+
.map((c) => `${c.name} (${c.description})`)
|
|
107
|
+
.join(", ");
|
|
108
|
+
return `Based on '${useCase}' use case: ${descriptions}. Call get_component for each to check props/StyleSet, then generate_component_code.`;
|
|
109
|
+
}
|
|
110
|
+
export function registerSuggestComponents(server) {
|
|
111
|
+
server.tool("suggest_components", "No prerequisite needed. " +
|
|
112
|
+
"Call this when the user describes a use case or feature to build (e.g. 'login form', 'file upload', 'data table') rather than asking about a specific component by name. " +
|
|
113
|
+
"Recommends relevant Vlossom components using keyword and heuristic analysis of the use case description. " +
|
|
114
|
+
"Then call get_component for each result to check props/StyleSet, then generate_component_code.", { useCase: z.string().describe("Description of the use case or feature to build (e.g. 'login form', 'file upload feature', 'data table with pagination')") }, async ({ useCase }) => {
|
|
115
|
+
const all = getAllComponentsMeta();
|
|
116
|
+
const keywords = extractKeywords(useCase);
|
|
117
|
+
const orderedNames = [];
|
|
118
|
+
const seen = new Set();
|
|
119
|
+
const addName = (name) => {
|
|
120
|
+
if (!seen.has(name)) {
|
|
121
|
+
seen.add(name);
|
|
122
|
+
orderedNames.push(name);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
// 1단계: 휴리스틱 맵 매칭
|
|
126
|
+
for (const keyword of keywords) {
|
|
127
|
+
const heuristicMatches = HEURISTIC_MAP[keyword] ?? [];
|
|
128
|
+
for (const name of heuristicMatches) {
|
|
129
|
+
addName(name);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// 2단계: 키워드 기반 메타데이터 검색
|
|
133
|
+
for (const keyword of keywords) {
|
|
134
|
+
const searchMatches = searchByKeyword(all, keyword);
|
|
135
|
+
for (const component of searchMatches) {
|
|
136
|
+
addName(component.name);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// 3단계: 최대 8개로 제한
|
|
140
|
+
const limitedNames = orderedNames.slice(0, MAX_RESULTS);
|
|
141
|
+
// 메타데이터 조회
|
|
142
|
+
const nameToMeta = new Map(all.map((c) => [c.name, c]));
|
|
143
|
+
const components = limitedNames
|
|
144
|
+
.map((name) => nameToMeta.get(name))
|
|
145
|
+
.filter((c) => c !== undefined);
|
|
146
|
+
const reasoning = buildReasoning(useCase, limitedNames, components);
|
|
147
|
+
if (components.length === 0) {
|
|
148
|
+
return textResponse({
|
|
149
|
+
components: [],
|
|
150
|
+
reasoning,
|
|
151
|
+
message: `No components matched for use case: '${useCase}'. Try search_components with a more specific keyword.`,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return textResponse({
|
|
155
|
+
components,
|
|
156
|
+
reasoning,
|
|
157
|
+
total: components.length,
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=suggest-components.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggest-components.js","sourceRoot":"","sources":["../../src/tools/suggest-components.ts"],"names":[],"mappings":"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"}
|