mozaic-mcp-server 2.1.0 → 2.2.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.
Files changed (34) hide show
  1. package/README.md +11 -7
  2. package/SKILLS.md +53 -5
  3. package/bin/install-skills.js +1 -0
  4. package/data/mozaic.db +0 -0
  5. package/dist/__tests__/tools.integration.test.js +85 -0
  6. package/dist/__tests__/tools.integration.test.js.map +1 -1
  7. package/dist/index.js +55 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/parsers/web-components-parser.d.ts +3 -0
  10. package/dist/parsers/web-components-parser.d.ts.map +1 -0
  11. package/dist/parsers/web-components-parser.js +491 -0
  12. package/dist/parsers/web-components-parser.js.map +1 -0
  13. package/dist/tools/generate-webcomponent.d.ts +38 -0
  14. package/dist/tools/generate-webcomponent.d.ts.map +1 -0
  15. package/dist/tools/generate-webcomponent.js +83 -0
  16. package/dist/tools/generate-webcomponent.js.map +1 -0
  17. package/dist/tools/get-component-info.d.ts +1 -1
  18. package/dist/tools/get-component-info.d.ts.map +1 -1
  19. package/dist/tools/get-component-info.js +5 -1
  20. package/dist/tools/get-component-info.js.map +1 -1
  21. package/dist/tools/get-webcomponent-info.d.ts +52 -0
  22. package/dist/tools/get-webcomponent-info.d.ts.map +1 -0
  23. package/dist/tools/get-webcomponent-info.js +170 -0
  24. package/dist/tools/get-webcomponent-info.js.map +1 -0
  25. package/dist/tools/list-webcomponents.d.ts +32 -0
  26. package/dist/tools/list-webcomponents.d.ts.map +1 -0
  27. package/dist/tools/list-webcomponents.js +110 -0
  28. package/dist/tools/list-webcomponents.js.map +1 -0
  29. package/package.json +1 -1
  30. package/skills/mozaic-webcomponents-builder/scripts/generate-component.sh +67 -0
  31. package/skills/mozaic-webcomponents-builder/scripts/get-component.sh +105 -0
  32. package/skills/mozaic-webcomponents-builder/scripts/list-components.sh +42 -0
  33. package/skills/mozaic-webcomponents-builder/scripts/search-components.sh +34 -0
  34. package/skills/mozaic-webcomponents-builder/skill.md +292 -0
