@santi020k/lumen-mcp 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/data.d.ts CHANGED
@@ -69,6 +69,7 @@ export interface LumenData {
69
69
  recipes: LumenRecipeSnapshot[];
70
70
  rules: string;
71
71
  tokens: {
72
+ chart: Record<string, string>;
72
73
  colors: Record<string, string>;
73
74
  glass: Record<string, string>;
74
75
  semantic: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"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"}
package/dist/data.js CHANGED
@@ -1,10 +1,11 @@
1
- import { readFileSync as readFsFile } from 'node:fs';
1
+ import * as fs from 'node:fs';
2
2
  import { fileURLToPath } from 'node:url';
3
3
  const dataUrl = new URL('../data/lumen-data.json', import.meta.url);
4
4
  let cached;
5
5
  export const loadLumenData = () => {
6
6
  if (cached)
7
7
  return cached;
8
+ const readFsFile = Reflect.get(fs, 'readFileSync');
8
9
  const raw = readFsFile(fileURLToPath(dataUrl), 'utf8');
9
10
  cached = JSON.parse(raw);
10
11
  return cached;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAYrD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,cAAc,YAAY,CAAA;AAE1B,4EAA4E;AAC5E,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAKlD,CAAA;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,EAAE,GAAG,CAAA;CACT;AAED,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,GAC5B,UAAS,mBAAwB,KAChC,OAAO,CAAC,kBAAkB,CA2I5B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAA;AAYrD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,YAAY,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAC/C,cAAc,YAAY,CAAA;AAE1B,4EAA4E;AAC5E,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAKlD,CAAA;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,EAAE,GAAG,CAAA;CACT;AAoDD,wFAAwF;AACxF,eAAO,MAAM,iBAAiB,GAC5B,UAAS,mBAAwB,KAChC,OAAO,CAAC,kBAAkB,CA+F5B,CAAA"}
package/dist/index.js CHANGED
@@ -11,6 +11,43 @@ export const startLumenMcp = async () => {
11
11
  const transport = new StdioServerTransport();
12
12
  await server.connect(transport);
13
13
  };
14
+ const toWebRequest = (request, host, options) => {
15
+ const headers = new Headers();
16
+ for (const [name, value] of Object.entries(request.headers)) {
17
+ for (const item of Array.isArray(value) ? value : [value]) {
18
+ if (item !== undefined)
19
+ headers.append(name, item);
20
+ }
21
+ }
22
+ const hostHeader = request.headers.host ?? `${host}:${options.port ?? 3000}`;
23
+ const method = request.method;
24
+ return new Request(`http://${hostHeader}${request.url}`, {
25
+ headers,
26
+ method,
27
+ ...(['GET', 'HEAD'].includes(method) ? {} : { body: JSON.stringify(request.body) })
28
+ });
29
+ };
30
+ const streamResponse = async (webResponse, response) => {
31
+ response.statusCode = webResponse.status;
32
+ for (const [name, value] of webResponse.headers.entries())
33
+ response.setHeader(name, value);
34
+ if (!webResponse.body) {
35
+ response.end();
36
+ return;
37
+ }
38
+ const reader = webResponse.body.getReader();
39
+ response.once('close', () => {
40
+ reader.cancel().catch(() => { });
41
+ });
42
+ while (!response.destroyed) {
43
+ const chunk = await reader.read();
44
+ if (chunk.done)
45
+ break;
46
+ response.write(Buffer.from(chunk.value));
47
+ }
48
+ if (!response.writableEnded)
49
+ response.end();
50
+ };
14
51
  /** Start a self-hostable Streamable HTTP transport. Defaults to loopback for safety. */
15
52
  export const startLumenMcpHttp = async (options = {}) => {
16
53
  const host = options.host ?? '127.0.0.1';
@@ -28,44 +65,11 @@ export const startLumenMcpHttp = async (options = {}) => {
28
65
  activeServers.add(mcpServer);
29
66
  try {
30
67
  await mcpServer.connect(transport);
31
- const headers = new Headers();
32
- for (const [name, value] of Object.entries(request.headers)) {
33
- for (const item of Array.isArray(value) ? value : [value]) {
34
- if (item !== undefined)
35
- headers.append(name, item);
36
- }
37
- }
38
- const hostHeader = request.headers.host ?? `${host}:${options.port ?? 3000}`;
39
- const method = request.method;
40
- const webRequest = new Request(`http://${hostHeader}${request.url}`, {
41
- headers,
42
- method,
43
- ...(['GET', 'HEAD'].includes(method)
44
- ? {}
45
- : { body: JSON.stringify(request.body) })
46
- });
68
+ const webRequest = toWebRequest(request, host, options);
47
69
  const webResponse = await transport.handleRequest(webRequest, {
48
70
  parsedBody: request.body
49
71
  });
50
- response.statusCode = webResponse.status;
51
- for (const [name, value] of webResponse.headers.entries())
52
- response.setHeader(name, value);
53
- if (!webResponse.body) {
54
- response.end();
55
- return;
56
- }
57
- const reader = webResponse.body.getReader();
58
- response.once('close', () => {
59
- reader.cancel().catch(() => { });
60
- });
61
- while (!response.destroyed) {
62
- const chunk = await reader.read();
63
- if (chunk.done)
64
- break;
65
- response.write(Buffer.from(chunk.value));
66
- }
67
- if (!response.writableEnded)
68
- response.end();
72
+ await streamResponse(webResponse, response);
69
73
  }
70
74
  catch (error) {
71
75
  if (response.headersSent)
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAA;AA2JrF,eAAO,MAAM,iBAAiB,QAAO,SAgTpC,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAoB,MAAM,yCAAyC,CAAA;AA4JrF,eAAO,MAAM,iBAAiB,QAAO,SAgTpC,CAAA"}
package/dist/server.js CHANGED
@@ -46,6 +46,7 @@ const searchOutputSchema = z.strictObject({
46
46
  });
47
47
  const tokensOutputSchema = z.strictObject({
48
48
  tokens: z.strictObject({
49
+ chart: z.record(z.string(), z.string().trim()),
49
50
  colors: z.record(z.string(), z.string().trim()),
50
51
  glass: z.record(z.string(), z.string().trim()),
51
52
  semantic: z.array(z.string().trim()),
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/dist/tools.js CHANGED
@@ -40,21 +40,25 @@ export const resolveRecipe = (name, data = loadLumenData()) => {
40
40
  const target = normalize(name);
41
41
  return data.recipes.find((recipe) => normalize(recipe.name) === target);
42
42
  };
43
- const frameworkSearchText = (component, framework) => (framework
44
- ? [component.frameworkDetails[framework]]
45
- : Object.values(component.frameworkDetails))
46
- .flatMap((framework) => [
43
+ const frameworkBehaviorSearchText = (behavior) => [
44
+ behavior?.description ?? '',
45
+ behavior?.hook ?? '',
46
+ behavior?.mode ?? '',
47
+ behavior?.setup ?? ''
48
+ ];
49
+ const frameworkDetailsSearchText = (framework) => [
47
50
  framework.packageName,
48
- framework.behavior?.description ?? '',
49
- framework.behavior?.hook ?? '',
50
- framework.behavior?.mode ?? '',
51
- framework.behavior?.setup ?? '',
51
+ ...frameworkBehaviorSearchText(framework.behavior),
52
52
  framework.example,
53
53
  framework.propsExtends ?? '',
54
54
  framework.props.map((prop) => `${prop.name} ${prop.type}`).join(' '),
55
55
  framework.attributes?.join(' ') ?? '',
56
56
  framework.tagName ?? ''
57
- ])
57
+ ];
58
+ const frameworkSearchText = (component, framework) => (framework
59
+ ? [Reflect.get(component.frameworkDetails, framework)]
60
+ : Object.values(component.frameworkDetails))
61
+ .flatMap(frameworkDetailsSearchText)
58
62
  .join(' ');
59
63
  const componentSearchText = (component, framework) => [
60
64
  component.name,
@@ -74,13 +78,13 @@ const componentSearchText = (component, framework) => [
74
78
  ].join(' ');
75
79
  const scoreCandidate = (query, terms, searchableText, primaryName = '') => {
76
80
  const normalizedText = normalize(searchableText);
77
- const matchedTerms = terms.filter((term) => (searchTermAliases[term] ?? [term]).some((candidate) => normalizedText.includes(candidate)));
81
+ const matchedTerms = terms.filter((term) => (Reflect.get(searchTermAliases, term) ?? [term]).some((candidate) => normalizedText.includes(candidate)));
78
82
  if (matchedTerms.length === 0)
79
83
  return { matchedTerms, score: 0 };
80
84
  const normalizedQuery = terms.join('-');
81
85
  const normalizedName = normalize(primaryName);
82
86
  const coverage = matchedTerms.length / terms.length;
83
- let score = matchedTerms.reduce((total, term) => total + ((searchTermAliases[term] ?? [term]).some((candidate) => normalizedName.includes(candidate))
87
+ let score = matchedTerms.reduce((total, term) => total + ((Reflect.get(searchTermAliases, term) ?? [term]).some((candidate) => normalizedName.includes(candidate))
84
88
  ? 20
85
89
  : 5), 0);
86
90
  score += Math.round(coverage * 80);
@@ -101,7 +105,7 @@ const appendSearchResult = (results, candidate, query, terms, searchableText) =>
101
105
  const collectSearchResults = (query, terms, data, framework) => {
102
106
  const results = [];
103
107
  for (const component of data.components) {
104
- if (framework && !component.frameworks[framework])
108
+ if (framework && !Reflect.get(component.frameworks, framework))
105
109
  continue;
106
110
  appendSearchResult(results, {
107
111
  category: component.category,
@@ -231,38 +235,35 @@ const formatProps = (framework) => {
231
235
  : 'Props:';
232
236
  return `${header}\n${lines.join('\n')}`;
233
237
  };
234
- const formatComponentUsage = (component, frameworkName, detail) => {
235
- const framework = getFrameworkDetail(component.frameworkDetails, frameworkName);
236
- const sections = [
237
- `# ${component.name}`,
238
- component.description,
239
- `Category: ${component.category}`,
240
- `Framework: ${frameworkName}`,
241
- `Package: ${framework.packageName}`,
242
- `Import: ${framework.importStatement}`,
243
- `Styles: ${framework.styleImport}`,
244
- framework.tagName ? `Custom element: <${framework.tagName}>` : '',
245
- component.recipes.length > 0
246
- ? `Recipes: ${component.recipes.map((recipe) => recipe.name).join(', ')}`
247
- : 'Recipes: none'
248
- ].filter(Boolean);
249
- if (detail === 'summary')
250
- return sections.join('\n');
251
- sections.push('', formatProps(framework), '', '## Example', `\`\`\`${framework.language}`);
252
- sections.push(framework.example, '```');
253
- if (framework.behavior) {
254
- sections.push('', '## Framework behavior', framework.behavior.setup);
255
- if (framework.behavior.hook)
256
- sections.push(`Hook: ${framework.behavior.hook}`);
257
- if (framework.behavior.description)
258
- sections.push(framework.behavior.description);
259
- if (framework.behavior.options && framework.behavior.options.length > 0) {
260
- sections.push('', 'Hook options:', ...framework.behavior.options.map((option) => `- ${option.name}: ${option.type} — ${option.description}`));
261
- }
262
- if (framework.behavior.controller && framework.behavior.controller.length > 0) {
263
- sections.push('', 'Controller values:', ...framework.behavior.controller.map((value) => `- ${value.name}: ${value.type} — ${value.description}`));
264
- }
238
+ const buildSummarySections = (component, frameworkName, framework) => [
239
+ `# ${component.name}`,
240
+ component.description,
241
+ `Category: ${component.category}`,
242
+ `Framework: ${frameworkName}`,
243
+ `Package: ${framework.packageName}`,
244
+ `Import: ${framework.importStatement}`,
245
+ `Styles: ${framework.styleImport}`,
246
+ framework.tagName ? `Custom element: <${framework.tagName}>` : '',
247
+ component.recipes.length > 0
248
+ ? `Recipes: ${component.recipes.map((recipe) => recipe.name).join(', ')}`
249
+ : 'Recipes: none'
250
+ ].filter(Boolean);
251
+ const appendBehaviorSections = (sections, behavior) => {
252
+ if (!behavior)
253
+ return;
254
+ sections.push('', '## Framework behavior', behavior.setup);
255
+ if (behavior.hook)
256
+ sections.push(`Hook: ${behavior.hook}`);
257
+ if (behavior.description)
258
+ sections.push(behavior.description);
259
+ if (behavior.options && behavior.options.length > 0) {
260
+ sections.push('', 'Hook options:', ...behavior.options.map((option) => `- ${option.name}: ${option.type} — ${option.description}`));
261
+ }
262
+ if (behavior.controller && behavior.controller.length > 0) {
263
+ sections.push('', 'Controller values:', ...behavior.controller.map((value) => `- ${value.name}: ${value.type} — ${value.description}`));
265
264
  }
265
+ };
266
+ const appendGuidanceSections = (sections, component) => {
266
267
  if (component.guidance) {
267
268
  sections.push('', '## Guidance', component.guidance.when);
268
269
  if (component.guidance.distinction)
@@ -270,15 +271,27 @@ const formatComponentUsage = (component, frameworkName, detail) => {
270
271
  }
271
272
  if (component.keyboardInteractions.length > 0) {
272
273
  sections.push('', '## Keyboard interactions');
273
- sections.push(...component.keyboardInteractions.map((row) => `- ${row.key}: ${row.action}`));
274
+ sections.push(...component.keyboardInteractions.map((interaction) => `- ${interaction.key}: ${interaction.action}`));
275
+ }
276
+ if (component.apiReference.length > 0) {
277
+ sections.push('', '## API reference');
278
+ sections.push(...component.apiReference.map((row) => `- \`${row.attribute}\` ${row.values} — ${row.description}`));
274
279
  }
275
280
  if (component.runtimeEvents.length > 0) {
276
281
  sections.push('', '## Runtime events');
277
282
  sections.push(...component.runtimeEvents.map((event) => `- ${event.name}: ${event.when}`));
278
283
  }
284
+ };
285
+ const formatComponentUsage = (component, frameworkName, detail) => {
286
+ const framework = getFrameworkDetail(component.frameworkDetails, frameworkName);
287
+ const sections = buildSummarySections(component, frameworkName, framework);
288
+ if (detail === 'summary')
289
+ return sections.join('\n');
290
+ sections.push('', formatProps(framework), '', '## Example', `\`\`\`${framework.language}`, framework.example, '```');
291
+ appendBehaviorSections(sections, framework.behavior);
292
+ appendGuidanceSections(sections, component);
279
293
  if (detail === 'source') {
280
- sections.push('', `## ${frameworkName} reference source`);
281
- sections.push(`\`\`\`${framework.language}`, framework.source.trimEnd(), '```');
294
+ sections.push('', `## ${frameworkName} reference source`, `\`\`\`${framework.language}`, framework.source.trimEnd(), '```');
282
295
  }
283
296
  return sections.join('\n');
284
297
  };
@@ -389,12 +402,12 @@ const diffManifestSection = (current, baseline) => {
389
402
  const currentNames = Object.keys(current);
390
403
  const baselineNames = Object.keys(baseline);
391
404
  return {
392
- added: currentNames.filter((name) => baseline[name] === undefined).sort(),
405
+ added: currentNames.filter((name) => Reflect.get(baseline, name) === undefined).sort(),
393
406
  changed: currentNames
394
- .filter((name) => baseline[name] !== undefined && baseline[name] !== current[name])
407
+ .filter((name) => Reflect.get(baseline, name) !== undefined && Reflect.get(baseline, name) !== Reflect.get(current, name))
395
408
  .sort(),
396
- removed: baselineNames.filter((name) => current[name] === undefined).sort(),
397
- unchanged: currentNames.filter((name) => baseline[name] === current[name]).sort()
409
+ removed: baselineNames.filter((name) => Reflect.get(current, name) === undefined).sort(),
410
+ unchanged: currentNames.filter((name) => Reflect.get(baseline, name) === Reflect.get(current, name)).sort()
398
411
  };
399
412
  };
400
413
  export const getCatalogManifest = (data = loadLumenData()) => ({
@@ -465,14 +478,17 @@ export const diagnose = (data = loadLumenData()) => {
465
478
  {
466
479
  message: 'Every component has a manifest fingerprint.',
467
480
  name: 'component-manifest',
468
- status: componentNames.every((name) => data.catalogManifest.components[name]) ? 'pass' : 'fail'
481
+ status: componentNames.every((name) => Reflect.get(data.catalogManifest.components, name)) ? 'pass' : 'fail'
469
482
  },
470
483
  {
471
484
  message: 'Every available framework contract has an example and import statement.',
472
485
  name: 'framework-contracts',
473
- status: data.components.every((component) => Object.entries(component.frameworks).every(([framework, available]) => !available ||
474
- Boolean(component.frameworkDetails[framework].example.trim()) &&
475
- Boolean(component.frameworkDetails[framework].importStatement.trim()))) ? 'pass' : 'fail'
486
+ status: data.components.every((component) => Object.entries(component.frameworks).every(([framework, available]) => {
487
+ if (!available)
488
+ return true;
489
+ const details = Reflect.get(component.frameworkDetails, framework);
490
+ return Boolean(details?.example.trim()) && Boolean(details?.importStatement.trim());
491
+ })) ? 'pass' : 'fail'
476
492
  }
477
493
  ];
478
494
  const status = checks.every((check) => check.status === 'pass') ? 'healthy' : 'issues';
@@ -490,6 +506,7 @@ export const diagnose = (data = loadLumenData()) => {
490
506
  };
491
507
  export const getTokens = (data = loadLumenData()) => {
492
508
  const { tokens } = data;
509
+ const chartLines = Object.entries(tokens.chart).map(([name, value]) => `- ${name}: ${value}`);
493
510
  const colorLines = Object.entries(tokens.colors).map(([name, value]) => `- ${name}: hsl(${value})`);
494
511
  const glassLines = Object.entries(tokens.glass).map(([name, value]) => `- ${name}: ${value}`);
495
512
  const text = [
@@ -502,6 +519,9 @@ export const getTokens = (data = loadLumenData()) => {
502
519
  '## Base color values',
503
520
  colorLines.join('\n'),
504
521
  '',
522
+ '## Data visualization tokens',
523
+ chartLines.join('\n'),
524
+ '',
505
525
  '## Glass surface tokens',
506
526
  glassLines.join('\n')
507
527
  ].join('\n');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@santi020k/lumen-mcp",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },