@urbicon-ui/mcp-server 6.25.0 → 6.26.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 (81) hide show
  1. package/package.json +9 -3
  2. package/dist/data/catalog-loader.d.ts +0 -37
  3. package/dist/data/catalog-loader.d.ts.map +0 -1
  4. package/dist/data/catalog-loader.js +0 -15
  5. package/dist/data/catalog-loader.js.map +0 -1
  6. package/dist/data/component-loader.d.ts +0 -2
  7. package/dist/data/component-loader.d.ts.map +0 -1
  8. package/dist/data/component-loader.js +0 -17
  9. package/dist/data/component-loader.js.map +0 -1
  10. package/dist/data/recipe-loader.d.ts +0 -4
  11. package/dist/data/recipe-loader.d.ts.map +0 -1
  12. package/dist/data/recipe-loader.js +0 -102
  13. package/dist/data/recipe-loader.js.map +0 -1
  14. package/dist/data/template-loader.d.ts +0 -8
  15. package/dist/data/template-loader.d.ts.map +0 -1
  16. package/dist/data/template-loader.js +0 -33
  17. package/dist/data/template-loader.js.map +0 -1
  18. package/dist/index.d.ts +0 -3
  19. package/dist/index.d.ts.map +0 -1
  20. package/dist/index.js +0 -57
  21. package/dist/index.js.map +0 -1
  22. package/dist/resources/catalog.d.ts +0 -3
  23. package/dist/resources/catalog.d.ts.map +0 -1
  24. package/dist/resources/catalog.js +0 -20
  25. package/dist/resources/catalog.js.map +0 -1
  26. package/dist/resources/component.d.ts +0 -3
  27. package/dist/resources/component.d.ts.map +0 -1
  28. package/dist/resources/component.js +0 -29
  29. package/dist/resources/component.js.map +0 -1
  30. package/dist/resources/guides.d.ts +0 -3
  31. package/dist/resources/guides.d.ts.map +0 -1
  32. package/dist/resources/guides.js +0 -36
  33. package/dist/resources/guides.js.map +0 -1
  34. package/dist/server.d.ts +0 -3
  35. package/dist/server.d.ts.map +0 -1
  36. package/dist/server.js.map +0 -1
  37. package/dist/tools/find-components.d.ts +0 -3
  38. package/dist/tools/find-components.d.ts.map +0 -1
  39. package/dist/tools/find-components.js +0 -21
  40. package/dist/tools/find-components.js.map +0 -1
  41. package/dist/tools/get-recipe.d.ts +0 -3
  42. package/dist/tools/get-recipe.d.ts.map +0 -1
  43. package/dist/tools/get-recipe.js +0 -48
  44. package/dist/tools/get-recipe.js.map +0 -1
  45. package/dist/tools/suggest-implementation.d.ts +0 -3
  46. package/dist/tools/suggest-implementation.d.ts.map +0 -1
  47. package/dist/tools/suggest-implementation.js +0 -178
  48. package/dist/tools/suggest-implementation.js.map +0 -1
  49. package/dist/transports/http.d.ts +0 -2
  50. package/dist/transports/http.d.ts.map +0 -1
  51. package/dist/transports/http.js +0 -77
  52. package/dist/transports/http.js.map +0 -1
  53. package/dist/transports/stdio.d.ts +0 -3
  54. package/dist/transports/stdio.d.ts.map +0 -1
  55. package/dist/transports/stdio.js +0 -6
  56. package/dist/transports/stdio.js.map +0 -1
  57. package/dist/tsconfig.tsbuildinfo +0 -1
  58. package/dist/utils/format-catalog.d.ts +0 -7
  59. package/dist/utils/format-catalog.d.ts.map +0 -1
  60. package/dist/utils/format-catalog.js +0 -93
  61. package/dist/utils/format-catalog.js.map +0 -1
  62. package/dist/utils/paths.d.ts +0 -7
  63. package/dist/utils/paths.d.ts.map +0 -1
  64. package/dist/utils/paths.js +0 -23
  65. package/dist/utils/paths.js.map +0 -1
  66. package/dist/utils/search.d.ts +0 -3
  67. package/dist/utils/search.d.ts.map +0 -1
  68. package/dist/utils/search.js +0 -44
  69. package/dist/utils/search.js.map +0 -1
  70. package/src/data/catalog-loader.test.ts +0 -42
  71. package/src/data/design-system-loader.test.ts +0 -82
  72. package/src/data/icon-loader.test.ts +0 -30
  73. package/src/eval/briefs.ts +0 -104
  74. package/src/eval/eval.test.ts +0 -106
  75. package/src/eval/index.ts +0 -11
  76. package/src/eval/score.ts +0 -128
  77. package/src/prompts/design-prompts.test.ts +0 -79
  78. package/src/server.test.ts +0 -78
  79. package/src/utils/format-catalog.test.ts +0 -144
  80. package/tsconfig.json +0 -27
  81. package/vitest.config.ts +0 -15
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urbicon-ui/mcp-server",
3
- "version": "6.25.0",
3
+ "version": "6.26.0",
4
4
  "description": "Model Context Protocol server exposing the Urbicon UI component catalog, recipes and design intelligence to LLM agents",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -20,6 +20,12 @@
