@conciso/design-system-mcp 0.0.0-bootstrap.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/bin/cds-mcp.mjs +9 -0
  4. package/package.json +48 -0
  5. package/snapshot/manifests/components.json +617 -0
  6. package/snapshot/manifests/docs.json +293 -0
  7. package/snapshot/services/addon-docs/mdx/beispielseiten-/303/274bersicht--/303/274bersicht.json +18 -0
  8. package/snapshot/services/addon-docs/mdx/grundlagen-barrierefreiheit--/303/274bersicht.json +18 -0
  9. package/snapshot/services/addon-docs/mdx/grundlagen-design-tokens--/303/274bersicht.json +18 -0
  10. package/snapshot/services/addon-docs/mdx/grundlagen-einrichtung--/303/274bersicht.json +18 -0
  11. package/snapshot/services/addon-docs/mdx/grundlagen-elevation--/303/274bersicht.json +18 -0
  12. package/snapshot/services/addon-docs/mdx/grundlagen-icons--/303/274bersicht.json +18 -0
  13. package/snapshot/services/addon-docs/mdx/grundlagen-responsive--/303/274bersicht.json +18 -0
  14. package/snapshot/services/addon-docs/mdx/grundlagen-spacing-grid--/303/274bersicht.json +18 -0
  15. package/snapshot/services/addon-docs/mdx/komponenten-buchungsformular--/303/274bersicht.json +18 -0
  16. package/snapshot/services/addon-docs/mdx/komponenten-buttons--verwendung.json +18 -0
  17. package/snapshot/services/addon-docs/mdx/komponenten-call-to-action--verwendung.json +18 -0
  18. package/snapshot/services/addon-docs/mdx/komponenten-cards-teaser--verwendung.json +18 -0
  19. package/snapshot/services/addon-docs/mdx/komponenten-chips-badges-pills--verwendung.json +18 -0
  20. package/snapshot/services/addon-docs/mdx/komponenten-code-block--verwendung.json +18 -0
  21. package/snapshot/services/addon-docs/mdx/komponenten-dropdowns--verwendung.json +18 -0
  22. package/snapshot/services/addon-docs/mdx/komponenten-feedback--verwendung.json +18 -0
  23. package/snapshot/services/addon-docs/mdx/komponenten-footer--verwendung.json +18 -0
  24. package/snapshot/services/addon-docs/mdx/komponenten-hero--/303/274bersicht.json +18 -0
  25. package/snapshot/services/addon-docs/mdx/komponenten-inputs-forms--verwendung.json +18 -0
  26. package/snapshot/services/addon-docs/mdx/komponenten-navigation--verwendung.json +18 -0
  27. package/snapshot/services/addon-docs/mdx/komponenten-sektion--/303/274bersicht.json +18 -0
  28. package/snapshot/services/addon-docs/mdx/komponenten-slider-carousel--verwendung.json +18 -0
  29. package/snapshot/services/addon-docs/mdx/komponenten-tabelle--/303/274bersicht.json +18 -0
  30. package/snapshot/services/addon-docs/mdx/komponenten-theme-umschalter--verwendung.json +18 -0
  31. package/snapshot/services/addon-docs/mdx/komponenten-zitate-testimonials--verwendung.json +18 -0
  32. package/snapshot/services/addon-docs/mdx/marke-bildsprache--/303/274bersicht.json +18 -0
  33. package/snapshot/services/addon-docs/mdx/marke-brand-areas--/303/274bersicht.json +18 -0
  34. package/snapshot/services/addon-docs/mdx/marke-logo--verwendung.json +18 -0
  35. package/snapshot/services/addon-docs/mdx/marke-markenrad--/303/274bersicht.json +18 -0
  36. package/snapshot/services/addon-docs/mdx/referenzen-quellen--/303/274bersicht.json +18 -0
  37. package/snapshot/services/addon-docs/mdx/seitenmuster-angebots-detailseite--/303/274bersicht.json +18 -0
  38. package/snapshot/services/addon-docs/mdx/seitenmuster-beitrags/303/274bersicht--/303/274bersicht.json +18 -0
  39. package/snapshot/services/addon-docs/mdx/seitenmuster-seminar-/302/267-training--/303/274bersicht.json +18 -0
  40. package/snapshot/services/addon-docs/mdx/seitenmuster-veranstaltung--/303/274bersicht.json +18 -0
  41. package/snapshot/services/addon-docs/mdx/seitenmuster-veranstaltungs/303/274bersicht--/303/274bersicht.json +18 -0
  42. package/snapshot/services/addon-docs/mdx/seitenmuster-wissensbeitrag--/303/274bersicht.json +18 -0
  43. package/snapshot/services/core/docgen/grundlagen-farben.json +3 -0
  44. package/snapshot/services/core/docgen/grundlagen-typografie.json +3 -0
  45. package/snapshot/services/core/docgen/komponenten-buttons-button.json +183 -0
  46. package/snapshot/services/core/docgen/komponenten-call-to-action-cta-band.json +131 -0
  47. package/snapshot/services/core/docgen/komponenten-call-to-action-downloadcta.json +182 -0
  48. package/snapshot/services/core/docgen/komponenten-cards-teaser-card.json +146 -0
  49. package/snapshot/services/core/docgen/komponenten-cards-teaser-feature-liste.json +128 -0
  50. package/snapshot/services/core/docgen/komponenten-cards-teaser-featured-karte.json +158 -0
  51. package/snapshot/services/core/docgen/komponenten-cards-teaser-icon-karte.json +111 -0
  52. package/snapshot/services/core/docgen/komponenten-cards-teaser-klickbare-karte.json +161 -0
  53. package/snapshot/services/core/docgen/komponenten-cards-teaser-statcard.json +115 -0
  54. package/snapshot/services/core/docgen/komponenten-cards-teaser-statstrip.json +58 -0
  55. package/snapshot/services/core/docgen/komponenten-cards-teaser-tier-trenner.json +56 -0
  56. package/snapshot/services/core/docgen/komponenten-chips-badges-pills-bereichs-badge.json +63 -0
  57. package/snapshot/services/core/docgen/komponenten-chips-badges-pills-chip.json +95 -0
  58. package/snapshot/services/core/docgen/komponenten-chips-badges-pills-pill.json +78 -0
  59. package/snapshot/services/core/docgen/komponenten-chips-badges-pills-status-badge.json +63 -0
  60. package/snapshot/services/core/docgen/komponenten-code-block-code-block.json +91 -0
  61. package/snapshot/services/core/docgen/komponenten-dropdowns-combobox.json +224 -0
  62. package/snapshot/services/core/docgen/komponenten-dropdowns-custom-select.json +173 -0
  63. package/snapshot/services/core/docgen/komponenten-feedback-snackbar.json +97 -0
  64. package/snapshot/services/core/docgen/komponenten-footer-komplett.json +21 -0
  65. package/snapshot/services/core/docgen/komponenten-footer-oberer-teil.json +39 -0
  66. package/snapshot/services/core/docgen/komponenten-footer-unterer-teil.json +105 -0
  67. package/snapshot/services/core/docgen/komponenten-hero-hero-bild.json +162 -0
  68. package/snapshot/services/core/docgen/komponenten-hero-st/303/266rer.json +41 -0
  69. package/snapshot/services/core/docgen/komponenten-inputs-forms-auswahlfeld.json +192 -0
  70. package/snapshot/services/core/docgen/komponenten-inputs-forms-checkbox.json +182 -0
  71. package/snapshot/services/core/docgen/komponenten-inputs-forms-radio.json +181 -0
  72. package/snapshot/services/core/docgen/komponenten-inputs-forms-skala.json +179 -0
  73. package/snapshot/services/core/docgen/komponenten-inputs-forms-slider.json +259 -0
  74. package/snapshot/services/core/docgen/komponenten-inputs-forms-textbereich.json +190 -0
  75. package/snapshot/services/core/docgen/komponenten-inputs-forms-textfeld.json +207 -0
  76. package/snapshot/services/core/docgen/komponenten-navigation-topnav.json +186 -0
  77. package/snapshot/services/core/docgen/komponenten-sektion-sektion.json +113 -0
  78. package/snapshot/services/core/docgen/komponenten-slider-carousel-carousel.json +92 -0
  79. package/snapshot/services/core/docgen/komponenten-slider-carousel-logocarousel.json +92 -0
  80. package/snapshot/services/core/docgen/komponenten-tabelle-tabelle.json +74 -0
  81. package/snapshot/services/core/docgen/komponenten-tabelle-vergleichstabelle.json +142 -0
  82. package/snapshot/services/core/docgen/komponenten-theme-umschalter-cycle-button.json +41 -0
  83. package/snapshot/services/core/docgen/komponenten-theme-umschalter-dropdown.json +41 -0
  84. package/snapshot/services/core/docgen/komponenten-theme-umschalter-segment.json +41 -0
  85. package/snapshot/services/core/docgen/komponenten-zitate-testimonials-blockquote.json +96 -0
  86. package/snapshot/services/core/docgen/komponenten-zitate-testimonials-teamvoice.json +130 -0
  87. package/snapshot/services/core/docgen/komponenten-zitate-testimonials-testimonial.json +96 -0
  88. package/snapshot/services/core/docgen/marke-brand-areas-areatabs.json +75 -0
  89. package/snapshot/services/core/docgen/marke-logo-logo.json +71 -0
  90. package/snapshot/services/core/docgen/seitenmuster-seminar-/302/267-training-fakten-liste.json +79 -0
  91. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-article-header.json +196 -0
  92. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-author-card.json +91 -0
  93. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-avatar.json +100 -0
  94. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-callout.json +64 -0
  95. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-faq.json +41 -0
  96. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-figure.json +73 -0
  97. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-inhaltsverzeichnis.json +75 -0
  98. package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-pull-quote.json +63 -0
  99. package/snapshot/services/core/story-docs/grundlagen-farben.json +19 -0
  100. package/snapshot/services/core/story-docs/grundlagen-typografie.json +25 -0
  101. package/snapshot/services/core/story-docs/komponenten-buttons-button.json +48 -0
  102. package/snapshot/services/core/story-docs/komponenten-call-to-action-cta-band.json +27 -0
  103. package/snapshot/services/core/story-docs/komponenten-call-to-action-downloadcta.json +17 -0
  104. package/snapshot/services/core/story-docs/komponenten-cards-teaser-card.json +37 -0
  105. package/snapshot/services/core/story-docs/komponenten-cards-teaser-feature-liste.json +37 -0
  106. package/snapshot/services/core/story-docs/komponenten-cards-teaser-featured-karte.json +36 -0
  107. package/snapshot/services/core/story-docs/komponenten-cards-teaser-icon-karte.json +41 -0
  108. package/snapshot/services/core/story-docs/komponenten-cards-teaser-klickbare-karte.json +26 -0
  109. package/snapshot/services/core/story-docs/komponenten-cards-teaser-statcard.json +21 -0
  110. package/snapshot/services/core/story-docs/komponenten-cards-teaser-statstrip.json +21 -0
  111. package/snapshot/services/core/story-docs/komponenten-cards-teaser-tier-trenner.json +22 -0
  112. package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-bereichs-badge.json +21 -0
  113. package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-chip.json +27 -0
  114. package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-pill.json +21 -0
  115. package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-status-badge.json +21 -0
  116. package/snapshot/services/core/story-docs/komponenten-code-block-code-block.json +26 -0
  117. package/snapshot/services/core/story-docs/komponenten-dropdowns-combobox.json +37 -0
  118. package/snapshot/services/core/story-docs/komponenten-dropdowns-custom-select.json +37 -0
  119. package/snapshot/services/core/story-docs/komponenten-feedback-snackbar.json +27 -0
  120. package/snapshot/services/core/story-docs/komponenten-footer-komplett.json +22 -0
  121. package/snapshot/services/core/story-docs/komponenten-footer-oberer-teil.json +21 -0
  122. package/snapshot/services/core/story-docs/komponenten-footer-unterer-teil.json +32 -0
  123. package/snapshot/services/core/story-docs/komponenten-hero-hero-bild.json +37 -0
  124. package/snapshot/services/core/story-docs/komponenten-hero-st/303/266rer.json +26 -0
  125. package/snapshot/services/core/story-docs/komponenten-inputs-forms-auswahlfeld.json +32 -0
  126. package/snapshot/services/core/story-docs/komponenten-inputs-forms-checkbox.json +32 -0
  127. package/snapshot/services/core/story-docs/komponenten-inputs-forms-radio.json +32 -0
  128. package/snapshot/services/core/story-docs/komponenten-inputs-forms-skala.json +42 -0
  129. package/snapshot/services/core/story-docs/komponenten-inputs-forms-slider.json +37 -0
  130. package/snapshot/services/core/story-docs/komponenten-inputs-forms-textbereich.json +27 -0
  131. package/snapshot/services/core/story-docs/komponenten-inputs-forms-textfeld.json +32 -0
  132. package/snapshot/services/core/story-docs/komponenten-navigation-topnav.json +26 -0
  133. package/snapshot/services/core/story-docs/komponenten-sektion-sektion.json +41 -0
  134. package/snapshot/services/core/story-docs/komponenten-slider-carousel-carousel.json +31 -0
  135. package/snapshot/services/core/story-docs/komponenten-slider-carousel-logocarousel.json +27 -0
  136. package/snapshot/services/core/story-docs/komponenten-tabelle-tabelle.json +36 -0
  137. package/snapshot/services/core/story-docs/komponenten-tabelle-vergleichstabelle.json +32 -0
  138. package/snapshot/services/core/story-docs/komponenten-theme-umschalter-cycle-button.json +31 -0
  139. package/snapshot/services/core/story-docs/komponenten-theme-umschalter-dropdown.json +26 -0
  140. package/snapshot/services/core/story-docs/komponenten-theme-umschalter-segment.json +26 -0
  141. package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-blockquote.json +21 -0
  142. package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-teamvoice.json +21 -0
  143. package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-testimonial.json +21 -0
  144. package/snapshot/services/core/story-docs/marke-brand-areas-areatabs.json +26 -0
  145. package/snapshot/services/core/story-docs/marke-logo-logo.json +23 -0
  146. package/snapshot/services/core/story-docs/seitenmuster-seminar-/302/267-training-fakten-liste.json +21 -0
  147. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-article-header.json +37 -0
  148. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-author-card.json +31 -0
  149. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-avatar.json +32 -0
  150. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-callout.json +26 -0
  151. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-faq.json +27 -0
  152. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-figure.json +22 -0
  153. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-inhaltsverzeichnis.json +27 -0
  154. package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-pull-quote.json +21 -0
  155. package/src/instructions.mjs +38 -0
  156. package/src/server.mjs +111 -0
  157. package/src/version-check.mjs +80 -0
