@ng-solid/mcp 22.0.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/GUIDE.md +292 -0
- package/README.md +159 -0
- package/data/design-system.json +24204 -0
- package/data/icons.json +1 -0
- package/data/skills/ns-solid-components/SKILL.md +140 -0
- package/data/skills/ns-solid-forms/SKILL.md +183 -0
- package/data/skills/ns-solid-icons/SKILL.md +95 -0
- package/data/skills/ns-solid-install/SKILL.md +120 -0
- package/data/skills/ns-solid-style-contract/SKILL.md +84 -0
- package/data/skills/ns-solid-theming/SKILL.md +123 -0
- package/index.d.ts +3 -0
- package/index.js +38 -0
- package/lib/data.d.ts +26 -0
- package/lib/data.js +51 -0
- package/lib/install-skills.d.ts +1 -0
- package/lib/install-skills.js +159 -0
- package/lib/preset-validator.d.ts +44 -0
- package/lib/preset-validator.js +172 -0
- package/lib/prompts.d.ts +2 -0
- package/lib/prompts.js +173 -0
- package/lib/resources.d.ts +2 -0
- package/lib/resources.js +328 -0
- package/lib/server.d.ts +3 -0
- package/lib/server.js +31 -0
- package/lib/style-contract.d.ts +37 -0
- package/lib/style-contract.js +167 -0
- package/lib/template-parser.d.ts +29 -0
- package/lib/template-parser.js +230 -0
- package/lib/tools.components.d.ts +44 -0
- package/lib/tools.components.js +836 -0
- package/lib/tools.d.ts +9 -0
- package/lib/tools.guides.d.ts +15 -0
- package/lib/tools.guides.js +103 -0
- package/lib/tools.icons.d.ts +7 -0
- package/lib/tools.icons.js +106 -0
- package/lib/tools.js +18 -0
- package/lib/tools.tokens.d.ts +7 -0
- package/lib/tools.tokens.js +278 -0
- package/lib/types.d.ts +349 -0
- package/lib/types.js +11 -0
- package/package.json +52 -0
- package/skills/ns-solid-components/SKILL.md +77 -0
- package/skills/ns-solid-forms/SKILL.md +166 -0
- package/skills/ns-solid-icons/SKILL.md +95 -0
- package/skills/ns-solid-install/SKILL.md +119 -0
- package/skills/ns-solid-style-contract/SKILL.md +84 -0
- package/skills/ns-solid-theming/SKILL.md +123 -0
package/GUIDE.md
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# Guía de `@ng-solid/mcp`
|
|
2
|
+
|
|
3
|
+
Arquitectura, pipeline de datos y mantenimiento del servidor MCP del design
|
|
4
|
+
system Arvisfy. Para instalación y uso como consumidor, ver
|
|
5
|
+
[`README.md`](./README.md).
|
|
6
|
+
|
|
7
|
+
> Resumen rápido: este paquete genera en build un snapshot JSON a partir del
|
|
8
|
+
> **AST real** de `@ng-solid/design-system` (Compiler API de TypeScript), del
|
|
9
|
+
> preset Arvisfy, del catálogo de iconos `@ng-solid/icons` y de las 6 skills
|
|
10
|
+
> en `packages/mcp/skills/`. El servidor MCP sólo lee ese snapshot por
|
|
11
|
+
> stdio — nunca ejecuta Angular ni analiza código en runtime.
|
|
12
|
+
|
|
13
|
+
## 1. Primera librería no-Angular del workspace
|
|
14
|
+
|
|
15
|
+
`@ng-solid/mcp` es la **primera** librería de `packages/*` que no es una
|
|
16
|
+
librería Angular. Eso tiene consecuencias que no aplican al resto del
|
|
17
|
+
workspace:
|
|
18
|
+
|
|
19
|
+
- **`@nx/dependency-checks` no aplica.** El resto de `packages/*` usa
|
|
20
|
+
`@nx/eslint-plugin`'s dependency-checks rule para validar que
|
|
21
|
+
`package.json` liste exactamente lo que el código importa; `eslint.config.mjs`
|
|
22
|
+
de este paquete no extiende esa regla porque no hay un `ng-package.json`
|
|
23
|
+
que la alimente.
|
|
24
|
+
- **`flat/angular` y `flat/angular-template` no aplican.** `eslint.config.mjs`
|
|
25
|
+
extiende `../../eslint.config.mjs` explícitamente sin esos presets ni
|
|
26
|
+
`@angular-eslint/component-selector` — no hay componentes ni templates
|
|
27
|
+
Angular en este paquete.
|
|
28
|
+
- **El preset de Jest del workspace no aplica.** El target `test` es
|
|
29
|
+
`nx:run-commands` puro (`node --test tests/*.test.mjs` + `node
|
|
30
|
+
scripts/smoke.mjs`), usando el test runner nativo de Node 24. No hay
|
|
31
|
+
`jest.config.ts` ni `ts-jest`.
|
|
32
|
+
- **El build no usa `ng-packagr`.** Es `nx:run-commands` →
|
|
33
|
+
`node scripts/prebuild.mjs && tsc -p tsconfig.lib.json && node
|
|
34
|
+
scripts/postbuild.mjs`. `tsc` compila `src/` a JS plano (`module`/`moduleResolution:
|
|
35
|
+
NodeNext`), y `postbuild.mjs` copia los assets (`data/`, `skills/`,
|
|
36
|
+
`README.md`, `GUIDE.md`) y escribe un `package.json` saneado en
|
|
37
|
+
`dist/packages/mcp`.
|
|
38
|
+
- **No hay dependencia de código hacia `design-system`/`icons`.** El
|
|
39
|
+
prebuild lee sus ficheros fuente directamente por ruta, sin importar
|
|
40
|
+
ningún paquete `@ng-solid/*` en tiempo de build. Por eso `project.json`
|
|
41
|
+
declara `implicitDependencies: ["design-system", "icons"]` — sin eso,
|
|
42
|
+
`nx affected` nunca dispararía la regeneración del snapshot cuando esos
|
|
43
|
+
paquetes cambian.
|
|
44
|
+
|
|
45
|
+
## 2. Arquitectura del pipeline de datos
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
packages/design-system/src/** ─┐
|
|
49
|
+
packages/icons/src/lib/generated/** ├─► scripts/prebuild.mjs ─► data/design-system.json
|
|
50
|
+
apps/demo/src/app/docs.registry.ts │ data/icons.json
|
|
51
|
+
tools/scripts/check-design-system-styles.mjs data/skills/<name>/SKILL.md
|
|
52
|
+
packages/mcp/skills/<name>/SKILL.md ─┘
|
|
53
|
+
packages/mcp/overrides/component-notes.json
|
|
54
|
+
|
|
55
|
+
data/*.json ─► src/lib/data.ts (loadSnapshot/loadIcons) ─► src/lib/{tools,resources,prompts}.ts ─► server.ts ─► stdio
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
`scripts/prebuild.mjs` orquesta un único `ts.Program` (`ts-program.mjs`,
|
|
59
|
+
rooteado en `packages/design-system/src/index.ts`) y ejecuta cada extractor
|
|
60
|
+
de `scripts/lib/` sobre él:
|
|
61
|
+
|
|
62
|
+
| Extractor | Lee | Produce |
|
|
63
|
+
| ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
64
|
+
| `extract-components.mjs` (+ `extract-members.mjs`, `extract-host.mjs`, `extract-template.mjs`) | AST de cada `@Component`/`@Directive` bajo `design-system/src/lib` | `ComponentDoc[]` — un doc por selector, con herencia de inputs resuelta, BEM parseado y `visibility` derivada del cierre de exports público |
|
|
65
|
+
| `extract-services.mjs` | AST de servicios `@Injectable` y providers de función exportados | `ServiceDoc[]`, `ProviderDoc[]` |
|
|
66
|
+
| `extract-tokens.mjs` | `arvisfy.preset.ts` + `theme.utils.ts` (transpilados en memoria) + SCSS de componente | `ThemeDoc` — 3 tiers, `resolved.{light,dark}` por token de componente, `drift` |
|
|
67
|
+
| `extract-registry.mjs` | `apps/demo/src/app/docs.registry.ts` | Join `slug ↔ selector` que añade `category`/`summary`/`variants`/`snippet` a los `ComponentDoc` del registro |
|
|
68
|
+
| `extract-icons.mjs` | `packages/icons/src/lib/generated/{catalog.json,index.ts,metadata.ts}` | `IconDoc[]` (name ↔ symbol, sin cuerpos SVG) |
|
|
69
|
+
| `extract-guides.mjs` (Fase 5, este paquete) | `packages/mcp/skills/<name>/SKILL.md` + el resto de extractores (para interpolar) | `GuideDoc[]` embebido en el snapshot, y el `Map` de ficheros resueltos que `prebuild.mjs` escribe en `data/skills/` |
|
|
70
|
+
|
|
71
|
+
`overrides/component-notes.json` inyecta `pitfalls`/`relatedComponents`
|
|
72
|
+
escritos a mano por selector — lo único que ningún AST puede producir.
|
|
73
|
+
|
|
74
|
+
`scripts/lib/snapshot.mjs` ensambla ambos ficheros finales
|
|
75
|
+
(`buildSnapshot`/`buildIconsSnapshot`), aplica `sanitizePaths` (ninguna ruta
|
|
76
|
+
absoluta del checkout sobrevive al JSON) y fija `generatedAt: "snapshot"` —
|
|
77
|
+
nunca una fecha real — para que dos ejecuciones sucesivas sean
|
|
78
|
+
byte-idénticas.
|
|
79
|
+
|
|
80
|
+
### Regenerar el snapshot
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
pnpm exec nx run mcp:build-data # escribe packages/mcp/data/*.json y data/skills/**
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Regenera cuando cambie cualquiera de las fuentes de la tabla anterior:
|
|
87
|
+
un input()/output()/model() en design-system, el preset Arvisfy, el
|
|
88
|
+
catálogo de iconos, el registro de docs de la demo, el script de
|
|
89
|
+
estilos, o una `SKILL.md`.
|
|
90
|
+
|
|
91
|
+
### `--check` — el gate de CI
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
pnpm exec nx run mcp:check-data
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Genera el mismo snapshot **en memoria** (nunca escribe a disco) y lo
|
|
98
|
+
compara byte a byte contra `data/design-system.json` / `data/icons.json`.
|
|
99
|
+
Si difiere, sale con código 1 y un resumen legible (selectores
|
|
100
|
+
añadidos/eliminados, inputs que cambiaron, conteo de iconos) — el mismo
|
|
101
|
+
contrato que `pnpm icons:check` para el catálogo de iconos del propio
|
|
102
|
+
`@ng-solid/icons`. Como `guides` vive dentro de `design-system.json`, un
|
|
103
|
+
cambio no regenerado en cualquier `SKILL.md` (incluida una interpolación de
|
|
104
|
+
marcador desactualizada) también hace fallar `--check`, sin lógica
|
|
105
|
+
adicional: no hay un `--check` separado para `data/skills/`.
|
|
106
|
+
|
|
107
|
+
### Por qué se publica desde `dist/packages/mcp`
|
|
108
|
+
|
|
109
|
+
`nx.json` fija `nx-release-publish.packageRoot =
|
|
110
|
+
"dist/packages/{projectName}"`, y `tools/scripts/publish.mjs` hace `chdir`
|
|
111
|
+
al primer `build.outputs` del proyecto antes de `npm publish`.
|
|
112
|
+
`project.json` de este paquete declara
|
|
113
|
+
`build.outputs: ["{workspaceRoot}/dist/packages/mcp"]` precisamente para
|
|
114
|
+
encajar en ese contrato **sin modificar** `publish.mjs` — la alternativa
|
|
115
|
+
(publicar desde `packages/mcp`, como hace el blueprint de BHD) exigiría un
|
|
116
|
+
override del publish script y versionar `dist/` en git.
|
|
117
|
+
|
|
118
|
+
## 3. El resolutor de 3 fallbacks (`data.ts`)
|
|
119
|
+
|
|
120
|
+
`src/lib/data.ts#resolveSnapshotPath` no puede usar
|
|
121
|
+
`new URL('../../data/…', import.meta.url)` a secas (el truco de BHD) porque
|
|
122
|
+
la ruta relativa entre el módulo compilado y `data/` **cambia** según dónde
|
|
123
|
+
corra el código:
|
|
124
|
+
|
|
125
|
+
1. `process.env.NG_SOLID_MCP_DATA` — override explícito (tests, debugging).
|
|
126
|
+
2. `../data/<fichero>` relativo al propio módulo — layout publicado:
|
|
127
|
+
`dist/packages/mcp/lib/data.js` → `dist/packages/mcp/data/<fichero>`.
|
|
128
|
+
3. `../../data/<fichero>` — layout de desarrollo:
|
|
129
|
+
`packages/mcp/src/lib/data.ts` → `packages/mcp/data/<fichero>`.
|
|
130
|
+
|
|
131
|
+
Gana el primer candidato para el que `existsSync` es verdadero; si ninguno
|
|
132
|
+
existe, lanza un error listando las tres rutas probadas (nunca falla en
|
|
133
|
+
silencio). `src/lib/install-skills.ts#resolveSkillsSourceDir` replica
|
|
134
|
+
exactamente la misma cadena para `data/skills/`, y
|
|
135
|
+
`GuideDoc.skillPath` (`data/skills/<name>/SKILL.md`, relativo a la raíz del
|
|
136
|
+
paquete) es lo que `resources.ts`'s `ns://skill/{slug}` resuelve con la
|
|
137
|
+
misma lógica de dos niveles (`../` publicado, `../../` dev) — **no** apunta
|
|
138
|
+
al `SKILL.md` autoral bajo `skills/`, que puede tener marcadores sin
|
|
139
|
+
resolver.
|
|
140
|
+
|
|
141
|
+
## 4. El guardarraíl de `transpileModule` en `extract-tokens.mjs`
|
|
142
|
+
|
|
143
|
+
`extract-tokens.mjs` no reimplementa `flattenTokens` /
|
|
144
|
+
`tokenPathToCssVariable` / `validateNsPreset`: los importa **en caliente**
|
|
145
|
+
desde el código de producción, transpilando `theme.utils.ts` y
|
|
146
|
+
`arvisfy.preset.ts` con `ts.transpileModule(...)` y cargando el resultado
|
|
147
|
+
vía `import('data:text/javascript;base64,' + …)`. Esto sólo es seguro
|
|
148
|
+
porque ambos ficheros hoy únicamente tienen imports **de tipo**
|
|
149
|
+
(`import type` o imports erasados por `isolatedModules`); un import de
|
|
150
|
+
**valor** (por ejemplo, si `arvisfy.preset.ts` empezara a importar una
|
|
151
|
+
utilidad en runtime) rompería el resultado transpilado, porque ese import
|
|
152
|
+
no puede resolverse desde un data URI.
|
|
153
|
+
|
|
154
|
+
El prebuild debe detectar un import de valor en esos ficheros y abortar con
|
|
155
|
+
un mensaje explícito en vez de producir un snapshot silenciosamente
|
|
156
|
+
incorrecto. Si eso ocurre, el fallback documentado es dejar de transpilar en
|
|
157
|
+
memoria y ejecutar Node directamente sobre TypeScript con
|
|
158
|
+
`node --experimental-strip-types`, aceptando que entonces sólo se admiten
|
|
159
|
+
anotaciones de tipo _erasables_ (sin decoradores, sin enums no-const) en
|
|
160
|
+
esos dos ficheros.
|
|
161
|
+
|
|
162
|
+
## 5. Skills: fuente única, dos vehículos, un solo punto de interpolación
|
|
163
|
+
|
|
164
|
+
`packages/mcp/skills/<name>/SKILL.md` es la única fuente de verdad para:
|
|
165
|
+
|
|
166
|
+
1. **`guides` en el snapshot** (`list_guides`/`get_guide`, resource
|
|
167
|
+
`ns://guide/{slug}`).
|
|
168
|
+
2. **Los ficheros distribuibles** que copia `install-skills` (resource
|
|
169
|
+
`ns://skill/{slug}` sirve el mismo fichero).
|
|
170
|
+
|
|
171
|
+
Cada `SKILL.md` es front-matter mínimo (`name`, `description` — sin
|
|
172
|
+
dependencia de YAML, parseo manual de esas dos claves en
|
|
173
|
+
`extract-guides.mjs`) más un cuerpo Markdown troceado por headings `## ` en
|
|
174
|
+
`sections: [{ id: slugify(title), title, content }]`.
|
|
175
|
+
|
|
176
|
+
### Marcadores de datos vivos
|
|
177
|
+
|
|
178
|
+
Un `SKILL.md` puede embeber `<!-- ns:<marcador> -->` en cualquier punto del
|
|
179
|
+
cuerpo; `extract-guides.mjs` los reemplaza con datos derivados de los mismos
|
|
180
|
+
extractores que alimentan el resto del snapshot, para que la skill nunca
|
|
181
|
+
pueda desincronizarse del código real:
|
|
182
|
+
|
|
183
|
+
| Marcador | Contenido |
|
|
184
|
+
| ---------------------------- | --------------------------------------------------------------------------------------------- |
|
|
185
|
+
| `<!-- ns:component-list -->` | Tabla markdown de todos los componentes públicos (selector, clase, familia, categoría) |
|
|
186
|
+
| `<!-- ns:icon-count -->` | El conteo real de `NS_ICON_COUNT` + licencia |
|
|
187
|
+
| `<!-- ns:versions -->` | Versiones publicadas de `@ng-solid/design-system` / `@ng-solid/icons` + rango peer de Angular |
|
|
188
|
+
| `<!-- ns:token-count -->` | Conteo de tokens por tier + número de grupos de componente |
|
|
189
|
+
| `<!-- ns:form-controls -->` | Tabla de los controles `ControlValueAccessor` públicos bajo `form/`, con sus inputs propios |
|
|
190
|
+
|
|
191
|
+
Un marcador desconocido (typo) hace que `extract-guides.mjs` lance una
|
|
192
|
+
excepción — falla el build en vez de publicar un comentario HTML literal.
|
|
193
|
+
|
|
194
|
+
### Dónde se materializa la interpolación (decisión de diseño)
|
|
195
|
+
|
|
196
|
+
`extract-guides.mjs` es **puro**: no escribe a disco, sólo devuelve
|
|
197
|
+
`{ guides, resolvedFiles }` (`resolvedFiles` es un `Map<"<name>/SKILL.md",
|
|
198
|
+
string>` con el markdown ya resuelto). `scripts/prebuild.mjs` decide qué
|
|
199
|
+
hacer con eso:
|
|
200
|
+
|
|
201
|
+
- `guides` se embebe directamente en `data/design-system.json` — así
|
|
202
|
+
`list_guides`/`get_guide` no tocan el filesystem en runtime, sólo leen el
|
|
203
|
+
snapshot ya cargado en memoria.
|
|
204
|
+
- `resolvedFiles` se escribe, uno por skill, en
|
|
205
|
+
`data/skills/<name>/SKILL.md` — **regenerando el directorio completo en
|
|
206
|
+
cada build** (`rmSync` + recreación) para que una skill renombrada o
|
|
207
|
+
eliminada nunca deje un fichero huérfano.
|
|
208
|
+
|
|
209
|
+
`install-skills` copia siempre desde `data/skills/`, nunca desde `skills/`
|
|
210
|
+
directamente — así el consumidor final recibe el mismo markdown, con los
|
|
211
|
+
marcadores ya resueltos, sin importar si llegó por MCP (`get_guide`,
|
|
212
|
+
`ns://guide/{slug}`, `ns://skill/{slug}`) o por fichero
|
|
213
|
+
(`install-skills`). El directorio autoral `skills/` (con marcadores sin
|
|
214
|
+
resolver) también viaja en el tarball npm porque `postbuild.mjs` lo copia
|
|
215
|
+
tal cual a `dist/packages/mcp/skills/` — eso es intencional (permite
|
|
216
|
+
inspeccionar la fuente), pero ningún tool ni el comando `install-skills`
|
|
217
|
+
deben leer de ahí.
|
|
218
|
+
|
|
219
|
+
### Gobierno: no se duplican en `.agents/skills/` de este repo
|
|
220
|
+
|
|
221
|
+
`.agents/skills/local-package-publish/` es workflow **interno** del
|
|
222
|
+
workspace (cómo publicar un paquete cambiado a Verdaccio); no tiene
|
|
223
|
+
relación con el design system. `packages/mcp/skills/` es **producto**: lo
|
|
224
|
+
que un consumidor externo instala con `install-skills`. No mezclar ambos
|
|
225
|
+
directorios ni copiar contenido de uno a otro.
|
|
226
|
+
|
|
227
|
+
## 6. Superficie MCP (32 tools, 10 resources, 6 prompts)
|
|
228
|
+
|
|
229
|
+
Ver el detalle completo, agrupado, en el [`README.md`](./README.md#tools-por-grupo-32).
|
|
230
|
+
Convenciones que aplican a toda la superficie:
|
|
231
|
+
|
|
232
|
+
- Todo output que incluya markup respeta el invariante de standalone:
|
|
233
|
+
`selector` + `importStatement` + `imports: [NsXComponent]` siempre juntos
|
|
234
|
+
(`get_component_import`, `generate_component_template`,
|
|
235
|
+
`export_component_docs`).
|
|
236
|
+
- Los resources usan el namespace `ns://` (nunca `bhd://`, que era el del
|
|
237
|
+
blueprint): `component/{selector}`, `component/{selector}/markdown`,
|
|
238
|
+
`guide/{slug}`, `skill/{slug}`, `tokens/{tier}`,
|
|
239
|
+
`tokens/component/{group}`, `preset/arvisfy`, `icons/catalog`,
|
|
240
|
+
`contract/style`, `snapshot/stats`.
|
|
241
|
+
- Los prompts (`build_ns_ui`, `review_ns_usage`, `choose_ns_component`,
|
|
242
|
+
`build_ns_form`, `theme_ns_app`, `migrate_to_ns`) comparten un bloque de
|
|
243
|
+
invariantes no negociables (entrypoint único, `imports` obligatorio, BEM
|
|
244
|
+
sin Tailwind en markup, valores de union cerrados, `--ns-component-*`
|
|
245
|
+
únicamente, `provideNsTheme` una sola vez) y terminan pidiendo al agente
|
|
246
|
+
que valide su propio resultado con `validate_component_usage`/
|
|
247
|
+
`validate_style_contract` antes de darlo por terminado.
|
|
248
|
+
|
|
249
|
+
## 7. Cómo agregar o mejorar una guía
|
|
250
|
+
|
|
251
|
+
1. Edita el `SKILL.md` correspondiente bajo `packages/mcp/skills/<name>/` —
|
|
252
|
+
nunca escribas markdown de guía a mano en TypeScript.
|
|
253
|
+
2. Si necesitas un dato vivo nuevo, añade un `MARKER_BUILDERS['mi-marcador']`
|
|
254
|
+
en `extract-guides.mjs` y documenta el marcador en la tabla de la
|
|
255
|
+
sección 5 de esta guía.
|
|
256
|
+
3. Regenera y valida:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
pnpm exec nx run mcp:build-data
|
|
260
|
+
pnpm exec nx run mcp:check-data
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
4. Si es una skill completamente nueva, crea el directorio
|
|
264
|
+
`packages/mcp/skills/<name>/SKILL.md` con front-matter `name`/`description`
|
|
265
|
+
(el `name` debe coincidir con el nombre del directorio — `extract-guides.mjs`
|
|
266
|
+
lo valida y falla si no coinciden) y al menos una sección `## `.
|
|
267
|
+
|
|
268
|
+
## 8. Cómo agregar una tool/resource/prompt nuevos
|
|
269
|
+
|
|
270
|
+
No es responsabilidad de esta guía duplicar las convenciones de
|
|
271
|
+
`src/lib/tools*.ts`/`resources.ts`/`prompts.ts` (ver esos ficheros
|
|
272
|
+
directamente), pero en resumen:
|
|
273
|
+
|
|
274
|
+
- Reusa `loadSnapshot()`/`loadIcons()` de `data.ts`; no leas `data/*.json`
|
|
275
|
+
por tu cuenta.
|
|
276
|
+
- Da errores accionables con sugerencias (ver `resolveComponent`/
|
|
277
|
+
`resolveGuide` en `tools.components.ts`/`tools.guides.ts`) en vez de un
|
|
278
|
+
simple "not found".
|
|
279
|
+
- No dupliques snapshot completo en una respuesta si un subconjunto basta.
|
|
280
|
+
- Mantén los nombres de tools/resources/prompts estables una vez publicados
|
|
281
|
+
— un cliente MCP puede tenerlos cacheados.
|
|
282
|
+
|
|
283
|
+
## 9. Publicación — configurada, no ejecutada en esta tanda
|
|
284
|
+
|
|
285
|
+
```bash
|
|
286
|
+
pnpm exec nx run mcp:publish:local # build + bump patch + publish a Verdaccio (localhost:4873)
|
|
287
|
+
pnpm view @ng-solid/mcp version --registry=http://localhost:4873
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Antes del primer publish real, `pnpm pack --dry-run` desde
|
|
291
|
+
`dist/packages/mcp` confirma que `data/**` y `skills/**` viajan en el
|
|
292
|
+
tarball (ambos están en `files` de `package.json`).
|
package/README.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# @ng-solid/mcp
|
|
2
|
+
|
|
3
|
+
Servidor [MCP](https://modelcontextprotocol.io) que expone por stdio un snapshot
|
|
4
|
+
generado en build del design system Arvisfy (`@ng-solid/design-system` +
|
|
5
|
+
`@ng-solid/icons`): componentes (props/eventos/modelos, con herencia
|
|
6
|
+
resuelta), tokens de tema con resolución de contraste `light`/`dark`,
|
|
7
|
+
servicios, providers, el catálogo de 1790 iconos Lucide, el contrato de
|
|
8
|
+
estilos y 6 guías de uso. Pensado para que un agente de IA que consuma
|
|
9
|
+
`@ng-solid/design-system` en un proyecto externo trabaje con la API real en
|
|
10
|
+
vez de inventarla — ver la arquitectura completa y el pipeline de datos en
|
|
11
|
+
[`GUIDE.md`](./GUIDE.md).
|
|
12
|
+
|
|
13
|
+
> **Estado de publicación**: este paquete todavía no se publica a npm público
|
|
14
|
+
> ni a Verdaccio (ver `GUIDE.md` § publicación). Los bloques de configuración
|
|
15
|
+
> de abajo describen el consumo objetivo una vez publicado
|
|
16
|
+
> (`npx -y @ng-solid/mcp`); mientras tanto, usa el build local — ver
|
|
17
|
+
> "Desarrollo local" más abajo, o el `.mcp.json` en la raíz de este
|
|
18
|
+
> monorepo, que ya apunta a `dist/packages/mcp/index.js` para dogfooding.
|
|
19
|
+
|
|
20
|
+
## Instalación por cliente MCP
|
|
21
|
+
|
|
22
|
+
### Claude Code
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
claude mcp add ng-solid -- npx -y @ng-solid/mcp
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
O en `.mcp.json` (raíz del proyecto consumidor):
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"ng-solid": {
|
|
34
|
+
"command": "npx",
|
|
35
|
+
"args": ["-y", "@ng-solid/mcp"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### OpenAI Codex
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
codex mcp add ng-solid -- npx -y @ng-solid/mcp
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
O en `~/.codex/config.toml`:
|
|
48
|
+
|
|
49
|
+
```toml
|
|
50
|
+
[mcp_servers.ng-solid]
|
|
51
|
+
command = "npx"
|
|
52
|
+
args = ["-y", "@ng-solid/mcp"]
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Cursor
|
|
56
|
+
|
|
57
|
+
Crea o edita `.cursor/mcp.json`:
|
|
58
|
+
|
|
59
|
+
```json
|
|
60
|
+
{
|
|
61
|
+
"mcpServers": {
|
|
62
|
+
"ng-solid": {
|
|
63
|
+
"command": "npx",
|
|
64
|
+
"args": ["-y", "@ng-solid/mcp"]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### VS Code
|
|
71
|
+
|
|
72
|
+
1. Paleta de comandos (`Cmd+Shift+P` / `Ctrl+Shift+P`) → `MCP: Add Server`.
|
|
73
|
+
2. Selecciona `Command (stdio)`.
|
|
74
|
+
3. Comando: `npx`. Argumentos: `-y @ng-solid/mcp`.
|
|
75
|
+
4. Nombre del servidor: `ng-solid`.
|
|
76
|
+
|
|
77
|
+
O edita `.vscode/mcp.json`:
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{
|
|
81
|
+
"servers": {
|
|
82
|
+
"ng-solid": {
|
|
83
|
+
"command": "npx",
|
|
84
|
+
"args": ["-y", "@ng-solid/mcp"]
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## `install-skills` — distribuir las guías como ficheros
|
|
91
|
+
|
|
92
|
+
El mismo binario copia las 6 guías (`packages/mcp/skills/*/SKILL.md`,
|
|
93
|
+
ya resueltas — sin marcadores `<!-- ns:… -->` pendientes) a un directorio de
|
|
94
|
+
skills local, útil para agentes que leen ficheros `SKILL.md` en vez de
|
|
95
|
+
consultar el MCP por stdio:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npx -y @ng-solid/mcp install-skills # copia a ./.agents/skills/
|
|
99
|
+
npx -y @ng-solid/mcp install-skills --list # lista las skills sin copiar
|
|
100
|
+
npx -y @ng-solid/mcp install-skills --dir ./docs/skills --force
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
- `--dir <ruta>` — directorio destino (default `./.agents/skills`).
|
|
104
|
+
- `--list` — enumera las skills disponibles sin copiar nada.
|
|
105
|
+
- `--force` — sobreescribe skills ya presentes en el destino; sin ella, una
|
|
106
|
+
skill existente se salta con un aviso.
|
|
107
|
+
|
|
108
|
+
## Tools por grupo (32)
|
|
109
|
+
|
|
110
|
+
**Descubrimiento** — `list_components`, `get_component`,
|
|
111
|
+
`search_components`, `search_all`, `suggest_component`,
|
|
112
|
+
`get_related_components`, `get_categories`.
|
|
113
|
+
|
|
114
|
+
**API de componentes** — `get_component_api`, `get_component_import`,
|
|
115
|
+
`generate_component_template`, `get_usage_example`, `export_component_docs`.
|
|
116
|
+
|
|
117
|
+
**Formularios** — `get_form_control_contract`, `list_form_controls`.
|
|
118
|
+
|
|
119
|
+
**Servicios y providers** — `list_services`, `get_service`, `get_provider`.
|
|
120
|
+
|
|
121
|
+
**Tokens/tema** — `get_component_tokens`, `list_theme_tokens`,
|
|
122
|
+
`resolve_token`, `get_token_scope`, `validate_theme_preset`,
|
|
123
|
+
`get_token_drift`.
|
|
124
|
+
|
|
125
|
+
**Contrato de estilos** — `get_style_contract`, `validate_style_contract`,
|
|
126
|
+
`validate_component_usage`.
|
|
127
|
+
|
|
128
|
+
**Iconos** — `search_icons`, `get_icon`, `get_icons_setup`.
|
|
129
|
+
|
|
130
|
+
**Guías/meta** — `list_guides`, `get_guide`, `get_version_info`.
|
|
131
|
+
|
|
132
|
+
## Resources y prompts
|
|
133
|
+
|
|
134
|
+
Ver el detalle de URIs `ns://…` y de los prompts (`build_ns_ui`,
|
|
135
|
+
`review_ns_usage`, `choose_ns_component`, `build_ns_form`, `theme_ns_app`,
|
|
136
|
+
`migrate_to_ns`) en [`GUIDE.md`](./GUIDE.md).
|
|
137
|
+
|
|
138
|
+
## Desarrollo local
|
|
139
|
+
|
|
140
|
+
Desde la raíz del monorepo:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
pnpm exec nx run mcp:build # prebuild + tsc + postbuild -> dist/packages/mcp
|
|
144
|
+
node dist/packages/mcp/index.js # servidor por stdio
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Regenerar sólo el snapshot de datos:
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
pnpm exec nx run mcp:build-data # escribe packages/mcp/data/*.json y data/skills/
|
|
151
|
+
pnpm exec nx run mcp:check-data # falla si el snapshot en disco quedó desactualizado
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Inspector MCP contra el build compilado:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
cd packages/mcp
|
|
158
|
+
pnpm run inspect
|
|
159
|
+
```
|