@redsift/ds-mcp-server 12.3.1-muiv6-alpha.2

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 (258) hide show
  1. package/README.md +203 -0
  2. package/consumer-instructions/.cursorrules +80 -0
  3. package/consumer-instructions/.windsurfrules +80 -0
  4. package/consumer-instructions/CLAUDE.md +87 -0
  5. package/consumer-instructions/redsift-design-system.instructions.md +87 -0
  6. package/data/demos/patterns/crossfiltered-datagrid-page/example.tsx +750 -0
  7. package/data/demos/patterns/crossfiltered-datagrid-page/with-empty-state.tsx +111 -0
  8. package/data/demos/patterns/crossfiltered-datagrid-page/with-error.tsx +122 -0
  9. package/data/demos/patterns/crossfiltered-datagrid-page/with-loading.tsx +88 -0
  10. package/data/demos/patterns/datagrid-page/example.tsx +521 -0
  11. package/data/demos/patterns/datagrid-page/with-empty-state.tsx +80 -0
  12. package/data/demos/patterns/datagrid-page/with-error.tsx +96 -0
  13. package/data/demos/patterns/datagrid-page/with-loading.tsx +57 -0
  14. package/data/demos/patterns/drilldown-datagrid-page/example.tsx +715 -0
  15. package/data/demos/patterns/drilldown-datagrid-page/with-empty-state.tsx +113 -0
  16. package/data/demos/patterns/drilldown-datagrid-page/with-error.tsx +125 -0
  17. package/data/demos/patterns/drilldown-datagrid-page/with-loading.tsx +90 -0
  18. package/data/demos/patterns/server-datagrid-page/example.tsx +757 -0
  19. package/data/demos/patterns/server-datagrid-page/with-empty-state.tsx +107 -0
  20. package/data/demos/patterns/server-datagrid-page/with-error.tsx +107 -0
  21. package/data/demos/patterns/server-datagrid-page/with-loading.tsx +63 -0
  22. package/data/docs/components/charts/Arc.json +179 -0
  23. package/data/docs/components/charts/Arcs.json +104 -0
  24. package/data/docs/components/charts/Axis.json +269 -0
  25. package/data/docs/components/charts/Bar.json +236 -0
  26. package/data/docs/components/charts/BarChart.json +852 -0
  27. package/data/docs/components/charts/BarChartBars.json +18 -0
  28. package/data/docs/components/charts/BarChartGroupedTooltip.json +9 -0
  29. package/data/docs/components/charts/BarChartOverlay.json +34 -0
  30. package/data/docs/components/charts/BarChartSection.json +94 -0
  31. package/data/docs/components/charts/BaseBarChart.json +852 -0
  32. package/data/docs/components/charts/ChartContainerTitle.json +574 -0
  33. package/data/docs/components/charts/DataPoint.json +160 -0
  34. package/data/docs/components/charts/Dot.json +191 -0
  35. package/data/docs/components/charts/EmptyBarChart.json +852 -0
  36. package/data/docs/components/charts/EmptyLineChart.json +753 -0
  37. package/data/docs/components/charts/EmptyPieChart.json +826 -0
  38. package/data/docs/components/charts/EmptyScatterPlot.json +802 -0
  39. package/data/docs/components/charts/Legend.json +510 -0
  40. package/data/docs/components/charts/LegendItem.json +128 -0
  41. package/data/docs/components/charts/Line.json +69 -0
  42. package/data/docs/components/charts/LineChart.json +753 -0
  43. package/data/docs/components/charts/LoadingBarChart.json +852 -0
  44. package/data/docs/components/charts/LoadingLineChart.json +753 -0
  45. package/data/docs/components/charts/LoadingPieChart.json +826 -0
  46. package/data/docs/components/charts/LoadingScatterPlot.json +802 -0
  47. package/data/docs/components/charts/PieChart.json +826 -0
  48. package/data/docs/components/charts/RenderedLineChart.json +753 -0
  49. package/data/docs/components/charts/RenderedLinearBarChart.json +823 -0
  50. package/data/docs/components/charts/RenderedOrdinalBarChart.json +852 -0
  51. package/data/docs/components/charts/RenderedPieChart.json +826 -0
  52. package/data/docs/components/charts/RenderedScatterPlot.json +802 -0
  53. package/data/docs/components/charts/ScatterPlot.json +802 -0
  54. package/data/docs/components/charts/getAxisType.json +9 -0
  55. package/data/docs/components/charts/getComponentPosition.json +9 -0
  56. package/data/docs/components/dashboard/ChartEmptyState.json +42 -0
  57. package/data/docs/components/dashboard/Dashboard.json +26 -0
  58. package/data/docs/components/dashboard/DataCard.json +300 -0
  59. package/data/docs/components/dashboard/DataCardBody.json +431 -0
  60. package/data/docs/components/dashboard/DataCardHeader.json +304 -0
  61. package/data/docs/components/dashboard/DataCardListbox.json +529 -0
  62. package/data/docs/components/dashboard/DataRow.json +539 -0
  63. package/data/docs/components/dashboard/DrilldownItem.json +342 -0
  64. package/data/docs/components/dashboard/FilterableBarChart.json +83 -0
  65. package/data/docs/components/dashboard/FilterableDataGrid.json +83 -0
  66. package/data/docs/components/dashboard/FilterablePieChart.json +83 -0
  67. package/data/docs/components/dashboard/FilterableScatterPlot.json +83 -0
  68. package/data/docs/components/dashboard/PdfDocument.json +58 -0
  69. package/data/docs/components/dashboard/PdfExportButton.json +458 -0
  70. package/data/docs/components/dashboard/TimeSeriesBarChart.json +172 -0
  71. package/data/docs/components/dashboard/WithFilters.json +83 -0
  72. package/data/docs/components/design-system/ActiveDescendantListbox.json +521 -0
  73. package/data/docs/components/design-system/Alert.json +349 -0
  74. package/data/docs/components/design-system/AppBar.json +64 -0
  75. package/data/docs/components/design-system/AppContainer.json +67 -0
  76. package/data/docs/components/design-system/AppContent.json +566 -0
  77. package/data/docs/components/design-system/AppSidePanel.json +87 -0
  78. package/data/docs/components/design-system/Badge.json +293 -0
  79. package/data/docs/components/design-system/BaseBreadcrumbs.json +298 -0
  80. package/data/docs/components/design-system/BaseGrid.json +543 -0
  81. package/data/docs/components/design-system/BaseSkeleton.json +338 -0
  82. package/data/docs/components/design-system/BreadcrumbItem.json +231 -0
  83. package/data/docs/components/design-system/Breadcrumbs.json +298 -0
  84. package/data/docs/components/design-system/Button.json +402 -0
  85. package/data/docs/components/design-system/ButtonGroup.json +415 -0
  86. package/data/docs/components/design-system/ButtonLink.json +568 -0
  87. package/data/docs/components/design-system/Card.json +328 -0
  88. package/data/docs/components/design-system/CardActions.json +431 -0
  89. package/data/docs/components/design-system/CardBody.json +431 -0
  90. package/data/docs/components/design-system/CardHeader.json +428 -0
  91. package/data/docs/components/design-system/Checkbox.json +426 -0
  92. package/data/docs/components/design-system/CheckboxGroup.json +382 -0
  93. package/data/docs/components/design-system/ConditionalWrapper.json +40 -0
  94. package/data/docs/components/design-system/DetailedCard.json +401 -0
  95. package/data/docs/components/design-system/DetailedCardCollapsibleSectionItems.json +29 -0
  96. package/data/docs/components/design-system/DetailedCardHeader.json +37 -0
  97. package/data/docs/components/design-system/DetailedCardSection.json +90 -0
  98. package/data/docs/components/design-system/DetailedCardSectionItem.json +109 -0
  99. package/data/docs/components/design-system/Flexbox.json +523 -0
  100. package/data/docs/components/design-system/FocusWithinGroup.json +9 -0
  101. package/data/docs/components/design-system/Grid.json +543 -0
  102. package/data/docs/components/design-system/GridItem.json +388 -0
  103. package/data/docs/components/design-system/Heading.json +390 -0
  104. package/data/docs/components/design-system/Icon.json +325 -0
  105. package/data/docs/components/design-system/IconButton.json +371 -0
  106. package/data/docs/components/design-system/IconButtonLink.json +588 -0
  107. package/data/docs/components/design-system/Item.json +554 -0
  108. package/data/docs/components/design-system/Link.json +552 -0
  109. package/data/docs/components/design-system/LinkButton.json +397 -0
  110. package/data/docs/components/design-system/Listbox.json +529 -0
  111. package/data/docs/components/design-system/Number.json +773 -0
  112. package/data/docs/components/design-system/NumberField.json +594 -0
  113. package/data/docs/components/design-system/Pill.json +378 -0
  114. package/data/docs/components/design-system/ProgressBar.json +121 -0
  115. package/data/docs/components/design-system/RadarSvgLinearGradient.json +9 -0
  116. package/data/docs/components/design-system/Radio.json +415 -0
  117. package/data/docs/components/design-system/RadioGroup.json +382 -0
  118. package/data/docs/components/design-system/RenderedListboxItem.json +18 -0
  119. package/data/docs/components/design-system/RovingTabindexListbox.json +521 -0
  120. package/data/docs/components/design-system/Shield.json +360 -0
  121. package/data/docs/components/design-system/SideNavigationMenu.json +144 -0
  122. package/data/docs/components/design-system/SideNavigationMenuBar.json +89 -0
  123. package/data/docs/components/design-system/SideNavigationMenuItem.json +319 -0
  124. package/data/docs/components/design-system/Skeleton.json +338 -0
  125. package/data/docs/components/design-system/SkeletonCircle.json +338 -0
  126. package/data/docs/components/design-system/SkeletonText.json +371 -0
  127. package/data/docs/components/design-system/Spinner.json +291 -0
  128. package/data/docs/components/design-system/Switch.json +415 -0
  129. package/data/docs/components/design-system/SwitchGroup.json +382 -0
  130. package/data/docs/components/design-system/Text.json +418 -0
  131. package/data/docs/components/design-system/TextArea.json +501 -0
  132. package/data/docs/components/design-system/TextField.json +539 -0
  133. package/data/docs/components/design-system/sizeToDimension.json +9 -0
  134. package/data/docs/components/pickers/BaseCombobox.json +320 -0
  135. package/data/docs/components/pickers/BaseComboboxContent.json +453 -0
  136. package/data/docs/components/pickers/BaseMenuButton.json +240 -0
  137. package/data/docs/components/pickers/BaseMenuButtonContent.json +442 -0
  138. package/data/docs/components/pickers/BaseSelect.json +258 -0
  139. package/data/docs/components/pickers/Combobox.json +320 -0
  140. package/data/docs/components/pickers/ComboboxContent.json +453 -0
  141. package/data/docs/components/pickers/ComboboxContentFooter.json +431 -0
  142. package/data/docs/components/pickers/ComboboxContentHeader.json +431 -0
  143. package/data/docs/components/pickers/ComboboxContentListbox.json +541 -0
  144. package/data/docs/components/pickers/ComboboxTrigger.json +336 -0
  145. package/data/docs/components/pickers/Item.json +554 -0
  146. package/data/docs/components/pickers/MenuButton.json +240 -0
  147. package/data/docs/components/pickers/MenuButtonContent.json +442 -0
  148. package/data/docs/components/pickers/MenuButtonContentFooter.json +431 -0
  149. package/data/docs/components/pickers/MenuButtonContentHeader.json +431 -0
  150. package/data/docs/components/pickers/MenuButtonContentMenu.json +523 -0
  151. package/data/docs/components/pickers/MenuButtonTrigger.json +287 -0
  152. package/data/docs/components/pickers/Select.json +258 -0
  153. package/data/docs/components/pickers/SelectContent.json +442 -0
  154. package/data/docs/components/pickers/SelectTrigger.json +298 -0
  155. package/data/docs/components/popovers/BaseDialog.json +114 -0
  156. package/data/docs/components/popovers/BaseDialogContent.json +21 -0
  157. package/data/docs/components/popovers/BasePopover.json +171 -0
  158. package/data/docs/components/popovers/BaseToggletip.json +184 -0
  159. package/data/docs/components/popovers/BaseTooltip.json +121 -0
  160. package/data/docs/components/popovers/Button.json +402 -0
  161. package/data/docs/components/popovers/ButtonLink.json +568 -0
  162. package/data/docs/components/popovers/Dialog.json +114 -0
  163. package/data/docs/components/popovers/DialogContent.json +21 -0
  164. package/data/docs/components/popovers/DialogContentActions.json +442 -0
  165. package/data/docs/components/popovers/DialogContentBody.json +442 -0
  166. package/data/docs/components/popovers/DialogContentHeader.json +76 -0
  167. package/data/docs/components/popovers/DialogTrigger.json +276 -0
  168. package/data/docs/components/popovers/IconButton.json +371 -0
  169. package/data/docs/components/popovers/IconButtonLink.json +588 -0
  170. package/data/docs/components/popovers/Link.json +552 -0
  171. package/data/docs/components/popovers/LinkButton.json +397 -0
  172. package/data/docs/components/popovers/Popover.json +171 -0
  173. package/data/docs/components/popovers/PopoverContent.json +442 -0
  174. package/data/docs/components/popovers/PopoverTrigger.json +276 -0
  175. package/data/docs/components/popovers/Toast.json +145 -0
  176. package/data/docs/components/popovers/ToastContainer.json +122 -0
  177. package/data/docs/components/popovers/Toggletip.json +184 -0
  178. package/data/docs/components/popovers/ToggletipContent.json +402 -0
  179. package/data/docs/components/popovers/ToggletipTrigger.json +276 -0
  180. package/data/docs/components/popovers/Tooltip.json +121 -0
  181. package/data/docs/components/popovers/TooltipContent.json +402 -0
  182. package/data/docs/components/popovers/TooltipTrigger.json +276 -0
  183. package/data/docs/components/products/Dialog.json +106 -0
  184. package/data/docs/components/products/MenuButton.json +232 -0
  185. package/data/docs/components/products/PulsedRadarImage.json +9 -0
  186. package/data/docs/components/products/RadarButton.json +402 -0
  187. package/data/docs/components/products/RadarItem.json +554 -0
  188. package/data/docs/components/table/ControlledPagination.json +9 -0
  189. package/data/docs/components/table/DataGrid.json +93 -0
  190. package/data/docs/components/table/GridToolbarFilterSemanticField.json +69 -0
  191. package/data/docs/components/table/ServerSideControlledPagination.json +9 -0
  192. package/data/docs/components/table/StatefulDataGrid.json +117 -0
  193. package/data/docs/components/table/TextCell.json +118 -0
  194. package/data/docs/components/table/Toolbar.json +145 -0
  195. package/data/docs/components/table/ToolbarWrapper.json +9 -0
  196. package/data/docs/components-index.json +1206 -0
  197. package/data/docs/components.json +55694 -0
  198. package/data/docs/llms-full.txt +8012 -0
  199. package/data/docs/llms.txt +234 -0
  200. package/data/docs/patterns-catalog.md +359 -0
  201. package/data/docs/patterns.json +712 -0
  202. package/data/metadata.json +4 -0
  203. package/data/patterns/crossfiltered-datagrid-page.mdx +386 -0
  204. package/data/patterns/datagrid-page.mdx +214 -0
  205. package/data/patterns/drilldown-datagrid-page.mdx +291 -0
  206. package/data/patterns/server-datagrid-page.mdx +301 -0
  207. package/data/tokens/properties/components/dark-components.json +1108 -0
  208. package/data/tokens/properties/components/light-components.json +1108 -0
  209. package/data/tokens/properties/core/border-radius.json +3 -0
  210. package/data/tokens/properties/core/color.json +280 -0
  211. package/data/tokens/properties/core/layout.json +14 -0
  212. package/data/tokens/properties/core/typography.json +199 -0
  213. package/data/tokens/redsift-design-tokens.css +1391 -0
  214. package/dist/data-store.d.ts +47 -0
  215. package/dist/data-store.d.ts.map +1 -0
  216. package/dist/data-store.js +152 -0
  217. package/dist/data-store.js.map +1 -0
  218. package/dist/index.d.ts +16 -0
  219. package/dist/index.d.ts.map +1 -0
  220. package/dist/index.js +50 -0
  221. package/dist/index.js.map +1 -0
  222. package/dist/init.d.ts +14 -0
  223. package/dist/init.d.ts.map +1 -0
  224. package/dist/init.js +137 -0
  225. package/dist/init.js.map +1 -0
  226. package/dist/paths.d.ts +30 -0
  227. package/dist/paths.d.ts.map +1 -0
  228. package/dist/paths.js +53 -0
  229. package/dist/paths.js.map +1 -0
  230. package/dist/pattern-store.d.ts +41 -0
  231. package/dist/pattern-store.d.ts.map +1 -0
  232. package/dist/pattern-store.js +177 -0
  233. package/dist/pattern-store.js.map +1 -0
  234. package/dist/prompts.d.ts +14 -0
  235. package/dist/prompts.d.ts.map +1 -0
  236. package/dist/prompts.js +762 -0
  237. package/dist/prompts.js.map +1 -0
  238. package/dist/resources.d.ts +14 -0
  239. package/dist/resources.d.ts.map +1 -0
  240. package/dist/resources.js +482 -0
  241. package/dist/resources.js.map +1 -0
  242. package/dist/scaffold.d.ts +31 -0
  243. package/dist/scaffold.d.ts.map +1 -0
  244. package/dist/scaffold.js +239 -0
  245. package/dist/scaffold.js.map +1 -0
  246. package/dist/token-store.d.ts +70 -0
  247. package/dist/token-store.d.ts.map +1 -0
  248. package/dist/token-store.js +196 -0
  249. package/dist/token-store.js.map +1 -0
  250. package/dist/tools.d.ts +15 -0
  251. package/dist/tools.d.ts.map +1 -0
  252. package/dist/tools.js +491 -0
  253. package/dist/tools.js.map +1 -0
  254. package/dist/types.d.ts +108 -0
  255. package/dist/types.d.ts.map +1 -0
  256. package/dist/types.js +17 -0
  257. package/dist/types.js.map +1 -0
  258. package/package.json +39 -0
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Data loader for the MCP server.
3
+ * Reads pre-extracted component documentation from the docs/ directory.
4
+ */
5
+ import type { ComponentsJson, ComponentIndexEntry, ComponentDoc } from './types.js';
6
+ /**
7
+ * DataStore loads and caches all component documentation at startup.
8
+ */
9
+ export declare class DataStore {
10
+ private componentsJson;
11
+ private componentIndex;
12
+ private componentsByName;
13
+ private componentsByPackage;
14
+ constructor();
15
+ /** Get the lightweight component index */
16
+ getIndex(): ComponentIndexEntry[];
17
+ /** Get full components.json metadata */
18
+ getComponentsJson(): ComponentsJson;
19
+ /** Get the llms.txt overview */
20
+ getLlmsTxt(): string;
21
+ /** Get the llms-full.txt complete documentation */
22
+ getLlmsFullTxt(): string;
23
+ /**
24
+ * Search components by name or description.
25
+ * Returns matches sorted by relevance.
26
+ */
27
+ searchComponents(query: string, packageFilter?: string): ComponentIndexEntry[];
28
+ /**
29
+ * Get full component documentation by name.
30
+ * Optionally filter by package for disambiguation.
31
+ */
32
+ getComponent(name: string, packageFilter?: string): ComponentDoc | undefined;
33
+ /**
34
+ * Get an individual component JSON file.
35
+ */
36
+ getComponentJson(packageName: string, componentName: string): ComponentDoc | null;
37
+ /** List all packages with their component counts */
38
+ listPackages(): Array<{
39
+ name: string;
40
+ fullName: string;
41
+ componentCount: number;
42
+ description: string;
43
+ }>;
44
+ /** Get all components for a package */
45
+ getPackageComponents(packageName: string): ComponentDoc[];
46
+ }
47
+ //# sourceMappingURL=data-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-store.d.ts","sourceRoot":"","sources":["../src/data-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgCpF;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,gBAAgB,CAA4B;IACpD,OAAO,CAAC,mBAAmB,CAA8B;;IAuBzD,0CAA0C;IAC1C,QAAQ,IAAI,mBAAmB,EAAE;IAIjC,wCAAwC;IACxC,iBAAiB,IAAI,cAAc;IAInC,gCAAgC;IAChC,UAAU,IAAI,MAAM;IAIpB,mDAAmD;IACnD,cAAc,IAAI,MAAM;IAIxB;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,mBAAmB,EAAE;IA8C9E;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAS5E;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAajF,oDAAoD;IACpD,YAAY,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAStG,uCAAuC;IACvC,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE;CAI1D"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Data loader for the MCP server.
3
+ * Reads pre-extracted component documentation from the docs/ directory.
4
+ */
5
+ import { readFileSync, existsSync } from 'node:fs';
6
+ import { resolve } from 'node:path';
7
+ import { resolveDataPaths } from './paths.js';
8
+ const { docsDir: DOCS_DIR } = resolveDataPaths();
9
+ /**
10
+ * Read and parse a JSON file from the docs directory.
11
+ */
12
+ function readJsonFile(relativePath) {
13
+ const fullPath = resolve(DOCS_DIR, relativePath);
14
+ if (!existsSync(fullPath)) {
15
+ throw new Error(`Documentation file not found: ${fullPath}. Run 'yarn extract:docs' first.`);
16
+ }
17
+ const content = readFileSync(fullPath, 'utf-8');
18
+ return JSON.parse(content);
19
+ }
20
+ /**
21
+ * Read a text file from the docs directory.
22
+ */
23
+ function readTextFile(relativePath) {
24
+ const fullPath = resolve(DOCS_DIR, relativePath);
25
+ if (!existsSync(fullPath)) {
26
+ throw new Error(`Documentation file not found: ${fullPath}. Run 'yarn extract:docs' first.`);
27
+ }
28
+ return readFileSync(fullPath, 'utf-8');
29
+ }
30
+ /**
31
+ * DataStore loads and caches all component documentation at startup.
32
+ */
33
+ export class DataStore {
34
+ componentsJson;
35
+ componentIndex;
36
+ componentsByName;
37
+ componentsByPackage;
38
+ constructor() {
39
+ this.componentsJson = readJsonFile('components.json');
40
+ this.componentIndex = readJsonFile('components-index.json');
41
+ // Build lookup maps
42
+ this.componentsByName = new Map();
43
+ this.componentsByPackage = new Map();
44
+ for (const pkg of this.componentsJson.packages) {
45
+ const pkgShortName = pkg.name.replace('@redsift/', '');
46
+ this.componentsByPackage.set(pkgShortName, pkg.components);
47
+ for (const comp of pkg.components) {
48
+ // Store by name (last wins if duplicate names across packages)
49
+ this.componentsByName.set(comp.name, comp);
50
+ // Also store by "package/name" for disambiguation
51
+ this.componentsByName.set(`${pkgShortName}/${comp.name}`, comp);
52
+ }
53
+ }
54
+ }
55
+ /** Get the lightweight component index */
56
+ getIndex() {
57
+ return this.componentIndex;
58
+ }
59
+ /** Get full components.json metadata */
60
+ getComponentsJson() {
61
+ return this.componentsJson;
62
+ }
63
+ /** Get the llms.txt overview */
64
+ getLlmsTxt() {
65
+ return readTextFile('llms.txt');
66
+ }
67
+ /** Get the llms-full.txt complete documentation */
68
+ getLlmsFullTxt() {
69
+ return readTextFile('llms-full.txt');
70
+ }
71
+ /**
72
+ * Search components by name or description.
73
+ * Returns matches sorted by relevance.
74
+ */
75
+ searchComponents(query, packageFilter) {
76
+ const lowerQuery = query.toLowerCase();
77
+ const terms = lowerQuery.split(/\s+/).filter(Boolean);
78
+ let results = this.componentIndex;
79
+ // Filter by package if specified
80
+ if (packageFilter) {
81
+ const pkgName = packageFilter.startsWith('@redsift/') ? packageFilter : `@redsift/${packageFilter}`;
82
+ results = results.filter((c) => c.package === pkgName);
83
+ }
84
+ // Score each component
85
+ const scored = results
86
+ .map((entry) => {
87
+ const nameLower = entry.name.toLowerCase();
88
+ const descLower = (entry.description || '').toLowerCase();
89
+ let score = 0;
90
+ for (const term of terms) {
91
+ // Exact name match
92
+ if (nameLower === term) {
93
+ score += 100;
94
+ }
95
+ // Name starts with term
96
+ else if (nameLower.startsWith(term)) {
97
+ score += 50;
98
+ }
99
+ // Name contains term
100
+ else if (nameLower.includes(term)) {
101
+ score += 30;
102
+ }
103
+ // Description contains term
104
+ if (descLower.includes(term)) {
105
+ score += 10;
106
+ }
107
+ }
108
+ return { entry, score };
109
+ })
110
+ .filter((s) => s.score > 0)
111
+ .sort((a, b) => b.score - a.score);
112
+ return scored.map((s) => s.entry);
113
+ }
114
+ /**
115
+ * Get full component documentation by name.
116
+ * Optionally filter by package for disambiguation.
117
+ */
118
+ getComponent(name, packageFilter) {
119
+ if (packageFilter) {
120
+ const pkgName = packageFilter.startsWith('@redsift/') ? packageFilter.replace('@redsift/', '') : packageFilter;
121
+ return this.componentsByName.get(`${pkgName}/${name}`);
122
+ }
123
+ return this.componentsByName.get(name);
124
+ }
125
+ /**
126
+ * Get an individual component JSON file.
127
+ */
128
+ getComponentJson(packageName, componentName) {
129
+ const pkgShort = packageName.startsWith('@redsift/') ? packageName.replace('@redsift/', '') : packageName;
130
+ const filePath = resolve(DOCS_DIR, 'components', pkgShort, `${componentName}.json`);
131
+ if (!existsSync(filePath)) {
132
+ return null;
133
+ }
134
+ const content = readFileSync(filePath, 'utf-8');
135
+ return JSON.parse(content);
136
+ }
137
+ /** List all packages with their component counts */
138
+ listPackages() {
139
+ return Object.entries(this.componentsJson.summary.componentsByPackage).map(([name, count]) => ({
140
+ name,
141
+ fullName: `@redsift/${name}`,
142
+ componentCount: count,
143
+ description: this.componentsJson.packages.find((p) => p.name === `@redsift/${name}`) ? `${count} components` : '',
144
+ }));
145
+ }
146
+ /** Get all components for a package */
147
+ getPackageComponents(packageName) {
148
+ const pkgShort = packageName.startsWith('@redsift/') ? packageName.replace('@redsift/', '') : packageName;
149
+ return this.componentsByPackage.get(pkgShort) || [];
150
+ }
151
+ }
152
+ //# sourceMappingURL=data-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-store.js","sourceRoot":"","sources":["../src/data-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Red Sift Design System — MCP Server
4
+ *
5
+ * A Model Context Protocol server that exposes design system component
6
+ * documentation, search, and code generation tools to AI assistants.
7
+ *
8
+ * Usage:
9
+ * npx @redsift/ds-mcp-server — Run MCP server (stdio transport)
10
+ * npx @redsift/ds-mcp-server init <tool> — Set up instruction files in your project
11
+ * yarn mcp:dev — Run with tsx (development)
12
+ *
13
+ * Transport: stdio (for VS Code, Claude Desktop, etc.)
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG"}
package/dist/index.js ADDED
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Red Sift Design System — MCP Server
4
+ *
5
+ * A Model Context Protocol server that exposes design system component
6
+ * documentation, search, and code generation tools to AI assistants.
7
+ *
8
+ * Usage:
9
+ * npx @redsift/ds-mcp-server — Run MCP server (stdio transport)
10
+ * npx @redsift/ds-mcp-server init <tool> — Set up instruction files in your project
11
+ * yarn mcp:dev — Run with tsx (development)
12
+ *
13
+ * Transport: stdio (for VS Code, Claude Desktop, etc.)
14
+ */
15
+ // Route to init subcommand if requested
16
+ if (process.argv[2] === 'init') {
17
+ await import('./init.js');
18
+ }
19
+ else {
20
+ const { McpServer } = await import('@modelcontextprotocol/sdk/server/mcp.js');
21
+ const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
22
+ const { DataStore } = await import('./data-store.js');
23
+ const { TokenStore } = await import('./token-store.js');
24
+ const { PatternStore } = await import('./pattern-store.js');
25
+ const { registerTools } = await import('./tools.js');
26
+ const { registerResources } = await import('./resources.js');
27
+ const { registerPrompts } = await import('./prompts.js');
28
+ const SERVER_NAME = 'redsift-design-system';
29
+ const SERVER_VERSION = '1.0.0';
30
+ // Initialize data stores
31
+ const store = new DataStore();
32
+ const tokenStore = new TokenStore();
33
+ const patternStore = new PatternStore();
34
+ // Create MCP server
35
+ const server = new McpServer({
36
+ name: SERVER_NAME,
37
+ version: SERVER_VERSION,
38
+ });
39
+ // Register tools, resources, and prompts
40
+ registerTools(server, store, tokenStore, patternStore);
41
+ registerResources(server, store, patternStore);
42
+ registerPrompts(server, store, patternStore);
43
+ // Connect via stdio transport
44
+ const transport = new StdioServerTransport();
45
+ await server.connect(transport);
46
+ // Log to stderr (stdout is reserved for MCP protocol)
47
+ console.error(`${SERVER_NAME} v${SERVER_VERSION} started`);
48
+ }
49
+ export {};
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG;AAEH,wCAAwC;AACxC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;IAC/B,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;AAC5B,CAAC;KAAM,CAAC;IACN,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;IAC9E,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC;IAC3F,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACtD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACxD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC5D,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;IACrD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;IAEzD,MAAM,WAAW,GAAG,uBAAuB,CAAC;IAC5C,MAAM,cAAc,GAAG,OAAO,CAAC;IAE/B,yBAAyB;IACzB,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;IACpC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;IAExC,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,yCAAyC;IACzC,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;IACvD,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC/C,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAE7C,8BAA8B;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,sDAAsD;IACtD,OAAO,CAAC,KAAK,CAAC,GAAG,WAAW,KAAK,cAAc,UAAU,CAAC,CAAC;AAC7D,CAAC"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `ds-mcp init` — copies the appropriate instruction file into the consumer project.
4
+ *
5
+ * Detects the AI tool in use and copies the matching instruction file:
6
+ * - VS Code Copilot → .github/instructions/redsift-design-system.instructions.md
7
+ * - Claude Code → CLAUDE.md
8
+ * - Cursor → .cursorrules
9
+ * - Windsurf → .windsurfrules
10
+ *
11
+ * Also generates the .vscode/mcp.json config if it doesn't exist.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
package/dist/init.js ADDED
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * `ds-mcp init` — copies the appropriate instruction file into the consumer project.
4
+ *
5
+ * Detects the AI tool in use and copies the matching instruction file:
6
+ * - VS Code Copilot → .github/instructions/redsift-design-system.instructions.md
7
+ * - Claude Code → CLAUDE.md
8
+ * - Cursor → .cursorrules
9
+ * - Windsurf → .windsurfrules
10
+ *
11
+ * Also generates the .vscode/mcp.json config if it doesn't exist.
12
+ */
13
+ import { existsSync, mkdirSync, cpSync, writeFileSync, readFileSync } from 'node:fs';
14
+ import { resolve, dirname } from 'node:path';
15
+ import { fileURLToPath } from 'node:url';
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = dirname(__filename);
18
+ /** consumer-instructions/ is a sibling of dist/ (or src/ in dev) */
19
+ const INSTRUCTIONS_DIR = resolve(__dirname, '..', 'consumer-instructions');
20
+ const TARGETS = {
21
+ copilot: {
22
+ sourceFile: 'redsift-design-system.instructions.md',
23
+ destPath: '.github/instructions/redsift-design-system.instructions.md',
24
+ description: 'VS Code Copilot instruction file',
25
+ },
26
+ claude: {
27
+ sourceFile: 'CLAUDE.md',
28
+ destPath: 'CLAUDE.md',
29
+ description: 'Claude Code instruction file',
30
+ },
31
+ cursor: {
32
+ sourceFile: '.cursorrules',
33
+ destPath: '.cursorrules',
34
+ description: 'Cursor rules file',
35
+ },
36
+ windsurf: {
37
+ sourceFile: '.windsurfrules',
38
+ destPath: '.windsurfrules',
39
+ description: 'Windsurf rules file',
40
+ },
41
+ };
42
+ const MCP_CONFIG = {
43
+ servers: {
44
+ 'design-system': {
45
+ type: 'stdio',
46
+ command: 'npx',
47
+ args: ['@redsift/ds-mcp-server'],
48
+ },
49
+ },
50
+ };
51
+ function main() {
52
+ const cwd = process.cwd();
53
+ const tool = process.argv[3]; // ds-mcp init <tool>
54
+ if (!tool || tool === '--help' || tool === '-h') {
55
+ printUsage();
56
+ process.exit(tool ? 0 : 1);
57
+ }
58
+ if (tool === 'all') {
59
+ // Install all instruction files
60
+ for (const [key, target] of Object.entries(TARGETS)) {
61
+ installFile(cwd, key, target);
62
+ }
63
+ installMcpConfig(cwd);
64
+ return;
65
+ }
66
+ const target = TARGETS[tool];
67
+ if (!target) {
68
+ console.error(`Unknown tool: "${tool}". Valid options: ${Object.keys(TARGETS).join(', ')}, all`);
69
+ process.exit(1);
70
+ }
71
+ installFile(cwd, tool, target);
72
+ installMcpConfig(cwd);
73
+ }
74
+ function installFile(cwd, tool, target) {
75
+ const src = resolve(INSTRUCTIONS_DIR, target.sourceFile);
76
+ const dest = resolve(cwd, target.destPath);
77
+ if (!existsSync(src)) {
78
+ console.error(`Source file not found: ${src}`);
79
+ console.error('The consumer-instructions may not be included in this package. Try reinstalling.');
80
+ process.exit(1);
81
+ }
82
+ if (existsSync(dest)) {
83
+ console.log(` ⚠ Skipped ${target.destPath} — already exists`);
84
+ return;
85
+ }
86
+ mkdirSync(dirname(dest), { recursive: true });
87
+ cpSync(src, dest);
88
+ console.log(` ✓ Created ${target.destPath} (${target.description})`);
89
+ }
90
+ function installMcpConfig(cwd) {
91
+ const mcpPath = resolve(cwd, '.vscode', 'mcp.json');
92
+ if (existsSync(mcpPath)) {
93
+ // Check if design-system server is already configured
94
+ try {
95
+ const existing = JSON.parse(readFileSync(mcpPath, 'utf-8'));
96
+ if (existing.servers?.['design-system']) {
97
+ console.log(' ⚠ Skipped .vscode/mcp.json — design-system server already configured');
98
+ return;
99
+ }
100
+ // Merge into existing config
101
+ existing.servers = { ...existing.servers, ...MCP_CONFIG.servers };
102
+ writeFileSync(mcpPath, JSON.stringify(existing, null, 2) + '\n');
103
+ console.log(' ✓ Added design-system server to existing .vscode/mcp.json');
104
+ return;
105
+ }
106
+ catch {
107
+ console.log(' ⚠ Skipped .vscode/mcp.json — file exists but could not be parsed');
108
+ return;
109
+ }
110
+ }
111
+ mkdirSync(dirname(mcpPath), { recursive: true });
112
+ writeFileSync(mcpPath, JSON.stringify(MCP_CONFIG, null, 2) + '\n');
113
+ console.log(' ✓ Created .vscode/mcp.json');
114
+ }
115
+ function printUsage() {
116
+ console.log(`
117
+ @redsift/ds-mcp-server init — Set up AI instruction files for your project
118
+
119
+ Usage:
120
+ npx @redsift/ds-mcp-server init <tool>
121
+
122
+ Tools:
123
+ copilot VS Code Copilot → .github/instructions/redsift-design-system.instructions.md
124
+ claude Claude Code → CLAUDE.md
125
+ cursor Cursor → .cursorrules
126
+ windsurf Windsurf → .windsurfrules
127
+ all Install all instruction files
128
+
129
+ This also creates .vscode/mcp.json if it doesn't exist.
130
+
131
+ Example:
132
+ npx @redsift/ds-mcp-server init copilot
133
+ npx @redsift/ds-mcp-server init all
134
+ `);
135
+ }
136
+ main();
137
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Path resolution for the MCP server.
3
+ *
4
+ * Resolves data directories with a two-tier strategy:
5
+ * 1. Bundled data: apps/mcp-server/data/ (for npm distribution)
6
+ * 2. Monorepo root: ../../.. from src/ (for local development)
7
+ *
8
+ * The bundled data directory is checked first. If it doesn't exist,
9
+ * the monorepo root is used as a fallback. This ensures backward
10
+ * compatibility for developers running from a local clone.
11
+ */
12
+ export interface ResolvedPaths {
13
+ /** Directory containing docs JSON/text files */
14
+ docsDir: string;
15
+ /** Directory containing style-dictionary JSON token sources */
16
+ styleDictDir: string;
17
+ /** Path to the generated CSS tokens file */
18
+ cssTokensPath: string;
19
+ /** Directory containing demo TSX files */
20
+ demoDir: string;
21
+ /** Directory containing pattern MDX pages */
22
+ patternsDir: string;
23
+ /** Whether running from bundled data (npm) or monorepo */
24
+ isBundled: boolean;
25
+ }
26
+ /**
27
+ * Resolve all data paths. Prefers bundled data, falls back to monorepo.
28
+ */
29
+ export declare function resolveDataPaths(): ResolvedPaths;
30
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAwBH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAqBhD"}
package/dist/paths.js ADDED
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Path resolution for the MCP server.
3
+ *
4
+ * Resolves data directories with a two-tier strategy:
5
+ * 1. Bundled data: apps/mcp-server/data/ (for npm distribution)
6
+ * 2. Monorepo root: ../../.. from src/ (for local development)
7
+ *
8
+ * The bundled data directory is checked first. If it doesn't exist,
9
+ * the monorepo root is used as a fallback. This ensures backward
10
+ * compatibility for developers running from a local clone.
11
+ */
12
+ import { existsSync } from 'node:fs';
13
+ import { resolve, dirname } from 'node:path';
14
+ import { fileURLToPath } from 'node:url';
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = dirname(__filename);
17
+ /**
18
+ * Resolve where bundled data lives.
19
+ *
20
+ * When compiled (dist/), data/ is a sibling of dist/.
21
+ * When running from source (src/), data/ is a sibling of src/.
22
+ * Either way, it's one level up from __dirname.
23
+ */
24
+ const BUNDLED_DATA_DIR = resolve(__dirname, '..', 'data');
25
+ /** Root of the monorepo — three levels up from apps/mcp-server/src/ (or dist/) */
26
+ const MONOREPO_ROOT = resolve(__dirname, '..', '..', '..');
27
+ /** Whether bundled data is available */
28
+ const HAS_BUNDLED_DATA = existsSync(BUNDLED_DATA_DIR) && existsSync(resolve(BUNDLED_DATA_DIR, 'docs'));
29
+ /**
30
+ * Resolve all data paths. Prefers bundled data, falls back to monorepo.
31
+ */
32
+ export function resolveDataPaths() {
33
+ if (HAS_BUNDLED_DATA) {
34
+ return {
35
+ docsDir: resolve(BUNDLED_DATA_DIR, 'docs'),
36
+ styleDictDir: resolve(BUNDLED_DATA_DIR, 'tokens', 'properties'),
37
+ cssTokensPath: resolve(BUNDLED_DATA_DIR, 'tokens', 'redsift-design-tokens.css'),
38
+ demoDir: resolve(BUNDLED_DATA_DIR, 'demos'),
39
+ patternsDir: resolve(BUNDLED_DATA_DIR, 'patterns'),
40
+ isBundled: true,
41
+ };
42
+ }
43
+ // Fallback: monorepo root
44
+ return {
45
+ docsDir: resolve(MONOREPO_ROOT, 'docs'),
46
+ styleDictDir: resolve(MONOREPO_ROOT, 'packages', 'design-system', 'style-dictionary', 'properties'),
47
+ cssTokensPath: resolve(MONOREPO_ROOT, 'packages', 'design-system', 'style', 'redsift-design-tokens.css'),
48
+ demoDir: resolve(MONOREPO_ROOT, 'apps', 'website', 'demo'),
49
+ patternsDir: resolve(MONOREPO_ROOT, 'apps', 'website', 'pages', 'patterns'),
50
+ isBundled: false,
51
+ };
52
+ }
53
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAE1D,kFAAkF;AAClF,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE3D,wCAAwC;AACxC,MAAM,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;AAiBvG;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO;YACL,OAAO,EAAE,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC;YAC1C,YAAY,EAAE,OAAO,CAAC,gBAAgB,EAAE,QAAQ,EAAE,YAAY,CAAC;YAC/D,aAAa,EAAE,OAAO,CAAC,gBAAgB,EAAE,QAAQ,EAAE,2BAA2B,CAAC;YAC/E,OAAO,EAAE,OAAO,CAAC,gBAAgB,EAAE,OAAO,CAAC;YAC3C,WAAW,EAAE,OAAO,CAAC,gBAAgB,EAAE,UAAU,CAAC;YAClD,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;IAED,0BAA0B;IAC1B,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC;QACvC,YAAY,EAAE,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,CAAC;QACnG,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,2BAA2B,CAAC;QACxG,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;QAC1D,WAAW,EAAE,OAAO,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC;QAC3E,SAAS,EAAE,KAAK;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Pattern data loader for the MCP server.
3
+ * Reads composition patterns from docs/patterns.json and loads demo source files.
4
+ */
5
+ import type { Pattern, PatternWithDemo } from './types.js';
6
+ /**
7
+ * PatternStore loads and caches all composition patterns at startup,
8
+ * including demo source code, variant demos, and MDX spec content.
9
+ */
10
+ export declare class PatternStore {
11
+ private patterns;
12
+ private demoSources;
13
+ private variantSources;
14
+ private mdxSources;
15
+ private catalog;
16
+ constructor();
17
+ /** Get all patterns */
18
+ getAll(): Pattern[];
19
+ /** Get a pattern by slug, optionally with demo source */
20
+ getBySlug(slug: string): Pattern | undefined;
21
+ /** Get a pattern with its demo source code, variant sources, and MDX spec */
22
+ getBySlugWithDemo(slug: string): PatternWithDemo | undefined;
23
+ /** Get the demo source code for a pattern */
24
+ getDemoSource(slug: string): string | undefined;
25
+ /** Get the variant demo sources for a pattern */
26
+ getVariantSources(slug: string): Record<string, string> | undefined;
27
+ /** Get the cleaned MDX spec content for a pattern */
28
+ getMdxSource(slug: string): string | undefined;
29
+ /** Get the patterns catalog markdown */
30
+ getCatalog(): string;
31
+ /**
32
+ * Search patterns by name, description, components, tags, or whenToUse.
33
+ * Returns matches sorted by relevance.
34
+ */
35
+ searchPatterns(query: string, limit?: number): Pattern[];
36
+ /**
37
+ * Strip JSX imports and component tags from MDX, keeping markdown prose.
38
+ */
39
+ private cleanMdx;
40
+ }
41
+ //# sourceMappingURL=pattern-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pattern-store.d.ts","sourceRoot":"","sources":["../src/pattern-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAO3D;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,cAAc,CAAkD;IACxE,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,OAAO,CAAc;;IAmD7B,uBAAuB;IACvB,MAAM,IAAI,OAAO,EAAE;IAInB,yDAAyD;IACzD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAI5C,6EAA6E;IAC7E,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAY5D,6CAA6C;IAC7C,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI/C,iDAAiD;IACjD,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;IAInE,qDAAqD;IACrD,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C,wCAAwC;IACxC,UAAU,IAAI,MAAM;IAIpB;;;OAGG;IACH,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,EAAE;IAuDxD;;OAEG;IACH,OAAO,CAAC,QAAQ;CAkBjB"}