mozaic-mcp-server 1.0.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 (161) hide show
  1. package/INSTALLATION.md +232 -0
  2. package/README.md +262 -0
  3. package/SKILLS.md +411 -0
  4. package/bin/install-skills.js +171 -0
  5. package/data/mozaic.db +0 -0
  6. package/data/mozaic.db-shm +0 -0
  7. package/data/mozaic.db-wal +0 -0
  8. package/dist/__tests__/sanity-check.test.d.ts +2 -0
  9. package/dist/__tests__/sanity-check.test.d.ts.map +1 -0
  10. package/dist/__tests__/sanity-check.test.js +167 -0
  11. package/dist/__tests__/sanity-check.test.js.map +1 -0
  12. package/dist/__tests__/tools.integration.test.d.ts +2 -0
  13. package/dist/__tests__/tools.integration.test.d.ts.map +1 -0
  14. package/dist/__tests__/tools.integration.test.js +220 -0
  15. package/dist/__tests__/tools.integration.test.js.map +1 -0
  16. package/dist/db/queries.d.ts +144 -0
  17. package/dist/db/queries.d.ts.map +1 -0
  18. package/dist/db/queries.js +536 -0
  19. package/dist/db/queries.js.map +1 -0
  20. package/dist/db/schema.d.ts +4 -0
  21. package/dist/db/schema.d.ts.map +1 -0
  22. package/dist/db/schema.js +253 -0
  23. package/dist/db/schema.js.map +1 -0
  24. package/dist/index.d.ts +3 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +416 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/parsers/__tests__/docs-parser.test.d.ts +2 -0
  29. package/dist/parsers/__tests__/docs-parser.test.d.ts.map +1 -0
  30. package/dist/parsers/__tests__/docs-parser.test.js +251 -0
  31. package/dist/parsers/__tests__/docs-parser.test.js.map +1 -0
  32. package/dist/parsers/__tests__/icons-parser.test.d.ts +2 -0
  33. package/dist/parsers/__tests__/icons-parser.test.d.ts.map +1 -0
  34. package/dist/parsers/__tests__/icons-parser.test.js +169 -0
  35. package/dist/parsers/__tests__/icons-parser.test.js.map +1 -0
  36. package/dist/parsers/__tests__/react-parser.test.d.ts +2 -0
  37. package/dist/parsers/__tests__/react-parser.test.d.ts.map +1 -0
  38. package/dist/parsers/__tests__/react-parser.test.js +274 -0
  39. package/dist/parsers/__tests__/react-parser.test.js.map +1 -0
  40. package/dist/parsers/__tests__/scss-parser.test.d.ts +2 -0
  41. package/dist/parsers/__tests__/scss-parser.test.d.ts.map +1 -0
  42. package/dist/parsers/__tests__/scss-parser.test.js +364 -0
  43. package/dist/parsers/__tests__/scss-parser.test.js.map +1 -0
  44. package/dist/parsers/__tests__/tokens-parser.test.d.ts +2 -0
  45. package/dist/parsers/__tests__/tokens-parser.test.d.ts.map +1 -0
  46. package/dist/parsers/__tests__/tokens-parser.test.js +172 -0
  47. package/dist/parsers/__tests__/tokens-parser.test.js.map +1 -0
  48. package/dist/parsers/__tests__/vue-parser.test.d.ts +2 -0
  49. package/dist/parsers/__tests__/vue-parser.test.d.ts.map +1 -0
  50. package/dist/parsers/__tests__/vue-parser.test.js +207 -0
  51. package/dist/parsers/__tests__/vue-parser.test.js.map +1 -0
  52. package/dist/parsers/docs-parser.d.ts +4 -0
  53. package/dist/parsers/docs-parser.d.ts.map +1 -0
  54. package/dist/parsers/docs-parser.js +237 -0
  55. package/dist/parsers/docs-parser.js.map +1 -0
  56. package/dist/parsers/icons-parser.d.ts +33 -0
  57. package/dist/parsers/icons-parser.d.ts.map +1 -0
  58. package/dist/parsers/icons-parser.js +125 -0
  59. package/dist/parsers/icons-parser.js.map +1 -0
  60. package/dist/parsers/react-parser.d.ts +3 -0
  61. package/dist/parsers/react-parser.d.ts.map +1 -0
  62. package/dist/parsers/react-parser.js +406 -0
  63. package/dist/parsers/react-parser.js.map +1 -0
  64. package/dist/parsers/scss-parser.d.ts +9 -0
  65. package/dist/parsers/scss-parser.d.ts.map +1 -0
  66. package/dist/parsers/scss-parser.js +351 -0
  67. package/dist/parsers/scss-parser.js.map +1 -0
  68. package/dist/parsers/tokens/border-parser.d.ts +3 -0
  69. package/dist/parsers/tokens/border-parser.d.ts.map +1 -0
  70. package/dist/parsers/tokens/border-parser.js +83 -0
  71. package/dist/parsers/tokens/border-parser.js.map +1 -0
  72. package/dist/parsers/tokens/color-parser.d.ts +3 -0
  73. package/dist/parsers/tokens/color-parser.d.ts.map +1 -0
  74. package/dist/parsers/tokens/color-parser.js +88 -0
  75. package/dist/parsers/tokens/color-parser.js.map +1 -0
  76. package/dist/parsers/tokens/grid-parser.d.ts +3 -0
  77. package/dist/parsers/tokens/grid-parser.d.ts.map +1 -0
  78. package/dist/parsers/tokens/grid-parser.js +97 -0
  79. package/dist/parsers/tokens/grid-parser.js.map +1 -0
  80. package/dist/parsers/tokens/index.d.ts +9 -0
  81. package/dist/parsers/tokens/index.d.ts.map +1 -0
  82. package/dist/parsers/tokens/index.js +10 -0
  83. package/dist/parsers/tokens/index.js.map +1 -0
  84. package/dist/parsers/tokens/screen-parser.d.ts +3 -0
  85. package/dist/parsers/tokens/screen-parser.d.ts.map +1 -0
  86. package/dist/parsers/tokens/screen-parser.js +54 -0
  87. package/dist/parsers/tokens/screen-parser.js.map +1 -0
  88. package/dist/parsers/tokens/shadow-parser.d.ts +3 -0
  89. package/dist/parsers/tokens/shadow-parser.d.ts.map +1 -0
  90. package/dist/parsers/tokens/shadow-parser.js +62 -0
  91. package/dist/parsers/tokens/shadow-parser.js.map +1 -0
  92. package/dist/parsers/tokens/spacing-parser.d.ts +4 -0
  93. package/dist/parsers/tokens/spacing-parser.d.ts.map +1 -0
  94. package/dist/parsers/tokens/spacing-parser.js +85 -0
  95. package/dist/parsers/tokens/spacing-parser.js.map +1 -0
  96. package/dist/parsers/tokens/types.d.ts +33 -0
  97. package/dist/parsers/tokens/types.d.ts.map +1 -0
  98. package/dist/parsers/tokens/types.js +42 -0
  99. package/dist/parsers/tokens/types.js.map +1 -0
  100. package/dist/parsers/tokens/typography-parser.d.ts +3 -0
  101. package/dist/parsers/tokens/typography-parser.d.ts.map +1 -0
  102. package/dist/parsers/tokens/typography-parser.js +76 -0
  103. package/dist/parsers/tokens/typography-parser.js.map +1 -0
  104. package/dist/parsers/tokens-parser.d.ts +18 -0
  105. package/dist/parsers/tokens-parser.d.ts.map +1 -0
  106. package/dist/parsers/tokens-parser.js +57 -0
  107. package/dist/parsers/tokens-parser.js.map +1 -0
  108. package/dist/parsers/vue-parser.d.ts +3 -0
  109. package/dist/parsers/vue-parser.d.ts.map +1 -0
  110. package/dist/parsers/vue-parser.js +343 -0
  111. package/dist/parsers/vue-parser.js.map +1 -0
  112. package/dist/tools/generate-react-component.d.ts +35 -0
  113. package/dist/tools/generate-react-component.d.ts.map +1 -0
  114. package/dist/tools/generate-react-component.js +81 -0
  115. package/dist/tools/generate-react-component.js.map +1 -0
  116. package/dist/tools/generate-vue-component.d.ts +35 -0
  117. package/dist/tools/generate-vue-component.d.ts.map +1 -0
  118. package/dist/tools/generate-vue-component.js +81 -0
  119. package/dist/tools/generate-vue-component.js.map +1 -0
  120. package/dist/tools/get-component-info.d.ts +52 -0
  121. package/dist/tools/get-component-info.d.ts.map +1 -0
  122. package/dist/tools/get-component-info.js +94 -0
  123. package/dist/tools/get-component-info.js.map +1 -0
  124. package/dist/tools/get-css-utility.d.ts +41 -0
  125. package/dist/tools/get-css-utility.d.ts.map +1 -0
  126. package/dist/tools/get-css-utility.js +57 -0
  127. package/dist/tools/get-css-utility.js.map +1 -0
  128. package/dist/tools/get-design-tokens.d.ts +44 -0
  129. package/dist/tools/get-design-tokens.d.ts.map +1 -0
  130. package/dist/tools/get-design-tokens.js +124 -0
  131. package/dist/tools/get-design-tokens.js.map +1 -0
  132. package/dist/tools/get-icon.d.ts +32 -0
  133. package/dist/tools/get-icon.d.ts.map +1 -0
  134. package/dist/tools/get-icon.js +108 -0
  135. package/dist/tools/get-icon.js.map +1 -0
  136. package/dist/tools/get-install-info.d.ts +39 -0
  137. package/dist/tools/get-install-info.d.ts.map +1 -0
  138. package/dist/tools/get-install-info.js +160 -0
  139. package/dist/tools/get-install-info.js.map +1 -0
  140. package/dist/tools/list-components.d.ts +32 -0
  141. package/dist/tools/list-components.d.ts.map +1 -0
  142. package/dist/tools/list-components.js +62 -0
  143. package/dist/tools/list-components.js.map +1 -0
  144. package/dist/tools/list-css-utilities.d.ts +27 -0
  145. package/dist/tools/list-css-utilities.d.ts.map +1 -0
  146. package/dist/tools/list-css-utilities.js +48 -0
  147. package/dist/tools/list-css-utilities.js.map +1 -0
  148. package/dist/tools/search-documentation.d.ts +37 -0
  149. package/dist/tools/search-documentation.d.ts.map +1 -0
  150. package/dist/tools/search-documentation.js +120 -0
  151. package/dist/tools/search-documentation.js.map +1 -0
  152. package/dist/tools/search-icons.d.ts +41 -0
  153. package/dist/tools/search-icons.d.ts.map +1 -0
  154. package/dist/tools/search-icons.js +134 -0
  155. package/dist/tools/search-icons.js.map +1 -0
  156. package/package.json +98 -0
  157. package/skills/mozaic-css-utilities/skill.md +633 -0
  158. package/skills/mozaic-design-tokens/skill.md +621 -0
  159. package/skills/mozaic-icons/skill.md +624 -0
  160. package/skills/mozaic-react-builder/skill.md +652 -0
  161. package/skills/mozaic-vue-builder/skill.md +491 -0