@@ -0,0 +1,491 @@
1
+ import { readFileSync, existsSync, readdirSync, statSync } from "fs";
2
+ import { join, basename } from "path";
3
+ // Parse Custom Elements Manifest (CEM)
4
+ function parseCustomElementsManifest(basePath) {
5
+ const components = [];
6
+ const manifestPaths = [
7
+ join(basePath, "..", "..", "custom-elements.json"),
8
+ join(basePath, "..", "custom-elements.json"),
9
+ join(basePath, "custom-elements.json"),
10
+ join(basePath, "..", "..", "custom-elements-manifest.json"),
11
+ ];
12
+ for (const manifestPath of manifestPaths) {
13
+ if (existsSync(manifestPath)) {
14
+ try {
15
+ const content = readFileSync(manifestPath, "utf-8");
16
+ const manifest = JSON.parse(content);
17
+ if (manifest.modules) {
18
+ for (const module of manifest.modules) {
19
+ if (module.declarations) {
20
+ for (const declaration of module.declarations) {
21
+ if (declaration.kind === "class" && declaration.tagName && declaration.name) {
22
+ const props = [];
23
+ const events = [];
24
+ const slots = [];
25
+ const cssProperties = [];
26
+ // Extract properties
27
+ if (declaration.members) {
28
+ for (const member of declaration.members) {
29
+ if (member.kind === "field" && member.attribute) {
30
+ props.push({
31
+ name: member.name || "",
32
+ type: member.type?.text,
33
+ defaultValue: member.default,
34
+ description: member.description,
35
+ required: !member.default,
36
+ });
37
+ }
38
+ }
39
+ }
40
+ // Extract events
41
+ if (declaration.events) {
42
+ for (const event of declaration.events) {
43
+ if (event.name) {
44
+ events.push({
45
+ name: event.name,
46
+ payload: event.type?.text,
47
+ description: event.description,
48
+ });
49
+ }
50
+ }
51
+ }
52
+ // Extract slots
53
+ if (declaration.slots) {
54
+ for (const slot of declaration.slots) {
55
+ slots.push({
56
+ name: slot.name || "default",
57
+ description: slot.description,
58
+ });
59
+ }
60
+ }
61
+ // Extract CSS custom properties
62
+ if (declaration.cssProperties) {
63
+ for (const cssProp of declaration.cssProperties) {
64
+ if (cssProp.name) {
65
+ cssProperties.push(cssProp.name);
66
+ }
67
+ }
68
+ }
69
+ components.push({
70
+ name: declaration.name,
71
+ tagName: declaration.tagName,
72
+ description: declaration.description,
73
+ props,
74
+ slots,
75
+ events,
76
+ cssProperties,
77
+ });
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ console.log(` ✓ Parsed custom elements manifest: ${components.length} components`);
84
+ return components;
85
+ }
86
+ catch (error) {
87
+ console.warn(`Warning: Could not parse manifest ${manifestPath}:`, error);
88
+ }
89
+ }
90
+ }
91
+ return components;
92
+ }
93
+ // Extract properties from TypeScript/JavaScript source
94
+ function extractPropsFromSource(content) {
95
+ const props = [];
96
+ const seenProps = new Set();
97
+ // Pattern 1: @property() decorator (Lit)
98
+ const propertyRegex = /@property\s*\(\s*\{([^}]*)\}\s*\)\s*(?:\/\*\*[\s\S]*?\*\/\s*)?(\w+)(\??)\s*:\s*([^;=\n]+)/g;
99
+ let match;
100
+ while ((match = propertyRegex.exec(content)) !== null) {
101
+ const options = match[1];
102
+ const propName = match[2];
103
+ const isOptional = match[3] === "?";
104
+ const propType = match[4].trim();
105
+ if (!seenProps.has(propName)) {
106
+ seenProps.add(propName);
107
+ // Extract type from options
108
+ const typeMatch = options.match(/type\s*:\s*(\w+)/);
109
+ const attributeMatch = options.match(/attribute\s*:\s*['"`]([^'"`]+)['"`]/);
110
+ // const reflectMatch = options.match(/reflect\s*:\s*(true|false)/);
111
+ // Extract JSDoc comment before decorator
112
+ const beforeDecorator = content.substring(0, match.index);
113
+ const jsdocMatch = beforeDecorator.match(/\/\*\*\s*([\s\S]*?)\s*\*\/\s*$/);
114
+ let description;
115
+ if (jsdocMatch) {
116
+ description = jsdocMatch[1]
117
+ .replace(/^\s*\*\s*/gm, "")
118
+ .replace(/\n/g, " ")
119
+ .trim();
120
+ }
121
+ props.push({
122
+ name: attributeMatch ? attributeMatch[1] : propName,
123
+ type: typeMatch ? typeMatch[1] : propType,
124
+ required: !isOptional,
125
+ description,
126
+ });
127
+ }
128
+ }
129
+ // Pattern 2: static properties = { ... } (Lit)
130
+ const staticPropsMatch = content.match(/static\s+properties\s*=\s*\{([\s\S]*?)\};/);
131
+ if (staticPropsMatch) {
132
+ const propsContent = staticPropsMatch[1];
133
+ const propDefRegex = /(\w+)\s*:\s*\{([^}]*)\}/g;
134
+ while ((match = propDefRegex.exec(propsContent)) !== null) {
135
+ const propName = match[1];
136
+ const propDef = match[2];
137
+ if (!seenProps.has(propName)) {
138
+ seenProps.add(propName);
139
+ const typeMatch = propDef.match(/type\s*:\s*(\w+)/);
140
+ const attributeMatch = propDef.match(/attribute\s*:\s*['"`]([^'"`]+)['"`]/);
141
+ props.push({
142
+ name: attributeMatch ? attributeMatch[1] : propName,
143
+ type: typeMatch ? typeMatch[1] : undefined,
144
+ });
145
+ }
146
+ }
147
+ }
148
+ // Pattern 3: static get properties() { return { ... } }
149
+ const staticGetPropsMatch = content.match(/static\s+get\s+properties\s*\(\s*\)\s*\{[\s\S]*?return\s*\{([\s\S]*?)\}/);
150
+ if (staticGetPropsMatch) {
151
+ const propsContent = staticGetPropsMatch[1];
152
+ const propDefRegex = /(\w+)\s*:\s*\{([^}]*)\}/g;
153
+ while ((match = propDefRegex.exec(propsContent)) !== null) {
154
+ const propName = match[1];
155
+ const propDef = match[2];
156
+ if (!seenProps.has(propName)) {
157
+ seenProps.add(propName);
158
+ const typeMatch = propDef.match(/type\s*:\s*(\w+)/);
159
+ props.push({
160
+ name: propName,
161
+ type: typeMatch ? typeMatch[1] : undefined,
162
+ });
163
+ }
164
+ }
165
+ }
166
+ return props;
167
+ }
168
+ // Extract events from source
169
+ function extractEventsFromSource(content) {
170
+ const events = [];
171
+ const seenEvents = new Set();
172
+ // Pattern 1: dispatchEvent(new CustomEvent('event-name'))
173
+ const customEventRegex = /dispatchEvent\s*\(\s*new\s+CustomEvent\s*\(\s*['"`]([^'"`]+)['"`]/g;
174
+ let match;
175
+ while ((match = customEventRegex.exec(content)) !== null) {
176
+ const eventName = match[1];
177
+ if (!seenEvents.has(eventName)) {
178
+ seenEvents.add(eventName);
179
+ events.push({ name: eventName });
180
+ }
181
+ }
182
+ // Pattern 2: this.dispatchEvent(new Event('event-name'))
183
+ const eventRegex = /dispatchEvent\s*\(\s*new\s+Event\s*\(\s*['"`]([^'"`]+)['"`]/g;
184
+ while ((match = eventRegex.exec(content)) !== null) {
185
+ const eventName = match[1];
186
+ if (!seenEvents.has(eventName)) {
187
+ seenEvents.add(eventName);
188
+ events.push({ name: eventName });
189
+ }
190
+ }
191
+ // Pattern 3: @event JSDoc tags
192
+ const jsdocEventRegex = /@(?:fires?|event)\s+\{?([^}\s]+)\}?\s+(\w+)/g;
193
+ while ((match = jsdocEventRegex.exec(content)) !== null) {
194
+ const eventName = match[2];
195
+ if (!seenEvents.has(eventName)) {
196
+ seenEvents.add(eventName);
197
+ events.push({
198
+ name: eventName,
199
+ payload: match[1],
200
+ });
201
+ }
202
+ }
203
+ return events;
204
+ }
205
+ // Extract slots from template/render
206
+ function extractSlotsFromSource(content) {
207
+ const slots = [];
208
+ const seenSlots = new Set();
209
+ // Match <slot> tags in template literals or html`` strings
210
+ const slotRegex = /<slot\s*(?:name=["']([^"']+)["'])?[^>]*>/g;
211
+ let match;
212
+ while ((match = slotRegex.exec(content)) !== null) {
213
+ const slotName = match[1] || "default";
214
+ if (!seenSlots.has(slotName)) {
215
+ seenSlots.add(slotName);
216
+ slots.push({ name: slotName });
217
+ }
218
+ }
219
+ return slots;
220
+ }
221
+ // Extract CSS custom properties
222
+ function extractCssProperties(content) {
223
+ const cssProps = [];
224
+ const seenProps = new Set();
225
+ // Match --property-name in CSS or static styles
226
+ const cssVarRegex = /(--[a-z0-9-]+)/g;
227
+ let match;
228
+ while ((match = cssVarRegex.exec(content)) !== null) {
229
+ const propName = match[1];
230
+ if (!seenProps.has(propName)) {
231
+ seenProps.add(propName);
232
+ cssProps.push(propName);
233
+ }
234
+ }
235
+ return cssProps;
236
+ }
237
+ // Parse TypeScript/JavaScript component file
238
+ function parseWebComponentFile(filePath) {
239
+ try {
240
+ const content = readFileSync(filePath, "utf-8");
241
+ const fileName = basename(filePath, ".ts").replace(/\.js$/, "");
242
+ // Extract component name from @customElement decorator or class name
243
+ let componentName = fileName;
244
+ let tagName = fileName.toLowerCase();
245
+ const customElementMatch = content.match(/@customElement\s*\(\s*['"`]([^'"`]+)['"`]\s*\)/);
246
+ if (customElementMatch) {
247
+ tagName = customElementMatch[1];
248
+ // Convert tag-name to ClassName
249
+ componentName = tagName
250
+ .split("-")
251
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
252
+ .join("");
253
+ }
254
+ // Extract class name if available
255
+ const classMatch = content.match(/class\s+(\w+)\s+extends\s+(?:LitElement|HTMLElement)/);
256
+ if (classMatch) {
257
+ componentName = classMatch[1];
258
+ }
259
+ // Extract description from JSDoc
260
+ let description;
261
+ const jsdocMatch = content.match(/\/\*\*\s*([\s\S]*?)\s*\*\/\s*export\s+class/);
262
+ if (jsdocMatch) {
263
+ description = jsdocMatch[1]
264
+ .replace(/^\s*\*\s*/gm, "")
265
+ .replace(/@\w+.*$/gm, "")
266
+ .replace(/\n/g, " ")
267
+ .trim();
268
+ }
269
+ return {
270
+ name: componentName,
271
+ tagName,
272
+ description,
273
+ props: extractPropsFromSource(content),
274
+ events: extractEventsFromSource(content),
275
+ slots: extractSlotsFromSource(content),
276
+ cssProperties: extractCssProperties(content),
277
+ };
278
+ }
279
+ catch (error) {
280
+ console.warn(`Warning: Could not parse ${filePath}:`, error);
281
+ return null;
282
+ }
283
+ }
284
+ // Parse Storybook stories for web components
285
+ function parseWebComponentStories(filePath) {
286
+ const examples = [];
287
+ try {
288
+ const content = readFileSync(filePath, "utf-8");
289
+ // Match story exports with render functions
290
+ const storyRegex = /export\s+const\s+(\w+)[\s\S]*?render:\s*\(([^)]*)\)\s*=>\s*html`([^`]*)`/g;
291
+ let match;
292
+ while ((match = storyRegex.exec(content)) !== null) {
293
+ const storyName = match[1];
294
+ const template = match[3];
295
+ if (storyName !== "Default") {
296
+ examples.push({
297
+ title: storyName.replace(/([A-Z])/g, " $1").trim(),
298
+ code: template.trim(),
299
+ });
300
+ }
301
+ }
302
+ // Also match simple template assignments
303
+ const templateRegex = /template\s*:\s*html`([^`]+)`/g;
304
+ while ((match = templateRegex.exec(content)) !== null) {
305
+ examples.push({
306
+ title: "Example",
307
+ code: match[1].trim(),
308
+ });
309
+ }
310
+ }
311
+ catch (error) {
312
+ console.warn(`Warning: Could not parse stories ${filePath}:`, error);
313
+ }
314
+ return examples;
315
+ }
316
+ // Find component directories
317
+ function findComponentDirs(baseDir) {
318
+ const dirs = [];
319
+ if (!existsSync(baseDir)) {
320
+ return dirs;
321
+ }
322
+ const entries = readdirSync(baseDir);
323
+ for (const entry of entries) {
324
+ const fullPath = join(baseDir, entry);
325
+ const stat = statSync(fullPath);
326
+ if (stat.isDirectory() && /^[a-z]/.test(entry)) {
327
+ dirs.push(fullPath);
328
+ }
329
+ }
330
+ return dirs;
331
+ }
332
+ // Infer component category
333
+ function inferCategory(componentName, tagName) {
334
+ const name = (componentName + tagName).toLowerCase();
335
+ if (["button", "link"].some((n) => name.includes(n))) {
336
+ return "action";
337
+ }
338
+ if ([
339
+ "input",
340
+ "select",
341
+ "checkbox",
342
+ "radio",
343
+ "toggle",
344
+ "textarea",
345
+ "field",
346
+ "form",
347
+ "datepicker",
348
+ "dropdown",
349
+ ].some((n) => name.includes(n))) {
350
+ return "form";
351
+ }
352
+ if (["accordion", "breadcrumb", "menu", "nav", "pagination", "tabs", "stepper"].some((n) => name.includes(n))) {
353
+ return "navigation";
354
+ }
355
+ if (["badge", "alert", "loader", "modal", "notification", "progress", "tooltip", "snackbar"].some((n) => name.includes(n))) {
356
+ return "feedback";
357
+ }
358
+ if (["card", "divider", "container", "grid", "stack"].some((n) => name.includes(n))) {
359
+ return "layout";
360
+ }
361
+ if (["table", "list", "heading", "text", "icon", "avatar", "chip", "tag"].some((n) => name.includes(n))) {
362
+ return "data-display";
363
+ }
364
+ return "other";
365
+ }
366
+ // Consolidate component data from multiple sources
367
+ function consolidateComponent(manifestData, sourceData, stories) {
368
+ // Use manifest as primary source, fall back to source parsing
369
+ const base = manifestData || sourceData;
370
+ if (!base)
371
+ return null;
372
+ const component = {
373
+ name: base.name,
374
+ slug: base.tagName,
375
+ category: inferCategory(base.name, base.tagName),
376
+ description: base.description,
377
+ frameworks: ["webcomponents"],
378
+ props: [],
379
+ slots: [],
380
+ events: [],
381
+ examples: [],
382
+ cssClasses: base.cssProperties || [],
383
+ };
384
+ // Consolidate props (deduplicate by name)
385
+ const propMap = new Map();
386
+ // Add manifest props first (higher priority)
387
+ if (manifestData) {
388
+ for (const prop of manifestData.props) {
389
+ propMap.set(prop.name, prop);
390
+ }
391
+ }
392
+ // Add source props if not already present
393
+ if (sourceData) {
394
+ for (const prop of sourceData.props) {
395
+ if (!propMap.has(prop.name)) {
396
+ propMap.set(prop.name, prop);
397
+ }
398
+ }
399
+ }
400
+ component.props = Array.from(propMap.values());
401
+ // Consolidate events
402
+ const eventMap = new Map();
403
+ if (manifestData) {
404
+ for (const event of manifestData.events) {
405
+ eventMap.set(event.name, event);
406
+ }
407
+ }
408
+ if (sourceData) {
409
+ for (const event of sourceData.events) {
410
+ if (!eventMap.has(event.name)) {
411
+ eventMap.set(event.name, event);
412
+ }
413
+ }
414
+ }
415
+ component.events = Array.from(eventMap.values());
416
+ // Consolidate slots
417
+ const slotMap = new Map();
418
+ if (manifestData) {
419
+ for (const slot of manifestData.slots) {
420
+ slotMap.set(slot.name, slot);
421
+ }
422
+ }
423
+ if (sourceData) {
424
+ for (const slot of sourceData.slots) {
425
+ if (!slotMap.has(slot.name)) {
426
+ slotMap.set(slot.name, slot);
427
+ }
428
+ }
429
+ }
430
+ component.slots = Array.from(slotMap.values());
431
+ // Add examples from Storybook
432
+ component.examples = stories.map((story) => ({
433
+ framework: "webcomponents",
434
+ title: story.title,
435
+ code: story.code,
436
+ }));
437
+ return component;
438
+ }
439
+ export async function parseWebComponents(componentsPath) {
440
+ const components = [];
441
+ // Step 1: Parse Custom Elements Manifest
442
+ const manifestComponents = parseCustomElementsManifest(componentsPath);
443
+ const manifestMap = new Map();
444
+ for (const comp of manifestComponents) {
445
+ manifestMap.set(comp.tagName, comp);
446
+ }
447
+ // Step 2: Parse component source files
448
+ const componentDirs = findComponentDirs(componentsPath);
449
+ for (const dir of componentDirs) {
450
+ const dirName = basename(dir);
451
+ // Try to find component file
452
+ const possibleFiles = [
453
+ join(dir, `${dirName}.ts`),
454
+ join(dir, `${dirName}.js`),
455
+ join(dir, "index.ts"),
456
+ join(dir, "index.js"),
457
+ ];
458
+ let componentFile = null;
459
+ for (const file of possibleFiles) {
460
+ if (existsSync(file)) {
461
+ componentFile = file;
462
+ break;
463
+ }
464
+ }
465
+ if (componentFile) {
466
+ const sourceData = parseWebComponentFile(componentFile);
467
+ // Get manifest data if available
468
+ const manifestData = sourceData ? manifestMap.get(sourceData.tagName) : undefined;
469
+ // Parse stories
470
+ let stories = [];
471
+ const storyPatterns = [
472
+ join(dir, `${dirName}.stories.ts`),
473
+ join(dir, `${dirName}.stories.js`),
474
+ join(dir, "stories", `${dirName}.stories.ts`),
475
+ ];
476
+ for (const storyPath of storyPatterns) {
477
+ if (existsSync(storyPath)) {
478
+ stories = parseWebComponentStories(storyPath);
479
+ break;
480
+ }
481
+ }
482
+ // Consolidate all data
483
+ const component = consolidateComponent(manifestData, sourceData, stories);
484
+ if (component) {
485
+ components.push(component);
486
+ }
487
+ }
488
+ }
489
+ return components;
490
+ }
491
+ //# sourceMappingURL=web-components-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-components-parser.js","sourceRoot":"","sources":["../../src/parsers/web-components-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type Database from "better-sqlite3";
2
+ export interface GenerateWebComponentInput {
3
+ component: string;
4
+ attributes?: Record<string, string>;
5
+ children?: string;
6
+ }
7
+ export declare function handleGenerateWebComponent(db: Database.Database, input: GenerateWebComponentInput): {
8
+ content: Array<{
9
+ type: "text";
10
+ text: string;
11
+ }>;
12
+ };
13
+ export declare const generateWebComponentTool: {
14
+ name: string;
15
+ description: string;
16
+ inputSchema: {
17
+ type: "object";
18
+ properties: {
19
+ component: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ attributes: {
24
+ type: string;
25
+ description: string;
26
+ additionalProperties: {
27
+ type: string;
28
+ };
29
+ };
30
+ children: {
31
+ type: string;
32
+ description: string;
33
+ };
34
+ };
35
+ required: string[];
36
+ };
37
+ };
38
+ //# sourceMappingURL=generate-webcomponent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-webcomponent.d.ts","sourceRoot":"","sources":["../../src/tools/generate-webcomponent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,yBAAyB,GAC/B;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAwBpD;AAiDD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;CA2BpC,CAAC"}
@@ -0,0 +1,83 @@
1
+ import { getComponentBySlug } from "../db/queries.js";
2
+ export function handleGenerateWebComponent(db, input) {
3
+ const { component, attributes = {}, children = "" } = input;
4
+ // Normalize component name to kebab-case slug
5
+ const slug = component.toLowerCase().replace(/^mozaic-/, "");
6
+ const componentData = getComponentBySlug(db, slug);
7
+ // Get tag name (should be kebab-case)
8
+ const tagName = componentData?.slug || `mozaic-${slug}`;
9
+ const code = generateWebComponent(tagName, attributes, children);
10
+ let output = `// Import web component\n`;
11
+ output += `import '@adeo/mozaic-web-components/${slug}.js';\n\n`;
12
+ output += `// Usage in HTML\n${code}`;
13
+ return {
14
+ content: [
15
+ {
16
+ type: "text",
17
+ text: output,
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ function generateWebComponent(tagName, attributes, children) {
23
+ const attributesString = generateAttributesString(attributes);
24
+ if (children) {
25
+ return `<${tagName}${attributesString}>\n ${children}\n</${tagName}>`;
26
+ }
27
+ if (Object.keys(attributes).length === 0) {
28
+ return `<${tagName}></${tagName}>`;
29
+ }
30
+ return `<${tagName}${attributesString}></${tagName}>`;
31
+ }
32
+ function generateAttributesString(attributes) {
33
+ if (Object.keys(attributes).length === 0) {
34
+ return "";
35
+ }
36
+ const parts = [];
37
+ for (const [key, value] of Object.entries(attributes)) {
38
+ if (value === undefined || value === null) {
39
+ continue;
40
+ }
41
+ // Web component attributes are always strings
42
+ // Boolean attributes: if truthy, add attribute without value
43
+ if (value === "true" || value === "") {
44
+ parts.push(key);
45
+ }
46
+ else if (value === "false") {
47
+ // Skip false boolean attributes
48
+ continue;
49
+ }
50
+ else {
51
+ // All other values as string attributes
52
+ parts.push(`${key}="${value}"`);
53
+ }
54
+ }
55
+ return parts.length > 0 ? "\n " + parts.join("\n ") : "";
56
+ }
57
+ // Tool definition for MCP
58
+ export const generateWebComponentTool = {
59
+ name: "generate_webcomponent",
60
+ description: "Generate Web Component code using Mozaic Design System (@adeo/mozaic-web-components). Returns ready-to-use HTML with import statement.",
61
+ inputSchema: {
62
+ type: "object",
63
+ properties: {
64
+ component: {
65
+ type: "string",
66
+ description: "Component type to generate (e.g., button, card, modal). Will be converted to kebab-case tag name (e.g., mozaic-button)",
67
+ },
68
+ attributes: {
69
+ type: "object",
70
+ description: "HTML attributes to apply to the component (all values as strings). Use 'true'/'false' for boolean attributes.",
71
+ additionalProperties: {
72
+ type: "string",
73
+ },
74
+ },
75
+ children: {
76
+ type: "string",
77
+ description: "Inner HTML content / slot content to place inside the component",
78
+ },
79
+ },
80
+ required: ["component"],
81
+ },
82
+ };
83
+ //# sourceMappingURL=generate-webcomponent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-webcomponent.js","sourceRoot":"","sources":["../../src/tools/generate-webcomponent.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type Database from "better-sqlite3";
2
2
  export interface GetComponentInfoInput {
3
3
  component: string;
4
- framework?: "vue" | "react" | "html";
4
+ framework?: "vue" | "react" | "html" | "webcomponents";
5
5
  }
6
6
  export interface ComponentInfoOutput {
7
7
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"get-component-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-component-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,qBAAqB,GAC3B;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CA6DpD;AAqBD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;CAoBhC,CAAC"}
1
+ {"version":3,"file":"get-component-info.d.ts","sourceRoot":"","sources":["../../src/tools/get-component-info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,qBAAqB,GAC3B;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CA6DpD;AAyBD,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;CAoBhC,CAAC"}