@@ -0,0 +1,38 @@
1
+ // Server-`instructions` aus ADR-0012: Regeln des Design Systems, die die KI eines Consumers
2
+ // erreichen, bevor sie überhaupt ein Werkzeug aufruft (`initialize`-Antwort, `tmcp`s
3
+ // `ServerOptions.instructions`). Eigene deutsche Regeln zuerst, danach unverändert
4
+ // `STORYBOOK_MCP_INSTRUCTIONS` aus `@storybook/mcp` — die Anleitung zu docs-list/docs-show/
5
+ // docs-show-story bleibt bei der Bibliothek, die die Werkzeuge auch definiert.
6
+ import { STORYBOOK_MCP_INSTRUCTIONS } from '@storybook/mcp';
7
+
8
+ /**
9
+ * Storybook-ID der Einrichtungsseite (`storybook-angular/src/docs/grundlagen/einrichtung.mdx`,
10
+ * `<Meta title="Grundlagen/Einrichtung" name="Übersicht" />`). Als Konstante exportiert, statt
11
+ * die ID nur im Fließtext unten zu verstecken, damit ein Test sie referenzieren kann, ohne sie
12
+ * ein zweites Mal abzutippen.
13
+ */
14
+ export const EINRICHTUNG_DOC_ID = 'grundlagen-einrichtung--übersicht';
15
+
16
+ const OWN_INSTRUCTIONS = `## Conciso Design System
17
+
18
+ Feste Regeln für die Angular-Lib „@conciso/design-system-angular“:
19
+
20
+ 1. CSS-Schicht und Fonts global einbinden, nicht pro Komponente. Ohne diesen Schritt bleiben die Wrapper-Komponenten ungestylt.
21
+ 2. Kein eigenes CSS für DS-Komponenten schreiben und keine CSS-Klassen erfinden.
22
+ 3. Nur Inputs und Outputs verwenden, die docs-show für die jeweilige Komponente liefert. Vorher nachsehen, nie raten.
23
+ 4. Bei Fragen zur Einrichtung docs-show mit der ID „${EINRICHTUNG_DOC_ID}“ aufrufen (Storybook-Seite „Einrichtung“).`;
24
+
25
+ /**
26
+ * Baut den vollständigen `instructions`-Text: eigene Regeln, optional die Versions-Notiz aus
27
+ * `checkVersion`, danach die Storybook-eigenen Anweisungen.
28
+ * @param {string | null} [versionNote] `instructionsNote` aus `checkVersion` (src/version-check.mjs).
29
+ * @returns {string}
30
+ */
31
+ export function buildInstructions(versionNote) {
32
+ const sections = [OWN_INSTRUCTIONS];
33
+ if (versionNote) {
34
+ sections.push(versionNote);
35
+ }
36
+ sections.push(STORYBOOK_MCP_INSTRUCTIONS);
37
+ return sections.join('\n\n');
38
+ }
package/src/server.mjs ADDED
@@ -0,0 +1,111 @@
1
+ // MCP-Server für Consumer (ADR-0012): baut die drei Storybook-Doku-Werkzeuge von
2
+ // @storybook/mcp auf einem tmcp-Server mit stdio-Transport auf. Liest ausschließlich aus dem
3
+ // mitgelieferten Snapshot (`snapshot/manifests`, `snapshot/services`) — kein Netzzugriff, kein
4
+ // Port. Wichtige Invariante: stdout gehört exklusiv dem JSON-RPC-Protokoll, jede Diagnose geht
5
+ // auf stderr.
6
+ import { readFile } from 'node:fs/promises';
7
+ import { createRequire } from 'node:module';
8
+ import { dirname, join, sep } from 'node:path';
9
+ import { fileURLToPath } from 'node:url';
10
+
11
+ import { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot';
12
+ import { StdioTransport } from '@tmcp/transport-stdio';
13
+ import {
14
+ addGetDocumentationTool,
15
+ addGetStoryDocumentationTool,
16
+ addListAllDocumentationTool,
17
+ } from '@storybook/mcp';
18
+ import { McpServer } from 'tmcp';
19
+
20
+ import { buildInstructions } from './instructions.mjs';
21
+ import { checkVersion, resolveInstalledVersion } from './version-check.mjs';
22
+
23
+ const require = createRequire(import.meta.url);
24
+ // createRequire statt `import … with { type: 'json' }`: Import-Attribute für JSON brauchen
25
+ // neuere Node-Minor-Versionen als unser deklariertes `engines.node: >=20` garantiert; require()
26
+ // löst JSON seit jeher auf und funktioniert auf jeder Node-20-Version.
27
+ const pkg = require('../package.json');
28
+
29
+ const PACKAGE_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
30
+ export const SNAPSHOT_ROOT = join(PACKAGE_ROOT, 'snapshot');
31
+
32
+ /**
33
+ * @storybook/mcp ruft den manifestProvider mit Pfaden relativ zur Storybook-Wurzel auf, z. B.
34
+ * „./manifests/components.json“ oder „./services/core/docgen/<id>.json“. `request` bleibt in
35
+ * stdio immer `undefined` — es gibt kein HTTP-Request-Objekt; wir ignorieren es bewusst.
36
+ *
37
+ * ROOT CAUSE: @storybook/mcp löst `$ref`-Pfade aus dem Manifest
38
+ * URL-artig auf (`new URL(filePath, base).pathname`, siehe `parseManifestRef` in
39
+ * @storybook/mcp/dist/index.js) und übergibt dem manifestProvider deshalb einen
40
+ * PROZENTKODIERTEN Pfad, z. B. „./services/addon-docs/mdx/grundlagen-einrichtung--%C3%BCbersicht.json“
41
+ * für die Datei „…/grundlagen-einrichtung--übersicht.json“ auf der Platte — betrifft jede docs-id
42
+ * mit Nicht-ASCII-Zeichen (alle „…--übersicht“-MDX-Seiten). Über HTTP dekodiert der Server das
43
+ * automatisch; unser Dateisystem-Provider muss es hier selbst tun.
44
+ *
45
+ * Verteidigung in der Tiefe: `manifestPath` kommt aus `$ref`-Werten im Snapshot, nicht direkt von
46
+ * Nutzereingaben — trotzdem lehnt der Provider jeden Pfad ab, dessen Auflösung `SNAPSHOT_ROOT`
47
+ * verlässt (z. B. per `../..`), statt ihn stillschweigend zu folgen. Das Dekodieren läuft VOR
48
+ * dieser Guard-Prüfung, sonst würde eine kodierte Traversal (`..%2F..%2F…`) die Prüfung als
49
+ * harmlose Zeichenfolge passieren und erst danach zur echten Traversal werden.
50
+ * @param {unknown} _request
51
+ * @param {string} manifestPath
52
+ * @returns {Promise<string>}
53
+ */
54
+ export async function manifestProvider(_request, manifestPath) {
55
+ const relative = manifestPath.replace(/^\.\//, '');
56
+ let decoded;
57
+ try {
58
+ decoded = decodeURIComponent(relative);
59
+ } catch {
60
+ throw new Error(`Pfad ungültig kodiert (keine valide Prozentkodierung): „${manifestPath}“.`);
61
+ }
62
+ const absolute = join(SNAPSHOT_ROOT, decoded);
63
+ if (absolute !== SNAPSHOT_ROOT && !absolute.startsWith(SNAPSHOT_ROOT + sep)) {
64
+ throw new Error(`Pfad außerhalb des Snapshots abgelehnt: „${manifestPath}“.`);
65
+ }
66
+ return readFile(absolute, 'utf8');
67
+ }
68
+
69
+ /**
70
+ * Baut den tmcp-Server mit den drei registrierten Werkzeugen, aber startet noch keinen Transport.
71
+ * @param {{ cwd?: string }} [options] `cwd`: Arbeitsverzeichnis, ab dem die Versionsprüfung die
72
+ * installierte Angular-Lib auflöst (Default `process.cwd()`) — parametrisiert für Tests, damit
73
+ * sie kein reales Consumer-`node_modules` brauchen.
74
+ */
75
+ export async function createServer({ cwd = process.cwd() } = {}) {
76
+ const installedVersion = resolveInstalledVersion(cwd);
77
+ const { instructionsNote, stderrNote } = checkVersion(pkg.version, installedVersion);
78
+ if (stderrNote) {
79
+ console.error(stderrNote);
80
+ }
81
+
82
+ const server = new McpServer(
83
+ {
84
+ name: pkg.name,
85
+ version: pkg.version,
86
+ description:
87
+ 'Dokumentierte Inputs/Outputs der Angular-Lib des Conciso Design System, aus einem ' +
88
+ 'Storybook-Snapshot, kein Netzzugriff.',
89
+ },
90
+ {
91
+ adapter: new ValibotJsonSchemaAdapter(),
92
+ capabilities: { tools: { listChanged: true } },
93
+ instructions: buildInstructions(instructionsNote),
94
+ },
95
+ ).withContext();
96
+
97
+ await addListAllDocumentationTool(server);
98
+ await addGetDocumentationTool(server);
99
+ await addGetStoryDocumentationTool(server);
100
+
101
+ return server;
102
+ }
103
+
104
+ /** Baut den Server und hängt ihn an stdio. Gibt den Transport zurück (für Tests/Shutdown). */
105
+ export async function startServer() {
106
+ const server = await createServer();
107
+ const transport = new StdioTransport(server);
108
+ transport.listen({ manifestProvider });
109
+ console.error(`[cds-mcp] bereit (stdio), Snapshot: ${SNAPSHOT_ROOT}`);
110
+ return transport;
111
+ }
@@ -0,0 +1,80 @@
1
+ // Versionsprüfung aus ADR-0012 (Lockstep): Der MCP-Server liefert einen Snapshot, der zu genau
2
+ // einer Version der Angular-Lib passt. Weicht die installierte Version ab, warnt der Server
3
+ // (in den `instructions` und auf stderr) statt abzubrechen — ein MCP-Server, der die Verbindung
4
+ // verweigert, ist für die KI unsichtbar, eine falsche Doku-Erwartung dagegen sichtbar und
5
+ // korrigierbar.
6
+ //
7
+ // `checkVersion` ist bewusst eine reine Funktion (zwei Strings/`null` rein, ein Objekt raus):
8
+ // Unit-Tests brauchen dafür keine Fixtures, keinen `node_modules`-Baum und keinen Kindprozess.
9
+ // Das Auflösen der installierten Version (Dateisystemzugriff) steht getrennt in
10
+ // `resolveInstalledVersion`.
11
+ import { createRequire } from 'node:module';
12
+ import { join } from 'node:path';
13
+
14
+ /**
15
+ * Version, die das Repo laut ADR-0010 („versionsfreies Repo“, siehe
16
+ * scripts/release/stamp-version.mjs) dauerhaft trägt, bis der Publish-Job die echte Version
17
+ * einstempelt. Vor dem ersten Release — und bei jedem lokalen `npm test` aus einem Checkout, der
18
+ * nie gestempelt wurde — steht sie in JEDEM Paket, auch in einer frisch installierten
19
+ * Angular-Lib aus demselben Checkout. Ein Vergleich dagegen würde in der Entwicklung immer
20
+ * "unterschiedlich" melden, obwohl beide Seiten aus demselben, noch nicht veröffentlichten Stand
21
+ * stammen — eine strukturell falsche Warnung, keine echte Abweichung. Deshalb wird der Vergleich
22
+ * für diesen einen Wert übersprungen, nicht verschärft.
23
+ */
24
+ export const PLACEHOLDER_VERSION = '0.0.0';
25
+
26
+ /**
27
+ * Reine Versionsprüfung ohne Dateisystemzugriff.
28
+ * @param {string} ownVersion Version aus mcp-server/package.json (`pkg.version`).
29
+ * @param {string | null} installedVersion Version der installierten Angular-Lib, oder `null`,
30
+ * wenn sie nicht auflösbar ist (nicht installiert, kein `package.json`, kaputtes JSON).
31
+ * @returns {{ instructionsNote: string | null, stderrNote: string | null }}
32
+ */
33
+ export function checkVersion(ownVersion, installedVersion) {
34
+ if (ownVersion === PLACEHOLDER_VERSION) {
35
+ return {
36
+ instructionsNote: null,
37
+ stderrNote:
38
+ '[cds-mcp] Entwicklungsmodus: eigene Version ist der Platzhalter „0.0.0“, Versionsprüfung übersprungen.',
39
+ };
40
+ }
41
+
42
+ if (installedVersion === null) {
43
+ return {
44
+ instructionsNote:
45
+ `Hinweis: „@conciso/design-system-angular“ ist im Projekt nicht installiert. ` +
46
+ `Dieser Snapshot gilt für Version ${ownVersion}.`,
47
+ stderrNote: null,
48
+ };
49
+ }
50
+
51
+ if (installedVersion === ownVersion) {
52
+ return { instructionsNote: null, stderrNote: null };
53
+ }
54
+
55
+ const note =
56
+ `Warnung: Dieser Snapshot gehört zu Version ${ownVersion} von „@conciso/design-system-angular“, ` +
57
+ `installiert ist Version ${installedVersion}. Dokumentierte Inputs und Outputs können abweichen.`;
58
+ return { instructionsNote: note, stderrNote: `[cds-mcp] ${note}` };
59
+ }
60
+
61
+ /**
62
+ * Löst die Version der installierten Angular-Lib **vom Arbeitsverzeichnis des Consumers aus**
63
+ * auf, nicht vom Installationsort dieses Pakets (`import.meta.url` wäre hier falsch: `cds-mcp`
64
+ * liegt in `node_modules/@conciso/design-system-mcp/…`, die zu prüfende Lib aber im
65
+ * `node_modules` des Consumer-Projekts). `createRequire(join(cwd, 'noop.js'))` erzeugt einen
66
+ * `require`, dessen Modulauflösung an einem Pfad IM Consumer-Verzeichnis beginnt, ohne dass
67
+ * dieser Pfad existieren muss — Node löst `require.resolve` immer relativ zum Verzeichnis eines
68
+ * (auch fiktiven) Moduls auf, nie zur Datei selbst.
69
+ * @param {string} [cwd] Default: `process.cwd()`, parametrisiert für Tests.
70
+ * @returns {string | null}
71
+ */
72
+ export function resolveInstalledVersion(cwd = process.cwd()) {
73
+ try {
74
+ const require = createRequire(join(cwd, 'noop.js'));
75
+ const installedPkg = require('@conciso/design-system-angular/package.json');
76
+ return installedPkg.version;
77
+ } catch {
78
+ return null;
79
+ }
80
+ }