fix(mcp-server): las capas del guard nombraban carpetas que no existen - #656
Merged
Conversation
El descriptor de elementos de mcp-server describia una arquitectura que no
estaba en disco. Declaraba los tipos `application` y `core` para `src/application`
y `src/core`, que no existen: sus patrones no casaban con nada, asi que sus
politicas eran letra muerta. A la vez `src/common` y `src/utils` — que si existen,
y que importan `mcp` (10 ficheros) y `tools` (7) — no tenian descriptor, de modo
que sus ficheros quedaban sin clasificar (type: null) y `boundaries/dependencies`
no gobernaba ni un solo import hacia ellos ni desde ellos.
Una capa nombrada que no es una carpeta no es una aspiracion inofensiva: es una
regla que no puede dispararse.
- fuera `application` y `core` (no existen).
- dentro `common` y `utils`, cada uno permitido solo a si mismo. Verificado:
ninguno importa nada local fuera de su carpeta, solo relativos internos y
paquetes externos (@nestjs/common, node:crypto, node:path, pino), asi que
la politica describe la realidad en vez de aspirar a ella.
- `mcp` gana `common`; `tools` gana `common` y `utils`. `resources` y `watcher`
NO: hoy no importan de ahi, y el guard debe obligar a decidirlo conscientemente
el dia que haga falta.
- `src/test-doubles` no es una capa: esta excluido del tsconfig y solo se cablea
por el `moduleNameMapper` de jest, asi que nunca entra en el grafo compilado.
Pasa a la lista de ignorados, no a un tipo.
Medido, no razonado. Matriz sobre CADA par ordenado de capas (destino directo y
anidado, en forma valor y `import type`): 98 canarios, 32 pares que deben
bloquear.
config anterior: 13 de 32 bloqueados -> 19 imports prohibidos pasaban mudos
config nueva: 32 de 32 bloqueados -> 0 divergencias vs lo declarado
Los 19 huecos involucraban todos a `common` o `utils`. Ademas: el codigo real
sigue verde (exit 0) y los unicos ficheros que quedan sin clasificar son los tres
de arranque (app.module.ts, main.ts, tracing.ts), que son la raiz de composicion
y cablean todo por definicion: darles una capa exigiria un allow-all que no
aplicaria nada.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Signed-off-by: aarroyo <beyondnet.peru@gmail.com>
|
You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard. |
📊 Bilingual Coverage ImpactPR Changes
Repository Coverage
✅ Good: All EN changes have ES counterparts. Generated by GitHub Actions |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Pull Request Summary
El descriptor de elementos de
mcp-serverdescribía una arquitectura que no estaba en disco. Salió a la luz al migrar los guards aeslint-plugin-boundariesv7 (#653), y se separó a propósito para no mezclar un hallazgo con una migración que preservaba comportamiento.Declaraba los tipos
applicationycoreapuntando asrc/applicationysrc/core, que no existen: sus patrones no casaban con nada, así que sus políticas eran letra muerta. A la vezsrc/commonysrc/utils— que sí existen, y de los que importanmcp(10 ficheros) ytools(7) — no tenían descriptor, así que sus ficheros quedaban sin clasificar (type: null) yboundaries/dependenciesno gobernaba ni un solo import hacia ellos ni desde ellos.Una capa nombrada que no es una carpeta no es una aspiración inofensiva: es una regla que no puede dispararse.
Qué cambia
applicationycore— no existen.commonyutils, cada uno permitido solo a sí mismo. Verificado: ninguno importa nada local fuera de su carpeta, solo relativos internos y paquetes externos (@nestjs/common,node:crypto,node:path,pino). La política describe la realidad en vez de aspirar a ella.mcpganacommon;toolsganacommonyutils.resourcesywatcherno: hoy no importan de ahí, y el guard debe obligar a decidirlo conscientemente el día que haga falta.src/test-doublesno es una capa: está excluido deltsconfigy solo se cablea por elmoduleNameMapperde jest, así que nunca entra en el grafo compilado. Pasa a la lista de ignorados, no a un tipo.Medido, no razonado
Una config de boundaries mal puesta falla abierta: no reporta nada y sale 0. Así que la evidencia es una matriz sobre cada par ordenado de capas (destino directo en la carpeta y anidado, en forma valor y
import type): 98 canarios, 32 pares que deben bloquear.Los 19 huecos involucraban todos a
commonoutils— exactamente las carpetas sin clasificar. Ejemplos que pasaban mudos:common → mcp,common → tools,watcher → common,resources → utils.Además: el código real sigue verde (
npm run lint:boundariesexit 0), y los únicos ficheros que quedan sin clasificar son los tres de arranque (app.module.ts,main.ts,tracing.ts) — la raíz de composición, que cablea todo por definición: darles una capa exigiría unallow-all que no aplicaría nada. Los canarios se borraron.Before you submit
Signed-off-byline.Linked ADRs / Issues
eslint-plugin-boundariesa v7), donde se detectó y se dejó fuera a propósito.🤖 Generated with Claude Code