@@ -0,0 +1,343 @@
1
+ import { readFileSync, existsSync, readdirSync, statSync } from "fs";
2
+ import { join, basename } from "path";
3
+ // Extract props from Vue component script
4
+ function extractProps(content) {
5
+ const props = [];
6
+ // Vue 3 Composition API: defineProps<{...}>() with TypeScript generics
7
+ // Handles both withDefaults(defineProps<{...}>(), {...}) and defineProps<{...}>()
8
+ const definePropsMatch = content.match(/defineProps<\{([\s\S]*?)\}>\s*\(\)/);
9
+ if (definePropsMatch) {
10
+ const propsContent = definePropsMatch[1];
11
+ // Extract defaults from withDefaults if present
12
+ const defaultsMatch = content.match(/withDefaults\s*\(\s*defineProps<[\s\S]*?>\s*\(\)\s*,\s*\{([\s\S]*?)\}\s*\)/);
13
+ const defaultsContent = defaultsMatch ? defaultsMatch[1] : "";
14
+ // Parse each prop with its JSDoc comment
15
+ // Pattern: /** comment */ propName?: type;
16
+ const propRegex = /(?:\/\*\*[\s\S]*?\*\/\s*)?(\w+)(\?)?:\s*([^;]+);/g;
17
+ let match;
18
+ while ((match = propRegex.exec(propsContent)) !== null) {
19
+ const propName = match[1];
20
+ const isOptional = !!match[2];
21
+ const propType = match[3].trim();
22
+ // Extract description from JSDoc comment before this prop
23
+ const beforeProp = propsContent.substring(0, match.index);
24
+ const jsdocMatch = beforeProp.match(/\/\*\*\s*([\s\S]*?)\s*\*\/\s*$/);
25
+ let description;
26
+ if (jsdocMatch) {
27
+ description = jsdocMatch[1]
28
+ .replace(/^\s*\*\s*/gm, "")
29
+ .replace(/\n/g, " ")
30
+ .trim();
31
+ }
32
+ // Extract default value
33
+ const defaultMatch = defaultsContent.match(new RegExp(`${propName}\\s*:\\s*['"\`]?([^'"\`,}]+)['"\`]?`));
34
+ const defaultValue = defaultMatch ? defaultMatch[1].trim() : undefined;
35
+ // Extract options from union types like 'a' | 'b' | 'c'
36
+ let options;
37
+ const unionMatch = propType.match(/^['"]([^'"]+)['"](?:\s*\|\s*['"]([^'"]+)['"])+$/);
38
+ if (unionMatch || (propType.includes("'") && propType.includes("|"))) {
39
+ options = propType
40
+ .split("|")
41
+ .map((s) => s.trim().replace(/['"]/g, ""))
42
+ .filter((s) => s.length > 0);
43
+ }
44
+ props.push({
45
+ name: propName,
46
+ type: propType,
47
+ required: !isOptional,
48
+ defaultValue,
49
+ options,
50
+ description,
51
+ });
52
+ }
53
+ }
54
+ // Fallback: Options API props: { ... }
55
+ if (props.length === 0) {
56
+ const propsMatch = content.match(/props\s*:\s*{([\s\S]*?)}\s*(?:,|\n\s*\w)/);
57
+ if (propsMatch) {
58
+ const propsContent = propsMatch[1];
59
+ const propRegex = /(\w+)\s*:\s*{([^}]*)}/g;
60
+ let match;
61
+ while ((match = propRegex.exec(propsContent)) !== null) {
62
+ const propName = match[1];
63
+ const propDef = match[2];
64
+ const prop = { name: propName };
65
+ const typeMatch = propDef.match(/type\s*:\s*(\w+)/);
66
+ if (typeMatch)
67
+ prop.type = typeMatch[1].toLowerCase();
68
+ const defaultMatch = propDef.match(/default\s*:\s*(?:['"`]([^'"`]*)['"`]|(\w+))/);
69
+ if (defaultMatch)
70
+ prop.defaultValue = defaultMatch[1] || defaultMatch[2];
71
+ const requiredMatch = propDef.match(/required\s*:\s*(true|false)/);
72
+ if (requiredMatch)
73
+ prop.required = requiredMatch[1] === "true";
74
+ const validatorMatch = propDef.match(/validator\s*:\s*\(?\w+\)?\s*=>\s*\[([^\]]+)\]/);
75
+ if (validatorMatch) {
76
+ prop.options = validatorMatch[1].split(",").map((s) => s.trim().replace(/['"`]/g, ""));
77
+ }
78
+ props.push(prop);
79
+ }
80
+ }
81
+ }
82
+ // Fallback: TypeScript interface-based props
83
+ if (props.length === 0) {
84
+ const interfaceMatch = content.match(/interface\s+\w*Props\w*\s*{([\s\S]*?)}/);
85
+ if (interfaceMatch) {
86
+ const interfaceContent = interfaceMatch[1];
87
+ const propRegex = /(\w+)(\?)?:\s*([^;\n]+)/g;
88
+ let match;
89
+ while ((match = propRegex.exec(interfaceContent)) !== null) {
90
+ props.push({
91
+ name: match[1],
92
+ type: match[3].trim(),
93
+ required: !match[2],
94
+ });
95
+ }
96
+ }
97
+ }
98
+ return props;
99
+ }
100
+ // Extract slots from template
101
+ function extractSlots(content) {
102
+ const slots = [];
103
+ const seenSlots = new Set();
104
+ // Match <slot> tags
105
+ const slotRegex = /<slot\s*(?:name=["']([^"']+)["'])?[^>]*>/g;
106
+ let match;
107
+ while ((match = slotRegex.exec(content)) !== null) {
108
+ const slotName = match[1] || "default";
109
+ if (!seenSlots.has(slotName)) {
110
+ seenSlots.add(slotName);
111
+ slots.push({ name: slotName });
112
+ }
113
+ }
114
+ return slots;
115
+ }
116
+ // Extract emitted events
117
+ function extractEvents(content) {
118
+ const events = [];
119
+ const seenEvents = new Set();
120
+ // Match emit calls
121
+ const emitPatterns = [
122
+ /emit\s*\(\s*['"`]([^'"`]+)['"`]/g,
123
+ /\$emit\s*\(\s*['"`]([^'"`]+)['"`]/g,
124
+ /defineEmits\s*<?\s*\[?\s*['"`]([^'"`\]]+)['"`]/g,
125
+ ];
126
+ for (const pattern of emitPatterns) {
127
+ let match;
128
+ while ((match = pattern.exec(content)) !== null) {
129
+ const eventName = match[1];
130
+ if (!seenEvents.has(eventName)) {
131
+ seenEvents.add(eventName);
132
+ events.push({ name: eventName });
133
+ }
134
+ }
135
+ }
136
+ // Match emits option
137
+ const emitsMatch = content.match(/emits\s*:\s*\[([\s\S]*?)\]/);
138
+ if (emitsMatch) {
139
+ const emitsContent = emitsMatch[1];
140
+ const eventRegex = /['"`]([^'"`]+)['"`]/g;
141
+ let match;
142
+ while ((match = eventRegex.exec(emitsContent)) !== null) {
143
+ if (!seenEvents.has(match[1])) {
144
+ seenEvents.add(match[1]);
145
+ events.push({ name: match[1] });
146
+ }
147
+ }
148
+ }
149
+ return events;
150
+ }
151
+ // Extract CSS classes from component
152
+ function extractCssClasses(content) {
153
+ const classes = [];
154
+ const seenClasses = new Set();
155
+ // Match mc- prefixed classes (Mozaic convention)
156
+ const classRegex = /['"`](mc-[a-z0-9-]+)['"`]/g;
157
+ let match;
158
+ while ((match = classRegex.exec(content)) !== null) {
159
+ if (!seenClasses.has(match[1])) {
160
+ seenClasses.add(match[1]);
161
+ classes.push(match[1]);
162
+ }
163
+ }
164
+ return classes;
165
+ }
166
+ function parseVueFile(filePath) {
167
+ try {
168
+ const content = readFileSync(filePath, "utf-8");
169
+ const fileName = basename(filePath, ".vue");
170
+ return {
171
+ name: fileName,
172
+ props: extractProps(content),
173
+ slots: extractSlots(content),
174
+ events: extractEvents(content),
175
+ };
176
+ }
177
+ catch (error) {
178
+ console.warn(`Warning: Could not parse ${filePath}:`, error);
179
+ return null;
180
+ }
181
+ }
182
+ // Parse storybook stories for examples
183
+ function parseStoriesFile(filePath) {
184
+ const examples = [];
185
+ try {
186
+ const content = readFileSync(filePath, "utf-8");
187
+ // Match story exports
188
+ const storyRegex = /export\s+const\s+(\w+)[\s\S]*?args\s*:\s*{([^}]*)}/g;
189
+ let match;
190
+ while ((match = storyRegex.exec(content)) !== null) {
191
+ const storyName = match[1];
192
+ const args = match[2];
193
+ // Skip Default story as it's usually just basic usage
194
+ if (storyName !== "Default") {
195
+ examples.push({
196
+ title: storyName.replace(/([A-Z])/g, " $1").trim(),
197
+ code: args.trim(),
198
+ });
199
+ }
200
+ }
201
+ // Also try to extract template strings
202
+ const templateRegex = /template\s*:\s*`([^`]+)`/g;
203
+ while ((match = templateRegex.exec(content)) !== null) {
204
+ examples.push({
205
+ title: "Example",
206
+ code: match[1].trim(),
207
+ });
208
+ }
209
+ }
210
+ catch (error) {
211
+ console.warn(`Warning: Could not parse stories ${filePath}:`, error);
212
+ }
213
+ return examples;
214
+ }
215
+ function findComponentDirs(baseDir) {
216
+ const dirs = [];
217
+ if (!existsSync(baseDir)) {
218
+ return dirs;
219
+ }
220
+ const entries = readdirSync(baseDir);
221
+ for (const entry of entries) {
222
+ const fullPath = join(baseDir, entry);
223
+ const stat = statSync(fullPath);
224
+ // Accept directories that are lowercase component names (not .mdx files, etc.)
225
+ if (stat.isDirectory() && /^[a-z]/.test(entry)) {
226
+ dirs.push(fullPath);
227
+ }
228
+ }
229
+ return dirs;
230
+ }
231
+ // Component category mapping based on name patterns
232
+ function inferCategory(componentName) {
233
+ const name = componentName.toLowerCase();
234
+ if (["button", "link", "optionbutton", "optioncard"].some((n) => name.includes(n))) {
235
+ return "action";
236
+ }
237
+ if ([
238
+ "input",
239
+ "select",
240
+ "checkbox",
241
+ "radio",
242
+ "toggle",
243
+ "textarea",
244
+ "field",
245
+ "autocomplete",
246
+ "datepicker",
247
+ "dropdown",
248
+ "fileuploader",
249
+ "password",
250
+ "phone",
251
+ "quantity",
252
+ ].some((n) => name.includes(n))) {
253
+ return "form";
254
+ }
255
+ if (["accordion", "breadcrumb", "menu", "pagination", "sidebar", "stepper", "tabs"].some((n) => name.includes(n))) {
256
+ return "navigation";
257
+ }
258
+ if (["badge", "flag", "loader", "modal", "notification", "progress", "tooltip"].some((n) => name.includes(n))) {
259
+ return "feedback";
260
+ }
261
+ if (["card", "divider", "layer"].some((n) => name.includes(n))) {
262
+ return "layout";
263
+ }
264
+ if (["table", "heading", "hero", "listbox", "rating", "tag"].some((n) => name.includes(n))) {
265
+ return "data-display";
266
+ }
267
+ return "other";
268
+ }
269
+ export async function parseVueComponents(componentsPath) {
270
+ const components = [];
271
+ const componentDirs = findComponentDirs(componentsPath);
272
+ for (const dir of componentDirs) {
273
+ const dirName = basename(dir);
274
+ // Convert directory name to PascalCase with M prefix (button -> MButton)
275
+ const componentName = "M" + dirName.charAt(0).toUpperCase() + dirName.slice(1);
276
+ // Try multiple file patterns
277
+ const possibleFiles = [
278
+ join(dir, `${componentName}.vue`), // MButton.vue
279
+ join(dir, `${dirName}.vue`), // button.vue
280
+ join(dir, "index.vue"), // index.vue
281
+ ];
282
+ let vueFile = null;
283
+ for (const file of possibleFiles) {
284
+ if (existsSync(file)) {
285
+ vueFile = file;
286
+ break;
287
+ }
288
+ }
289
+ if (vueFile) {
290
+ const parsed = parseVueFile(vueFile);
291
+ if (parsed) {
292
+ const component = {
293
+ name: parsed.name,
294
+ slug: parsed.name.replace(/^M/, "").toLowerCase(),
295
+ category: inferCategory(parsed.name),
296
+ frameworks: ["vue"],
297
+ props: parsed.props,
298
+ slots: parsed.slots,
299
+ events: parsed.events,
300
+ examples: [],
301
+ cssClasses: [],
302
+ };
303
+ // Try to find stories file - check both in component dir and stories subdir
304
+ const storyPatterns = [
305
+ join(dir, `${componentName}.stories.ts`), // MButton.stories.ts
306
+ join(dir, `${dirName}.stories.ts`), // button.stories.ts
307
+ join(dir, "stories", `${componentName}.stories.ts`),
308
+ join(dir, "stories", "index.stories.ts"),
309
+ ];
310
+ for (const storyPath of storyPatterns) {
311
+ if (existsSync(storyPath)) {
312
+ const stories = parseStoriesFile(storyPath);
313
+ component.examples?.push(...stories.map((s) => ({
314
+ framework: "vue",
315
+ title: s.title,
316
+ code: s.code,
317
+ })));
318
+ break; // Use first found stories file
319
+ }
320
+ }
321
+ // Also check for stories directory with multiple files
322
+ const storiesDir = join(dir, "stories");
323
+ if (existsSync(storiesDir)) {
324
+ const storyFiles = readdirSync(storiesDir).filter((f) => f.endsWith(".stories.ts"));
325
+ for (const storyFile of storyFiles) {
326
+ const stories = parseStoriesFile(join(storiesDir, storyFile));
327
+ component.examples?.push(...stories.map((s) => ({
328
+ framework: "vue",
329
+ title: s.title,
330
+ code: s.code,
331
+ })));
332
+ }
333
+ }
334
+ // Extract CSS classes from the Vue file
335
+ const vueContent = readFileSync(vueFile, "utf-8");
336
+ component.cssClasses = extractCssClasses(vueContent);
337
+ components.push(component);
338
+ }
339
+ }
340
+ }
341
+ return components;
342
+ }
343
+ //# sourceMappingURL=vue-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue-parser.js","sourceRoot":"","sources":["../../src/parsers/vue-parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type Database from "better-sqlite3";
2
+ export interface GenerateReactComponentInput {
3
+ component: string;
4
+ props?: Record<string, unknown>;
5
+ children?: string;
6
+ }
7
+ export declare function handleGenerateReactComponent(db: Database.Database, input: GenerateReactComponentInput): {
8
+ content: Array<{
9
+ type: "text";
10
+ text: string;
11
+ }>;
12
+ };
13
+ export declare const generateReactComponentTool: {
14
+ name: string;
15
+ description: string;
16
+ inputSchema: {
17
+ type: "object";
18
+ properties: {
19
+ component: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ props: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ children: {
28
+ type: string;
29
+ description: string;
30
+ };
31
+ };
32
+ required: string[];
33
+ };
34
+ };
35
+ //# sourceMappingURL=generate-react-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-react-component.d.ts","sourceRoot":"","sources":["../../src/tools/generate-react-component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,2BAA2B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,KAAK,EAAE,2BAA2B,GACjC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAyBpD;AAiDD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;CAqBtC,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { getComponentBySlug } from "../db/queries.js";
2
+ export function handleGenerateReactComponent(db, input) {
3
+ const { component, props = {}, children = "" } = input;
4
+ // Normalize component name
5
+ const slug = component.replace(/^M/i, "").toLowerCase();
6
+ const componentData = getComponentBySlug(db, slug);
7
+ // Get component name (React components use same naming as Vue in Mozaic)
8
+ const componentName = componentData?.name ||
9
+ `M${component.charAt(0).toUpperCase()}${component.slice(1).toLowerCase()}`;
10
+ const code = generateReactComponent(componentName, props, children);
11
+ let output = `// Import statement\nimport { ${componentName} } from '@mozaic-ds/react';\n\n`;
12
+ output += `// Component usage\n${code}`;
13
+ return {
14
+ content: [
15
+ {
16
+ type: "text",
17
+ text: output,
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ function generateReactComponent(componentName, props, children) {
23
+ const propsString = generatePropsString(props);
24
+ if (children) {
25
+ return `<${componentName}${propsString}>\n ${children}\n</${componentName}>`;
26
+ }
27
+ if (Object.keys(props).length === 0) {
28
+ return `<${componentName} />`;
29
+ }
30
+ return `<${componentName}${propsString} />`;
31
+ }
32
+ function generatePropsString(props) {
33
+ if (Object.keys(props).length === 0) {
34
+ return "";
35
+ }
36
+ const parts = [];
37
+ for (const [key, value] of Object.entries(props)) {
38
+ if (value === undefined || value === null) {
39
+ continue;
40
+ }
41
+ if (typeof value === "boolean") {
42
+ if (value) {
43
+ parts.push(key);
44
+ }
45
+ }
46
+ else if (typeof value === "string") {
47
+ parts.push(`${key}="${value}"`);
48
+ }
49
+ else if (typeof value === "number") {
50
+ parts.push(`${key}={${value}}`);
51
+ }
52
+ else if (typeof value === "object") {
53
+ parts.push(`${key}={${JSON.stringify(value)}}`);
54
+ }
55
+ }
56
+ return parts.length > 0 ? "\n " + parts.join("\n ") : "";
57
+ }
58
+ // Tool definition for MCP
59
+ export const generateReactComponentTool = {
60
+ name: "generate_react_component",
61
+ description: "Generate React component code using Mozaic Design System (@mozaic-ds/react)",
62
+ inputSchema: {
63
+ type: "object",
64
+ properties: {
65
+ component: {
66
+ type: "string",
67
+ description: "Component type to generate (e.g., Button, TextInput, Modal)",
68
+ },
69
+ props: {
70
+ type: "object",
71
+ description: "Component properties to apply",
72
+ },
73
+ children: {
74
+ type: "string",
75
+ description: "Content to place inside the component",
76
+ },
77
+ },
78
+ required: ["component"],
79
+ },
80
+ };
81
+ //# sourceMappingURL=generate-react-component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-react-component.js","sourceRoot":"","sources":["../../src/tools/generate-react-component.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type Database from "better-sqlite3";
2
+ export interface GenerateVueComponentInput {
3
+ component: string;
4
+ props?: Record<string, unknown>;
5
+ children?: string;
6
+ }
7
+ export declare function handleGenerateVueComponent(db: Database.Database, input: GenerateVueComponentInput): {
8
+ content: Array<{
9
+ type: "text";
10
+ text: string;
11
+ }>;
12
+ };
13
+ export declare const generateVueComponentTool: {
14
+ name: string;
15
+ description: string;
16
+ inputSchema: {
17
+ type: "object";
18
+ properties: {
19
+ component: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ props: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ children: {
28
+ type: string;
29
+ description: string;
30
+ };
31
+ };
32
+ required: string[];
33
+ };
34
+ };
35
+ //# sourceMappingURL=generate-vue-component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-vue-component.d.ts","sourceRoot":"","sources":["../../src/tools/generate-vue-component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,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,CAyBpD;AAiDD,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;CAqBpC,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { getComponentBySlug } from "../db/queries.js";
2
+ export function handleGenerateVueComponent(db, input) {
3
+ const { component, props = {}, children = "" } = input;
4
+ // Normalize component name
5
+ const slug = component.replace(/^M/i, "").toLowerCase();
6
+ const componentData = getComponentBySlug(db, slug);
7
+ // Get component name (with M prefix for Vue)
8
+ const componentName = componentData?.name ||
9
+ `M${component.charAt(0).toUpperCase()}${component.slice(1).toLowerCase()}`;
10
+ const code = generateVueComponent(componentName, props, children);
11
+ let output = `// Import statement\nimport { ${componentName} } from '@mozaic-ds/vue-3';\n\n`;
12
+ output += `// Component usage\n${code}`;
13
+ return {
14
+ content: [
15
+ {
16
+ type: "text",
17
+ text: output,
18
+ },
19
+ ],
20
+ };
21
+ }
22
+ function generateVueComponent(componentName, props, children) {
23
+ const propsString = generatePropsString(props);
24
+ if (children) {
25
+ return `<${componentName}${propsString}>\n ${children}\n</${componentName}>`;
26
+ }
27
+ if (Object.keys(props).length === 0) {
28
+ return `<${componentName} />`;
29
+ }
30
+ return `<${componentName}${propsString} />`;
31
+ }
32
+ function generatePropsString(props) {
33
+ if (Object.keys(props).length === 0) {
34
+ return "";
35
+ }
36
+ const parts = [];
37
+ for (const [key, value] of Object.entries(props)) {
38
+ if (value === undefined || value === null) {
39
+ continue;
40
+ }
41
+ if (typeof value === "boolean") {
42
+ if (value) {
43
+ parts.push(key);
44
+ }
45
+ }
46
+ else if (typeof value === "string") {
47
+ parts.push(`${key}="${value}"`);
48
+ }
49
+ else if (typeof value === "number") {
50
+ parts.push(`:${key}="${value}"`);
51
+ }
52
+ else if (typeof value === "object") {
53
+ parts.push(`:${key}="${JSON.stringify(value).replace(/"/g, "'")}"`);
54
+ }
55
+ }
56
+ return parts.length > 0 ? "\n " + parts.join("\n ") : "";
57
+ }
58
+ // Tool definition for MCP
59
+ export const generateVueComponentTool = {
60
+ name: "generate_vue_component",
61
+ description: "Generate Vue component code using Mozaic Design System (@mozaic-ds/vue-3)",
62
+ inputSchema: {
63
+ type: "object",
64
+ properties: {
65
+ component: {
66
+ type: "string",
67
+ description: "Component type to generate (e.g., button, input, modal)",
68
+ },
69
+ props: {
70
+ type: "object",
71
+ description: "Component properties to apply",
72
+ },
73
+ children: {
74
+ type: "string",
75
+ description: "Content to place inside the component",
76
+ },
77
+ },
78
+ required: ["component"],
79
+ },
80
+ };
81
+ //# sourceMappingURL=generate-vue-component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-vue-component.js","sourceRoot":"","sources":["../../src/tools/generate-vue-component.ts"],"names":[],"mappings":"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"}