@fundamental-styles/mcp 0.41.7-rc.8 → 0.41.7
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/data/AI_USAGE.md +425 -0
- package/data/CHANGELOG.md +53 -3
- package/data/component-catalog.json +62 -209
- package/data/components/README.md +281 -0
- package/data/components/action-bar.md +443 -0
- package/data/components/ai-busy-indicator.md +79 -0
- package/data/components/ai-loading-bar.md +66 -0
- package/data/components/avatar-btp.md +198 -0
- package/data/components/avatar-group.md +2660 -0
- package/data/components/avatar-product-switch.md +476 -0
- package/data/components/avatar.md +993 -0
- package/data/components/bar.md +574 -0
- package/data/components/border-radius.md +148 -0
- package/data/components/border.md +412 -0
- package/data/components/breadcrumb.md +546 -0
- package/data/components/button-2.md +440 -0
- package/data/components/button-action-sheet.md +292 -0
- package/data/components/button-ai.md +730 -0
- package/data/components/button-btp.md +223 -0
- package/data/components/button-button.md +233 -0
- package/data/components/button-counter.md +176 -0
- package/data/components/button-patterns.md +731 -0
- package/data/components/button-split.md +459 -0
- package/data/components/button.md +469 -0
- package/data/components/calendar.md +5784 -0
- package/data/components/card-card-media.md +707 -0
- package/data/components/card-card.md +2426 -0
- package/data/components/card-layouts.md +1201 -0
- package/data/components/card.md +2404 -0
- package/data/components/carousel.md +1506 -0
- package/data/components/code.md +139 -0
- package/data/components/component-reset.md +272 -0
- package/data/components/components-icons-businesssuiteinappsymbol-icons.md +85 -0
- package/data/components/components-icons-sap-icons.md +147 -0
- package/data/components/components-icons-tnt-icons.md +85 -0
- package/data/components/container-queries.md +221 -0
- package/data/components/container.md +227 -0
- package/data/components/dialog-docs-static-busy-indicator.md +165 -0
- package/data/components/dialog-docs-static-dialog.md +949 -0
- package/data/components/dialog-docs-static-patterns.md +147 -0
- package/data/components/dialog-docs-static-settings.md +528 -0
- package/data/components/dialog-docs-static.md +982 -0
- package/data/components/dialog.md +606 -0
- package/data/components/dynamic-page-dynamic-page.md +1914 -0
- package/data/components/dynamic-page.md +973 -0
- package/data/components/dynamic-side.md +197 -0
- package/data/components/elevation.md +110 -0
- package/data/components/feed-input.md +346 -0
- package/data/components/feed-list.md +580 -0
- package/data/components/fieldset-2.md +292 -0
- package/data/components/fieldset-forms.md +169 -0
- package/data/components/fieldset.md +381 -0
- package/data/components/flexible-column-layout.md +205 -0
- package/data/components/form-group.md +287 -0
- package/data/components/form-header.md +71 -0
- package/data/components/form-item-2.md +98 -0
- package/data/components/form-item-3.md +134 -0
- package/data/components/form-item-4.md +556 -0
- package/data/components/form-item-5.md +182 -0
- package/data/components/form-item-6.md +539 -0
- package/data/components/form-item-7.md +239 -0
- package/data/components/form-item-ai.md +158 -0
- package/data/components/form-item-file-uploader.md +445 -0
- package/data/components/form-item-forms.md +234 -0
- package/data/components/form-item-patterns.md +426 -0
- package/data/components/form-item.md +464 -0
- package/data/components/form-label-ai.md +126 -0
- package/data/components/form-label-layouts.md +306 -0
- package/data/components/form-label-patterns.md +1175 -0
- package/data/components/form-label-status-indicator.md +1083 -0
- package/data/components/form-label-step-input.md +620 -0
- package/data/components/form-label.md +2876 -0
- package/data/components/generic-tag.md +747 -0
- package/data/components/grid-list-grid-list.md +1185 -0
- package/data/components/grid-list.md +1449 -0
- package/data/components/heading.md +66 -0
- package/data/components/horizontal-navigation.md +568 -0
- package/data/components/icon-tab-bar-dev.md +190 -0
- package/data/components/icon-tab-bar.md +2620 -0
- package/data/components/icon.md +171 -0
- package/data/components/iconBusinessSuite.md +92 -0
- package/data/components/iconTnt.md +92 -0
- package/data/components/illustrated-message.md +439 -0
- package/data/components/info-label.md +348 -0
- package/data/components/input-group.md +2068 -0
- package/data/components/label.md +66 -0
- package/data/components/layout-grid.md +447 -0
- package/data/components/layout-panel.md +261 -0
- package/data/components/layouts-layout-grid.md +608 -0
- package/data/components/layouts-paddings.md +133 -0
- package/data/components/layouts-section.md +287 -0
- package/data/components/list-2.md +148 -0
- package/data/components/list-3.md +735 -0
- package/data/components/list-list.md +790 -0
- package/data/components/list-object-list.md +1225 -0
- package/data/components/list.md +1286 -0
- package/data/components/media-queries.md +168 -0
- package/data/components/menu.md +946 -0
- package/data/components/message-box-docs-static-ai.md +149 -0
- package/data/components/message-box-docs-static.md +527 -0
- package/data/components/message-page-upload-collection.md +678 -0
- package/data/components/message-page.md +256 -0
- package/data/components/message-strip.md +977 -0
- package/data/components/message-toast.md +119 -0
- package/data/components/micro-process-flow.md +991 -0
- package/data/components/navigation-menu.md +366 -0
- package/data/components/navigation-navigation.md +1245 -0
- package/data/components/navigation.md +2604 -0
- package/data/components/numeric-content.md +317 -0
- package/data/components/object-attribute.md +96 -0
- package/data/components/object-identifier.md +227 -0
- package/data/components/object-marker.md +202 -0
- package/data/components/object-number.md +327 -0
- package/data/components/object-status.md +1538 -0
- package/data/components/off-screen.md +87 -0
- package/data/components/overflow.md +97 -0
- package/data/components/padding.md +122 -0
- package/data/components/paddings.md +130 -0
- package/data/components/page.md +300 -0
- package/data/components/pagination.md +672 -0
- package/data/components/panel-layouts.md +345 -0
- package/data/components/panel.md +514 -0
- package/data/components/patterns-label.md +74 -0
- package/data/components/popover-2.md +906 -0
- package/data/components/popover-ai.md +466 -0
- package/data/components/popover-btp.md +886 -0
- package/data/components/popover-deprecated.md +308 -0
- package/data/components/popover-message-popover.md +683 -0
- package/data/components/popover-notification.md +1511 -0
- package/data/components/popover-patterns.md +1100 -0
- package/data/components/popover-popover.md +1862 -0
- package/data/components/popover-quick-view.md +385 -0
- package/data/components/popover-timepicker.md +1836 -0
- package/data/components/popover-user-menu.md +1303 -0
- package/data/components/popover.md +1938 -0
- package/data/components/progress-indicator.md +351 -0
- package/data/components/prompt-input-ai.md +226 -0
- package/data/components/prompt-input.md +226 -0
- package/data/components/rating-indicator.md +1469 -0
- package/data/components/resizable-card-layout.md +951 -0
- package/data/components/scrollbar.md +86 -0
- package/data/components/search-field.md +287 -0
- package/data/components/section.md +250 -0
- package/data/components/segmented-button.md +324 -0
- package/data/components/shellbar.md +2183 -0
- package/data/components/side-nav.md +1562 -0
- package/data/components/skeleton.md +243 -0
- package/data/components/slider.md +395 -0
- package/data/components/splitter.md +353 -0
- package/data/components/table.md +2749 -0
- package/data/components/tabs.md +658 -0
- package/data/components/text-text.md +380 -0
- package/data/components/text.md +253 -0
- package/data/components/tile.md +1132 -0
- package/data/components/time.md +818 -0
- package/data/components/title.md +153 -0
- package/data/components/titles.md +83 -0
- package/data/components/token.md +311 -0
- package/data/components/tokenizer.md +398 -0
- package/data/components/tool-header.md +1352 -0
- package/data/components/tool-layout.md +199 -0
- package/data/components/toolbar-ai.md +174 -0
- package/data/components/toolbar-btp.md +526 -0
- package/data/components/toolbar-title-bar.md +473 -0
- package/data/components/toolbar.md +432 -0
- package/data/components/tree.md +1031 -0
- package/data/components/typography.md +435 -0
- package/data/components/variant-management.md +360 -0
- package/data/components/vertical-nav.md +589 -0
- package/data/components/wizard.md +1429 -0
- package/data/examples/Components/dialog/device-specifications.example.html +39 -30
- package/data/examples/Components/shellbar/optional-items.example.html +210 -157
- package/data/examples/Components/shellbar/overflow-toolbar.example.html +202 -177
- package/data/examples/Components/shellbar/responsive-paddings.example.html +217 -146
- package/data/examples/Components/shellbar/responsiveness.example.html +825 -613
- package/data/examples/Components/user-menu/default.example.html +241 -83
- package/data/schemas/badge.schema.json +1 -1
- package/data/schemas/button-split.schema.json +1 -1
- package/data/schemas/component-frontmatter.schema.json +123 -0
- package/data/schemas/component-markdown.schema.json +81 -0
- package/data/schemas/counter.schema.json +1 -1
- package/data/schemas/dynamic-page.schema.json +1 -1
- package/data/schemas/dynamic-side-content.schema.json +1 -1
- package/data/schemas/facet.schema.json +1 -1
- package/data/schemas/fieldset.schema.json +1 -1
- package/data/schemas/flexible-column-layout.schema.json +1 -1
- package/data/schemas/form-group.schema.json +3 -2
- package/data/schemas/form-header.schema.json +1 -1
- package/data/schemas/form-label.schema.json +1 -0
- package/data/schemas/form-message.schema.json +1 -1
- package/data/schemas/grid-list.schema.json +1 -1
- package/data/schemas/input-group.schema.json +1 -1
- package/data/schemas/layout-panel.schema.json +1 -1
- package/data/schemas/page.schema.json +1 -1
- package/data/schemas/quick-view.schema.json +2 -1
- package/data/schemas/section.schema.json +1 -1
- package/data/schemas/side-nav.schema.json +1 -1
- package/data/schemas/splitter.schema.json +1 -1
- package/data/schemas/tabs.schema.json +1 -1
- package/data/schemas/tile.schema.json +1 -1
- package/data/schemas/tool-layout.schema.json +1 -1
- package/data/schemas/user-menu.schema.json +10 -0
- package/data/schemas/wizard.schema.json +1 -1
- package/package.json +1 -1
- package/src/data/load-catalog.d.ts +2 -0
- package/src/data/load-catalog.js +5 -1
- package/src/data/load-catalog.js.map +1 -1
- package/src/data/load-markdown-docs.d.ts +44 -0
- package/src/data/load-markdown-docs.js +179 -0
- package/src/data/load-markdown-docs.js.map +1 -0
- package/src/data/markdown-cache.d.ts +60 -0
- package/src/data/markdown-cache.js +218 -0
- package/src/data/markdown-cache.js.map +1 -0
- package/src/server.js +72 -1
- package/src/server.js.map +1 -1
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MarkdownDocCache = void 0;
|
|
4
|
+
exports.getMarkdownCache = getMarkdownCache;
|
|
5
|
+
exports.loadMarkdownDocs = loadMarkdownDocs;
|
|
6
|
+
exports.getMarkdownDoc = getMarkdownDoc;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = require("path");
|
|
9
|
+
const markdown_cache_1 = require("./markdown-cache");
|
|
10
|
+
// Re-export for convenience
|
|
11
|
+
var markdown_cache_2 = require("./markdown-cache");
|
|
12
|
+
Object.defineProperty(exports, "MarkdownDocCache", { enumerable: true, get: function () { return markdown_cache_2.MarkdownDocCache; } });
|
|
13
|
+
// Global cache instance with LRU eviction (max 50 components in memory)
|
|
14
|
+
// This reduces memory from ~50MB (all 168 docs) to ~5MB
|
|
15
|
+
let markdownCache = null;
|
|
16
|
+
/**
|
|
17
|
+
* Get or create the markdown cache instance
|
|
18
|
+
* @param maxSize Maximum number of docs to keep in cache (default: 50)
|
|
19
|
+
*/
|
|
20
|
+
function getMarkdownCache(maxSize = 50) {
|
|
21
|
+
if (!markdownCache) {
|
|
22
|
+
markdownCache = new markdown_cache_1.MarkdownDocCache(maxSize);
|
|
23
|
+
}
|
|
24
|
+
return markdownCache;
|
|
25
|
+
}
|
|
26
|
+
/** Resolve path to markdown docs directory — works both from source (dev) and from dist (npm). */
|
|
27
|
+
function resolveMarkdownDocsPath() {
|
|
28
|
+
// dist path: dist/packages/mcp/data/components/
|
|
29
|
+
const distPath = (0, path_1.resolve)(__dirname, '..', '..', 'data', 'components');
|
|
30
|
+
// source path: docs/components/
|
|
31
|
+
const srcPath = (0, path_1.resolve)(__dirname, '..', '..', '..', '..', 'docs', 'components');
|
|
32
|
+
try {
|
|
33
|
+
(0, fs_1.readdirSync)(distPath);
|
|
34
|
+
return distPath;
|
|
35
|
+
}
|
|
36
|
+
catch (_a) {
|
|
37
|
+
return srcPath;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/** Parse frontmatter from markdown content */
|
|
41
|
+
function parseFrontmatter(content) {
|
|
42
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]+?)\n---\n([\s\S]*)$/);
|
|
43
|
+
if (!frontmatterMatch) {
|
|
44
|
+
return { frontmatter: {}, body: content };
|
|
45
|
+
}
|
|
46
|
+
const [, frontmatterText, body] = frontmatterMatch;
|
|
47
|
+
const frontmatter = {};
|
|
48
|
+
// Simple YAML parser for common types
|
|
49
|
+
const lines = frontmatterText.split('\n');
|
|
50
|
+
let currentKey = '';
|
|
51
|
+
for (const line of lines) {
|
|
52
|
+
const trimmed = line.trim();
|
|
53
|
+
if (!trimmed)
|
|
54
|
+
continue;
|
|
55
|
+
// Array item
|
|
56
|
+
if (trimmed.startsWith('- ')) {
|
|
57
|
+
if (currentKey && Array.isArray(frontmatter[currentKey])) {
|
|
58
|
+
frontmatter[currentKey].push(trimmed.slice(2).trim());
|
|
59
|
+
}
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
// Key-value pair
|
|
63
|
+
const match = trimmed.match(/^([a-zA-Z0-9_-]+):\s*(.*)$/);
|
|
64
|
+
if (match) {
|
|
65
|
+
const [, key, value] = match;
|
|
66
|
+
currentKey = key;
|
|
67
|
+
// Empty value means array follows
|
|
68
|
+
if (!value) {
|
|
69
|
+
frontmatter[key] = [];
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
// Try to parse as number or boolean
|
|
73
|
+
if (value === 'true') {
|
|
74
|
+
frontmatter[key] = true;
|
|
75
|
+
}
|
|
76
|
+
else if (value === 'false') {
|
|
77
|
+
frontmatter[key] = false;
|
|
78
|
+
}
|
|
79
|
+
else if (/^\d+$/.test(value)) {
|
|
80
|
+
frontmatter[key] = parseInt(value, 10);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Remove quotes if present
|
|
84
|
+
frontmatter[key] = value.replace(/^["']|["']$/g, '');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { frontmatter, body };
|
|
90
|
+
}
|
|
91
|
+
/** Extract HTML examples from markdown code blocks */
|
|
92
|
+
function extractExamples(body) {
|
|
93
|
+
const examples = [];
|
|
94
|
+
// Find all HTML code blocks with optional preceding heading
|
|
95
|
+
const htmlBlockRegex = /(?:^|\n)(?:#{2,4}\s+(.+?)\n)?(?:(.+?)\n)?```html\n([\s\S]+?)\n```/g;
|
|
96
|
+
let match;
|
|
97
|
+
while ((match = htmlBlockRegex.exec(body)) !== null) {
|
|
98
|
+
const [, heading, descriptionLine, html] = match;
|
|
99
|
+
examples.push({
|
|
100
|
+
title: heading || descriptionLine || 'Example',
|
|
101
|
+
html: html.trim(),
|
|
102
|
+
description: heading ? descriptionLine === null || descriptionLine === void 0 ? void 0 : descriptionLine.trim() : undefined
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
return examples;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Load all component markdown documentation files
|
|
109
|
+
* @deprecated Use getMarkdownCache() for lazy loading instead
|
|
110
|
+
* This function loads all docs eagerly and can use ~50MB of memory.
|
|
111
|
+
* The new cache-based approach uses ~5MB.
|
|
112
|
+
*/
|
|
113
|
+
function loadMarkdownDocs() {
|
|
114
|
+
console.warn('Warning: loadMarkdownDocs() loads all docs eagerly. Consider using getMarkdownCache() for lazy loading.');
|
|
115
|
+
const docs = new Map();
|
|
116
|
+
const docsDir = resolveMarkdownDocsPath();
|
|
117
|
+
try {
|
|
118
|
+
const files = (0, fs_1.readdirSync)(docsDir).filter((f) => f.endsWith('.md') && f !== 'README.md');
|
|
119
|
+
for (const file of files) {
|
|
120
|
+
const filePath = (0, path_1.resolve)(docsDir, file);
|
|
121
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
122
|
+
const id = (0, path_1.basename)(file, '.md');
|
|
123
|
+
const { frontmatter, body } = parseFrontmatter(content);
|
|
124
|
+
const examples = extractExamples(body);
|
|
125
|
+
docs.set(id, {
|
|
126
|
+
id,
|
|
127
|
+
content,
|
|
128
|
+
frontmatter: {
|
|
129
|
+
component: frontmatter['component'] || id,
|
|
130
|
+
title: frontmatter['title'] || id,
|
|
131
|
+
selector: frontmatter['selector'] || '',
|
|
132
|
+
cssFile: frontmatter['cssFile'] || '',
|
|
133
|
+
category: frontmatter['category'],
|
|
134
|
+
subcategory: frontmatter['subcategory'],
|
|
135
|
+
package: frontmatter['package'],
|
|
136
|
+
description: frontmatter['description'],
|
|
137
|
+
tags: frontmatter['tags'],
|
|
138
|
+
relatedComponents: frontmatter['relatedComponents']
|
|
139
|
+
},
|
|
140
|
+
examples
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
console.error('Failed to load markdown docs:', error);
|
|
146
|
+
}
|
|
147
|
+
return docs;
|
|
148
|
+
}
|
|
149
|
+
/** Get markdown documentation for a specific component */
|
|
150
|
+
function getMarkdownDoc(componentId) {
|
|
151
|
+
const docsDir = resolveMarkdownDocsPath();
|
|
152
|
+
const filePath = (0, path_1.resolve)(docsDir, `${componentId}.md`);
|
|
153
|
+
try {
|
|
154
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
155
|
+
const { frontmatter, body } = parseFrontmatter(content);
|
|
156
|
+
const examples = extractExamples(body);
|
|
157
|
+
return {
|
|
158
|
+
id: componentId,
|
|
159
|
+
content,
|
|
160
|
+
frontmatter: {
|
|
161
|
+
component: frontmatter['component'] || componentId,
|
|
162
|
+
title: frontmatter['title'] || componentId,
|
|
163
|
+
selector: frontmatter['selector'] || '',
|
|
164
|
+
cssFile: frontmatter['cssFile'] || '',
|
|
165
|
+
category: frontmatter['category'],
|
|
166
|
+
subcategory: frontmatter['subcategory'],
|
|
167
|
+
package: frontmatter['package'],
|
|
168
|
+
description: frontmatter['description'],
|
|
169
|
+
tags: frontmatter['tags'],
|
|
170
|
+
relatedComponents: frontmatter['relatedComponents']
|
|
171
|
+
},
|
|
172
|
+
examples
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
catch (_a) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=load-markdown-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-markdown-docs.js","sourceRoot":"","sources":["../../../../../packages/mcp/src/data/load-markdown-docs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ComponentMarkdownDoc } from './load-markdown-docs';
|
|
2
|
+
/**
|
|
3
|
+
* LRU Cache for markdown documentation
|
|
4
|
+
*
|
|
5
|
+
* Implements lazy loading with a Least Recently Used (LRU) eviction policy.
|
|
6
|
+
* This reduces memory usage from ~50MB (all docs) to ~5MB (configurable cache size).
|
|
7
|
+
*/
|
|
8
|
+
export declare class MarkdownDocCache {
|
|
9
|
+
private cache;
|
|
10
|
+
private accessOrder;
|
|
11
|
+
private readonly maxSize;
|
|
12
|
+
private readonly docsPath;
|
|
13
|
+
private availableIds;
|
|
14
|
+
constructor(maxSize?: number);
|
|
15
|
+
/** Resolve path to markdown docs directory — works both from source (dev) and from dist (npm). */
|
|
16
|
+
private resolveMarkdownDocsPath;
|
|
17
|
+
/** Get list of available component IDs (lazy initialization) */
|
|
18
|
+
private getAvailableIds;
|
|
19
|
+
/** Load a single markdown document from disk */
|
|
20
|
+
private loadDoc;
|
|
21
|
+
/** Parse frontmatter from markdown content */
|
|
22
|
+
private parseFrontmatter;
|
|
23
|
+
/** Extract HTML examples from markdown code blocks */
|
|
24
|
+
private extractExamples;
|
|
25
|
+
/** Update LRU access order */
|
|
26
|
+
private updateAccessOrder;
|
|
27
|
+
/** Evict least recently used item if cache is full */
|
|
28
|
+
private evictIfNeeded;
|
|
29
|
+
/**
|
|
30
|
+
* Get a markdown document by ID (lazy loaded)
|
|
31
|
+
* @param componentId Component ID (e.g., "button")
|
|
32
|
+
* @returns ComponentMarkdownDoc or null if not found
|
|
33
|
+
*/
|
|
34
|
+
get(componentId: string): ComponentMarkdownDoc | null;
|
|
35
|
+
/**
|
|
36
|
+
* Get all available component IDs without loading documents
|
|
37
|
+
* @returns Array of component IDs
|
|
38
|
+
*/
|
|
39
|
+
keys(): string[];
|
|
40
|
+
/**
|
|
41
|
+
* Check if a component exists without loading it
|
|
42
|
+
* @param componentId Component ID
|
|
43
|
+
* @returns true if component exists
|
|
44
|
+
*/
|
|
45
|
+
has(componentId: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Get cache statistics
|
|
48
|
+
* @returns Object with cache metrics
|
|
49
|
+
*/
|
|
50
|
+
getStats(): {
|
|
51
|
+
size: number;
|
|
52
|
+
maxSize: number;
|
|
53
|
+
hitRate: number;
|
|
54
|
+
totalComponents: number;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Clear the cache
|
|
58
|
+
*/
|
|
59
|
+
clear(): void;
|
|
60
|
+
}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MarkdownDocCache = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
/**
|
|
7
|
+
* LRU Cache for markdown documentation
|
|
8
|
+
*
|
|
9
|
+
* Implements lazy loading with a Least Recently Used (LRU) eviction policy.
|
|
10
|
+
* This reduces memory usage from ~50MB (all docs) to ~5MB (configurable cache size).
|
|
11
|
+
*/
|
|
12
|
+
class MarkdownDocCache {
|
|
13
|
+
constructor(maxSize = 50) {
|
|
14
|
+
this.cache = new Map();
|
|
15
|
+
this.accessOrder = [];
|
|
16
|
+
this.availableIds = null;
|
|
17
|
+
this.maxSize = maxSize;
|
|
18
|
+
this.docsPath = this.resolveMarkdownDocsPath();
|
|
19
|
+
}
|
|
20
|
+
/** Resolve path to markdown docs directory — works both from source (dev) and from dist (npm). */
|
|
21
|
+
resolveMarkdownDocsPath() {
|
|
22
|
+
// dist path: dist/packages/mcp/data/components/
|
|
23
|
+
const distPath = (0, path_1.resolve)(__dirname, '..', '..', 'data', 'components');
|
|
24
|
+
// source path: docs/components/
|
|
25
|
+
const srcPath = (0, path_1.resolve)(__dirname, '..', '..', '..', '..', 'docs', 'components');
|
|
26
|
+
if ((0, fs_1.existsSync)(distPath)) {
|
|
27
|
+
return distPath;
|
|
28
|
+
}
|
|
29
|
+
return srcPath;
|
|
30
|
+
}
|
|
31
|
+
/** Get list of available component IDs (lazy initialization) */
|
|
32
|
+
getAvailableIds() {
|
|
33
|
+
if (this.availableIds === null) {
|
|
34
|
+
this.availableIds = new Set();
|
|
35
|
+
try {
|
|
36
|
+
const files = (0, fs_1.readdirSync)(this.docsPath).filter((f) => f.endsWith('.md') && f !== 'README.md');
|
|
37
|
+
for (const file of files) {
|
|
38
|
+
this.availableIds.add((0, path_1.basename)(file, '.md'));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error('Failed to read markdown docs directory:', error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return this.availableIds;
|
|
46
|
+
}
|
|
47
|
+
/** Load a single markdown document from disk */
|
|
48
|
+
loadDoc(componentId) {
|
|
49
|
+
const filePath = (0, path_1.resolve)(this.docsPath, `${componentId}.md`);
|
|
50
|
+
try {
|
|
51
|
+
const content = (0, fs_1.readFileSync)(filePath, 'utf-8');
|
|
52
|
+
const { frontmatter, body } = this.parseFrontmatter(content);
|
|
53
|
+
const examples = this.extractExamples(body);
|
|
54
|
+
return {
|
|
55
|
+
id: componentId,
|
|
56
|
+
content,
|
|
57
|
+
frontmatter: {
|
|
58
|
+
component: frontmatter['component'] || componentId,
|
|
59
|
+
title: frontmatter['title'] || componentId,
|
|
60
|
+
selector: frontmatter['selector'] || '',
|
|
61
|
+
cssFile: frontmatter['cssFile'] || '',
|
|
62
|
+
category: frontmatter['category'],
|
|
63
|
+
subcategory: frontmatter['subcategory'],
|
|
64
|
+
package: frontmatter['package'],
|
|
65
|
+
description: frontmatter['description'],
|
|
66
|
+
tags: frontmatter['tags'],
|
|
67
|
+
relatedComponents: frontmatter['relatedComponents']
|
|
68
|
+
},
|
|
69
|
+
examples
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (_a) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/** Parse frontmatter from markdown content */
|
|
77
|
+
parseFrontmatter(content) {
|
|
78
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]+?)\n---\n([\s\S]*)$/);
|
|
79
|
+
if (!frontmatterMatch) {
|
|
80
|
+
return { frontmatter: {}, body: content };
|
|
81
|
+
}
|
|
82
|
+
const [, frontmatterText, body] = frontmatterMatch;
|
|
83
|
+
const frontmatter = {};
|
|
84
|
+
// Simple YAML parser for common types
|
|
85
|
+
const lines = frontmatterText.split('\n');
|
|
86
|
+
let currentKey = '';
|
|
87
|
+
for (const line of lines) {
|
|
88
|
+
const trimmed = line.trim();
|
|
89
|
+
if (!trimmed)
|
|
90
|
+
continue;
|
|
91
|
+
// Array item
|
|
92
|
+
if (trimmed.startsWith('- ')) {
|
|
93
|
+
if (currentKey && Array.isArray(frontmatter[currentKey])) {
|
|
94
|
+
frontmatter[currentKey].push(trimmed.slice(2).trim());
|
|
95
|
+
}
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
// Key-value pair
|
|
99
|
+
const match = trimmed.match(/^([a-zA-Z0-9_-]+):\s*(.*)$/);
|
|
100
|
+
if (match) {
|
|
101
|
+
const [, key, value] = match;
|
|
102
|
+
currentKey = key;
|
|
103
|
+
// Empty value means array follows
|
|
104
|
+
if (!value) {
|
|
105
|
+
frontmatter[key] = [];
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// Try to parse as number or boolean
|
|
109
|
+
if (value === 'true') {
|
|
110
|
+
frontmatter[key] = true;
|
|
111
|
+
}
|
|
112
|
+
else if (value === 'false') {
|
|
113
|
+
frontmatter[key] = false;
|
|
114
|
+
}
|
|
115
|
+
else if (/^\d+$/.test(value)) {
|
|
116
|
+
frontmatter[key] = parseInt(value, 10);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// Remove quotes if present
|
|
120
|
+
frontmatter[key] = value.replace(/^["']|["']$/g, '');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { frontmatter, body };
|
|
126
|
+
}
|
|
127
|
+
/** Extract HTML examples from markdown code blocks */
|
|
128
|
+
extractExamples(body) {
|
|
129
|
+
const examples = [];
|
|
130
|
+
// Find all HTML code blocks with optional preceding heading
|
|
131
|
+
const htmlBlockRegex = /(?:^|\n)(?:#{2,4}\s+(.+?)\n)?(?:(.+?)\n)?```html\n([\s\S]+?)\n```/g;
|
|
132
|
+
let match;
|
|
133
|
+
while ((match = htmlBlockRegex.exec(body)) !== null) {
|
|
134
|
+
const [, heading, descriptionLine, html] = match;
|
|
135
|
+
examples.push({
|
|
136
|
+
title: heading || descriptionLine || 'Example',
|
|
137
|
+
html: html.trim(),
|
|
138
|
+
description: heading ? descriptionLine === null || descriptionLine === void 0 ? void 0 : descriptionLine.trim() : undefined
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return examples;
|
|
142
|
+
}
|
|
143
|
+
/** Update LRU access order */
|
|
144
|
+
updateAccessOrder(id) {
|
|
145
|
+
// Remove from current position
|
|
146
|
+
const index = this.accessOrder.indexOf(id);
|
|
147
|
+
if (index > -1) {
|
|
148
|
+
this.accessOrder.splice(index, 1);
|
|
149
|
+
}
|
|
150
|
+
// Add to end (most recently used)
|
|
151
|
+
this.accessOrder.push(id);
|
|
152
|
+
}
|
|
153
|
+
/** Evict least recently used item if cache is full */
|
|
154
|
+
evictIfNeeded() {
|
|
155
|
+
if (this.cache.size >= this.maxSize && this.accessOrder.length > 0) {
|
|
156
|
+
const lruId = this.accessOrder.shift();
|
|
157
|
+
if (lruId) {
|
|
158
|
+
this.cache.delete(lruId);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Get a markdown document by ID (lazy loaded)
|
|
164
|
+
* @param componentId Component ID (e.g., "button")
|
|
165
|
+
* @returns ComponentMarkdownDoc or null if not found
|
|
166
|
+
*/
|
|
167
|
+
get(componentId) {
|
|
168
|
+
// Check cache first
|
|
169
|
+
if (this.cache.has(componentId)) {
|
|
170
|
+
this.updateAccessOrder(componentId);
|
|
171
|
+
return this.cache.get(componentId);
|
|
172
|
+
}
|
|
173
|
+
// Load from disk
|
|
174
|
+
const doc = this.loadDoc(componentId);
|
|
175
|
+
if (doc) {
|
|
176
|
+
this.evictIfNeeded();
|
|
177
|
+
this.cache.set(componentId, doc);
|
|
178
|
+
this.updateAccessOrder(componentId);
|
|
179
|
+
}
|
|
180
|
+
return doc;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get all available component IDs without loading documents
|
|
184
|
+
* @returns Array of component IDs
|
|
185
|
+
*/
|
|
186
|
+
keys() {
|
|
187
|
+
return Array.from(this.getAvailableIds());
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if a component exists without loading it
|
|
191
|
+
* @param componentId Component ID
|
|
192
|
+
* @returns true if component exists
|
|
193
|
+
*/
|
|
194
|
+
has(componentId) {
|
|
195
|
+
return this.getAvailableIds().has(componentId);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get cache statistics
|
|
199
|
+
* @returns Object with cache metrics
|
|
200
|
+
*/
|
|
201
|
+
getStats() {
|
|
202
|
+
return {
|
|
203
|
+
size: this.cache.size,
|
|
204
|
+
maxSize: this.maxSize,
|
|
205
|
+
hitRate: this.cache.size > 0 ? (this.accessOrder.length / this.cache.size) : 0,
|
|
206
|
+
totalComponents: this.getAvailableIds().size
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Clear the cache
|
|
211
|
+
*/
|
|
212
|
+
clear() {
|
|
213
|
+
this.cache.clear();
|
|
214
|
+
this.accessOrder = [];
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
exports.MarkdownDocCache = MarkdownDocCache;
|
|
218
|
+
//# sourceMappingURL=markdown-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-cache.js","sourceRoot":"","sources":["../../../../../packages/mcp/src/data/markdown-cache.ts"],"names":[],"mappings":"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"}
|
package/src/server.js
CHANGED
|
@@ -9,6 +9,7 @@ const load_examples_1 = require("./data/load-examples");
|
|
|
9
9
|
const helpers_1 = require("./helpers");
|
|
10
10
|
const changelog_extractor_1 = require("./data/changelog-extractor");
|
|
11
11
|
const component_dependencies_1 = require("./data/component-dependencies");
|
|
12
|
+
const load_markdown_docs_1 = require("./data/load-markdown-docs");
|
|
12
13
|
const component_metadata_1 = require("./types/component-metadata");
|
|
13
14
|
// Load data at startup
|
|
14
15
|
let data;
|
|
@@ -29,7 +30,8 @@ catch (_a) {
|
|
|
29
30
|
htmlExamples: null,
|
|
30
31
|
componentUseCases: null,
|
|
31
32
|
componentGuidance: null,
|
|
32
|
-
semanticTags: null
|
|
33
|
+
semanticTags: null,
|
|
34
|
+
markdownDocs: (0, load_markdown_docs_1.getMarkdownCache)(50)
|
|
33
35
|
};
|
|
34
36
|
console.error('Warning: Failed to load component catalog data.');
|
|
35
37
|
}
|
|
@@ -2541,6 +2543,75 @@ Use this when implementing interactive features or adding JavaScript behavior to
|
|
|
2541
2543
|
};
|
|
2542
2544
|
}));
|
|
2543
2545
|
// ---------------------------------------------------------------------------
|
|
2546
|
+
// Tool: get_component_markdown
|
|
2547
|
+
// ---------------------------------------------------------------------------
|
|
2548
|
+
server.tool('get_component_markdown', `Get complete markdown documentation for a component, including all HTML examples with modifiers.
|
|
2549
|
+
This returns the full auto-generated component documentation from Storybook stories.
|
|
2550
|
+
Contains complete HTML examples with all variants, modifiers, and states.
|
|
2551
|
+
Use this when you need comprehensive examples or want to see all available variations.`, {
|
|
2552
|
+
component: zod_1.z.string().describe('Component ID (e.g., "button", "table", "dialog")'),
|
|
2553
|
+
examplesOnly: zod_1.z.boolean().optional().default(false).describe('Return only HTML examples without frontmatter/description (default: false)')
|
|
2554
|
+
}, (_a) => tslib_1.__awaiter(void 0, [_a], void 0, function* ({ component, examplesOnly = false }) {
|
|
2555
|
+
const doc = data.markdownDocs.get(component);
|
|
2556
|
+
if (!doc) {
|
|
2557
|
+
// Try to find similar component names
|
|
2558
|
+
const similar = Array.from(data.markdownDocs.keys())
|
|
2559
|
+
.filter(id => id.includes(component.toLowerCase()) || component.toLowerCase().includes(id))
|
|
2560
|
+
.slice(0, 5);
|
|
2561
|
+
return {
|
|
2562
|
+
content: [
|
|
2563
|
+
{
|
|
2564
|
+
type: 'text',
|
|
2565
|
+
text: JSON.stringify({
|
|
2566
|
+
error: `No markdown documentation found for component: ${component}`,
|
|
2567
|
+
suggestion: similar.length > 0
|
|
2568
|
+
? `Did you mean one of these? ${similar.join(', ')}`
|
|
2569
|
+
: `Try list_components to see all available components.`,
|
|
2570
|
+
availableComponents: similar.length > 0 ? similar : undefined
|
|
2571
|
+
}, null, 2)
|
|
2572
|
+
}
|
|
2573
|
+
]
|
|
2574
|
+
};
|
|
2575
|
+
}
|
|
2576
|
+
if (examplesOnly) {
|
|
2577
|
+
return {
|
|
2578
|
+
content: [
|
|
2579
|
+
{
|
|
2580
|
+
type: 'text',
|
|
2581
|
+
text: JSON.stringify({
|
|
2582
|
+
component: doc.frontmatter.component,
|
|
2583
|
+
title: doc.frontmatter.title,
|
|
2584
|
+
totalExamples: doc.examples.length,
|
|
2585
|
+
examples: doc.examples
|
|
2586
|
+
}, null, 2)
|
|
2587
|
+
}
|
|
2588
|
+
]
|
|
2589
|
+
};
|
|
2590
|
+
}
|
|
2591
|
+
// Return full documentation
|
|
2592
|
+
return {
|
|
2593
|
+
content: [
|
|
2594
|
+
{
|
|
2595
|
+
type: 'text',
|
|
2596
|
+
text: JSON.stringify({
|
|
2597
|
+
component: doc.frontmatter.component,
|
|
2598
|
+
title: doc.frontmatter.title,
|
|
2599
|
+
selector: doc.frontmatter.selector,
|
|
2600
|
+
cssFile: doc.frontmatter.cssFile,
|
|
2601
|
+
category: doc.frontmatter.category,
|
|
2602
|
+
subcategory: doc.frontmatter.subcategory,
|
|
2603
|
+
description: doc.frontmatter.description,
|
|
2604
|
+
tags: doc.frontmatter.tags,
|
|
2605
|
+
relatedComponents: doc.frontmatter.relatedComponents,
|
|
2606
|
+
totalExamples: doc.examples.length,
|
|
2607
|
+
examples: doc.examples,
|
|
2608
|
+
fullMarkdown: doc.content
|
|
2609
|
+
}, null, 2)
|
|
2610
|
+
}
|
|
2611
|
+
]
|
|
2612
|
+
};
|
|
2613
|
+
}));
|
|
2614
|
+
// ---------------------------------------------------------------------------
|
|
2544
2615
|
// Tool: list_mcp_resources
|
|
2545
2616
|
// ---------------------------------------------------------------------------
|
|
2546
2617
|
server.tool('list_mcp_resources', `List all available resources in the fundamental-styles MCP.
|