@spartan-ng/mcp 0.0.1-alpha.707

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 (44) hide show
  1. package/README.md +149 -0
  2. package/package.json +40 -0
  3. package/src/index.d.ts +1 -0
  4. package/src/index.js +2 -0
  5. package/src/index.js.map +1 -0
  6. package/src/server.d.ts +2 -0
  7. package/src/server.js +32 -0
  8. package/src/server.js.map +1 -0
  9. package/src/tools/analysis.d.ts +2 -0
  10. package/src/tools/analysis.js +269 -0
  11. package/src/tools/analysis.js.map +1 -0
  12. package/src/tools/blocks.d.ts +2 -0
  13. package/src/tools/blocks.js +173 -0
  14. package/src/tools/blocks.js.map +1 -0
  15. package/src/tools/cache-tools.d.ts +2 -0
  16. package/src/tools/cache-tools.js +175 -0
  17. package/src/tools/cache-tools.js.map +1 -0
  18. package/src/tools/cache-warmup.d.ts +40 -0
  19. package/src/tools/cache-warmup.js +156 -0
  20. package/src/tools/cache-warmup.js.map +1 -0
  21. package/src/tools/cache.d.ts +99 -0
  22. package/src/tools/cache.js +361 -0
  23. package/src/tools/cache.js.map +1 -0
  24. package/src/tools/components.d.ts +2 -0
  25. package/src/tools/components.js +126 -0
  26. package/src/tools/components.js.map +1 -0
  27. package/src/tools/docs.d.ts +2 -0
  28. package/src/tools/docs.js +91 -0
  29. package/src/tools/docs.js.map +1 -0
  30. package/src/tools/health.d.ts +2 -0
  31. package/src/tools/health.js +103 -0
  32. package/src/tools/health.js.map +1 -0
  33. package/src/tools/meta.d.ts +2 -0
  34. package/src/tools/meta.js +47 -0
  35. package/src/tools/meta.js.map +1 -0
  36. package/src/tools/prompts.d.ts +2 -0
  37. package/src/tools/prompts.js +299 -0
  38. package/src/tools/prompts.js.map +1 -0
  39. package/src/tools/resources.d.ts +2 -0
  40. package/src/tools/resources.js +178 -0
  41. package/src/tools/resources.js.map +1 -0
  42. package/src/tools/utils.d.ts +84 -0
  43. package/src/tools/utils.js +581 -0
  44. package/src/tools/utils.js.map +1 -0
@@ -0,0 +1,581 @@
1
+ import crypto from 'crypto';
2
+ // Base URLs for Spartan UI docs
3
+ export const SPARTAN_DOCS_BASE = 'https://www.spartan.ng/documentation';
4
+ export const SPARTAN_COMPONENTS_BASE = 'https://www.spartan.ng/components';
5
+ export const SPARTAN_BLOCKS_BASE = 'https://www.spartan.ng/blocks';
6
+ /**
7
+ * Known Spartan components (from docs navigation). Keep this list updated.
8
+ * Some entries may be marked as "soon" on the site.
9
+ */
10
+ export const KNOWN_COMPONENTS = [
11
+ 'accordion',
12
+ 'alert',
13
+ 'alert-dialog',
14
+ 'aspect-ratio',
15
+ 'autocomplete',
16
+ 'avatar',
17
+ 'badge',
18
+ 'breadcrumb',
19
+ 'button',
20
+ 'button-group',
21
+ 'calendar',
22
+ 'card',
23
+ 'carousel',
24
+ 'checkbox',
25
+ 'collapsible',
26
+ 'combobox',
27
+ 'command',
28
+ 'context-menu',
29
+ 'data-table',
30
+ 'date-picker',
31
+ 'dialog',
32
+ 'dropdown-menu',
33
+ 'empty',
34
+ 'field',
35
+ 'form-field',
36
+ 'hover-card',
37
+ 'icon',
38
+ 'input',
39
+ 'input-group',
40
+ 'input-otp',
41
+ 'item',
42
+ 'kbd',
43
+ 'label',
44
+ 'menubar',
45
+ 'native-select',
46
+ 'navigation-menu',
47
+ 'pagination',
48
+ 'popover',
49
+ 'progress',
50
+ 'radio-group',
51
+ 'resizable',
52
+ 'scroll-area',
53
+ 'select',
54
+ 'separator',
55
+ 'sheet',
56
+ 'sidebar',
57
+ 'skeleton',
58
+ 'slider',
59
+ 'sonner',
60
+ 'spinner',
61
+ 'switch',
62
+ 'table',
63
+ 'tabs',
64
+ 'textarea',
65
+ 'toggle',
66
+ 'toggle-group',
67
+ 'tooltip',
68
+ ];
69
+ /**
70
+ * Known Spartan blocks (pre-built UI patterns).
71
+ */
72
+ export const KNOWN_BLOCKS = ['sidebar', 'login', 'signup', 'calendar'];
73
+ /**
74
+ * Known documentation topics.
75
+ */
76
+ export const DOCUMENTATION_TOPICS = [
77
+ 'installation',
78
+ 'cli',
79
+ 'theming',
80
+ 'dark-mode',
81
+ 'typography',
82
+ 'health-checks',
83
+ 'update-guide',
84
+ ];
85
+ /**
86
+ * Minimal HTML -> text converter for callers that want plain text.
87
+ */
88
+ export function htmlToText(html) {
89
+ const withoutScripts = html.replace(/<script[\s\S]*?<\/script>/gi, '');
90
+ const withoutStyles = withoutScripts.replace(/<style[\s\S]*?<\/style>/gi, '');
91
+ const withBreaks = withoutStyles
92
+ .replace(/<\/(p|div|section|article|li|h[1-6]|br|pre)>/gi, '\n')
93
+ .replace(/<(br|hr)\s*\/?>/gi, '\n');
94
+ const stripped = withBreaks.replace(/<[^>]+>/g, '');
95
+ const decoded = stripped
96
+ .replace(/&nbsp;/g, ' ')
97
+ .replace(/&amp;/g, '&')
98
+ .replace(/&lt;/g, '<')
99
+ .replace(/&gt;/g, '>')
100
+ .replace(/&quot;/g, '"')
101
+ .replace(/&#39;/g, "'");
102
+ return decoded.replace(/\n{3,}/g, '\n\n').trim();
103
+ }
104
+ /**
105
+ * Simple in-memory cache for fetched pages.
106
+ */
107
+ const responseCache = new Map();
108
+ /**
109
+ * Fetch a URL and return HTML or text with basic caching.
110
+ */
111
+ export async function fetchContent(url, format = 'html', noCache = false) {
112
+ const ttlMs = Number(process.env.SPARTAN_CACHE_TTL_MS || 5 * 60 * 1000);
113
+ const cacheKey = `${url}::${format}`;
114
+ const now = Date.now();
115
+ if (!noCache && responseCache.has(cacheKey)) {
116
+ const entry = responseCache.get(cacheKey);
117
+ if (now - entry.timestampMs < ttlMs) {
118
+ return entry.content;
119
+ }
120
+ }
121
+ const controller = new AbortController();
122
+ const timeout = setTimeout(() => controller.abort(), 10000);
123
+ let res;
124
+ try {
125
+ res = await fetch(url, {
126
+ headers: { 'User-Agent': 'spartan-mcp/1.0' },
127
+ signal: controller.signal,
128
+ });
129
+ }
130
+ catch (err) {
131
+ if (err instanceof DOMException && err.name === 'AbortError') {
132
+ throw new Error(`Request timed out: ${url}`);
133
+ }
134
+ throw err;
135
+ }
136
+ finally {
137
+ clearTimeout(timeout);
138
+ }
139
+ if (!res.ok) {
140
+ throw new Error(`Failed to fetch ${url}: ${res.status} ${res.statusText}`);
141
+ }
142
+ const html = await res.text();
143
+ const result = format === 'text' ? htmlToText(html) : html;
144
+ if (!noCache) {
145
+ responseCache.set(cacheKey, { content: result, timestampMs: now });
146
+ }
147
+ return result;
148
+ }
149
+ /**
150
+ * Detect language from code content and HTML attributes.
151
+ */
152
+ function detectLanguageFromContext(code, openingTags) {
153
+ // Check HTML class attribute first (e.g., <code class="language-typescript">)
154
+ const langMatch = openingTags.match(/language-(\w+)/i) || openingTags.match(/lang-(\w+)/i);
155
+ if (langMatch) {
156
+ const lang = langMatch[1].toLowerCase();
157
+ if (['typescript', 'javascript', 'html', 'css', 'bash', 'json', 'shell'].includes(lang)) {
158
+ return lang;
159
+ }
160
+ }
161
+ return detectLanguage(code);
162
+ }
163
+ /**
164
+ * Extract a title from the code block's HTML context (e.g., preceding heading).
165
+ */
166
+ function extractTitleFromContext(html, matchIndex) {
167
+ // Look for a heading before this code block
168
+ const beforeCode = html.slice(Math.max(0, matchIndex - 1000), matchIndex);
169
+ const headingMatch = beforeCode.match(/<h[1-6][^>]*>([^<]+)<\/h[1-6]>\s*$/i);
170
+ if (headingMatch) {
171
+ return htmlToText(headingMatch[1]).trim();
172
+ }
173
+ // Look for a caption or label
174
+ const captionMatch = beforeCode.match(/<(caption|summary|label)[^>]*>([^<]+)<\/\1>\s*$/i);
175
+ if (captionMatch) {
176
+ return htmlToText(captionMatch[2]).trim();
177
+ }
178
+ return '';
179
+ }
180
+ /**
181
+ * Remove common leading whitespace from code (like ES6 dedent).
182
+ */
183
+ function dedent(code) {
184
+ const lines = code.split('\n');
185
+ // Find minimum indentation (ignoring empty lines)
186
+ let minIndent = Infinity;
187
+ for (const line of lines) {
188
+ if (line.trim().length === 0)
189
+ continue;
190
+ const match = line.match(/^(\s*)/);
191
+ if (match) {
192
+ minIndent = Math.min(minIndent, match[1].length);
193
+ }
194
+ }
195
+ if (minIndent === Infinity || minIndent === 0) {
196
+ return code;
197
+ }
198
+ // Remove common indentation
199
+ return lines
200
+ .map((line) => (line.trim().length > 0 ? line.slice(minIndent) : line))
201
+ .join('\n')
202
+ .trim();
203
+ }
204
+ /**
205
+ * Clean up code: fix HTML entities, normalize line endings, dedent.
206
+ */
207
+ function cleanCode(raw) {
208
+ let code = raw;
209
+ // Normalize line endings
210
+ code = code.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
211
+ // Fix HTML entities that might remain
212
+ code = code
213
+ .replace(/&nbsp;/g, ' ')
214
+ .replace(/&amp;/g, '&')
215
+ .replace(/&lt;/g, '<')
216
+ .replace(/&gt;/g, '>')
217
+ .replace(/&quot;/g, '"')
218
+ .replace(/&#39;/g, "'")
219
+ .replace(/&apos;/g, "'");
220
+ // Remove trailing whitespace on each line
221
+ code = code
222
+ .split('\n')
223
+ .map((line) => line.trimEnd())
224
+ .join('\n');
225
+ // Remove leading/trailing blank lines
226
+ code = code.replace(/^\n+/, '').replace(/\n+$/, '');
227
+ // Dedent
228
+ code = dedent(code);
229
+ // Collapse excessive blank lines (max 1 consecutive)
230
+ code = code.replace(/\n{3,}/g, '\n\n');
231
+ return code;
232
+ }
233
+ /**
234
+ * Generate an ID from code content for deduplication.
235
+ */
236
+ function generateCodeId(code) {
237
+ const hash = crypto.createHash('sha256').update(code).digest('hex').slice(0, 12);
238
+ return `${hash}-${code.length}`;
239
+ }
240
+ /**
241
+ * Extract code blocks from HTML and return as an array of CodeBlock objects.
242
+ */
243
+ export function extractCodeBlocks(html) {
244
+ const blocks = [];
245
+ const seenIds = new Set();
246
+ // Match <pre><code> blocks with position tracking
247
+ const preCodeRegex = /<pre[^>]*>\s*<code[^>]*>([\s\S]*?)<\/code>\s*<\/pre>/gi;
248
+ let match;
249
+ while ((match = preCodeRegex.exec(html)) !== null) {
250
+ // Capture both the <pre ...> and <code ...> opening tags so language classes
251
+ // (typically on the <code> element, e.g. class="language-typescript") are seen.
252
+ const openingTags = /<pre[^>]*>\s*<code[^>]*>/i.exec(match[0])?.[0] ?? '';
253
+ const rawInner = match[1];
254
+ // Strip nested HTML tags (like syntax highlighting spans) but keep text
255
+ const strippedInner = rawInner.replace(/<[^>]+>/g, '');
256
+ const rawCode = htmlToText(strippedInner);
257
+ const lines = rawCode.split('\n').filter((line) => line.trim().length > 0);
258
+ // Skip very short blocks (single imports, snippets)
259
+ if (lines.length < 3)
260
+ continue;
261
+ const code = cleanCode(rawCode);
262
+ if (code.length < 20)
263
+ continue;
264
+ const id = generateCodeId(code);
265
+ if (seenIds.has(id))
266
+ continue;
267
+ seenIds.add(id);
268
+ const language = detectLanguageFromContext(rawCode, openingTags);
269
+ const title = extractTitleFromContext(html, match.index);
270
+ blocks.push({ code, language, title, id });
271
+ }
272
+ return blocks;
273
+ }
274
+ /**
275
+ * Extract headings (h1-h3) and return as plain text in order.
276
+ */
277
+ export function extractHeadings(html) {
278
+ const regex = /<(h[1-3])[^>]*>([\s\S]*?)<\/\1>/gi;
279
+ const headings = [];
280
+ let match;
281
+ while ((match = regex.exec(html)) !== null)
282
+ headings.push(htmlToText(match[2]));
283
+ return headings;
284
+ }
285
+ export function extractLinks(html) {
286
+ const regex = /<a[^>]*href=["']([^"']+)["'][^>]*>([\s\S]*?)<\/a>/gi;
287
+ const links = [];
288
+ let match;
289
+ while ((match = regex.exec(html)) !== null) {
290
+ links.push({ href: match[1], text: htmlToText(match[2]) });
291
+ }
292
+ return links;
293
+ }
294
+ function normalizeInlineWhitespace(value) {
295
+ return value.replace(/\s+/g, ' ').trim();
296
+ }
297
+ function getHeadingMatches(html) {
298
+ const matches = [];
299
+ const regex = /<h([1-6])[^>]*>([\s\S]*?)<\/h\1>/gi;
300
+ let match;
301
+ while ((match = regex.exec(html)) !== null) {
302
+ matches.push({
303
+ text: normalizeInlineWhitespace(htmlToText(match[2])),
304
+ start: match.index,
305
+ end: regex.lastIndex,
306
+ });
307
+ }
308
+ return matches;
309
+ }
310
+ function extractSectionContent(html, heading, stopHeadings) {
311
+ const headings = getHeadingMatches(html);
312
+ const startHeading = headings.find((item) => item.text === heading);
313
+ if (!startHeading) {
314
+ return null;
315
+ }
316
+ const stopHeading = headings.find((item) => item.start > startHeading.start && stopHeadings.includes(item.text));
317
+ return html.slice(startHeading.end, stopHeading?.start ?? html.length);
318
+ }
319
+ function buildAPIExamples(html) {
320
+ return extractCodeBlocks(html)
321
+ .slice(0, 10)
322
+ .map((block, index) => ({
323
+ title: block.title || `Example ${index + 1}`,
324
+ code: block.code,
325
+ language: block.language,
326
+ }));
327
+ }
328
+ /**
329
+ * Extract structured API information from component documentation
330
+ */
331
+ export function extractAPIInfo(html) {
332
+ const apiInfo = {
333
+ brainAPI: [],
334
+ helmAPI: [],
335
+ examples: [],
336
+ };
337
+ try {
338
+ const brainAPISection = extractSectionContent(html, 'Brain API', ['Helm API', 'On this page']);
339
+ const helmAPISection = extractSectionContent(html, 'Helm API', ['On this page']);
340
+ if (brainAPISection) {
341
+ apiInfo.brainAPI = extractAPIComponents(brainAPISection);
342
+ }
343
+ if (helmAPISection) {
344
+ apiInfo.helmAPI = extractAPIComponents(helmAPISection);
345
+ }
346
+ apiInfo.examples = buildAPIExamples(html);
347
+ }
348
+ catch (error) {
349
+ console.error('Error extracting API info:', error);
350
+ }
351
+ return apiInfo;
352
+ }
353
+ function extractAPIComponents(html) {
354
+ const componentHeadings = getHeadingMatches(html).filter((item) => /^(Brn|Hlm)\w+$/.test(item.text));
355
+ if (componentHeadings.length === 0) {
356
+ return extractAPIComponentsFromText(htmlToText(html));
357
+ }
358
+ return componentHeadings.map((heading, index) => {
359
+ const nextHeading = componentHeadings[index + 1];
360
+ const content = html.slice(heading.end, nextHeading?.start ?? html.length);
361
+ return {
362
+ name: heading.text,
363
+ selector: extractSelector(content),
364
+ inputs: extractInputsFromTable(content),
365
+ outputs: extractOutputsFromTable(content),
366
+ };
367
+ });
368
+ }
369
+ function extractInputsFromTable(html) {
370
+ const props = [];
371
+ const tableSection = extractSectionContent(html, 'Inputs', ['Outputs']);
372
+ if (!tableSection)
373
+ return extractInputsFromText(htmlToText(html));
374
+ const rowRegex = /<tr[^>]*>([\s\S]*?)<\/tr>/gi;
375
+ let rowMatch;
376
+ let isHeaderRow = true;
377
+ while ((rowMatch = rowRegex.exec(tableSection)) !== null) {
378
+ const rowContent = rowMatch[1];
379
+ if (isHeaderRow) {
380
+ isHeaderRow = false;
381
+ continue;
382
+ }
383
+ const cells = [];
384
+ const cellRegex = /<t[dh][^>]*>([\s\S]*?)<\/t[dh]>/gi;
385
+ let cellMatch;
386
+ while ((cellMatch = cellRegex.exec(rowContent)) !== null) {
387
+ cells.push(htmlToText(cellMatch[1]).trim());
388
+ }
389
+ if (cells.length >= 3) {
390
+ props.push({
391
+ prop: cells[0],
392
+ type: cells[1],
393
+ default: cells[2],
394
+ description: cells[3] || '',
395
+ });
396
+ }
397
+ }
398
+ return props.length > 0
399
+ ? props
400
+ : extractInputRowsFromSectionText(htmlToText(tableSection))
401
+ .map(parseInputRow)
402
+ .filter((row) => row !== null);
403
+ }
404
+ function extractOutputsFromTable(html) {
405
+ const props = [];
406
+ const tableSection = extractSectionContent(html, 'Outputs', []);
407
+ if (!tableSection)
408
+ return extractOutputsFromText(htmlToText(html));
409
+ const rowRegex = /<tr[^>]*>([\s\S]*?)<\/tr>/gi;
410
+ let rowMatch;
411
+ let isHeaderRow = true;
412
+ while ((rowMatch = rowRegex.exec(tableSection)) !== null) {
413
+ const rowContent = rowMatch[1];
414
+ if (isHeaderRow) {
415
+ isHeaderRow = false;
416
+ continue;
417
+ }
418
+ const cells = [];
419
+ const cellRegex = /<t[dh][^>]*>([\s\S]*?)<\/t[dh]>/gi;
420
+ let cellMatch;
421
+ while ((cellMatch = cellRegex.exec(rowContent)) !== null) {
422
+ cells.push(htmlToText(cellMatch[1]).trim());
423
+ }
424
+ if (cells.length >= 3) {
425
+ props.push({
426
+ prop: cells[0],
427
+ type: cells[1],
428
+ description: (cells.length >= 4 ? cells.slice(3) : cells.slice(2)).join(' ').trim(),
429
+ });
430
+ }
431
+ }
432
+ return props.length > 0
433
+ ? props
434
+ : extractInputRowsFromSectionText(htmlToText(tableSection))
435
+ .map(parseOutputRow)
436
+ .filter((row) => row !== null);
437
+ }
438
+ function extractSelector(html) {
439
+ const selectorMatch = htmlToText(html).match(/Selector:\s*([^\n]+)/i);
440
+ return selectorMatch ? selectorMatch[1].replace(/`/g, '').trim() : '';
441
+ }
442
+ function extractAPIComponentsFromText(text) {
443
+ const lines = text
444
+ .split('\n')
445
+ .map((line) => line.trim())
446
+ .filter(Boolean);
447
+ const components = [];
448
+ let currentName = null;
449
+ let currentBlock = [];
450
+ const flush = () => {
451
+ if (!currentName) {
452
+ return;
453
+ }
454
+ const blockText = currentBlock.join('\n');
455
+ components.push({
456
+ name: currentName,
457
+ selector: extractSelector(blockText),
458
+ inputs: extractInputsFromText(blockText),
459
+ outputs: extractOutputsFromText(blockText),
460
+ });
461
+ };
462
+ for (const line of lines) {
463
+ if (/^(Brn|Hlm)\w+$/.test(line)) {
464
+ flush();
465
+ currentName = line;
466
+ currentBlock = [];
467
+ continue;
468
+ }
469
+ if (currentName) {
470
+ currentBlock.push(line);
471
+ }
472
+ }
473
+ flush();
474
+ return components;
475
+ }
476
+ function extractInputsFromText(text) {
477
+ const rows = extractSectionRows(text, 'Inputs', 'Outputs');
478
+ return rows.map(parseInputRow).filter((row) => row !== null);
479
+ }
480
+ function extractOutputsFromText(text) {
481
+ const rows = extractSectionRows(text, 'Outputs');
482
+ return rows.map(parseOutputRow).filter((row) => row !== null);
483
+ }
484
+ function parseInputRow(row) {
485
+ const wideParts = row.split(/\s{2,}/).map((part) => part.trim());
486
+ if (wideParts.length >= 4) {
487
+ const [prop, type, defaultValue, ...description] = wideParts;
488
+ return {
489
+ prop,
490
+ type,
491
+ default: defaultValue,
492
+ description: description.join(' ').trim(),
493
+ };
494
+ }
495
+ const compactMatch = row.match(/^(\S+)\s+(.+?)\s+(-|true|false|null|undefined|\d+(?:\.\d+)?|["'][^"']*["'])\s+(.+)$/);
496
+ if (!compactMatch) {
497
+ return null;
498
+ }
499
+ return {
500
+ prop: compactMatch[1],
501
+ type: compactMatch[2],
502
+ default: compactMatch[3],
503
+ description: compactMatch[4].trim(),
504
+ };
505
+ }
506
+ function parseOutputRow(row) {
507
+ const wideParts = row.split(/\s{2,}/).map((part) => part.trim());
508
+ if (wideParts.length >= 4) {
509
+ return {
510
+ prop: wideParts[0],
511
+ type: wideParts[1],
512
+ description: wideParts.slice(3).join(' ').trim(),
513
+ };
514
+ }
515
+ if (wideParts.length === 3) {
516
+ return {
517
+ prop: wideParts[0],
518
+ type: wideParts[1],
519
+ description: wideParts[2],
520
+ };
521
+ }
522
+ const compactMatch = row.match(/^(\S+)\s+(.+?)\s+(-|true|false|null|undefined|\d+(?:\.\d+)?|["'][^"']*["'])\s+(.+)$/);
523
+ if (!compactMatch) {
524
+ return null;
525
+ }
526
+ return {
527
+ prop: compactMatch[1],
528
+ type: compactMatch[2],
529
+ description: compactMatch[4].trim(),
530
+ };
531
+ }
532
+ function extractSectionRows(text, heading, stopHeading) {
533
+ const lines = text
534
+ .split('\n')
535
+ .map((line) => line.trim())
536
+ .filter(Boolean);
537
+ const startIndex = lines.findIndex((line) => line === heading);
538
+ if (startIndex === -1) {
539
+ return [];
540
+ }
541
+ const rows = [];
542
+ for (let index = startIndex + 1; index < lines.length; index += 1) {
543
+ const line = lines[index];
544
+ if (stopHeading && line === stopHeading) {
545
+ break;
546
+ }
547
+ if (/^(Brn|Hlm)\w+$/.test(line)) {
548
+ break;
549
+ }
550
+ if (/^Prop\s+Type/i.test(line)) {
551
+ continue;
552
+ }
553
+ rows.push(line);
554
+ }
555
+ return rows;
556
+ }
557
+ function extractInputRowsFromSectionText(text) {
558
+ return text
559
+ .split('\n')
560
+ .map((line) => line.trim())
561
+ .filter((line) => line.length > 0 && !/^Prop\s+Type/i.test(line));
562
+ }
563
+ /**
564
+ * Simple language detection based on code content
565
+ */
566
+ export function detectLanguage(code) {
567
+ if (code.includes('import') && code.includes('Component')) {
568
+ return 'typescript';
569
+ }
570
+ if (code.includes('import') && code.includes('from')) {
571
+ return 'javascript';
572
+ }
573
+ if (code.includes('<') && code.includes('>') && code.includes('hlm')) {
574
+ return 'html';
575
+ }
576
+ if (code.includes('npm') || code.includes('npx') || code.includes('ng ')) {
577
+ return 'bash';
578
+ }
579
+ return 'typescript';
580
+ }
581
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../libs/mcp/src/tools/utils.ts"],"names":[],"mappings":"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"}