20
20
  "engines": {
21
21
  "bun": ">=1.0.0"
22
22
  },
23
+ "files": [
24
+ "src",
25
+ "!src/**/*.test.*",
26
+ "!src/**/*.spec.*",
27
+ "!src/eval/**"
28
+ ],
23
29
  "main": "./src/index.ts",
24
30
  "scripts": {
25
31
  "build": "echo 'no build needed — Bun runs TypeScript directly'",
@@ -32,8 +38,8 @@
32
38
  },
33
39
  "dependencies": {
34
40
  "@modelcontextprotocol/sdk": "^1.29.0",
35
- "@urbicon-ui/design-content": "6.25.0",
36
- "@urbicon-ui/design-engine": "6.25.0",
41
+ "@urbicon-ui/design-content": "6.26.0",
42
+ "@urbicon-ui/design-engine": "6.26.0",
37
43
  "zod": "^4.3.6"
38
44
  },
39
45
  "devDependencies": {
@@ -1,37 +0,0 @@
1
- export interface ComponentCatalogEntry {
2
- name: string;
3
- slug: string;
4
- package: string;
5
- group: 'primitives' | 'components' | 'core';
6
- description: string;
7
- tags: string[];
8
- import: string;
9
- llmTxtPath: string;
10
- variants: {
11
- name: string;
12
- values: string[];
13
- default?: string;
14
- }[];
15
- keyProps: string[];
16
- slots: string[];
17
- hasExamples: boolean;
18
- relatedComponents: string[];
19
- }
20
- export interface RecipeEntry {
21
- id: string;
22
- title: string;
23
- description: string;
24
- components: string[];
25
- code: string;
26
- features: string[];
27
- }
28
- export interface ComponentCatalog {
29
- generated: string;
30
- version: string;
31
- components: ComponentCatalogEntry[];
32
- recipes: RecipeEntry[];
33
- tags: string[];
34
- }
35
- export declare function loadCatalog(): Promise<ComponentCatalog>;
36
- export declare function getCachedCatalog(): ComponentCatalog | null;
37
- //# sourceMappingURL=catalog-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"catalog-loader.d.ts","sourceRoot":"","sources":["../../src/data/catalog-loader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,YAAY,GAAG,YAAY,GAAG,MAAM,CAAC;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,qBAAqB,EAAE,CAAC;IACpC,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAID,wBAAsB,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAO7D;AAED,wBAAgB,gBAAgB,IAAI,gBAAgB,GAAG,IAAI,CAE1D"}
@@ -1,15 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import { getCatalogPath } from '../utils/paths.js';
3
- let cachedCatalog = null;
4
- export async function loadCatalog() {
5
- if (cachedCatalog)
6
- return cachedCatalog;
7
- const catalogPath = getCatalogPath();
8
- const raw = await readFile(catalogPath, 'utf-8');
9
- cachedCatalog = JSON.parse(raw);
10
- return cachedCatalog;
11
- }
12
- export function getCachedCatalog() {
13
- return cachedCatalog;
14
- }
15
- //# sourceMappingURL=catalog-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"catalog-loader.js","sourceRoot":"","sources":["../../src/data/catalog-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAmCnD,IAAI,aAAa,GAA4B,IAAI,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,aAAa;QAAE,OAAO,aAAa,CAAC;IAExC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACjD,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAC;IACpD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare function loadComponentLlmTxt(slug: string): Promise<string | null>;
2
- //# sourceMappingURL=component-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"component-loader.d.ts","sourceRoot":"","sources":["../../src/data/component-loader.ts"],"names":[],"mappings":"AAKA,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAW9E"}
@@ -1,17 +0,0 @@
1
- import { readFile, access } from 'node:fs/promises';
2
- import { getComponentLlmPath } from '../utils/paths.js';
3
- const SEARCH_GROUPS = ['blocks/primitives', 'blocks/components', 'docs/components', 'table'];
4
- export async function loadComponentLlmTxt(slug) {
5
- for (const group of SEARCH_GROUPS) {
6
- const path = getComponentLlmPath(group, slug);
7
- try {
8
- await access(path);
9
- return await readFile(path, 'utf-8');
10
- }
11
- catch {
12
- continue;
13
- }
14
- }
15
- return null;
16
- }
17
- //# sourceMappingURL=component-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"component-loader.js","sourceRoot":"","sources":["../../src/data/component-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,aAAa,GAAG,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAE7F,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY;IACpD,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,4 +0,0 @@
1
- import type { RecipeEntry } from './catalog-loader.js';
2
- export declare function loadRecipes(): Promise<RecipeEntry[]>;
3
- export declare function getRecipeById(id: string): Promise<RecipeEntry | null>;
4
- //# sourceMappingURL=recipe-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recipe-loader.d.ts","sourceRoot":"","sources":["../../src/data/recipe-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAqEvD,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAuC1D;AAED,wBAAsB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAG3E"}
@@ -1,102 +0,0 @@
1
- import { readFile, readdir, stat } from 'node:fs/promises';
2
- import { resolve } from 'node:path';
3
- import { getRecipeDir } from '../utils/paths.js';
4
- let cachedRecipes = null;
5
- function extractArray(content, varName) {
6
- const pattern = new RegExp(`const\\s+${varName}\\s*=\\s*\\[([^\\]]+)\\]`, 's');
7
- const match = content.match(pattern);
8
- if (!match?.[1])
9
- return [];
10
- return match[1]
11
- .split(',')
12
- .map((s) => s.trim().replace(/^['"]|['"]$/g, ''))
13
- .filter((s) => s.length > 0 && !s.includes('{'));
14
- }
15
- function extractRecipeCode(content) {
16
- // Find the recipeCode assignment start
17
- const startMatch = content.match(/const\s+recipeCode\s*=\s*\n?\s*/);
18
- if (!startMatch)
19
- return '';
20
- const startIdx = (startMatch.index ?? 0) + startMatch[0].length;
21
- const rest = content.slice(startIdx);
22
- // Find the end: a backtick followed by a semicolon (possibly with whitespace)
23
- // We need to track backtick nesting to handle `...` + `...`;
24
- let depth = 0;
25
- let endIdx = -1;
26
- for (let i = 0; i < rest.length; i++) {
27
- if (rest[i] === '`') {
28
- depth = depth === 0 ? 1 : 0;
29
- }
30
- if (depth === 0 && rest[i] === ';') {
31
- endIdx = i;
32
- break;
33
- }
34
- }
35
- if (endIdx === -1)
36
- return '';
37
- const raw = rest.slice(0, endIdx);
38
- // Split on backtick concatenation (`...` + `...`) and rejoin
39
- // This handles the </scr` + `ipt> pattern used to avoid parser issues
40
- const parts = raw.split(/`\s*\+\s*\n?\s*`/);
41
- return parts.map((p) => p.replace(/^\s*`|`\s*$/g, '')).join('');
42
- }
43
- function extractTitle(content, dirName) {
44
- const titleMatch = content.match(/<title>([^<]+)<\/title>/);
45
- if (titleMatch?.[1]) {
46
- return titleMatch[1].replace(/\s*[-|].*$/, '').trim();
47
- }
48
- return dirName
49
- .split('-')
50
- .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
51
- .join(' ');
52
- }
53
- function extractDescription(content) {
54
- const descMatch = content.match(/<p\s+class="text-text-secondary[^"]*"[^>]*>\s*([\s\S]*?)\s*<\/p>/);
55
- if (descMatch?.[1]) {
56
- return descMatch[1].replace(/<[^>]+>/g, '').trim();
57
- }
58
- return '';
59
- }
60
- export async function loadRecipes() {
61
- if (cachedRecipes)
62
- return cachedRecipes;
63
- const recipeDir = getRecipeDir();
64
- const entries = [];
65
- let dirs;
66
- try {
67
- dirs = await readdir(recipeDir);
68
- }
69
- catch {
70
- cachedRecipes = [];
71
- return [];
72
- }
73
- for (const dirName of dirs) {
74
- const dirPath = resolve(recipeDir, dirName);
75
- const dirStat = await stat(dirPath).catch(() => null);
76
- if (!dirStat?.isDirectory())
77
- continue;
78
- const pagePath = resolve(dirPath, '+page.svelte');
79
- let content;
80
- try {
81
- content = await readFile(pagePath, 'utf-8');
82
- }
83
- catch {
84
- continue;
85
- }
86
- entries.push({
87
- id: dirName,
88
- title: extractTitle(content, dirName),
89
- description: extractDescription(content),
90
- components: extractArray(content, 'usedComponents'),
91
- code: extractRecipeCode(content),
92
- features: extractArray(content, 'features')
93
- });
94
- }
95
- cachedRecipes = entries;
96
- return entries;
97
- }
98
- export async function getRecipeById(id) {
99
- const recipes = await loadRecipes();
100
- return recipes.find((r) => r.id === id) ?? null;
101
- }
102
- //# sourceMappingURL=recipe-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recipe-loader.js","sourceRoot":"","sources":["../../src/data/recipe-loader.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- export interface TemplateSections {
2
- 'api-grammar': string;
3
- tokens: string;
4
- customization: string;
5
- }
6
- export declare function loadTemplateSections(): Promise<TemplateSections>;
7
- export declare function getCachedSections(): TemplateSections | null;
8
- //# sourceMappingURL=template-loader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-loader.d.ts","sourceRoot":"","sources":["../../src/data/template-loader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB;AAmBD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CActE;AAED,wBAAgB,iBAAiB,IAAI,gBAAgB,GAAG,IAAI,CAE3D"}
@@ -1,33 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import { getTemplatePath } from '../utils/paths.js';
3
- let cachedSections = null;
4
- function extractSection(lines, startHeading, endMarker) {
5
- const startIdx = lines.findIndex((l) => l.trim().startsWith(startHeading));
6
- if (startIdx === -1)
7
- return '';
8
- let endIdx = lines.length;
9
- for (let i = startIdx + 1; i < lines.length; i++) {
10
- if (lines[i]?.trim() === endMarker) {
11
- endIdx = i;
12
- break;
13
- }
14
- }
15
- return lines.slice(startIdx, endIdx).join('\n').trim();
16
- }
17
- export async function loadTemplateSections() {
18
- if (cachedSections)
19
- return cachedSections;
20
- const templatePath = getTemplatePath();
21
- const raw = await readFile(templatePath, 'utf-8');
22
- const lines = raw.split('\n');
23
- cachedSections = {
24
- 'api-grammar': extractSection(lines, '## Shared API Grammar', '---'),
25
- tokens: extractSection(lines, '## Design Token System', '---'),
26
- customization: extractSection(lines, '## Customization', '---')
27
- };
28
- return cachedSections;
29
- }
30
- export function getCachedSections() {
31
- return cachedSections;
32
- }
33
- //# sourceMappingURL=template-loader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-loader.js","sourceRoot":"","sources":["../../src/data/template-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQpD,IAAI,cAAc,GAA4B,IAAI,CAAC;AAEnD,SAAS,cAAc,CAAC,KAAe,EAAE,YAAoB,EAAE,SAAiB;IAC9E,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3E,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAE/B,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,KAAK,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,GAAG,CAAC,CAAC;YACX,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB;IACxC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE9B,cAAc,GAAG;QACf,aAAa,EAAE,cAAc,CAAC,KAAK,EAAE,uBAAuB,EAAE,KAAK,CAAC;QACpE,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,wBAAwB,EAAE,KAAK,CAAC;QAC9D,aAAa,EAAE,cAAc,CAAC,KAAK,EAAE,kBAAkB,EAAE,KAAK,CAAC;KAChE,CAAC;IAEF,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,cAAc,CAAC;AACxB,CAAC"}
package/dist/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js DELETED
@@ -1,57 +0,0 @@
1
- #!/usr/bin/env node
2
- import { createServer } from './server.js';
3
- import { startStdioTransport } from './transports/stdio.js';
4
- import { startHttpTransport } from './transports/http.js';
5
- import { loadCatalog } from './data/catalog-loader.js';
6
- import { loadTemplateSections } from './data/template-loader.js';
7
- import { loadRecipes } from './data/recipe-loader.js';
8
- function parseArgs(args) {
9
- const result = {
10
- transport: 'stdio',
11
- port: 3001
12
- };
13
- for (let i = 0; i < args.length; i++) {
14
- const arg = args[i];
15
- const next = args[i + 1];
16
- if (arg === '--transport' && next) {
17
- if (next === 'stdio' || next === 'http') {
18
- result.transport = next;
19
- }
20
- i++;
21
- }
22
- else if (arg === '--port' && next) {
23
- result.port = parseInt(next, 10);
24
- i++;
25
- }
26
- else if (arg === '--data-dir' && next) {
27
- result.dataDir = next;
28
- i++;
29
- }
30
- }
31
- return result;
32
- }
33
- async function main() {
34
- const args = parseArgs(process.argv.slice(2));
35
- if (args.dataDir) {
36
- process.env.DATA_DIR = args.dataDir;
37
- }
38
- // Pre-load cached data
39
- try {
40
- await Promise.all([loadCatalog(), loadTemplateSections(), loadRecipes()]);
41
- }
42
- catch (err) {
43
- console.error('Warning: Failed to pre-load some data:', err);
44
- }
45
- if (args.transport === 'http') {
46
- await startHttpTransport(args.port);
47
- }
48
- else {
49
- const server = createServer();
50
- await startStdioTransport(server);
51
- }
52
- }
53
- main().catch((err) => {
54
- console.error('Fatal error:', err);
55
- process.exit(1);
56
- });
57
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQtD,SAAS,SAAS,CAAC,IAAc;IAC/B,MAAM,MAAM,GAAY;QACtB,SAAS,EAAE,OAAO;QAClB,IAAI,EAAE,IAAI;KACX,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzB,IAAI,GAAG,KAAK,aAAa,IAAI,IAAI,EAAE,CAAC;YAClC,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;gBACxC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YAC1B,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjC,CAAC,EAAE,CAAC;QACN,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,IAAI,IAAI,EAAE,CAAC;YACxC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YACtB,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE9C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;IACtC,CAAC;IAED,uBAAuB;IACvB,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,oBAAoB,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAC9B,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function registerCatalogResource(server: McpServer): void;
3
- //# sourceMappingURL=catalog.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../src/resources/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkB/D"}
@@ -1,20 +0,0 @@
1
- import { loadCatalog } from '../data/catalog-loader.js';
2
- import { formatCompactCatalog } from '../utils/format-catalog.js';
3
- export function registerCatalogResource(server) {
4
- server.resource('catalog', 'urbicon://catalog', async (uri) => {
5
- const catalog = await loadCatalog();
6
- const md = formatCompactCatalog(catalog.components, {
7
- recipes: catalog.recipes
8
- });
9
- return {
10
- contents: [
11
- {
12
- uri: uri.href,
13
- mimeType: 'text/markdown',
14
- text: md
15
- }
16
- ]
17
- };
18
- });
19
- }
20
- //# sourceMappingURL=catalog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/resources/catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QAEpC,MAAM,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE;YAClD,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QAEH,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,EAAE;iBACT;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function registerComponentResource(server: McpServer): void;
3
- //# sourceMappingURL=component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/resources/component.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4BjE"}
@@ -1,29 +0,0 @@
1
- import { loadComponentLlmTxt } from '../data/component-loader.js';
2
- export function registerComponentResource(server) {
3
- server.resource('component', 'urbicon://component/{name}', async (uri, _extra) => {
4
- // Extract component name from URI path: urbicon://component/{name}
5
- const name = uri.pathname.split('/').pop() || '';
6
- const content = await loadComponentLlmTxt(name);
7
- if (!content) {
8
- return {
9
- contents: [
10
- {
11
- uri: uri.href,
12
- mimeType: 'text/plain',
13
- text: `Component "${name}" not found. Use the catalog resource to see available components.`
14
- }
15
- ]
16
- };
17
- }
18
- return {
19
- contents: [
20
- {
21
- uri: uri.href,
22
- mimeType: 'text/markdown',
23
- text: content
24
- }
25
- ]
26
- };
27
- });
28
- }
29
- //# sourceMappingURL=component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/resources/component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAElE,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,4BAA4B,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE;QAC/E,mEAAmE;QACnE,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,YAAY;wBACtB,IAAI,EAAE,cAAc,IAAI,oEAAoE;qBAC7F;iBACF;aACF,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,GAAG,CAAC,IAAI;oBACb,QAAQ,EAAE,eAAe;oBACzB,IAAI,EAAE,OAAO;iBACd;aACF;SACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function registerGuideResources(server: McpServer): void;
3
- //# sourceMappingURL=guides.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guides.d.ts","sourceRoot":"","sources":["../../src/resources/guides.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBzE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiB9D"}
@@ -1,36 +0,0 @@
1
- import { loadTemplateSections } from '../data/template-loader.js';
2
- const GUIDE_RESOURCES = [
3
- {
4
- id: 'api-grammar',
5
- name: 'API Grammar Guide',
6
- key: 'api-grammar'
7
- },
8
- {
9
- id: 'tokens',
10
- name: 'Design Tokens Guide',
11
- key: 'tokens'
12
- },
13
- {
14
- id: 'customization',
15
- name: 'Customization Guide',
16
- key: 'customization'
17
- }
18
- ];
19
- export function registerGuideResources(server) {
20
- for (const guide of GUIDE_RESOURCES) {
21
- server.resource(`guide-${guide.id}`, `urbicon://guide/${guide.id}`, async (uri) => {
22
- const sections = await loadTemplateSections();
23
- const content = sections[guide.key];
24
- return {
25
- contents: [
26
- {
27
- uri: uri.href,
28
- mimeType: 'text/markdown',
29
- text: content || `Guide section "${guide.id}" not found.`
30
- }
31
- ]
32
- };
33
- });
34
- }
35
- }
36
- //# sourceMappingURL=guides.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"guides.js","sourceRoot":"","sources":["../../src/resources/guides.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAGlE,MAAM,eAAe,GAAgE;IACnF;QACE,EAAE,EAAE,aAAa;QACjB,IAAI,EAAE,mBAAmB;QACzB,GAAG,EAAE,aAAa;KACnB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,qBAAqB;QAC3B,GAAG,EAAE,QAAQ;KACd;IACD;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,qBAAqB;QAC3B,GAAG,EAAE,eAAe;KACrB;CACF,CAAC;AAEF,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,CAAC,QAAQ,CAAC,SAAS,KAAK,CAAC,EAAE,EAAE,EAAE,mBAAmB,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAChF,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEpC,OAAO;gBACL,QAAQ,EAAE;oBACR;wBACE,GAAG,EAAE,GAAG,CAAC,IAAI;wBACb,QAAQ,EAAE,eAAe;wBACzB,IAAI,EAAE,OAAO,IAAI,kBAAkB,KAAK,CAAC,EAAE,cAAc;qBAC1D;iBACF;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
package/dist/server.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function createServer(): McpServer;
3
- //# sourceMappingURL=server.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,wBAAgB,YAAY,IAAI,SAAS,CAiBxC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,iCAAiC,EAAE,MAAM,mCAAmC,CAAC;AAEtF,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,QAAQ;KAClB,CAAC,CAAC;IAEH,YAAY;IACZ,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAE/B,QAAQ;IACR,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,iCAAiC,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function registerFindComponentsTool(server: McpServer): void;
3
- //# sourceMappingURL=find-components.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-components.d.ts","sourceRoot":"","sources":["../../src/tools/find-components.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuBlE"}
@@ -1,21 +0,0 @@
1
- import { z } from 'zod';
2
- import { loadCatalog } from '../data/catalog-loader.js';
3
- import { formatCompactCatalog } from '../utils/format-catalog.js';
4
- export function registerFindComponentsTool(server) {
5
- server.tool('find_components', 'Browse the full Urbicon UI component catalog grouped by category (Actions, Forms, Layout, Feedback, Navigation, Display, Data). Optionally filter by tag. For detailed API docs on a specific component, read the resource `urbicon://component/{name}`.', {
6
- tags: z
7
- .array(z.string())
8
- .optional()
9
- .describe('Filter by category: form, layout, feedback, navigation, action, display, data')
10
- }, async ({ tags }) => {
11
- const catalog = await loadCatalog();
12
- const md = formatCompactCatalog(catalog.components, {
13
- recipes: catalog.recipes,
14
- tags
15
- });
16
- return {
17
- content: [{ type: 'text', text: md }]
18
- };
19
- });
20
- }
21
- //# sourceMappingURL=find-components.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"find-components.js","sourceRoot":"","sources":["../../src/tools/find-components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,UAAU,0BAA0B,CAAC,MAAiB;IAC1D,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,0PAA0P,EAC1P;QACE,IAAI,EAAE,CAAC;aACJ,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;aACjB,QAAQ,EAAE;aACV,QAAQ,CAAC,+EAA+E,CAAC;KAC7F,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAC;QAEpC,MAAM,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,UAAU,EAAE;YAClD,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI;SACL,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;SAC/C,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function registerGetRecipeTool(server: McpServer): void;
3
- //# sourceMappingURL=get-recipe.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-recipe.d.ts","sourceRoot":"","sources":["../../src/tools/get-recipe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqD7D"}
@@ -1,48 +0,0 @@
1
- import { z } from 'zod';
2
- import { getRecipeById, loadRecipes } from '../data/recipe-loader.js';
3
- export function registerGetRecipeTool(server) {
4
- server.tool('get_recipe', 'Get a complete, production-ready Svelte 5 code recipe.', {
5
- scenario: z
6
- .string()
7
- .describe('Recipe id: login, settings, dashboard, pricing, profile-card, data-table, command-palette')
8
- }, async ({ scenario }) => {
9
- const recipe = await getRecipeById(scenario);
10
- if (!recipe) {
11
- const allRecipes = await loadRecipes();
12
- const available = allRecipes.map((r) => r.id).join(', ');
13
- return {
14
- content: [
15
- {
16
- type: 'text',
17
- text: `Recipe "${scenario}" not found. Available recipes: ${available}`
18
- }
19
- ]
20
- };
21
- }
22
- let md = `# Recipe: ${recipe.title}\n\n`;
23
- if (recipe.description)
24
- md += `${recipe.description}\n\n`;
25
- if (recipe.components.length > 0) {
26
- md += `**Components used:** ${recipe.components.join(', ')}\n\n`;
27
- }
28
- if (recipe.features.length > 0) {
29
- md += '**Features:**\n';
30
- for (const f of recipe.features) {
31
- md += `- ${f}\n`;
32
- }
33
- md += '\n';
34
- }
35
- if (recipe.code) {
36
- md += '```svelte\n' + recipe.code + '\n```\n';
37
- }
38
- return {
39
- content: [
40
- {
41
- type: 'text',
42
- text: md
43
- }
44
- ]
45
- };
46
- });
47
- }
48
- //# sourceMappingURL=get-recipe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-recipe.js","sourceRoot":"","sources":["../../src/tools/get-recipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,wDAAwD,EACxD;QACE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CACP,2FAA2F,CAC5F;KACJ,EACD,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,UAAU,GAAG,MAAM,WAAW,EAAE,CAAC;YACvC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,WAAW,QAAQ,mCAAmC,SAAS,EAAE;qBACxE;iBACF;aACF,CAAC;QACJ,CAAC;QAED,IAAI,EAAE,GAAG,aAAa,MAAM,CAAC,KAAK,MAAM,CAAC;QACzC,IAAI,MAAM,CAAC,WAAW;YAAE,EAAE,IAAI,GAAG,MAAM,CAAC,WAAW,MAAM,CAAC;QAC1D,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,EAAE,IAAI,wBAAwB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACnE,CAAC;QACD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,EAAE,IAAI,iBAAiB,CAAC;YACxB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAChC,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC;YACnB,CAAC;YACD,EAAE,IAAI,IAAI,CAAC;QACb,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,EAAE,IAAI,aAAa,GAAG,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;QAChD,CAAC;QAED,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,EAAE;iBACT;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- export declare function registerSuggestImplementationTool(server: McpServer): void;
3
- //# sourceMappingURL=suggest-implementation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"suggest-implementation.d.ts","sourceRoot":"","sources":["../../src/tools/suggest-implementation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0DzE,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiIzE"}