@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.
- package/LICENSE +21 -0
- package/README.md +59 -0
- package/bin/cds-mcp.mjs +9 -0
- package/package.json +48 -0
- package/snapshot/manifests/components.json +617 -0
- package/snapshot/manifests/docs.json +293 -0
- package/snapshot/services/addon-docs/mdx/beispielseiten-/303/274bersicht--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-barrierefreiheit--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-design-tokens--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-einrichtung--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-elevation--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-icons--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-responsive--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/grundlagen-spacing-grid--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-buchungsformular--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-buttons--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-call-to-action--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-cards-teaser--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-chips-badges-pills--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-code-block--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-dropdowns--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-feedback--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-footer--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-hero--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-inputs-forms--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-navigation--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-sektion--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-slider-carousel--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-tabelle--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-theme-umschalter--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/komponenten-zitate-testimonials--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/marke-bildsprache--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/marke-brand-areas--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/marke-logo--verwendung.json +18 -0
- package/snapshot/services/addon-docs/mdx/marke-markenrad--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/referenzen-quellen--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-angebots-detailseite--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-beitrags/303/274bersicht--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-seminar-/302/267-training--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-veranstaltung--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-veranstaltungs/303/274bersicht--/303/274bersicht.json +18 -0
- package/snapshot/services/addon-docs/mdx/seitenmuster-wissensbeitrag--/303/274bersicht.json +18 -0
- package/snapshot/services/core/docgen/grundlagen-farben.json +3 -0
- package/snapshot/services/core/docgen/grundlagen-typografie.json +3 -0
- package/snapshot/services/core/docgen/komponenten-buttons-button.json +183 -0
- package/snapshot/services/core/docgen/komponenten-call-to-action-cta-band.json +131 -0
- package/snapshot/services/core/docgen/komponenten-call-to-action-downloadcta.json +182 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-card.json +146 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-feature-liste.json +128 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-featured-karte.json +158 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-icon-karte.json +111 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-klickbare-karte.json +161 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-statcard.json +115 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-statstrip.json +58 -0
- package/snapshot/services/core/docgen/komponenten-cards-teaser-tier-trenner.json +56 -0
- package/snapshot/services/core/docgen/komponenten-chips-badges-pills-bereichs-badge.json +63 -0
- package/snapshot/services/core/docgen/komponenten-chips-badges-pills-chip.json +95 -0
- package/snapshot/services/core/docgen/komponenten-chips-badges-pills-pill.json +78 -0
- package/snapshot/services/core/docgen/komponenten-chips-badges-pills-status-badge.json +63 -0
- package/snapshot/services/core/docgen/komponenten-code-block-code-block.json +91 -0
- package/snapshot/services/core/docgen/komponenten-dropdowns-combobox.json +224 -0
- package/snapshot/services/core/docgen/komponenten-dropdowns-custom-select.json +173 -0
- package/snapshot/services/core/docgen/komponenten-feedback-snackbar.json +97 -0
- package/snapshot/services/core/docgen/komponenten-footer-komplett.json +21 -0
- package/snapshot/services/core/docgen/komponenten-footer-oberer-teil.json +39 -0
- package/snapshot/services/core/docgen/komponenten-footer-unterer-teil.json +105 -0
- package/snapshot/services/core/docgen/komponenten-hero-hero-bild.json +162 -0
- package/snapshot/services/core/docgen/komponenten-hero-st/303/266rer.json +41 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-auswahlfeld.json +192 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-checkbox.json +182 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-radio.json +181 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-skala.json +179 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-slider.json +259 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-textbereich.json +190 -0
- package/snapshot/services/core/docgen/komponenten-inputs-forms-textfeld.json +207 -0
- package/snapshot/services/core/docgen/komponenten-navigation-topnav.json +186 -0
- package/snapshot/services/core/docgen/komponenten-sektion-sektion.json +113 -0
- package/snapshot/services/core/docgen/komponenten-slider-carousel-carousel.json +92 -0
- package/snapshot/services/core/docgen/komponenten-slider-carousel-logocarousel.json +92 -0
- package/snapshot/services/core/docgen/komponenten-tabelle-tabelle.json +74 -0
- package/snapshot/services/core/docgen/komponenten-tabelle-vergleichstabelle.json +142 -0
- package/snapshot/services/core/docgen/komponenten-theme-umschalter-cycle-button.json +41 -0
- package/snapshot/services/core/docgen/komponenten-theme-umschalter-dropdown.json +41 -0
- package/snapshot/services/core/docgen/komponenten-theme-umschalter-segment.json +41 -0
- package/snapshot/services/core/docgen/komponenten-zitate-testimonials-blockquote.json +96 -0
- package/snapshot/services/core/docgen/komponenten-zitate-testimonials-teamvoice.json +130 -0
- package/snapshot/services/core/docgen/komponenten-zitate-testimonials-testimonial.json +96 -0
- package/snapshot/services/core/docgen/marke-brand-areas-areatabs.json +75 -0
- package/snapshot/services/core/docgen/marke-logo-logo.json +71 -0
- package/snapshot/services/core/docgen/seitenmuster-seminar-/302/267-training-fakten-liste.json +79 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-article-header.json +196 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-author-card.json +91 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-avatar.json +100 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-callout.json +64 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-faq.json +41 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-figure.json +73 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-inhaltsverzeichnis.json +75 -0
- package/snapshot/services/core/docgen/seitenmuster-wissensbeitrag-pull-quote.json +63 -0
- package/snapshot/services/core/story-docs/grundlagen-farben.json +19 -0
- package/snapshot/services/core/story-docs/grundlagen-typografie.json +25 -0
- package/snapshot/services/core/story-docs/komponenten-buttons-button.json +48 -0
- package/snapshot/services/core/story-docs/komponenten-call-to-action-cta-band.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-call-to-action-downloadcta.json +17 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-card.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-feature-liste.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-featured-karte.json +36 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-icon-karte.json +41 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-klickbare-karte.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-statcard.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-statstrip.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-cards-teaser-tier-trenner.json +22 -0
- package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-bereichs-badge.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-chip.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-pill.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-chips-badges-pills-status-badge.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-code-block-code-block.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-dropdowns-combobox.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-dropdowns-custom-select.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-feedback-snackbar.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-footer-komplett.json +22 -0
- package/snapshot/services/core/story-docs/komponenten-footer-oberer-teil.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-footer-unterer-teil.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-hero-hero-bild.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-hero-st/303/266rer.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-auswahlfeld.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-checkbox.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-radio.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-skala.json +42 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-slider.json +37 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-textbereich.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-inputs-forms-textfeld.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-navigation-topnav.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-sektion-sektion.json +41 -0
- package/snapshot/services/core/story-docs/komponenten-slider-carousel-carousel.json +31 -0
- package/snapshot/services/core/story-docs/komponenten-slider-carousel-logocarousel.json +27 -0
- package/snapshot/services/core/story-docs/komponenten-tabelle-tabelle.json +36 -0
- package/snapshot/services/core/story-docs/komponenten-tabelle-vergleichstabelle.json +32 -0
- package/snapshot/services/core/story-docs/komponenten-theme-umschalter-cycle-button.json +31 -0
- package/snapshot/services/core/story-docs/komponenten-theme-umschalter-dropdown.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-theme-umschalter-segment.json +26 -0
- package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-blockquote.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-teamvoice.json +21 -0
- package/snapshot/services/core/story-docs/komponenten-zitate-testimonials-testimonial.json +21 -0
- package/snapshot/services/core/story-docs/marke-brand-areas-areatabs.json +26 -0
- package/snapshot/services/core/story-docs/marke-logo-logo.json +23 -0
- package/snapshot/services/core/story-docs/seitenmuster-seminar-/302/267-training-fakten-liste.json +21 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-article-header.json +37 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-author-card.json +31 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-avatar.json +32 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-callout.json +26 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-faq.json +27 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-figure.json +22 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-inhaltsverzeichnis.json +27 -0
- package/snapshot/services/core/story-docs/seitenmuster-wissensbeitrag-pull-quote.json +21 -0
- package/src/instructions.mjs +38 -0
- package/src/server.mjs +111 -0
- 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
|
+
}
|