@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.
Files changed (215) hide show
  1. package/data/AI_USAGE.md +425 -0
  2. package/data/CHANGELOG.md +53 -3
  3. package/data/component-catalog.json +62 -209
  4. package/data/components/README.md +281 -0
  5. package/data/components/action-bar.md +443 -0
  6. package/data/components/ai-busy-indicator.md +79 -0
  7. package/data/components/ai-loading-bar.md +66 -0
  8. package/data/components/avatar-btp.md +198 -0
  9. package/data/components/avatar-group.md +2660 -0
  10. package/data/components/avatar-product-switch.md +476 -0
  11. package/data/components/avatar.md +993 -0
  12. package/data/components/bar.md +574 -0
  13. package/data/components/border-radius.md +148 -0
  14. package/data/components/border.md +412 -0
  15. package/data/components/breadcrumb.md +546 -0
  16. package/data/components/button-2.md +440 -0
  17. package/data/components/button-action-sheet.md +292 -0
  18. package/data/components/button-ai.md +730 -0
  19. package/data/components/button-btp.md +223 -0
  20. package/data/components/button-button.md +233 -0
  21. package/data/components/button-counter.md +176 -0
  22. package/data/components/button-patterns.md +731 -0
  23. package/data/components/button-split.md +459 -0
  24. package/data/components/button.md +469 -0
  25. package/data/components/calendar.md +5784 -0
  26. package/data/components/card-card-media.md +707 -0
  27. package/data/components/card-card.md +2426 -0
  28. package/data/components/card-layouts.md +1201 -0
  29. package/data/components/card.md +2404 -0
  30. package/data/components/carousel.md +1506 -0
  31. package/data/components/code.md +139 -0
  32. package/data/components/component-reset.md +272 -0
  33. package/data/components/components-icons-businesssuiteinappsymbol-icons.md +85 -0
  34. package/data/components/components-icons-sap-icons.md +147 -0
  35. package/data/components/components-icons-tnt-icons.md +85 -0
  36. package/data/components/container-queries.md +221 -0
  37. package/data/components/container.md +227 -0
  38. package/data/components/dialog-docs-static-busy-indicator.md +165 -0
  39. package/data/components/dialog-docs-static-dialog.md +949 -0
  40. package/data/components/dialog-docs-static-patterns.md +147 -0
  41. package/data/components/dialog-docs-static-settings.md +528 -0
  42. package/data/components/dialog-docs-static.md +982 -0
  43. package/data/components/dialog.md +606 -0
  44. package/data/components/dynamic-page-dynamic-page.md +1914 -0
  45. package/data/components/dynamic-page.md +973 -0
  46. package/data/components/dynamic-side.md +197 -0
  47. package/data/components/elevation.md +110 -0
  48. package/data/components/feed-input.md +346 -0
  49. package/data/components/feed-list.md +580 -0
  50. package/data/components/fieldset-2.md +292 -0
  51. package/data/components/fieldset-forms.md +169 -0
  52. package/data/components/fieldset.md +381 -0
  53. package/data/components/flexible-column-layout.md +205 -0
  54. package/data/components/form-group.md +287 -0
  55. package/data/components/form-header.md +71 -0
  56. package/data/components/form-item-2.md +98 -0
  57. package/data/components/form-item-3.md +134 -0
  58. package/data/components/form-item-4.md +556 -0
  59. package/data/components/form-item-5.md +182 -0
  60. package/data/components/form-item-6.md +539 -0
  61. package/data/components/form-item-7.md +239 -0
  62. package/data/components/form-item-ai.md +158 -0
  63. package/data/components/form-item-file-uploader.md +445 -0
  64. package/data/components/form-item-forms.md +234 -0
  65. package/data/components/form-item-patterns.md +426 -0
  66. package/data/components/form-item.md +464 -0
  67. package/data/components/form-label-ai.md +126 -0
  68. package/data/components/form-label-layouts.md +306 -0
  69. package/data/components/form-label-patterns.md +1175 -0
  70. package/data/components/form-label-status-indicator.md +1083 -0
  71. package/data/components/form-label-step-input.md +620 -0
  72. package/data/components/form-label.md +2876 -0
  73. package/data/components/generic-tag.md +747 -0
  74. package/data/components/grid-list-grid-list.md +1185 -0
  75. package/data/components/grid-list.md +1449 -0
  76. package/data/components/heading.md +66 -0
  77. package/data/components/horizontal-navigation.md +568 -0
  78. package/data/components/icon-tab-bar-dev.md +190 -0
  79. package/data/components/icon-tab-bar.md +2620 -0
  80. package/data/components/icon.md +171 -0
  81. package/data/components/iconBusinessSuite.md +92 -0
  82. package/data/components/iconTnt.md +92 -0
  83. package/data/components/illustrated-message.md +439 -0
  84. package/data/components/info-label.md +348 -0
  85. package/data/components/input-group.md +2068 -0
  86. package/data/components/label.md +66 -0
  87. package/data/components/layout-grid.md +447 -0
  88. package/data/components/layout-panel.md +261 -0
  89. package/data/components/layouts-layout-grid.md +608 -0
  90. package/data/components/layouts-paddings.md +133 -0
  91. package/data/components/layouts-section.md +287 -0
  92. package/data/components/list-2.md +148 -0
  93. package/data/components/list-3.md +735 -0
  94. package/data/components/list-list.md +790 -0
  95. package/data/components/list-object-list.md +1225 -0
  96. package/data/components/list.md +1286 -0
  97. package/data/components/media-queries.md +168 -0
  98. package/data/components/menu.md +946 -0
  99. package/data/components/message-box-docs-static-ai.md +149 -0
  100. package/data/components/message-box-docs-static.md +527 -0
  101. package/data/components/message-page-upload-collection.md +678 -0
  102. package/data/components/message-page.md +256 -0
  103. package/data/components/message-strip.md +977 -0
  104. package/data/components/message-toast.md +119 -0
  105. package/data/components/micro-process-flow.md +991 -0
  106. package/data/components/navigation-menu.md +366 -0
  107. package/data/components/navigation-navigation.md +1245 -0
  108. package/data/components/navigation.md +2604 -0
  109. package/data/components/numeric-content.md +317 -0
  110. package/data/components/object-attribute.md +96 -0
  111. package/data/components/object-identifier.md +227 -0
  112. package/data/components/object-marker.md +202 -0
  113. package/data/components/object-number.md +327 -0
  114. package/data/components/object-status.md +1538 -0
  115. package/data/components/off-screen.md +87 -0
  116. package/data/components/overflow.md +97 -0
  117. package/data/components/padding.md +122 -0
  118. package/data/components/paddings.md +130 -0
  119. package/data/components/page.md +300 -0
  120. package/data/components/pagination.md +672 -0
  121. package/data/components/panel-layouts.md +345 -0
  122. package/data/components/panel.md +514 -0
  123. package/data/components/patterns-label.md +74 -0
  124. package/data/components/popover-2.md +906 -0
  125. package/data/components/popover-ai.md +466 -0
  126. package/data/components/popover-btp.md +886 -0
  127. package/data/components/popover-deprecated.md +308 -0
  128. package/data/components/popover-message-popover.md +683 -0
  129. package/data/components/popover-notification.md +1511 -0
  130. package/data/components/popover-patterns.md +1100 -0
  131. package/data/components/popover-popover.md +1862 -0
  132. package/data/components/popover-quick-view.md +385 -0
  133. package/data/components/popover-timepicker.md +1836 -0
  134. package/data/components/popover-user-menu.md +1303 -0
  135. package/data/components/popover.md +1938 -0
  136. package/data/components/progress-indicator.md +351 -0
  137. package/data/components/prompt-input-ai.md +226 -0
  138. package/data/components/prompt-input.md +226 -0
  139. package/data/components/rating-indicator.md +1469 -0
  140. package/data/components/resizable-card-layout.md +951 -0
  141. package/data/components/scrollbar.md +86 -0
  142. package/data/components/search-field.md +287 -0
  143. package/data/components/section.md +250 -0
  144. package/data/components/segmented-button.md +324 -0
  145. package/data/components/shellbar.md +2183 -0
  146. package/data/components/side-nav.md +1562 -0
  147. package/data/components/skeleton.md +243 -0
  148. package/data/components/slider.md +395 -0
  149. package/data/components/splitter.md +353 -0
  150. package/data/components/table.md +2749 -0
  151. package/data/components/tabs.md +658 -0
  152. package/data/components/text-text.md +380 -0
  153. package/data/components/text.md +253 -0
  154. package/data/components/tile.md +1132 -0
  155. package/data/components/time.md +818 -0
  156. package/data/components/title.md +153 -0
  157. package/data/components/titles.md +83 -0
  158. package/data/components/token.md +311 -0
  159. package/data/components/tokenizer.md +398 -0
  160. package/data/components/tool-header.md +1352 -0
  161. package/data/components/tool-layout.md +199 -0
  162. package/data/components/toolbar-ai.md +174 -0
  163. package/data/components/toolbar-btp.md +526 -0
  164. package/data/components/toolbar-title-bar.md +473 -0
  165. package/data/components/toolbar.md +432 -0
  166. package/data/components/tree.md +1031 -0
  167. package/data/components/typography.md +435 -0
  168. package/data/components/variant-management.md +360 -0
  169. package/data/components/vertical-nav.md +589 -0
  170. package/data/components/wizard.md +1429 -0
  171. package/data/examples/Components/dialog/device-specifications.example.html +39 -30
  172. package/data/examples/Components/shellbar/optional-items.example.html +210 -157
  173. package/data/examples/Components/shellbar/overflow-toolbar.example.html +202 -177
  174. package/data/examples/Components/shellbar/responsive-paddings.example.html +217 -146
  175. package/data/examples/Components/shellbar/responsiveness.example.html +825 -613
  176. package/data/examples/Components/user-menu/default.example.html +241 -83
  177. package/data/schemas/badge.schema.json +1 -1
  178. package/data/schemas/button-split.schema.json +1 -1
  179. package/data/schemas/component-frontmatter.schema.json +123 -0
  180. package/data/schemas/component-markdown.schema.json +81 -0
  181. package/data/schemas/counter.schema.json +1 -1
  182. package/data/schemas/dynamic-page.schema.json +1 -1
  183. package/data/schemas/dynamic-side-content.schema.json +1 -1
  184. package/data/schemas/facet.schema.json +1 -1
  185. package/data/schemas/fieldset.schema.json +1 -1
  186. package/data/schemas/flexible-column-layout.schema.json +1 -1
  187. package/data/schemas/form-group.schema.json +3 -2
  188. package/data/schemas/form-header.schema.json +1 -1
  189. package/data/schemas/form-label.schema.json +1 -0
  190. package/data/schemas/form-message.schema.json +1 -1
  191. package/data/schemas/grid-list.schema.json +1 -1
  192. package/data/schemas/input-group.schema.json +1 -1
  193. package/data/schemas/layout-panel.schema.json +1 -1
  194. package/data/schemas/page.schema.json +1 -1
  195. package/data/schemas/quick-view.schema.json +2 -1
  196. package/data/schemas/section.schema.json +1 -1
  197. package/data/schemas/side-nav.schema.json +1 -1
  198. package/data/schemas/splitter.schema.json +1 -1
  199. package/data/schemas/tabs.schema.json +1 -1
  200. package/data/schemas/tile.schema.json +1 -1
  201. package/data/schemas/tool-layout.schema.json +1 -1
  202. package/data/schemas/user-menu.schema.json +10 -0
  203. package/data/schemas/wizard.schema.json +1 -1
  204. package/package.json +1 -1
  205. package/src/data/load-catalog.d.ts +2 -0
  206. package/src/data/load-catalog.js +5 -1
  207. package/src/data/load-catalog.js.map +1 -1
  208. package/src/data/load-markdown-docs.d.ts +44 -0
  209. package/src/data/load-markdown-docs.js +179 -0
  210. package/src/data/load-markdown-docs.js.map +1 -0
  211. package/src/data/markdown-cache.d.ts +60 -0
  212. package/src/data/markdown-cache.js +218 -0
  213. package/src/data/markdown-cache.js.map +1 -0
  214. package/src/server.js +72 -1
  215. 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":";;;AA4CA,4CAKC;AAmGD,4CAwCC;AAGD,wCA6BC;AA5ND,2BAA+C;AAC/C,+BAAyC;AACzC,qDAAoD;AAEpD,4BAA4B;AAC5B,mDAAoD;AAA3C,kHAAA,gBAAgB,OAAA;AA+BzB,wEAAwE;AACxE,wDAAwD;AACxD,IAAI,aAAa,GAA4B,IAAI,CAAC;AAElD;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,UAAkB,EAAE;IACjD,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,aAAa,GAAG,IAAI,iCAAgB,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,aAAa,CAAC;AACzB,CAAC;AAED,kGAAkG;AAClG,SAAS,uBAAuB;IAC5B,gDAAgD;IAChD,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IACtE,gCAAgC;IAChC,MAAM,OAAO,GAAG,IAAA,cAAO,EAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;IAEjF,IAAI,CAAC;QACD,IAAA,gBAAW,EAAC,QAAQ,CAAC,CAAC;QACtB,OAAO,QAAQ,CAAC;IACpB,CAAC;IAAC,WAAM,CAAC;QACL,OAAO,OAAO,CAAC;IACnB,CAAC;AACL,CAAC;AAED,8CAA8C;AAC9C,SAAS,gBAAgB,CAAC,OAAe;IACrC,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAE5E,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACpB,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,gBAAgB,CAAC;IACnD,MAAM,WAAW,GAA4B,EAAE,CAAC;IAEhD,sCAAsC;IACtC,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,aAAa;QACb,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,IAAI,UAAU,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;gBACtD,WAAW,CAAC,UAAU,CAAc,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxE,CAAC;YACD,SAAS;QACb,CAAC;QAED,iBAAiB;QACjB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC;YAC7B,UAAU,GAAG,GAAG,CAAC;YAEjB,kCAAkC;YAClC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACT,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACJ,oCAAoC;gBACpC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACnB,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;gBAC5B,CAAC;qBAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;oBAC3B,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAC7B,CAAC;qBAAM,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;oBAC7B,WAAW,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACJ,2BAA2B;oBAC3B,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBACzD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,sDAAsD;AACtD,SAAS,eAAe,CAAC,IAAY;IACjC,MAAM,QAAQ,GAAiE,EAAE,CAAC;IAElF,4DAA4D;IAC5D,MAAM,cAAc,GAAG,oEAAoE,CAAC;IAE5F,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;QAEjD,QAAQ,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,OAAO,IAAI,eAAe,IAAI,SAAS;YAC9C,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS;SAC7D,CAAC,CAAC;IACP,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB;IAC5B,OAAO,CAAC,IAAI,CAAC,yGAAyG,CAAC,CAAC;IAExH,MAAM,IAAI,GAAG,IAAI,GAAG,EAAgC,CAAC;IACrD,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAE1C,IAAI,CAAC;QACD,MAAM,KAAK,GAAG,IAAA,gBAAW,EAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,WAAW,CAAC,CAAC;QAEzF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,EAAE,GAAG,IAAA,eAAQ,EAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAEjC,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAEvC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;gBACT,EAAE;gBACF,OAAO;gBACP,WAAW,EAAE;oBACT,SAAS,EAAG,WAAW,CAAC,WAAW,CAAY,IAAI,EAAE;oBACrD,KAAK,EAAG,WAAW,CAAC,OAAO,CAAY,IAAI,EAAE;oBAC7C,QAAQ,EAAG,WAAW,CAAC,UAAU,CAAY,IAAI,EAAE;oBACnD,OAAO,EAAG,WAAW,CAAC,SAAS,CAAY,IAAI,EAAE;oBACjD,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAuB;oBACvD,WAAW,EAAE,WAAW,CAAC,aAAa,CAAuB;oBAC7D,OAAO,EAAE,WAAW,CAAC,SAAS,CAAuB;oBACrD,WAAW,EAAE,WAAW,CAAC,aAAa,CAAuB;oBAC7D,IAAI,EAAE,WAAW,CAAC,MAAM,CAAyB;oBACjD,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CAAyB;iBAC9E;gBACD,QAAQ;aACX,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,0DAA0D;AAC1D,SAAgB,cAAc,CAAC,WAAmB;IAC9C,MAAM,OAAO,GAAG,uBAAuB,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,OAAO,EAAE,GAAG,WAAW,KAAK,CAAC,CAAC;IAEvD,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAEvC,OAAO;YACH,EAAE,EAAE,WAAW;YACf,OAAO;YACP,WAAW,EAAE;gBACT,SAAS,EAAG,WAAW,CAAC,WAAW,CAAY,IAAI,WAAW;gBAC9D,KAAK,EAAG,WAAW,CAAC,OAAO,CAAY,IAAI,WAAW;gBACtD,QAAQ,EAAG,WAAW,CAAC,UAAU,CAAY,IAAI,EAAE;gBACnD,OAAO,EAAG,WAAW,CAAC,SAAS,CAAY,IAAI,EAAE;gBACjD,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAuB;gBACvD,WAAW,EAAE,WAAW,CAAC,aAAa,CAAuB;gBAC7D,OAAO,EAAE,WAAW,CAAC,SAAS,CAAuB;gBACrD,WAAW,EAAE,WAAW,CAAC,aAAa,CAAuB;gBAC7D,IAAI,EAAE,WAAW,CAAC,MAAM,CAAyB;gBACjD,iBAAiB,EAAE,WAAW,CAAC,mBAAmB,CAAyB;aAC9E;YACD,QAAQ;SACX,CAAC;IACN,CAAC;IAAC,WAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
@@ -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.